Skip to content

Commit f57c21a

Browse files
feat: update facilitator role removal logic in AppDbContext (#339)
* feat: update facilitator role removal logic in AppDbContext * feat: enforce minimum facilitator requirement in project updates * fix: update namespace references from Scampi to PrismaApi in multiple files * feat: enforce project role requirement on updates
1 parent 2dbcc69 commit f57c21a

10 files changed

Lines changed: 40 additions & 19 deletions

File tree

PrismaDotnetApi/PrismaApi.Api/Controllers/SolversController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using Microsoft.AspNetCore.Mvc;
22
using PrismaApi.Application.Interfaces.Services;
33
using PrismaApi.Domain.Dtos;
4-
using Scampi.Domain.Extensions;
4+
using PrismaApi.Domain.Extensions;
55
using System.Net;
66
using PrismaApi.Api.Extensions;
77

PrismaDotnetApi/PrismaApi.Api/Controllers/StuctureController.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using Microsoft.AspNetCore.Mvc;
22
using PrismaApi.Application.Interfaces.Services;
33
using PrismaApi.Domain.Dtos;
4-
using Scampi.Domain.Extensions;
4+
using PrismaApi.Domain.Extensions;
55
using System.Net;
66
using PrismaApi.Api.Extensions;
77

PrismaDotnetApi/PrismaApi.Application/Repositories/ProjectRepository.cs

Lines changed: 11 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using PrismaApi.Domain.Constants;
44
using PrismaApi.Domain.Dtos;
55
using PrismaApi.Domain.Entities;
6+
using PrismaApi.Domain.Extensions;
67
using PrismaApi.Infrastructure.Context;
78
using System.Linq.Expressions;
89

@@ -41,11 +42,11 @@ public async Task<IEnumerable<Project>> UpdateRangeAsync(IEnumerable<Project> in
4142
var entities = await GetByIdsAsync(incomingEntities.Select(e => e.Id), withTracking: true, filterPredicate: filterPredicate, ct: ct);
4243
foreach (var entity in entities)
4344
{
44-
var incomingEntity = incomingEntities.Where(x => x.Id == entity.Id).First();
45+
var incomingEntity = incomingEntities.First(x => x.Id == entity.Id);
4546

4647
// if user is not a facillitator, they cannnot change the role type.
4748
bool isUserFacillitator = entity.ProjectRoles
48-
.Any(r => string.Equals(r.Role, ProjectRoleType.Facilitator.ToString(), StringComparison.OrdinalIgnoreCase) && r.UserId == userDto.Id);
49+
.Any(r => r.Role.IsFacilitator() && r.UserId == userDto.Id);
4950

5051
if (!isUserFacillitator)
5152
{
@@ -59,11 +60,16 @@ public async Task<IEnumerable<Project>> UpdateRangeAsync(IEnumerable<Project> in
5960
entity.ParentProjectName = incomingEntity.ParentProjectName;
6061
entity.EndDate = incomingEntity.EndDate;
6162
entity.UpdatedById = incomingEntity.UpdatedById;
62-
63-
if (incomingEntity.ProjectRoles.Count != 0)
63+
64+
if (incomingEntity.ProjectRoles.Count == 0)
65+
{
66+
throw new InvalidOperationException("At least one project role is required.");
67+
}
68+
if (!incomingEntity.ProjectRoles.Any(x => x.Role.IsFacilitator()))
6469
{
65-
entity.ProjectRoles.Update(incomingEntity.ProjectRoles, DbContext);
70+
throw new InvalidOperationException(ExceptionMessages.MinimumFacilitatorRequirement);
6671
}
72+
entity.ProjectRoles.Update(incomingEntity.ProjectRoles, DbContext);
6773
entity.Objectives.Update(incomingEntity.Objectives, DbContext);
6874
entity.Strategies.Update(incomingEntity.Strategies, DbContext);
6975
entity.BoardNodes.Update(incomingEntity.BoardNodes, DbContext);

PrismaDotnetApi/PrismaApi.Application/Services/InternalUserService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
using PrismaApi.Domain.Constants;
99
using PrismaApi.Domain.Dtos;
1010
using PrismaApi.Infrastructure.Caching;
11-
using Scampi.Domain.Extensions;
11+
using PrismaApi.Domain.Extensions;
1212

1313
namespace PrismaApi.Application.Services;
1414

PrismaDotnetApi/PrismaApi.Application/Services/PublicUserService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
using PrismaApi.Domain.Constants;
77
using PrismaApi.Domain.Dtos;
88
using PrismaApi.Infrastructure.Caching;
9-
using Scampi.Domain.Extensions;
9+
using PrismaApi.Domain.Extensions;
1010

1111
namespace PrismaApi.Application.Services;
1212

PrismaDotnetApi/PrismaApi.Application/Services/TableRebuildingService.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
using PrismaApi.Domain.Dtos;
55
using PrismaApi.Domain.Entities;
66
using PrismaApi.Infrastructure.Context;
7-
using Scampi.Domain.Extensions;
7+
using PrismaApi.Domain.Extensions;
88

99
namespace PrismaApi.Application.Services;
1010

PrismaDotnetApi/PrismaApi.Domain/Constants/DomainConstants.cs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -95,3 +95,8 @@ public enum BoardNodeStrokeStyles
9595
Dashed,
9696
Dotted,
9797
}
98+
99+
public static class ExceptionMessages
100+
{
101+
public const string MinimumFacilitatorRequirement = "Projects must have at least one Facilitator.";
102+
};
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
using PrismaApi.Domain.Constants;
2+
3+
namespace PrismaApi.Domain.Extensions;
4+
5+
public static class ProjectRoleTypeExtensions
6+
{
7+
public static bool IsFacilitator(this string role) =>
8+
string.Equals(role, ProjectRoleType.Facilitator.ToString(), StringComparison.OrdinalIgnoreCase);
9+
}

PrismaDotnetApi/PrismaApi.Domain/Extensions/StringExtensions.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
using System.Text;
33
using System.Security.Cryptography;
44

5-
namespace Scampi.Domain.Extensions;
5+
namespace PrismaApi.Domain.Extensions;
66

77
public static partial class StringExtensions
88
{

PrismaDotnetApi/PrismaApi.Infrastructure/Context/AppDbContext.cs

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
using Microsoft.Extensions.Caching.Memory;
44
using PrismaApi.Domain.Constants;
55
using PrismaApi.Domain.Entities;
6+
using PrismaApi.Domain.Extensions;
67
using PrismaApi.Domain.Interfaces;
78
using PrismaApi.Infrastructure.DiscreteTables;
89

@@ -146,25 +147,25 @@ private async Task EnforceMinimumProjectRoles(CancellationToken cancellationToke
146147

147148
foreach (var (projectId, roles) in affectedByProject)
148149
{
150+
var facilitatorRole = ProjectRoleType.Facilitator.ToString();
151+
149152
var facilitatorsBeingRemoved = roles.Count(role =>
150153
role.State == EntityState.Deleted
151-
? string.Equals(role.Entity.Role, ProjectRoleType.Facilitator.ToString(), StringComparison.OrdinalIgnoreCase)
152-
: string.Equals(
153-
role.OriginalValues.GetValue<string>(nameof(ProjectRole.Role)),
154-
ProjectRoleType.Facilitator.ToString(),
155-
StringComparison.OrdinalIgnoreCase));
154+
? role.Entity.Role.IsFacilitator()
155+
: role.OriginalValues.GetValue<string>(nameof(ProjectRole.Role)).IsFacilitator()
156+
&& !role.CurrentValues.GetValue<string>(nameof(ProjectRole.Role)).IsFacilitator());
156157

157158
if (facilitatorsBeingRemoved == 0)
158159
continue;
159160

160161
var currentFacilitatorCount = await ProjectRoles
161162
.AsNoTracking()
162163
.CountAsync(r => r.ProjectId == projectId &&
163-
r.Role.ToUpper() == ProjectRoleType.Facilitator.ToString().ToUpper(),
164-
cancellationToken);
164+
r.Role.IsFacilitator(),
165+
cancellationToken);
165166

166167
if (currentFacilitatorCount - facilitatorsBeingRemoved <= 0)
167-
throw new InvalidOperationException("Projects must have at least one Facilitator.");
168+
throw new InvalidOperationException(ExceptionMessages.MinimumFacilitatorRequirement);
168169
}
169170
}
170171

0 commit comments

Comments
 (0)