diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml index 49a1dddfdeb57fb2338b2f141b5c0ed4bbaf7236..532b61a2e2f790f0ba7e308820205826d94b4c04 100644 --- a/.gitlab-ci.yml +++ b/.gitlab-ci.yml @@ -21,8 +21,11 @@ migrate: 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 -p .\src\Database.Actions -- --action-create --name $DB_NAME --source $DB_DATA_SOURCE --user $DB_USER_ID --pw $DB_PASSWORD + - 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" # Remove the hardcoded Connection String inside \DataModel\Model.cs diff --git a/src/Database.Tests/Database.Tests.csproj b/src/Database.Tests/Database.Tests.csproj index a21a570ce100625917c4afbbb96643ec6ffba15f..960e65df2848f9ac8c5d443dd3082739b23667ef 100644 --- a/src/Database.Tests/Database.Tests.csproj +++ b/src/Database.Tests/Database.Tests.csproj @@ -19,4 +19,4 @@ <PackageReference Include="NUnit" Version="3.13.1" /> <PackageReference Include="NUnit3TestAdapter" Version="3.17.0" /> </ItemGroup> -</Project> \ No newline at end of file +</Project> diff --git a/src/Database/Models/GitlabResourceTypeModel.cs b/src/Database/Models/GitlabResourceTypeModel.cs index 1e2e7798c49cdcdb81c822310c9307946ebec84d..5028096547780674a05dfe78f53f5e3702468934 100644 --- a/src/Database/Models/GitlabResourceTypeModel.cs +++ b/src/Database/Models/GitlabResourceTypeModel.cs @@ -25,11 +25,14 @@ namespace Coscine.Database.Models public Dictionary<string, string> GetResourceTypeOptions(Guid id) { - var dictionary = new Dictionary<string, string>(); var resourceType = GetById(id); - dictionary.Add("token", resourceType.Token); - dictionary.Add("repositoryUrl", resourceType.RepositoryUrl); - dictionary.Add("repositoryNumber", resourceType.RepositoryNumber.ToString()); + var dictionary = new Dictionary<string, string> + { + { "branchName", resourceType.Branch }, + { "projectId", resourceType.GitlabProjectId.ToString() }, + { "repositoryUrl", resourceType.RepoUrl }, + { "accessToken", resourceType.ProjectAccessToken } + }; return dictionary; } } diff --git a/src/Database/Models/RDSResourceTypeModel.cs b/src/Database/Models/RDSResourceTypeModel.cs index 18f66d12e8031f08c5e34301979a0e2b874dd64d..c0e9a1edec9187c830fab8df7ceb461939005248 100644 --- a/src/Database/Models/RDSResourceTypeModel.cs +++ b/src/Database/Models/RDSResourceTypeModel.cs @@ -31,8 +31,7 @@ namespace Coscine.Database.Models { "accessKey", resourceType.AccessKey }, { "secretKey", resourceType.SecretKey }, { "bucketname", resourceType.BucketName }, - { "endpoint", resourceType.Endpoint }, - { "size", $"{resourceType.Size}" } + { "endpoint", resourceType.Endpoint } }; return dictionary; } diff --git a/src/Database/Models/RdsS3ResourceTypeModel.cs b/src/Database/Models/RdsS3ResourceTypeModel.cs index 84dc0c8f2aa4400892d59ff3a3143400b2cc852e..5b774ef82343731145bdef89842911108bcc6370 100644 --- a/src/Database/Models/RdsS3ResourceTypeModel.cs +++ b/src/Database/Models/RdsS3ResourceTypeModel.cs @@ -34,8 +34,7 @@ namespace Coscine.Database.Models { "accessKeyWrite", resourceType.AccessKeyWrite }, { "secretKeyWrite", resourceType.SecretKeyWrite }, { "bucketname", resourceType.BucketName }, - { "endpoint", resourceType.Endpoint }, - { "size", $"{resourceType.Size}" } + { "endpoint", resourceType.Endpoint } }; return dictionary; } diff --git a/src/Database/Models/RdsS3WormResourceTypeModel.cs b/src/Database/Models/RdsS3WormResourceTypeModel.cs index ba61b9a18f05b4b8c6433b7b8ca03c5d6a533d00..3d710d1ae788cc79ec8170a7b588cb75222fd474 100644 --- a/src/Database/Models/RdsS3WormResourceTypeModel.cs +++ b/src/Database/Models/RdsS3WormResourceTypeModel.cs @@ -34,8 +34,7 @@ namespace Coscine.Database.Models { "accessKeyWrite", resourceType.AccessKeyWrite }, { "secretKeyWrite", resourceType.SecretKeyWrite }, { "bucketname", resourceType.BucketName }, - { "endpoint", resourceType.Endpoint }, - { "size", $"{resourceType.Size}" } + { "endpoint", resourceType.Endpoint } }; return dictionary; } diff --git a/src/Database/Models/ResourceModel.cs b/src/Database/Models/ResourceModel.cs index 18fa9e8fdf88a1d2df75931d078cedb348b17e43..2252a0b5cb6ea02eb3b8640c2564bf76b2670e76 100644 --- a/src/Database/Models/ResourceModel.cs +++ b/src/Database/Models/ResourceModel.cs @@ -283,7 +283,7 @@ namespace Coscine.Database.Models { RDSResourceTypeModel rdsResourceTypeModel = new RDSResourceTypeModel(); var rdsResourceType = rdsResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value); - resourceTypeOptionObject = new RDSResourceTypeObject(rdsResourceType.Id, rdsResourceType.BucketName, (int)rdsResourceType.Size); + resourceTypeOptionObject = new RDSResourceTypeObject(rdsResourceType.Id, rdsResourceType.BucketName, null); } else if (resource.Type.Type == "s3" && resource.ResourceTypeOptionId != null) { @@ -295,7 +295,7 @@ namespace Coscine.Database.Models { GitlabResourceTypeModel gitlabResourceTypeModel = new GitlabResourceTypeModel(); var gitlabResourceType = gitlabResourceTypeModel.GetById(resource.ResourceTypeOptionId.Value); - resourceTypeOptionObject = new GitlabResourceTypeObject(gitlabResourceType.Id, gitlabResourceType.RepositoryNumber, gitlabResourceType.RepositoryUrl, null); + resourceTypeOptionObject = new GitlabResourceTypeObject(gitlabResourceType.Id, gitlabResourceType.Branch, gitlabResourceType.GitlabProjectId, gitlabResourceType.RepoUrl, gitlabResourceType.ProjectAccessToken); } else if (resource.Type.Type == "linked" && resource.ResourceTypeOptionId != null) { @@ -314,9 +314,9 @@ namespace Coscine.Database.Models Endpoint = rdsS3ResourceType.Endpoint, ReadAccessKey = rdsS3ResourceType.AccessKeyRead, ReadSecretKey = rdsS3ResourceType.SecretKeyRead, - Size = rdsS3ResourceType.Size, WriteAccessKey = rdsS3ResourceType.AccessKeyWrite, WriteSecretKey = rdsS3ResourceType.SecretKeyWrite, + Size = null }; } else if (resource.Type.Type == "rdss3worm" && resource.ResourceTypeOptionId != null) @@ -330,9 +330,9 @@ namespace Coscine.Database.Models Endpoint = rdsS3WormResourceType.Endpoint, ReadAccessKey = rdsS3WormResourceType.AccessKeyRead, ReadSecretKey = rdsS3WormResourceType.SecretKeyRead, - Size = rdsS3WormResourceType.Size, WriteAccessKey = rdsS3WormResourceType.AccessKeyWrite, WriteSecretKey = rdsS3WormResourceType.SecretKeyWrite, + Size = null }; } diff --git a/src/Database/ReturnObjects/GitlabResourceTypeObject.cs b/src/Database/ReturnObjects/GitlabResourceTypeObject.cs index 84124235f819620f49814a45e7a25322a0562ac4..0356fe1166de03801283b6f06fcdd6bb222e0fc8 100644 --- a/src/Database/ReturnObjects/GitlabResourceTypeObject.cs +++ b/src/Database/ReturnObjects/GitlabResourceTypeObject.cs @@ -6,17 +6,18 @@ namespace Coscine.Database.ReturnObjects public class GitlabResourceTypeObject : ResourceTypeOptionObject { public Guid Id { get; set; } + public string BranchName { get; set; } + public int ProjectId { get; set; } + public Uri RepositoryUrl { get; set; } + public string AccessToken { get; set; } - public int RepositoryNumber { get; set; } - public string RepositoryUrl { get; set; } - public string Token { get; set; } - - public GitlabResourceTypeObject(Guid id, int repositoryNumber, string repositoryUrl, string token) + public GitlabResourceTypeObject(Guid id, string branchName, int projectId, string repoUrl, string accessToken) { Id = id; - RepositoryNumber = repositoryNumber; - RepositoryUrl = repositoryUrl; - Token = token; + BranchName = branchName; + ProjectId = projectId; + RepositoryUrl = new Uri(repoUrl); + AccessToken = accessToken; } } } diff --git a/src/Database/ReturnObjects/InvitationReturnObject.cs b/src/Database/ReturnObjects/InvitationReturnObject.cs new file mode 100644 index 0000000000000000000000000000000000000000..ec68672e02aa90c7f75f719b60ece4f1345ec759 --- /dev/null +++ b/src/Database/ReturnObjects/InvitationReturnObject.cs @@ -0,0 +1,39 @@ +using System; + +namespace Coscine.Database.ReturnObjects; + +/// <summary> +/// Return object for a project invitation. +/// </summary> +public class InvitationReturnObject +{ + /// <summary> + /// The invitation id. + /// </summary> + public Guid Id { get; set; } + + /// <summary> + /// When the invite will expire. + /// </summary> + public DateTime Expiration { get; set; } + + /// <summary> + /// Email of the invitee. + /// </summary> + public string UserMail { get; set; } + + /// <summary> + /// Id of the issuer. + /// </summary> + public Guid Issuer { get; set; } + + /// <summary> + /// Id of the project. + /// </summary> + public Guid ProjectId { get; set; } + + /// <summary> + /// Id of the target Role. + /// </summary> + public Guid RoleId { get; set; } +} \ No newline at end of file diff --git a/src/Database/ReturnObjects/ProjectQuotaExtendedReturnObject.cs b/src/Database/ReturnObjects/ProjectQuotaExtendedReturnObject.cs new file mode 100644 index 0000000000000000000000000000000000000000..e4068f1e7be935eab635cdaa442f58f05e41074b --- /dev/null +++ b/src/Database/ReturnObjects/ProjectQuotaExtendedReturnObject.cs @@ -0,0 +1,40 @@ +using System; +using System.Collections.Generic; + +namespace Coscine.Database.ReturnObjects; + +/// <summary> +/// Contains information about the quota of a project by resource type. +/// </summary> +public class ProjectQuotaExtendedReturnObject +{ + /// <summary> + /// Id of the resoure type. + /// </summary> + public Guid Id { get; set; } + + /// <summary> + /// Display name of the resource type. + /// </summary> + public string Name { get; set; } + + /// <summary> + /// How much space is reserved by resources in total [GiB]. Is equal to the sum of all resource quota reserved values. + /// </summary> + public QuotaDimObject TotalReserved { get; set; } + + /// <summary> + /// How much space is currently allocated and is available to be taken by resources [GiB] (See Database, Table 'ProjectQuotas', Column 'Quota'). + /// </summary> + public QuotaDimObject Allocated { get; set; } + + /// <summary> + /// How much maximum space is possible to be taken by resources [GiB] (See Database, Table 'ProjectQuotas', Column 'MaxQuota'). + /// </summary> + public QuotaDimObject Maximum { get; set; } + + /// <summary> + /// Resources quota for all individual resources of a resource type in a selected project. + /// </summary> + public IEnumerable<ResourceQuotaReturnObject> ResourcesQuota { get; set; } +} \ No newline at end of file diff --git a/src/Database/ReturnObjects/ProjectQuotaReturnObject.cs b/src/Database/ReturnObjects/ProjectQuotaReturnObject.cs new file mode 100644 index 0000000000000000000000000000000000000000..dd9382fa63e77e98070a7d889ab5f11a711ce43c --- /dev/null +++ b/src/Database/ReturnObjects/ProjectQuotaReturnObject.cs @@ -0,0 +1,35 @@ +using System; +using System.Collections.Generic; + +namespace Coscine.Database.ReturnObjects; + +/// <summary> +/// Contains information about the quota of a project by resource type. +/// </summary> +public class ProjectQuotaReturnObject +{ + /// <summary> + /// Id of the resoure type. + /// </summary> + public Guid Id { get; set; } + + /// <summary> + /// Display name of the resource type. + /// </summary> + public string Name { get; set; } + + /// <summary> + /// How much space is reserved by resources in total [GiB]. Is equal to the sum of all resource quota reserved values. + /// </summary> + public QuotaDimObject TotalReserved { get; set; } + + /// <summary> + /// How much space is currently allocated and is available to be taken by resources [GiB] (See Database, Table 'ProjectQuotas', Column 'Quota'). + /// </summary> + public QuotaDimObject Allocated { get; set; } + + /// <summary> + /// How much maximum space is possible to be taken by resources [GiB] (See Database, Table 'ProjectQuotas', Column 'MaxQuota'). + /// </summary> + public QuotaDimObject Maximum { get; set; } +} \ No newline at end of file diff --git a/src/Database/ReturnObjects/QuotaDimObject.cs b/src/Database/ReturnObjects/QuotaDimObject.cs new file mode 100644 index 0000000000000000000000000000000000000000..f610b15aa64c6d60bf6c74685b78bb0e03d55998 --- /dev/null +++ b/src/Database/ReturnObjects/QuotaDimObject.cs @@ -0,0 +1,8 @@ +namespace Coscine.Database.ReturnObjects; + +public class QuotaDimObject +{ + public float Value { get; set; } + public QuotaUnit Unit { get; set; } +} + diff --git a/src/Database/ReturnObjects/QuotaUnit.cs b/src/Database/ReturnObjects/QuotaUnit.cs new file mode 100644 index 0000000000000000000000000000000000000000..210ccc1a18b52621bd19731222f2f7eeedd39939 --- /dev/null +++ b/src/Database/ReturnObjects/QuotaUnit.cs @@ -0,0 +1,34 @@ +using Newtonsoft.Json; +using Newtonsoft.Json.Converters; +using System.ComponentModel; +using System.Runtime.Serialization; + +namespace Coscine.Database.ReturnObjects; + +[JsonConverter(typeof(StringEnumConverter))] +public enum QuotaUnit +{ + [Description("The byte is a unit of digital information in computing and telecommunications that most commonly consists of eight bits.")] + [EnumMember(Value = "https://qudt.org/vocab/unit/BYTE")] + BYTE, + + [Description("The kibibyte is a multiple of the unit byte for digital information equivalent to 1024 bytes.")] + [EnumMember(Value = "https://qudt.org/vocab/unit/KibiBYTE")] + KibiBYTE, + + [Description("The mebibyte is a multiple of the unit byte for digital information equivalent to 1024^2 or 2^20 bytes.")] + [EnumMember(Value = "https://qudt.org/vocab/unit/MebiBYTE")] + MebiBYTE, + + [Description("The gibibyte is a multiple of the unit byte for digital information storage. The prefix gibi means 1024^3.")] + [EnumMember(Value = "https://qudt.org/vocab/unit/GibiBYTE")] + GibiBYTE, + + [Description("The tebibyte is a multiple of the unit byte for digital information. The prefix tebi means 1024^4.")] + [EnumMember(Value = "https://qudt.org/vocab/unit/TebiBYTE")] + TebiBYTE, + + [Description("The tebibyte is a multiple of the unit byte for digital information. The prefix tebi means 1024^5.")] + [EnumMember(Value = "https://qudt.org/vocab/unit/PebiBYTE")] + PebiBYTE, +} \ No newline at end of file diff --git a/src/Database/ReturnObjects/RDSResourceTypeObject.cs b/src/Database/ReturnObjects/RDSResourceTypeObject.cs index 5e6cfdd30efb0b08b827d21e7290cf8035f6a141..25aeeb9c8d4013e89aba877f9d82ed13437a2149 100644 --- a/src/Database/ReturnObjects/RDSResourceTypeObject.cs +++ b/src/Database/ReturnObjects/RDSResourceTypeObject.cs @@ -7,9 +7,9 @@ namespace Coscine.Database.ReturnObjects { public Guid Id { get; set; } public string BucketName { get; set; } - public int Size { get; set; } + public int? Size { get; set; } - public RDSResourceTypeObject(Guid id, string bucketName, int size) + public RDSResourceTypeObject(Guid id, string bucketName, int? size) { Id = id; BucketName = bucketName; diff --git a/src/Database/ReturnObjects/RdsS3ResourceTypeObject.cs b/src/Database/ReturnObjects/RdsS3ResourceTypeObject.cs index 300abbe6b3e0a964d100377e1b5d557a1973c934..22b16a5ca1c435af1c4cbd40868f9bc160d1bdb9 100644 --- a/src/Database/ReturnObjects/RdsS3ResourceTypeObject.cs +++ b/src/Database/ReturnObjects/RdsS3ResourceTypeObject.cs @@ -12,6 +12,6 @@ namespace Coscine.Database.ReturnObjects public string WriteAccessKey { get; set; } public string WriteSecretKey { get; set; } public string Endpoint { get; set; } - public int Size { get; set; } + public int? Size { get; set; } } } \ No newline at end of file diff --git a/src/Database/ReturnObjects/ResourceQuotaReturnObject.cs b/src/Database/ReturnObjects/ResourceQuotaReturnObject.cs new file mode 100644 index 0000000000000000000000000000000000000000..10b2063ce430ca26639dd193311d0d7070e36179 --- /dev/null +++ b/src/Database/ReturnObjects/ResourceQuotaReturnObject.cs @@ -0,0 +1,30 @@ +using System; + +namespace Coscine.Database.ReturnObjects; + +/// <summary> +/// Contains information about the quota of a resource. +/// </summary> +public class ResourceQuotaReturnObject +{ + /// <summary> + /// Id of the resoure. + /// </summary> + public Guid Id { get; set; } + /// <summary> + /// Display name of the resource. + /// </summary> + public string Name { get; set; } + /// <summary> + /// How much space is used by all files in a resource [Bytes]. + /// </summary> + public QuotaDimObject Used { get; set; } + /// <summary> + /// How much space is used by all files in a resource [%]. + /// </summary> + public float UsedPercentage { get; set; } + /// <summary> + /// How much space is reserved and is available to be taken by the resource [GiB]. This number represents its capacity. + /// </summary> + public QuotaDimObject Reserved { get; set; } +} diff --git a/src/Scaffolding/DataModel/GitlabResourceType.cs b/src/Scaffolding/DataModel/GitlabResourceType.cs index 3291a9b9b420794e08c70e1fe81c5150894f8d33..8840a2f310ae0c165b2103a5ac0c7ec64e1dcf69 100644 --- a/src/Scaffolding/DataModel/GitlabResourceType.cs +++ b/src/Scaffolding/DataModel/GitlabResourceType.cs @@ -10,8 +10,9 @@ namespace Coscine.Database.DataModel public partial class GitlabResourceType { public Guid Id { get; set; } - public int RepositoryNumber { get; set; } - public string RepositoryUrl { get; set; } - public string Token { get; set; } + public string Branch { get; set; } + public int GitlabProjectId { get; set; } + public string RepoUrl { get; set; } + public string ProjectAccessToken { get; set; } } } diff --git a/src/Scaffolding/DataModel/Model.cs b/src/Scaffolding/DataModel/Model.cs index 8459260266470b22f3c3fe04137514e78fe90c8a..66bc3ad147c69b5cd034c173c94d1b564af5e741 100644 --- a/src/Scaffolding/DataModel/Model.cs +++ b/src/Scaffolding/DataModel/Model.cs @@ -196,13 +196,17 @@ namespace Coscine.Database.DataModel entity.Property(e => e.Id).HasDefaultValueSql("(newid())"); - entity.Property(e => e.RepositoryUrl) + entity.Property(e => e.Branch) .IsRequired() - .HasMaxLength(500); + .HasMaxLength(200); + + entity.Property(e => e.ProjectAccessToken) + .IsRequired() + .HasMaxLength(200); - entity.Property(e => e.Token) + entity.Property(e => e.RepoUrl) .IsRequired() - .HasMaxLength(100); + .HasMaxLength(200); }); modelBuilder.Entity<Group>(entity => diff --git a/src/Scaffolding/DataModel/RdsS3resourceType.cs b/src/Scaffolding/DataModel/RdsS3resourceType.cs index 6250906657462ace5352d34215efb22cd46976e4..d12f37f8729fba7a3183927fbf69df4beae39ad4 100644 --- a/src/Scaffolding/DataModel/RdsS3resourceType.cs +++ b/src/Scaffolding/DataModel/RdsS3resourceType.cs @@ -18,6 +18,5 @@ namespace Coscine.Database.DataModel public string AccessKeyWrite { get; set; } public string SecretKeyWrite { get; set; } public string Endpoint { get; set; } - public int Size { get; set; } } } diff --git a/src/Scaffolding/DataModel/RdsS3wormResourceType.cs b/src/Scaffolding/DataModel/RdsS3wormResourceType.cs index be2ba6dd5c808fc01c47f9eb68a579383f70566d..f1e983acc4138dcdbf529cd9a6681679222c67cd 100644 --- a/src/Scaffolding/DataModel/RdsS3wormResourceType.cs +++ b/src/Scaffolding/DataModel/RdsS3wormResourceType.cs @@ -18,6 +18,5 @@ namespace Coscine.Database.DataModel public string AccessKeyWrite { get; set; } public string SecretKeyWrite { get; set; } public string Endpoint { get; set; } - public int Size { get; set; } } } diff --git a/src/Scaffolding/DataModel/RdsresourceType.cs b/src/Scaffolding/DataModel/RdsresourceType.cs index 673987713bec53d79a4ad8e13467022dfd043359..158142d103d4043109542acfc3313b5ebe8d1eaf 100644 --- a/src/Scaffolding/DataModel/RdsresourceType.cs +++ b/src/Scaffolding/DataModel/RdsresourceType.cs @@ -11,7 +11,6 @@ namespace Coscine.Database.DataModel { public Guid Id { get; set; } public string BucketName { get; set; } - public int? Size { get; set; } public string AccessKey { get; set; } public string SecretKey { get; set; } public string Endpoint { get; set; }