diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 3258bacc9c30fb3897a2ea1b322c9e5e0764e15d..9dece0b5358b8cd94bfc8d8fd888563ca816cba1 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -4,10 +4,10 @@ include: - /dotnet.yml stages: - - migrate + #- migrate - build - - test - - cleanup + #- test + #- cleanup - publish variables: @@ -15,32 +15,32 @@ variables: # Example DB_NAME = X_COSCINE_TMP_EF_1ecfd275 DB_NAME: "X_COSCINE_TMP_EF_$CI_COMMIT_SHORT_SHA" -migrate: - stage: migrate - extends: .dotnet-windows-base - script: - - dotnet tool install dotnet-ef; echo "1" - - dotnet tool update dotnet-ef - # List dependencies that will be used during build - - dotnet restore src --no-cache - - dotnet list src package - # Create new database and migrate to latest state - - dotnet run --project .\src\Database.Actions -- --action-create --name $DB_NAME --source $DB_DATA_SOURCE --user $DB_USER_ID --pw $DB_PASSWORD - # Scaffold created database - - dotnet ef dbcontext scaffold "Data Source=$DB_DATA_SOURCE;Integrated Security=False;User ID=$DB_USER_ID;Password=$DB_PASSWORD;Database=$DB_NAME" Microsoft.EntityFrameworkCore.SqlServer -o DataModel -c "Model" -f --no-onconfiguring --project "src\Scaffolding" - artifacts: - paths: - - src\Scaffolding\DataModel - expire_in: 1 week +#migrate: +# stage: migrate +# extends: .dotnet-windows-base +# script: +# - dotnet tool install dotnet-ef; echo "1" +# - dotnet tool update dotnet-ef +# # List dependencies that will be used during build +# - dotnet restore src --no-cache +# - dotnet list src package +# # Create new database and migrate to latest state +# - dotnet run --project .\src\Database.Actions -- --action-create --name $DB_NAME --source $DB_DATA_SOURCE --user $DB_USER_ID --pw $DB_PASSWORD +# # Scaffold created database +# - dotnet ef dbcontext scaffold "Data Source=$DB_DATA_SOURCE;Integrated Security=False;User ID=$DB_USER_ID;Password=$DB_PASSWORD;Database=$DB_NAME" Microsoft.EntityFrameworkCore.SqlServer -o DataModel -c "Model" -f --no-onconfiguring --project "src\Scaffolding" +# artifacts: +# paths: +# - src\Scaffolding\DataModel +# expire_in: 1 week -cleanup: - stage: cleanup - extends: .dotnet-windows-base - script: - # Drop created database - - dotnet run -p .\src\Database.Actions -- --action-drop --name $DB_NAME --source $DB_DATA_SOURCE --user $DB_USER_ID --pw $DB_PASSWORD - when: always +#cleanup: +# stage: cleanup +# extends: .dotnet-windows-base +# #script: +# # Drop created database +# #- dotnet run -p .\src\Database.Actions -- --action-drop --name $DB_NAME --source $DB_DATA_SOURCE --user $DB_USER_ID --pw $DB_PASSWORD +# when: always build-branch: extends: .build-branch @@ -48,18 +48,18 @@ build-branch: build-nuget-release: extends: .build-nuget-release -test: - extends: .dotnet-windows-base - stage: test - script: - - $env:DatabaseName=$DB_NAME - # Discover test projects in `src` folder - - dotnet test src - # TODO Add Dotnet Test coverage - only: - # Do not run tests for chore commit by bot but re-run tests for the semver tag before pushing to npm - variables: - - $GITLAB_USER_ID != $GIT_BOT_USER_ID || $CI_COMMIT_TAG =~ /v[0-9]*\.[0-9]*\.[0-9]*/ +#test: +# extends: .dotnet-windows-base +# stage: test +# script: +# - $env:DatabaseName=$DB_NAME +# # Discover test projects in `src` folder +# - dotnet test src +# # TODO Add Dotnet Test coverage +# only: +# # Do not run tests for chore commit by bot but re-run tests for the semver tag before pushing to npm +# variables: +# - $GITLAB_USER_ID != $GIT_BOT_USER_ID || $CI_COMMIT_TAG =~ /v[0-9]*\.[0-9]*\.[0-9]*/ publish-branch-prerelease: extends: .publish-branch-prerelease diff --git a/GitVersion.yml b/GitVersion.yml index 1bdc0fe219f5f35d8a024a66d9fd715f44539640..5a111397d4a13dbd97c0549853e62ebaf3abd2cf 100644 --- a/GitVersion.yml +++ b/GitVersion.yml @@ -1,5 +1,5 @@ mode: ContinuousDeployment -next-version: 1.0.0 +next-version: 2.22.0 major-version-bump-message: 'Breaking:' minor-version-bump-message: '(Update|New):' patch-version-bump-message: 'Fix:' diff --git a/src/Database.Actions/Database.Actions.csproj b/src/Database.Actions/Database.Actions.csproj index 28142ceb29b50340546c805d9eabfd038dad2de9..318d986bed6d52488e6d6bfff7a0129043ef0d12 100644 --- a/src/Database.Actions/Database.Actions.csproj +++ b/src/Database.Actions/Database.Actions.csproj @@ -4,7 +4,7 @@ <RootNamespace>Coscine.Database.Actions</RootNamespace> <AssemblyName>Coscine.Database.Actions</AssemblyName> <TargetFramework>net6.0</TargetFramework> - <Version>2.20.0</Version> + <Version>2.21.0</Version> </PropertyGroup> <ItemGroup> diff --git a/src/Database.Tests/Database.Tests.csproj b/src/Database.Tests/Database.Tests.csproj index 953c5b59c8001f11372f2ceef81efc0c0dbc85ea..cc816e62f794183ce9dcb5bc112f4907ef1b6d36 100644 --- a/src/Database.Tests/Database.Tests.csproj +++ b/src/Database.Tests/Database.Tests.csproj @@ -5,7 +5,7 @@ <AssemblyName>Coscine.Database.Tests</AssemblyName> <TargetFramework>net6.0</TargetFramework> <GenerateAssemblyInfo>false</GenerateAssemblyInfo> - <Version>2.20.0</Version> + <Version>2.21.0</Version> </PropertyGroup> <ItemGroup> diff --git a/src/Database/Database.csproj b/src/Database/Database.csproj index bddb13c83d2ef7ba7fae1b921b141a49f7788768..523494d1e27df1bcd4eeea8d3dbe5224b41356e8 100644 --- a/src/Database/Database.csproj +++ b/src/Database/Database.csproj @@ -4,9 +4,9 @@ <RootNamespace>Coscine.Database</RootNamespace> <AssemblyName>Coscine.Database</AssemblyName> <TargetFramework>net6.0</TargetFramework> - <Version>2.20.0</Version> + <Version>2.21.0</Version> </PropertyGroup> - + <PropertyGroup> <Authors>RWTH Aachen University</Authors> <Company>IT Center, RWTH Aachen University</Company> @@ -16,23 +16,23 @@ <PackageProjectUrl>https://git.rwth-aachen.de/coscine/backend/libraries/database</PackageProjectUrl> <PackageRequireLicenseAcceptance>false</PackageRequireLicenseAcceptance> </PropertyGroup> - + <PropertyGroup> <SignAssembly>true</SignAssembly> <AssemblyOriginatorKeyFile>Coscine.Database.Key.snk</AssemblyOriginatorKeyFile> </PropertyGroup> - + <ItemGroup> <None Include="Coscine.Database.Key.snk" /> <Reference Include="System.Web" Condition="'$(TargetFramework)' == 'net461'" /> </ItemGroup> - + <ItemGroup> <Compile Include="..\Scaffolding\DataModel\*.*"> <Link>DataModel\%(Filename)%(Extension)</Link> </Compile> </ItemGroup> - + <ItemGroup> <PackageReference Include="Coscine.Configuration" Version="*-*" /> <PackageReference Include="LinqKit" Version="1.2.3" /> @@ -40,7 +40,7 @@ <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.11" PrivateAssets="all" /> <PackageReference Include="Microsoft.EntityFrameworkCore.SqlServer" Version="6.0.11" /> </ItemGroup> - + <PropertyGroup> <LangVersion>Preview</LangVersion> </PropertyGroup> diff --git a/src/Database/Models/ProjectModel.cs b/src/Database/Models/ProjectModel.cs index c6c19c7d3e6e54e5d715914212d7552ce67474d0..e1bb715ed91115ee6920c3e6b602c32a57861f4e 100644 --- a/src/Database/Models/ProjectModel.cs +++ b/src/Database/Models/ProjectModel.cs @@ -93,10 +93,7 @@ namespace Coscine.Database.Models { if (!databaseObject.Deleted) { - return DatabaseConnection.ConnectToDatabase((db) => - { - return (int)db.Update(databaseObject).State; - }); + return DatabaseConnection.ConnectToDatabase((db) => (int)db.Update(databaseObject).State); } else { diff --git a/src/Database/Models/UserModel.cs b/src/Database/Models/UserModel.cs index a4f0efcf5222effe2ff063b3ca27a21aaa8b83e0..71043d881941b8e4f5b1d7205c560c076ec39ec2 100644 --- a/src/Database/Models/UserModel.cs +++ b/src/Database/Models/UserModel.cs @@ -65,7 +65,6 @@ namespace Coscine.Database.Models user.Title == null ? null : new TitleObject(user.Title.Id, user.Title.DisplayName), user.Language == null ? null : new LanguageObject(user.Language.Id, user.Language.DisplayName, user.Language.Abbreviation), user.Organization, - user.Institute, disciplines, false, externalAuthenticators); @@ -78,7 +77,6 @@ namespace Coscine.Database.Models user.Surname = userObject.Surname; user.DisplayName = userObject.DisplayName; user.Organization = userObject.Organization; - user.Institute = userObject.Institute; user.LanguageId = userObject.Language?.Id; SetDisciplines(user, userObject.Disciplines); return Update(user); diff --git a/src/Database/ReturnObjects/UserObject.cs b/src/Database/ReturnObjects/UserObject.cs index 959285634286b12f6297d863921085473b5e0a1a..daa9f425875205b8a1741d32704832290c58a5e3 100644 --- a/src/Database/ReturnObjects/UserObject.cs +++ b/src/Database/ReturnObjects/UserObject.cs @@ -24,15 +24,13 @@ namespace Coscine.Database.ReturnObjects public string Organization { get; set; } - public string Institute { get; set; } - public IEnumerable<DisciplineObject> Disciplines { get; set; } public bool IsRegistered { get; set; } public IEnumerable<ExternalAuthenticatorsObject> ExternalAuthenticators { get; set; } - public UserObject(Guid id, string displayName, string givenname, string surname, string emailAddress, bool hasProjectRole = false, TitleObject title = null, LanguageObject language = null, string organization = "", string institute = "", IEnumerable<DisciplineObject> disciplines = null, bool isRegistered = false, IEnumerable<ExternalAuthenticatorsObject> externalAuthenticators = null) + public UserObject(Guid id, string displayName, string givenname, string surname, string emailAddress, bool hasProjectRole = false, TitleObject title = null, LanguageObject language = null, string organization = "", IEnumerable<DisciplineObject> disciplines = null, bool isRegistered = false, IEnumerable<ExternalAuthenticatorsObject> externalAuthenticators = null) { Id = id; DisplayName = displayName; @@ -43,7 +41,6 @@ namespace Coscine.Database.ReturnObjects Title = title; Language = language; Organization = organization; - Institute = institute; Disciplines = disciplines; HasProjectRole = hasProjectRole; diff --git a/src/Scaffolding/DataModel/ActivityLog.cs b/src/Scaffolding/DataModel/ActivityLog.cs new file mode 100644 index 0000000000000000000000000000000000000000..058de8788c5d8291bd5d1dac33237d937c5d8a34 --- /dev/null +++ b/src/Scaffolding/DataModel/ActivityLog.cs @@ -0,0 +1,18 @@ +using System; +using System.Collections.Generic; + +namespace Coscine.Database.DataModel +{ + public partial class ActivityLog + { + public Guid Id { get; set; } + public string ApiPath { get; set; } + public Guid UserId { get; set; } + public DateTime ActivityTimestamp { get; set; } + public string HttpAction { get; set; } + public string ActionName { get; set; } + public string ControllerName { get; set; } + + public virtual User User { get; set; } + } +} diff --git a/src/Scaffolding/DataModel/License.cs b/src/Scaffolding/DataModel/License.cs index 169e2f1693fed78912f9561ae85922def01e2344..6069b831f01d245d2f7e12c5baa08a0a86717181 100644 --- a/src/Scaffolding/DataModel/License.cs +++ b/src/Scaffolding/DataModel/License.cs @@ -12,6 +12,7 @@ namespace Coscine.Database.DataModel public Guid Id { get; set; } public string DisplayName { get; set; } + public string Url { get; set; } public virtual ICollection<Resource> Resources { get; set; } } diff --git a/src/Scaffolding/DataModel/Model.cs b/src/Scaffolding/DataModel/Model.cs index 1b3b25146d54c80f47638b1b4c88125e61646f10..71976797f72706f2d91a3b3ce335f0cdce60ea53 100644 --- a/src/Scaffolding/DataModel/Model.cs +++ b/src/Scaffolding/DataModel/Model.cs @@ -1,4 +1,4 @@ -using System; +using System; using System.Collections.Generic; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata; @@ -17,6 +17,7 @@ namespace Coscine.Database.DataModel } public virtual DbSet<ActivatedFeature> ActivatedFeatures { get; set; } + public virtual DbSet<ActivityLog> ActivityLogs { get; set; } public virtual DbSet<ApiToken> ApiTokens { get; set; } public virtual DbSet<ContactChange> ContactChanges { get; set; } public virtual DbSet<Discipline> Disciplines { get; set; } @@ -35,6 +36,7 @@ namespace Coscine.Database.DataModel public virtual DbSet<Project> Projects { get; set; } public virtual DbSet<ProjectDiscipline> ProjectDisciplines { get; set; } public virtual DbSet<ProjectInstitute> ProjectInstitutes { get; set; } + public virtual DbSet<ProjectPublicationRequest> ProjectPublicationRequests { get; set; } public virtual DbSet<ProjectQuota> ProjectQuotas { get; set; } public virtual DbSet<ProjectResource> ProjectResources { get; set; } public virtual DbSet<ProjectRole> ProjectRoles { get; set; } @@ -58,6 +60,10 @@ namespace Coscine.Database.DataModel { modelBuilder.Entity<ActivatedFeature>(entity => { + entity.HasIndex(e => e.FeatureId, "IX_ActivatedFeatures_FeatureId"); + + entity.HasIndex(e => e.ProjectId, "IX_ActivatedFeatures_ProjectId"); + entity.Property(e => e.Id).HasDefaultValueSql("(newid())"); entity.HasOne(d => d.Feature) @@ -73,8 +79,39 @@ namespace Coscine.Database.DataModel .HasConstraintName("FK_ActivatedFeatures_ProjectId_Projects_Id"); }); + modelBuilder.Entity<ActivityLog>(entity => + { + entity.HasIndex(e => e.UserId, "IX_ActivityLogs_UserId"); + + entity.Property(e => e.Id).ValueGeneratedNever(); + + entity.Property(e => e.ActionName) + .HasMaxLength(255) + .HasDefaultValueSql("(N'NA')"); + + entity.Property(e => e.ApiPath) + .IsRequired() + .HasMaxLength(255); + + entity.Property(e => e.ControllerName) + .HasMaxLength(255) + .HasDefaultValueSql("(N'NA')"); + + entity.Property(e => e.HttpAction) + .IsRequired() + .HasMaxLength(10) + .HasDefaultValueSql("(N'NA')"); + + entity.HasOne(d => d.User) + .WithMany(p => p.ActivityLogs) + .HasForeignKey(d => d.UserId) + .OnDelete(DeleteBehavior.ClientSetNull); + }); + modelBuilder.Entity<ApiToken>(entity => { + entity.HasIndex(e => e.UserId, "IX_ApiTokens_UserId"); + entity.Property(e => e.Id).HasDefaultValueSql("(newid())"); entity.Property(e => e.Expiration).HasColumnType("datetime"); @@ -98,6 +135,8 @@ namespace Coscine.Database.DataModel entity.ToTable("ContactChange"); + entity.HasIndex(e => e.UserId, "IX_ContactChange_UserId"); + entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())"); entity.Property(e => e.ConfirmationToken).HasDefaultValueSql("(newid())"); @@ -141,6 +180,10 @@ namespace Coscine.Database.DataModel { entity.HasKey(e => e.RelationId); + entity.HasIndex(e => e.ExternalAuthenticatorId, "IX_ExternalIds_ExternalAuthenticatorId"); + + entity.HasIndex(e => e.UserId, "IX_ExternalIds_UserId"); + entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())"); entity.Property(e => e.ExternalId1) @@ -212,6 +255,10 @@ namespace Coscine.Database.DataModel { entity.HasKey(e => e.RelationId); + entity.HasIndex(e => e.GroupId, "IX_GroupMemberships_GroupId"); + + entity.HasIndex(e => e.UserId, "IX_GroupMemberships_UserId"); + entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())"); entity.HasOne(d => d.Group) @@ -229,6 +276,12 @@ namespace Coscine.Database.DataModel modelBuilder.Entity<Invitation>(entity => { + entity.HasIndex(e => e.Issuer, "IX_Invitations_Issuer"); + + entity.HasIndex(e => e.Project, "IX_Invitations_Project"); + + entity.HasIndex(e => e.Role, "IX_Invitations_Role"); + entity.Property(e => e.Id).HasDefaultValueSql("(newid())"); entity.Property(e => e.Expiration).HasColumnType("datetime"); @@ -318,6 +371,8 @@ namespace Coscine.Database.DataModel { entity.ToTable("MetadataExtraction"); + entity.HasIndex(e => e.ResourceId, "IX_MetadataExtraction_ResourceId"); + entity.Property(e => e.Id).HasDefaultValueSql("(newid())"); entity.HasOne(d => d.Resource) @@ -328,6 +383,8 @@ namespace Coscine.Database.DataModel modelBuilder.Entity<Project>(entity => { + entity.HasIndex(e => e.VisibilityId, "IX_Projects_VisibilityId"); + entity.Property(e => e.Id).HasDefaultValueSql("(newid())"); entity.Property(e => e.DateCreated) @@ -370,6 +427,10 @@ namespace Coscine.Database.DataModel entity.ToTable("ProjectDiscipline"); + entity.HasIndex(e => e.DisciplineId, "IX_ProjectDiscipline_DisciplineId"); + + entity.HasIndex(e => e.ProjectId, "IX_ProjectDiscipline_ProjectId"); + entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())"); entity.HasOne(d => d.Discipline) @@ -391,6 +452,8 @@ namespace Coscine.Database.DataModel entity.ToTable("ProjectInstitute"); + entity.HasIndex(e => e.ProjectId, "IX_ProjectInstitute_ProjectId"); + entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())"); entity.Property(e => e.OrganizationUrl) @@ -405,10 +468,52 @@ namespace Coscine.Database.DataModel .HasConstraintName("FK_ProjectInstitute_ProjectId_Projects_Id"); }); + modelBuilder.Entity<ProjectPublicationRequest>(entity => + { + entity.HasIndex(e => e.CreatorId, "IX_ProjectPublicationRequests_CreatorId"); + + entity.HasIndex(e => e.ProjectId, "IX_ProjectPublicationRequests_ProjectId"); + + entity.Property(e => e.Id).ValueGeneratedNever(); + + entity.Property(e => e.DateCreated) + .HasColumnType("datetime") + .HasDefaultValueSql("(getutcdate())"); + + entity.Property(e => e.PublicationServiceRorId).IsRequired(); + + entity.HasOne(d => d.Creator) + .WithMany(p => p.ProjectPublicationRequests) + .HasForeignKey(d => d.CreatorId) + .OnDelete(DeleteBehavior.ClientSetNull); + + entity.HasOne(d => d.Project) + .WithMany(p => p.ProjectPublicationRequests) + .HasForeignKey(d => d.ProjectId) + .OnDelete(DeleteBehavior.ClientSetNull); + + entity.HasMany(d => d.Resources) + .WithMany(p => p.PublicationRequests) + .UsingEntity<Dictionary<string, object>>( + "ProjectPublicationRequestResource", + l => l.HasOne<Resource>().WithMany().HasForeignKey("ResourcesId"), + r => r.HasOne<ProjectPublicationRequest>().WithMany().HasForeignKey("PublicationRequestsId"), + j => + { + j.HasKey("PublicationRequestsId", "ResourcesId"); + + j.ToTable("ProjectPublicationRequestResource"); + + j.HasIndex(new[] { "ResourcesId" }, "IX_ProjectPublicationRequestResource_ResourcesId"); + }); + }); + modelBuilder.Entity<ProjectQuota>(entity => { entity.HasKey(e => e.RelationId); + entity.HasIndex(e => e.ResourceTypeId, "IX_ProjectQuotas_ResourceTypeId"); + entity.HasIndex(e => new { e.ProjectId, e.ResourceTypeId }, "ProjectIdResourceTypeId") .IsUnique(); @@ -435,6 +540,10 @@ namespace Coscine.Database.DataModel entity.ToTable("ProjectResource"); + entity.HasIndex(e => e.ProjectId, "IX_ProjectResource_ProjectId"); + + entity.HasIndex(e => e.ResourceId, "IX_ProjectResource_ResourceId"); + entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())"); entity.HasOne(d => d.Project) @@ -453,6 +562,12 @@ namespace Coscine.Database.DataModel { entity.HasKey(e => e.RelationId); + entity.HasIndex(e => e.ProjectId, "IX_ProjectRoles_ProjectId"); + + entity.HasIndex(e => e.RoleId, "IX_ProjectRoles_RoleId"); + + entity.HasIndex(e => e.UserId, "IX_ProjectRoles_UserId"); + entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())"); entity.HasOne(d => d.Project) @@ -577,6 +692,12 @@ namespace Coscine.Database.DataModel modelBuilder.Entity<Resource>(entity => { + entity.HasIndex(e => e.LicenseId, "IX_Resources_LicenseId"); + + entity.HasIndex(e => e.TypeId, "IX_Resources_TypeId"); + + entity.HasIndex(e => e.VisibilityId, "IX_Resources_VisibilityId"); + entity.Property(e => e.Id).HasDefaultValueSql("(newid())"); entity.Property(e => e.ApplicationProfile).HasMaxLength(500); @@ -594,6 +715,10 @@ namespace Coscine.Database.DataModel entity.Property(e => e.Keywords).HasMaxLength(1000); + entity.Property(e => e.MetadataLocalCopy) + .IsRequired() + .HasDefaultValueSql("(CONVERT([bit],(0)))"); + entity.Property(e => e.ResourceName).HasMaxLength(200); entity.Property(e => e.UsageRights).HasMaxLength(200); @@ -621,6 +746,10 @@ namespace Coscine.Database.DataModel entity.ToTable("ResourceDiscipline"); + entity.HasIndex(e => e.DisciplineId, "IX_ResourceDiscipline_DisciplineId"); + + entity.HasIndex(e => e.ResourceId, "IX_ResourceDiscipline_ResourceId"); + entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())"); entity.HasOne(d => d.Discipline) @@ -688,6 +817,10 @@ namespace Coscine.Database.DataModel { entity.HasKey(e => e.RelationId); + entity.HasIndex(e => e.ProjectId, "IX_SubProjects_ProjectId"); + + entity.HasIndex(e => e.SubProjectId, "IX_SubProjects_SubProjectId"); + entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())"); entity.HasOne(d => d.Project) @@ -718,6 +851,8 @@ namespace Coscine.Database.DataModel entity.ToTable("TOSAccepted"); + entity.HasIndex(e => e.UserId, "IX_TOSAccepted_UserId"); + entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())"); entity.Property(e => e.Version) @@ -733,6 +868,10 @@ namespace Coscine.Database.DataModel modelBuilder.Entity<User>(entity => { + entity.HasIndex(e => e.LanguageId, "IX_Users_LanguageId"); + + entity.HasIndex(e => e.TitleId, "IX_Users_TitleId"); + entity.Property(e => e.Id).HasDefaultValueSql("(newid())"); entity.Property(e => e.DisplayName) @@ -745,7 +884,9 @@ namespace Coscine.Database.DataModel entity.Property(e => e.Givenname).HasMaxLength(200); - entity.Property(e => e.Institute).HasMaxLength(200); + entity.Property(e => e.LatestActivity) + .HasColumnType("datetime") + .HasDefaultValueSql("(getutcdate())"); entity.Property(e => e.Organization).HasMaxLength(200); @@ -766,6 +907,10 @@ namespace Coscine.Database.DataModel { entity.HasKey(e => e.RelationId); + entity.HasIndex(e => e.DisciplineId, "IX_UserDisciplines_DisciplineId"); + + entity.HasIndex(e => e.UserId, "IX_UserDisciplines_UserId"); + entity.Property(e => e.RelationId).HasDefaultValueSql("(newid())"); entity.HasOne(d => d.Discipline) diff --git a/src/Scaffolding/DataModel/Project.cs b/src/Scaffolding/DataModel/Project.cs index 24f0af4476a7c91e9ed09f11a509a3ed628c85f9..8e31fa931ea6f39729e1bb529b39c2ea80d8e68b 100644 --- a/src/Scaffolding/DataModel/Project.cs +++ b/src/Scaffolding/DataModel/Project.cs @@ -11,6 +11,7 @@ namespace Coscine.Database.DataModel Invitations = new HashSet<Invitation>(); ProjectDisciplines = new HashSet<ProjectDiscipline>(); ProjectInstitutes = new HashSet<ProjectInstitute>(); + ProjectPublicationRequests = new HashSet<ProjectPublicationRequest>(); ProjectQuotas = new HashSet<ProjectQuota>(); ProjectResources = new HashSet<ProjectResource>(); ProjectRoles = new HashSet<ProjectRole>(); @@ -38,6 +39,7 @@ namespace Coscine.Database.DataModel public virtual ICollection<Invitation> Invitations { get; set; } public virtual ICollection<ProjectDiscipline> ProjectDisciplines { get; set; } public virtual ICollection<ProjectInstitute> ProjectInstitutes { get; set; } + public virtual ICollection<ProjectPublicationRequest> ProjectPublicationRequests { get; set; } public virtual ICollection<ProjectQuota> ProjectQuotas { get; set; } public virtual ICollection<ProjectResource> ProjectResources { get; set; } public virtual ICollection<ProjectRole> ProjectRoles { get; set; } diff --git a/src/Scaffolding/DataModel/ProjectPublicationRequest.cs b/src/Scaffolding/DataModel/ProjectPublicationRequest.cs new file mode 100644 index 0000000000000000000000000000000000000000..500a6f04868be73e13315cca17f398cbf61b8674 --- /dev/null +++ b/src/Scaffolding/DataModel/ProjectPublicationRequest.cs @@ -0,0 +1,25 @@ +using System; +using System.Collections.Generic; + +namespace Coscine.Database.DataModel +{ + public partial class ProjectPublicationRequest + { + public ProjectPublicationRequest() + { + Resources = new HashSet<Resource>(); + } + + public Guid Id { get; set; } + public Guid ProjectId { get; set; } + public string PublicationServiceRorId { get; set; } + public Guid CreatorId { get; set; } + public DateTime DateCreated { get; set; } + public string Message { get; set; } + + public virtual User Creator { get; set; } + public virtual Project Project { get; set; } + + public virtual ICollection<Resource> Resources { get; set; } + } +} diff --git a/src/Scaffolding/DataModel/Resource.cs b/src/Scaffolding/DataModel/Resource.cs index d528af2741387c682db33c4b3dbdd1e5d4a9266d..65d8e23c7971ace761bb6ffeaffd0d997d5764ce 100644 --- a/src/Scaffolding/DataModel/Resource.cs +++ b/src/Scaffolding/DataModel/Resource.cs @@ -10,6 +10,7 @@ namespace Coscine.Database.DataModel MetadataExtractions = new HashSet<MetadataExtraction>(); ProjectResources = new HashSet<ProjectResource>(); ResourceDisciplines = new HashSet<ResourceDiscipline>(); + PublicationRequests = new HashSet<ProjectPublicationRequest>(); } public Guid Id { get; set; } @@ -28,6 +29,7 @@ namespace Coscine.Database.DataModel public string Archived { get; set; } public bool Deleted { get; set; } public DateTime? DateCreated { get; set; } + public bool? MetadataLocalCopy { get; set; } public virtual License License { get; set; } public virtual ResourceType Type { get; set; } @@ -35,5 +37,7 @@ namespace Coscine.Database.DataModel public virtual ICollection<MetadataExtraction> MetadataExtractions { get; set; } public virtual ICollection<ProjectResource> ProjectResources { get; set; } public virtual ICollection<ResourceDiscipline> ResourceDisciplines { get; set; } + + public virtual ICollection<ProjectPublicationRequest> PublicationRequests { get; set; } } } diff --git a/src/Scaffolding/DataModel/User.cs b/src/Scaffolding/DataModel/User.cs index a459fceba82bc5404e2bdf707e3dc64025e64cd8..ce69a28adc2bbc3380ce3d666e7260a9bc089a66 100644 --- a/src/Scaffolding/DataModel/User.cs +++ b/src/Scaffolding/DataModel/User.cs @@ -7,11 +7,13 @@ namespace Coscine.Database.DataModel { public User() { + ActivityLogs = new HashSet<ActivityLog>(); ApiTokens = new HashSet<ApiToken>(); ContactChanges = new HashSet<ContactChange>(); ExternalIds = new HashSet<ExternalId>(); GroupMemberships = new HashSet<GroupMembership>(); Invitations = new HashSet<Invitation>(); + ProjectPublicationRequests = new HashSet<ProjectPublicationRequest>(); ProjectRoles = new HashSet<ProjectRole>(); Tosaccepteds = new HashSet<Tosaccepted>(); UserDisciplines = new HashSet<UserDiscipline>(); @@ -26,15 +28,18 @@ namespace Coscine.Database.DataModel public string Organization { get; set; } public Guid? TitleId { get; set; } public Guid? LanguageId { get; set; } - public string Institute { get; set; } + public DateTime? LatestActivity { get; set; } + public DateTime? DeletedAt { get; set; } public virtual Language Language { get; set; } public virtual Title Title { get; set; } + public virtual ICollection<ActivityLog> ActivityLogs { get; set; } public virtual ICollection<ApiToken> ApiTokens { get; set; } public virtual ICollection<ContactChange> ContactChanges { get; set; } public virtual ICollection<ExternalId> ExternalIds { get; set; } public virtual ICollection<GroupMembership> GroupMemberships { get; set; } public virtual ICollection<Invitation> Invitations { get; set; } + public virtual ICollection<ProjectPublicationRequest> ProjectPublicationRequests { get; set; } public virtual ICollection<ProjectRole> ProjectRoles { get; set; } public virtual ICollection<Tosaccepted> Tosaccepteds { get; set; } public virtual ICollection<UserDiscipline> UserDisciplines { get; set; } diff --git a/src/Scaffolding/Scaffolding.csproj b/src/Scaffolding/Scaffolding.csproj index 15b68fec33c543f14a0acc459010ccc28db92ebf..850f7a3b89d5b62eab0dfb9dbf9a33992caedfc5 100644 --- a/src/Scaffolding/Scaffolding.csproj +++ b/src/Scaffolding/Scaffolding.csproj @@ -3,9 +3,9 @@ <RootNamespace>Coscine.Database</RootNamespace> <AssemblyName>Coscine.Database.Scaffolding</AssemblyName> <TargetFramework>net6.0</TargetFramework> - <Version>2.20.0</Version> + <Version>2.21.0</Version> </PropertyGroup> - + <ItemGroup> <PackageReference Include="Inflector.NetStandard" Version="1.2.2" /> <PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="6.0.11" PrivateAssets="all" />