Skip to content

Commit 93464e6

Browse files
authored
remove objectives and strategy from project dto. (#356)
* remove objectives and strategy from project dto. * fix based on PR comments
1 parent 760bf32 commit 93464e6

12 files changed

Lines changed: 88 additions & 55 deletions

File tree

PrismaDotnetApi/PrismaApi.Api/Controllers/ObjectivesController.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -59,9 +59,11 @@ public async Task<ActionResult<List<ObjectiveOutgoingDto>>> GetAllObjectives(Can
5959
}
6060

6161
[HttpGet("projects/{projectId:guid}/objectives")]
62-
public IActionResult GetObjectivesByProject(Guid projectId, CancellationToken ct = default)
62+
public async Task<ActionResult<List<ObjectiveOutgoingDto>>> GetObjectivesByProject(Guid projectId, CancellationToken ct = default)
6363
{
64-
return StatusCode(StatusCodes.Status501NotImplemented);
64+
UserOutgoingDto user = HttpContext.GetLoadedUser();
65+
var result = await _objectiveService.GetByProjectAsync(projectId, user, ct);
66+
return Ok(result);
6567
}
6668

6769
[HttpPut("objectives")]

PrismaDotnetApi/PrismaApi.Api/Controllers/StrategiesController.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -83,9 +83,11 @@ public async Task<ActionResult<List<StrategyOutgoingDto>>> GetAllStrategies(Canc
8383
}
8484

8585
[HttpGet("projects/{projectId:guid}/strategies")]
86-
public IActionResult GetStrategiesByProject(Guid projectId, CancellationToken ct = default)
86+
public async Task<ActionResult<List<StrategyOutgoingDto>>> GetStrategiesByProject(Guid projectId, CancellationToken ct = default)
8787
{
88-
return StatusCode(StatusCodes.Status501NotImplemented);
88+
UserOutgoingDto user = HttpContext.GetLoadedUser();
89+
var result = await _strategyService.GetByProjectAsync(projectId, user, ct);
90+
return Ok(result);
8991
}
9092

9193
[HttpDelete("strategies/{id:guid}")]

PrismaDotnetApi/PrismaApi.Application/Interfaces/Services/IObjectiveService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ public interface IObjectiveService
77
Task<List<ObjectiveOutgoingDto>> CreateAsync(List<ObjectiveIncomingDto> dtos, UserOutgoingDto userDto, CancellationToken ct = default);
88
Task<List<ObjectiveOutgoingDto>> UpdateAsync(List<ObjectiveIncomingDto> dtos, UserOutgoingDto userDto, CancellationToken ct = default);
99
Task DeleteAsync(List<Guid> ids, UserOutgoingDto user, CancellationToken ct = default);
10+
Task<List<ObjectiveOutgoingDto>> GetByProjectAsync(Guid projectId, UserOutgoingDto user, CancellationToken ct = default);
1011
Task<List<ObjectiveOutgoingDto>> GetAsync(List<Guid> ids, UserOutgoingDto user, CancellationToken ct = default);
1112
Task<List<ObjectiveOutgoingDto>> GetAllAsync(UserOutgoingDto user, CancellationToken ct = default);
1213
}

PrismaDotnetApi/PrismaApi.Application/Interfaces/Services/IStrategyService.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,5 +8,6 @@ public interface IStrategyService
88
Task<List<StrategyOutgoingDto>> UpdateAsync(List<StrategyIncomingDto> dtos, UserOutgoingDto userDto, CancellationToken ct = default);
99
Task DeleteAsync(List<Guid> ids, UserOutgoingDto user, CancellationToken ct = default);
1010
Task<List<StrategyOutgoingDto>> GetAsync(List<Guid> ids, UserOutgoingDto user, CancellationToken ct = default);
11+
Task<List<StrategyOutgoingDto>> GetByProjectAsync(Guid projectId, UserOutgoingDto user, CancellationToken ct = default);
1112
Task<List<StrategyOutgoingDto>> GetAllAsync(UserOutgoingDto user, CancellationToken ct = default);
1213
}

