Skip to content

Commit

Permalink
Merge pull request #312 from microsoft/dev
Browse files Browse the repository at this point in the history
ensure names are unique
  • Loading branch information
colbylwilliams authored Feb 3, 2022
2 parents 80844d0 + 24e5658 commit 7994743
Show file tree
Hide file tree
Showing 12 changed files with 42 additions and 6 deletions.
9 changes: 9 additions & 0 deletions src/TeamCloud.API/Controllers/DeploymentScopesController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -95,6 +95,15 @@ public Task<IActionResult> Post([FromBody] DeploymentScopeDefinition deploymentS
.BadRequest(definitionValidationResult)
.ToActionResult();

var nameExists = await deploymentScopeRepository
.NameExistsAsync(organization.Id, deploymentScopeDefinition.Slug)
.ConfigureAwait(false);

if (nameExists)
return ErrorResult
.Conflict($"A Deployment Scope with name '{deploymentScopeDefinition.DisplayName}' already exists. Deployment Scope names must be unique. Please try your request again with a unique name.")
.ToActionResult();

var deploymentScope = new DeploymentScope
{
Id = Guid.NewGuid().ToString(),
Expand Down
8 changes: 4 additions & 4 deletions src/TeamCloud.API/Controllers/OrganizationsController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -102,16 +102,16 @@ public async Task<IActionResult> Post([FromBody] OrganizationDefinition organiza
.BadRequest(validationResult)
.ToActionResult();

var organization = await organizationRepository
.GetAsync(UserService.CurrentUserTenant, organizationDefinition.Slug)
var nameExists = await organizationRepository
.NameExistsAsync(UserService.CurrentUserTenant, organizationDefinition.Slug)
.ConfigureAwait(false);

if (organization is not null)
if (nameExists)
return ErrorResult
.Conflict($"The Organication '{organizationDefinition.Slug}' already exists. Please try your request again with a unique Organization Name or Id.")
.ToActionResult();

organization = new Organization
var organization = new Organization
{
Id = Guid.NewGuid().ToString(),
Tenant = UserService.CurrentUserTenant,
Expand Down
2 changes: 1 addition & 1 deletion src/TeamCloud.API/Controllers/ProjectController.cs
Original file line number Diff line number Diff line change
Expand Up @@ -131,7 +131,7 @@ public Task<IActionResult> Post([FromBody] ProjectDefinition projectDefinition)
.ToActionResult();

var nameExists = await projectRepository
.NameExistsAsync(organization.Id, projectDefinition.DisplayName)
.NameExistsAsync(organization.Id, projectDefinition.Slug)
.ConfigureAwait(false);

if (nameExists)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,14 @@ private void RemoveCachedIds(DeploymentScope deploymentScope)
cache.Remove($"{deploymentScope.Organization}_{deploymentScope.Id}");
}

public async Task<bool> NameExistsAsync(string organization, string name)
{
var project = await ResolveIdAsync(organization, name)
.ConfigureAwait(false);

return project is not null;
}

public override async Task<DeploymentScope> AddAsync(DeploymentScope deploymentScope)
{
if (deploymentScope is null)
Expand Down
8 changes: 8 additions & 0 deletions src/TeamCloud.Data/CosmosDb/CosmosDbOrganizationRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,14 @@ public async Task<string> ResolveIdAsync(string tenant, string identifier)
return id;
}

public async Task<bool> NameExistsAsync(string organization, string name)
{
var project = await ResolveIdAsync(organization, name)
.ConfigureAwait(false);

return project is not null;
}

public override async Task<Organization> AddAsync(Organization organization)
{
if (organization is null)
Expand Down
5 changes: 4 additions & 1 deletion src/TeamCloud.Data/IDeploymentScopeRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,9 @@ namespace TeamCloud.Data;

public interface IDeploymentScopeRepository : IDocumentRepository<DeploymentScope>
{
Task<string> ResolveIdAsync(string tenant, string identifier);
Task<bool> NameExistsAsync(string organization, string name);

Task<string> ResolveIdAsync(string organization, string identifier);

Task<DeploymentScope> GetDefaultAsync(string organization);
}
2 changes: 2 additions & 0 deletions src/TeamCloud.Data/IOrganizationRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,8 @@ namespace TeamCloud.Data;

public interface IOrganizationRepository : IDocumentRepository<Organization>
{
Task<bool> NameExistsAsync(string organization, string name);

Task<string> ResolveIdAsync(string tenant, string identifier);

IAsyncEnumerable<Organization> ListAsync(string tenant, IEnumerable<string> identifiers);
Expand Down
2 changes: 2 additions & 0 deletions src/TeamCloud.Data/IProjectTemplateRepository.cs
Original file line number Diff line number Diff line change
Expand Up @@ -10,5 +10,7 @@ namespace TeamCloud.Data;

public interface IProjectTemplateRepository : IDocumentRepository<ProjectTemplate>
{
// Task<bool> NameExistsAsync(string organization, string name);

Task<ProjectTemplate> GetDefaultAsync(string organization);
}
1 change: 1 addition & 0 deletions src/TeamCloud.Model/Data/Component.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ public sealed class Component : ContainerDocument, ISoftDelete, IProjectContext,
/// <summary>
/// Gets or sets the component's display name.
/// </summary>
[UniqueKey]
public string DisplayName { get; set; }

/// <summary>
Expand Down
1 change: 1 addition & 0 deletions src/TeamCloud.Model/Data/DeploymentScope.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ public sealed class DeploymentScope : ContainerDocument, IOrganizationContext, I
[JsonProperty(Required = Required.Always)]
public string Organization { get; set; }

[UniqueKey]
[JsonProperty(Required = Required.Always)]
public string DisplayName { get; set; }

Expand Down
1 change: 1 addition & 0 deletions src/TeamCloud.Model/Data/Organization.cs
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ public string Slug
set => slug = value;
}

[UniqueKey]
[JsonProperty(Required = Required.Always)]
public string DisplayName { get; set; }

Expand Down
1 change: 1 addition & 0 deletions src/TeamCloud.Model/Data/ProjectTemplate.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ public string Slug

public string Name { get; set; }

[UniqueKey]
[JsonProperty(Required = Required.Always)]
public string DisplayName { get; set; }

Expand Down

0 comments on commit 7994743

Please sign in to comment.