diff --git a/src/Database/Models/ProjectModel.cs b/src/Database/Models/ProjectModel.cs index 1e7efeaea33ecfe85a21cce1189f8d361c294178..a641e36ead2f93fb7213a35a2321f78ae50300e7 100644 --- a/src/Database/Models/ProjectModel.cs +++ b/src/Database/Models/ProjectModel.cs @@ -7,6 +7,7 @@ using Coscine.Database.DataModel; using LinqToDB; using Coscine.Database.Util; using LinqKit; +using System.Text.RegularExpressions; namespace Coscine.Database.Models { @@ -37,6 +38,11 @@ namespace Coscine.Database.Models }); } + public Project GetBySlug(String slug) + { + return GetWhere((tableEntry) => tableEntry.Slug == slug); + } + public Project GetByIdIncludingDeleted(Guid id) { var expression = GetIdFromObject(); @@ -144,6 +150,7 @@ namespace Coscine.Database.Models ProjectName = projectObject.ProjectName, PrincipleInvestigators = projectObject.PrincipleInvestigators, GrantId = projectObject.GrantId, + Slug = GenerateSlug(projectObject), VisibilityId = projectObject.Visibility.Id, }; @@ -162,6 +169,41 @@ namespace Coscine.Database.Models return project; } + private String GenerateSlug(ProjectObject projectObject) + { + // create slug for project + var slug = projectObject.DisplayName; + slug = slug.ToLower(); + slug = Regex.Replace(slug, @"[\s-]+", "-"); + slug = Regex.Replace(slug, @"[^a-z0-9-]*|", ""); + slug = Regex.Replace(slug, @"^-|-$", ""); + + Random r = new Random(); + int rInt = r.Next(0, 9000000) + 1000000; + string fullSlug = "" + rInt; + + if (slug.Length >= 7) + { + rInt = r.Next(0, 9000) + 1000; + fullSlug = slug; + } + + if (GetBySlug(fullSlug) != null) + { + if (slug.Length >= 7) + { + fullSlug = slug + "-"; + } + while (GetBySlug(fullSlug + rInt) != null) + { + rInt++; + }; + fullSlug += rInt; + } + + return fullSlug; + } + private void SetDisciplines(Project project, IEnumerable<DisciplineObject> disciplines) { ProjectDisciplineModel projectDisciplineModel = new ProjectDisciplineModel(); @@ -332,6 +374,7 @@ namespace Coscine.Database.Models disciplines, organizations, project.Visibility == null ? null : new VisibilityObject(project.Visibility.Id, project.Visibility.DisplayName), + project.Slug, parentId); } diff --git a/src/Database/Models/ResourceModel.cs b/src/Database/Models/ResourceModel.cs index a454c3d6c8372ded109e6b6a187b249555a9b886..1aeb03cebc3ab2a60a4ca1bbc16f0b0bb816acd1 100644 --- a/src/Database/Models/ResourceModel.cs +++ b/src/Database/Models/ResourceModel.cs @@ -13,8 +13,6 @@ namespace Coscine.Database.Models { public class ResourceModel : DatabaseModel<Resource> { - private readonly IConfiguration _configuration = new ConsulConfiguration(); - public Resource StoreFromObject(ResourceObject resourceObject) { if (resourceObject.Disciplines.Count() == 0 || resourceObject.ResourceTypeOption == null) @@ -90,7 +88,7 @@ namespace Coscine.Database.Models { RDSResourceType rdsResourceType = new RDSResourceType() { - BucketName = GetRDSBucketName(), + BucketName = resource.Id.ToString(), Size = rdsResourceTypeObject.Size, }; rdsResourceTypeModel.Insert(rdsResourceType); @@ -158,17 +156,6 @@ namespace Coscine.Database.Models } } - private string GetRDSBucketName() - { - var prefix = _configuration.GetStringAndWait("coscine/global/buckets/prefix"); - var number = Int32.Parse(_configuration.GetStringAndWait("coscine/global/buckets/currentid")); - var maxNumber = Int32.Parse(_configuration.GetStringAndWait("coscine/global/buckets/highestid")); - var newNumber = number % maxNumber == 0 ? 1 : number + 1; - _configuration.Put("coscine/global/buckets/currentid", "" + newNumber); - - return String.Format("{0}{1,3:000}", prefix, number); - } - private void SetDisciplines(Resource resource, IEnumerable<DisciplineObject> disciplines) { ResourceDisciplineModel resourceDisciplineModel = new ResourceDisciplineModel(); @@ -323,7 +310,7 @@ namespace Coscine.Database.Models (resource.License != null) ? new LicenseObject(resource.License.Id, resource.License.DisplayName) : null, JObject.FromObject(resourceTypeOptionObject), resource.ApplicationProfile, - JToken.Parse(resource.FixedValues == null ? "{}": resource.FixedValues ), + JToken.Parse(resource.FixedValues ?? "{}"), (resource.Creator != null) ? resource.Creator : null ); } diff --git a/src/Database/ReturnObjects/ProjectObject.cs b/src/Database/ReturnObjects/ProjectObject.cs index ce10c1b14290d2b622c27c08f86c22966c86e039..21df41588c64e1cef3cc15e054f46a3cab798488 100644 --- a/src/Database/ReturnObjects/ProjectObject.cs +++ b/src/Database/ReturnObjects/ProjectObject.cs @@ -18,6 +18,7 @@ namespace Coscine.Database.ReturnObjects public string ProjectName { get; set; } public string PrincipleInvestigators { get; set; } public string GrantId { get; set; } + public string Slug { get; set; } public IEnumerable<DisciplineObject> Disciplines { get; set; } public IEnumerable<OrganizationObject> Organizations { get; set; } @@ -25,7 +26,7 @@ namespace Coscine.Database.ReturnObjects public Guid ParentId { get; set; } - public ProjectObject(Guid id, string description, string displayName, DateTime startDate, DateTime endDate, string keywords, string projectName, string principleInvestigators, string grantId, IEnumerable<DisciplineObject> discipline, IEnumerable<OrganizationObject> organization, VisibilityObject visibility, Guid parentId = new Guid()) + public ProjectObject(Guid id, string description, string displayName, DateTime startDate, DateTime endDate, string keywords, string projectName, string principleInvestigators, string grantId, IEnumerable<DisciplineObject> discipline, IEnumerable<OrganizationObject> organization, VisibilityObject visibility, string slug, Guid parentId = new Guid()) { Id = id; Description = description; @@ -38,6 +39,7 @@ namespace Coscine.Database.ReturnObjects ProjectName = projectName; PrincipleInvestigators = principleInvestigators; GrantId = grantId; + Slug = slug; Disciplines = discipline; Organizations = organization;