PrismaDotnetApi/PrismaApi.Application/Mapping/ProjectMappingExtensions.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,6 @@ public static ProjectOutgoingDto ToOutgoingDto(this Project entity)
1717
OpportunityStatement = entity.OpportunityStatement,
1818
Public = entity.Public,
1919
EndDate = entity.EndDate,
20-
Objectives = entity.Objectives.ToOutgoingDtos(),
21-
Strategies = entity.Strategies.ToOutgoingDtos(),
2220
Users = entity.ProjectRoles.ToOutgoingDtos(),
2321
BoardNodes = entity.BoardNodes.ToOutgoingDtos(),
2422
};
@@ -30,15 +28,16 @@ public static PopulatedProjectDto ToPopulatedDto(this Project entity)
3028
{
3129
Id = entity.Id,
3230
Name = entity.Name,
31+
Objectives = entity.Objectives.ToOutgoingDtos(),
32+
Strategies = entity.Strategies.ToOutgoingDtos(),
3333
ParentProjectId = entity.ParentProjectId,
3434
ParentProjectName = entity.ParentProjectName ?? "",
3535
OpportunityStatement = entity.OpportunityStatement,
3636
Public = entity.Public,
3737
EndDate = entity.EndDate,
38-
Objectives = entity.Objectives.ToOutgoingDtos(),
39-
Strategies = entity.Strategies.ToOutgoingDtos(),
4038
Users = entity.ProjectRoles.ToOutgoingDtos(),
4139
BoardNodes = entity.BoardNodes.ToOutgoingDtos(),
40+
4241
};
4342
}
4443

@@ -63,9 +62,9 @@ public static FullProjectForDuplicationDto ToFullProjectForDuplicationDto(this P
6362
OpportunityStatement = entity.OpportunityStatement,
6463
Public = entity.Public,
6564
EndDate = entity.EndDate,
66-
Objectives = entity.Objectives.ToOutgoingDtos(),
67-
Strategies = entity.Strategies.ToOutgoingDtos(),
6865
Users = entity.ProjectRoles.ToOutgoingDtos(),
66+
strategies = entity.Strategies.ToOutgoingDtos(),
67+
objectives = entity.Objectives.ToOutgoingDtos(),
6968
Issues = entity.Issues.ToOutgoingDtos(),
7069
Edges = entity.Edges.ToOutgoingDtos(),
7170
BoardNodes = entity.BoardNodes.ToOutgoingDtos(),
@@ -86,7 +85,6 @@ public static Project ToEntity(this ProjectCreateDto dto, UserOutgoingDto userDt
8685
EndDate = dto.EndDate,
8786
CreatedById = userDto.Id,
8887
UpdatedById = userDto.Id,
89-
Objectives = dto.Objectives.ToEntities(dto.Id, userDto),
9088
ProjectRoles = dto.Users.ToEntities(userDto),
9189
BoardNodes = dto.BoardNodes.ToEntities(userDto),
9290
};
@@ -105,8 +103,6 @@ public static Project ToEntity(this ProjectIncomingDto dto, UserOutgoingDto user
105103
EndDate = dto.EndDate,
106104
CreatedById = userDto.Id,
107105
UpdatedById = userDto.Id,
108-
Objectives = dto.Objectives.ToEntities(dto.Id, userDto),
109-
Strategies = dto.Strategies.ToEntities(userDto),
110106
ProjectRoles = dto.Users.ToEntities(userDto),
111107
BoardNodes = dto.BoardNodes.ToEntities(userDto),
112108
};

PrismaDotnetApi/PrismaApi.Application/Repositories/ProjectRepository.cs

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,7 +60,7 @@ public async Task<IEnumerable<Project>> UpdateRangeAsync(IEnumerable<Project> in
6060
entity.ParentProjectName = incomingEntity.ParentProjectName;
6161
entity.EndDate = incomingEntity.EndDate;
6262
entity.UpdatedById = incomingEntity.UpdatedById;
63-
63+
6464
if (incomingEntity.ProjectRoles.Count == 0)
6565
{
6666
throw new InvalidOperationException("At least one project role is required.");
@@ -70,8 +70,6 @@ public async Task<IEnumerable<Project>> UpdateRangeAsync(IEnumerable<Project> in
7070
throw new InvalidOperationException(ExceptionMessages.MinimumFacilitatorRequirement);
7171
}
7272
entity.ProjectRoles.Update(incomingEntity.ProjectRoles, DbContext);
73-
entity.Objectives.Update(incomingEntity.Objectives, DbContext);
74-
entity.Strategies.Update(incomingEntity.Strategies, DbContext);
7573
entity.BoardNodes.Update(incomingEntity.BoardNodes, DbContext);
7674
}
7775

PrismaDotnetApi/PrismaApi.Application/Services/ObjectiveService.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77

88
namespace PrismaApi.Application.Services;
99

10-
public class ObjectiveService: IObjectiveService
10+
public class ObjectiveService : IObjectiveService
1111
{
1212
private readonly IObjectiveRepository _objectiveRepository;
1313

@@ -48,7 +48,14 @@ public async Task<List<ObjectiveOutgoingDto>> GetAllAsync(UserOutgoingDto user,
4848
var entities = await _objectiveRepository.GetAllAsync(withTracking: false, filterPredicate: UserFilter(user), ct: ct);
4949
return entities.ToOutgoingDtos();
5050
}
51+
public async Task<List<ObjectiveOutgoingDto>> GetByProjectAsync(Guid projectId, UserOutgoingDto user, CancellationToken ct = default)
52+
{
53+
var objectives = await _objectiveRepository.GetAllAsync(filterPredicate: ProjectAndUserFilter(projectId, user), ct: ct);
54+
return objectives.ToOutgoingDtos();
55+
}
5156

5257
private static Expression<Func<Objective, bool>> UserFilter(UserOutgoingDto user)
5358
=> e => e.Project!.ProjectRoles.Any(p => p.UserId == user.Id);
59+
private static Expression<Func<Objective, bool>> ProjectAndUserFilter(Guid projectId, UserOutgoingDto user)
60+
=> e => e.ProjectId == projectId && e.Project!.ProjectRoles.Any(p => p.UserId == user.Id);
5461
}

PrismaDotnetApi/PrismaApi.Application/Services/ProjectduplicationService.cs

Lines changed: 37 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ public class ProjectDuplicationService : IProjectDuplicationService
1717
private readonly IDiscreteProbabilityService _discreteProbabilityService;
1818
private readonly IDiscreteUtilityService _discreteUtilityService;
1919
private readonly IAssessmentService _assessmentService;
20+
private readonly IObjectiveService _objectiveService;
2021
private readonly IDecisionQualityAssessmentService _decisionQualityAssessmentService;
2122
private readonly IBoardNodeService _boardNodeService; private readonly IMemoryCache _cache;
2223

@@ -31,7 +32,8 @@ public ProjectDuplicationService(
3132
IMemoryCache cache,
3233
IAssessmentService assessmentService,
3334
IDecisionQualityAssessmentService decisionQualityAssessmentService,
34-
IBoardNodeService boardNodeService)
35+
IBoardNodeService boardNodeService,
36+
IObjectiveService objectiveService)
3537
{
3638
_duplicationRepo = duplicationRepo;
3739
_projectService = projectService;
@@ -43,6 +45,7 @@ public ProjectDuplicationService(
4345
_assessmentService = assessmentService;
4446
_decisionQualityAssessmentService = decisionQualityAssessmentService;
4547
_boardNodeService = boardNodeService;
48+
_objectiveService = objectiveService;
4649
_cache = cache;
4750
}
4851

@@ -115,7 +118,7 @@ public async Task<ProjectOutgoingDto> DuplicateAsync(Guid projectId, UserOutgoin
115118
if (discreteUtilityDtos.Count > 0)
116119
await _discreteUtilityService.CreateAsync(discreteUtilityDtos);
117120

118-
var strategyDtos = CreateStrategies(fullProject.Strategies, s => s.Options, newProjectId, mappings);
121+
var strategyDtos = CreateStrategies(fullProject.strategies, s => s.Options, newProjectId, mappings);
119122
if (strategyDtos.Count > 0)
120123
await _strategyService.CreateAsync(strategyDtos, user);
121124

@@ -130,7 +133,7 @@ public async Task<ProjectOutgoingDto> DuplicateAsync(Guid projectId, UserOutgoin
130133
if (assessmentDtos.Count > 0)
131134
await _assessmentService.CreateAsync(assessmentDtos, user);
132135

133-
var decisionQualityAssessmentDtos = CreateDecisionQualityAssessments(fullProject.Assessments.SelectMany(a => a.DecisionQualityAssessments ?? []), assessmentIdMap);
136+
var decisionQualityAssessmentDtos = CreateDecisionQualityAssessments(fullProject.Assessments.SelectMany(a => a.DecisionQualityAssessments ?? []), assessmentIdMap, newProjectId);
134137
if (decisionQualityAssessmentDtos.Count > 0)
135138
await _decisionQualityAssessmentService.CreateAsync(decisionQualityAssessmentDtos, user, ct);
136139

@@ -214,8 +217,10 @@ public async Task<ProjectOutgoingDto> DuplicateAsync(Guid projectId, UserOutgoin
214217
if (discreteUtilityDtos.Count > 0)
215218
await _discreteUtilityService.CreateAsync(discreteUtilityDtos);
216219

217-
var strategyDtos = CreateStrategies(dto.Projects.Strategies, s => s.Options, newProjectId, mappings);
218-
220+
var objectiveDtos = CreateObjectives(dto.Objectives, newProjectId);
221+
if (objectiveDtos.Count > 0)
222+
await _objectiveService.CreateAsync(objectiveDtos, user);
223+
var strategyDtos = CreateStrategies(dto.Strategies, s => s.Options, newProjectId, mappings);
219224
if (strategyDtos.Count > 0)
220225
await _strategyService.CreateAsync(strategyDtos, user);
221226

@@ -226,7 +231,7 @@ public async Task<ProjectOutgoingDto> DuplicateAsync(Guid projectId, UserOutgoin
226231
if (assessmentDtos.Count > 0)
227232
await _assessmentService.CreateAsync(assessmentDtos, user);
228233

229-
var decisionQualityAssessmentDtos = CreateDecisionQualityAssessments(dto.Assessments.SelectMany(a => a.DecisionQualityAssessments ?? []), assessmentIdMap);
234+
var decisionQualityAssessmentDtos = CreateDecisionQualityAssessments(dto.Assessments.SelectMany(a => a.DecisionQualityAssessments ?? []), assessmentIdMap, newProjectId);
230235
if (decisionQualityAssessmentDtos.Count > 0)
231236
await _decisionQualityAssessmentService.CreateAsync(decisionQualityAssessmentDtos, user, ct);
232237

@@ -247,15 +252,6 @@ private static ProjectCreateDto CreateProjectDto(FullProjectForDuplicationDto fu
247252
OpportunityStatement = fullProject.OpportunityStatement,
248253
Public = fullProject.Public,
249254
EndDate = fullProject.EndDate,
250-
Objectives = fullProject.Objectives
251-
.Select(o => new ObjectiveViaProjectDto
252-
{
253-
Id = Guid.NewGuid(),
254-
Name = o.Name,
255-
Description = o.Description,
256-
Type = o.Type
257-
})
258-
.ToList(),
259255
Users = fullProject.Users
260256
.Select(u => new ProjectRoleCreateDto
261257
{
@@ -279,15 +275,6 @@ private static ProjectCreateDto CreateProjectDtoFromImport(ProjectIncomingDto pr
279275
OpportunityStatement = project.OpportunityStatement,
280276
Public = project.Public,
281277
EndDate = project.EndDate,
282-
Objectives = project.Objectives
283-
.Select(o => new ObjectiveViaProjectDto
284-
{
285-
Id = Guid.NewGuid(),
286-
Name = o.Name,
287-
Description = o.Description,
288-
Type = o.Type
289-
})
290-
.ToList(),
291278
Users = project.Users
292279
.Select(u => new ProjectRoleCreateDto
293280
{
@@ -453,6 +440,29 @@ private static (UtilityIncomingDto? Utility, List<DiscreteUtilityDto> DiscreteUt
453440
return (utilityDto, mappedDiscreteUtilities);
454441
}
455442

443+
private static List<ObjectiveIncomingDto> CreateObjectives(IEnumerable<ObjectiveOutgoingDto> objectives, Guid newProjectId)
444+
{
445+
return objectives.Select(o => new ObjectiveIncomingDto
446+
{
447+
Id = Guid.NewGuid(),
448+
Name = o.Name,
449+
Description = o.Description,
450+
Type = o.Type,
451+
ProjectId = newProjectId
452+
}).ToList();
453+
}
454+
455+
private static List<ObjectiveIncomingDto> CreateObjectives(IEnumerable<ObjectiveIncomingDto> objectives, Guid newProjectId)
456+
{
457+
return objectives.Select(o => new ObjectiveIncomingDto
458+
{
459+
Id = Guid.NewGuid(),
460+
Name = o.Name,
461+
Description = o.Description,
462+
Type = o.Type,
463+
ProjectId = newProjectId
464+
}).ToList();
465+
}
456466
private static List<StrategyIncomingDto> CreateStrategies<TStrategy>(
457467
IEnumerable<TStrategy> strategies,
458468
Func<TStrategy, IEnumerable<OptionDto>> getOptions,
@@ -498,12 +508,14 @@ private static (List<AssessmentIncomingDto> Dtos, Dictionary<Guid, Guid> IdMap)
498508
}
499509
private static List<DecisionQualityAssessmentIncomingDto> CreateDecisionQualityAssessments<TDecisionQualityAssessment>(
500510
IEnumerable<TDecisionQualityAssessment> decisionQualityAssessments,
501-
Dictionary<Guid, Guid> assessmentIdMap) where TDecisionQualityAssessment : DecisionQualityAssessmentDto
511+
Dictionary<Guid, Guid> assessmentIdMap,
512+
Guid newProjectId) where TDecisionQualityAssessment : DecisionQualityAssessmentDto
502513
{
503514
return decisionQualityAssessments.Select(decisionQualityAssessment => new DecisionQualityAssessmentIncomingDto
504515
{
505516
Id = Guid.NewGuid(),
506517
AssessmentId = assessmentIdMap.GetValueOrDefault(decisionQualityAssessment.AssessmentId, decisionQualityAssessment.AssessmentId),
518+
ProjectId = newProjectId,
507519
AppropriateFrame = decisionQualityAssessment.AppropriateFrame,
508520
TradeOffAnalysis = decisionQualityAssessment.TradeOffAnalysis,
509521
ReasoningCorrectness = decisionQualityAssessment.ReasoningCorrectness,

PrismaDotnetApi/PrismaApi.Application/Services/StrategyService.cs

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
namespace PrismaApi.Application.Services;
1313

14-
public class StrategyService: IStrategyService
14+
public class StrategyService : IStrategyService
1515
{
1616
private readonly IStrategyRepository _strategyRepository;
1717

@@ -48,6 +48,12 @@ public async Task<List<StrategyOutgoingDto>> GetAsync(List<Guid> ids, UserOutgoi
4848
var strategies = await _strategyRepository.GetByIdsAsync(ids, filterPredicate: UserFilter(user), ct: ct);
4949
return strategies.ToOutgoingDtos();
5050
}
51+
public async Task<List<StrategyOutgoingDto>> GetByProjectAsync(Guid projectId, UserOutgoingDto user, CancellationToken ct = default)
52+
{
53+
54+
var strategies = await _strategyRepository.GetAllAsync(filterPredicate: ProjectAndUserFilter(projectId, user), ct: ct);
55+
return strategies.ToOutgoingDtos();
56+
}
5157

5258
public async Task<List<StrategyOutgoingDto>> GetAllAsync(UserOutgoingDto user, CancellationToken ct = default)
5359
{
@@ -57,4 +63,8 @@ public async Task<List<StrategyOutgoingDto>> GetAllAsync(UserOutgoingDto user, C
5763

5864
private static Expression<Func<Strategy, bool>> UserFilter(UserOutgoingDto user)
5965
=> e => e.Project!.ProjectRoles.Any(p => p.UserId == user.Id);
66+
67+
private static Expression<Func<Strategy, bool>> ProjectAndUserFilter(Guid projectId, UserOutgoingDto user)
68+
=> e => e.ProjectId == projectId && e.Project!.ProjectRoles.Any(p => p.UserId == user.Id);
69+
6070
}

PrismaDotnetApi/PrismaApi.Domain/Dtos/ProjectDtos.cs

Lines changed: 7 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,6 @@ public class ProjectDto
2424

2525
public class ProjectCreateDto : ProjectDto
2626
{
27-
[JsonPropertyName("objectives")]
28-
public List<ObjectiveViaProjectDto> Objectives { get; set; } = new();
2927
[JsonPropertyName("board_nodes")]
3028
public List<BoardNodeIncomingDto> BoardNodes { get; set; } = new();
3129
[JsonPropertyName("users")]
@@ -34,36 +32,33 @@ public class ProjectCreateDto : ProjectDto
3432

3533
public class ProjectIncomingDto : ProjectDto
3634
{
37-
[JsonPropertyName("objectives")]
38-
public List<ObjectiveViaProjectDto> Objectives { get; set; } = new();
3935
[JsonPropertyName("board_nodes")]
4036
public List<BoardNodeIncomingDto> BoardNodes { get; set; } = new();
41-
[JsonPropertyName("strategies")]
42-
public List<StrategyIncomingDto> Strategies { get; set; } = new();
37+
4338
[JsonPropertyName("users")]
4439
public List<ProjectRoleIncomingDto> Users { get; set; } = new();
4540
}
4641

4742
public class ProjectOutgoingDto : ProjectDto
4843
{
49-
[JsonPropertyName("objectives")]
50-
public List<ObjectiveOutgoingDto> Objectives { get; set; } = new();
44+
5145
[JsonPropertyName("board_nodes")]
5246
public List<BoardNodeOutgoingDto> BoardNodes { get; set; } = new();
53-
[JsonPropertyName("strategies")]
54-
public List<StrategyOutgoingDto> Strategies { get; set; } = new();
47+
5548
[JsonPropertyName("users")]
5649
public List<ProjectRoleOutgoingDto> Users { get; set; } = new();
5750
}
5851

5952
public class PopulatedProjectDto : ProjectDto
6053
{
54+
[JsonPropertyName("strategies")]
55+
public List<StrategyOutgoingDto> Strategies { get; set; } = new();
6156
[JsonPropertyName("objectives")]
6257
public List<ObjectiveOutgoingDto> Objectives { get; set; } = new();
58+
6359
[JsonPropertyName("board_nodes")]
6460
public List<BoardNodeOutgoingDto> BoardNodes { get; set; } = new();
65-
[JsonPropertyName("strategies")]
66-
public List<StrategyOutgoingDto> Strategies { get; set; } = new();
61+
6762
[JsonPropertyName("users")]
6863
public List<ProjectRoleOutgoingDto> Users { get; set; } = new();
6964
}

0 commit comments

Comments
 (0)