Skip to content

Commit d509f52

Browse files
Thierry Habarthabarthierry-hue
authored andcommitted
Ticket 24 : Display case plan instances
1 parent aeb1166 commit d509f52

116 files changed

Lines changed: 1639 additions & 571 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

Architecture.pptx

5.2 KB
Binary file not shown.

src/CaseManagement.CMMN.AspNetCore/Apis/CasePlanInstancesController.cs

Lines changed: 29 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,9 @@ public class CasePlanInstancesController : Controller
3535
private readonly IActivateCommandHandler _activateCommandHandler;
3636
private readonly ICasePlanInstanceQueryRepository _cmmnWorkflowInstanceQueryRepository;
3737
private readonly ICaseFileItemRepository _caseFileItemRepository;
38+
private readonly IRoleQueryRepository _roleQueryRepository;
3839

39-
public CasePlanInstancesController(ICreateCaseInstanceCommandHandler createCaseInstanceCommandHandler, ILaunchCaseInstanceCommandHandler launchCaseInstanceCommandHandler, ISuspendCommandHandler suspendCommandHandler, IResumeCommandHandler resumeCommandHandler, ITerminateCommandHandler terminateCommandHandler, IReactivateCommandHandler reactivateCommandHandler, ICloseCommandHandler closeCommandHandler, IConfirmFormCommandHandler confirmFormCommandHandler, IActivateCommandHandler activateCommandHandler, ICasePlanInstanceQueryRepository cmmnWorkflowInstanceQueryRepository, ICaseFileItemRepository caseFileItemRepository)
40+
public CasePlanInstancesController(ICreateCaseInstanceCommandHandler createCaseInstanceCommandHandler, ILaunchCaseInstanceCommandHandler launchCaseInstanceCommandHandler, ISuspendCommandHandler suspendCommandHandler, IResumeCommandHandler resumeCommandHandler, ITerminateCommandHandler terminateCommandHandler, IReactivateCommandHandler reactivateCommandHandler, ICloseCommandHandler closeCommandHandler, IConfirmFormCommandHandler confirmFormCommandHandler, IActivateCommandHandler activateCommandHandler, ICasePlanInstanceQueryRepository cmmnWorkflowInstanceQueryRepository, ICaseFileItemRepository caseFileItemRepository, IRoleQueryRepository roleQueryRepository)
4041
{
4142
_createCaseInstanceCommandHandler = createCaseInstanceCommandHandler;
4243
_launchCaseInstanceCommandHandler = launchCaseInstanceCommandHandler;
@@ -49,6 +50,7 @@ public CasePlanInstancesController(ICreateCaseInstanceCommandHandler createCaseI
4950
_activateCommandHandler = activateCommandHandler;
5051
_cmmnWorkflowInstanceQueryRepository = cmmnWorkflowInstanceQueryRepository;
5152
_caseFileItemRepository = caseFileItemRepository;
53+
_roleQueryRepository = roleQueryRepository;
5254
}
5355

5456
[HttpGet("search")]
@@ -60,6 +62,18 @@ public async Task<IActionResult> Search()
6062
return new OkObjectResult(ToDto(result));
6163
}
6264

65+
[HttpGet("me/search")]
66+
[Authorize("me_search_caseplaninstance")]
67+
public async Task<IActionResult> SearchMe()
68+
{
69+
var query = HttpContext.Request.Query.ToEnumerable();
70+
var roles = await _roleQueryRepository.FindRolesByUser(this.GetNameIdentifier());
71+
var parameter = ExtractFindParameter(query);
72+
parameter.Roles = roles.Select(r => r.Id).ToList();
73+
var result = await _cmmnWorkflowInstanceQueryRepository.Find(parameter);
74+
return new OkObjectResult(ToDto(result));
75+
}
76+
6377
[HttpGet("me/{id}")]
6478
[Authorize("me_get_caseplaninstance")]
6579
public async Task<IActionResult> GetMe(string id)
@@ -417,6 +431,13 @@ private async Task<IActionResult> InternalSuspend(SuspendCommand suspendCommand)
417431
{ "bad_request", "case instance doesn't exist" }
418432
}, HttpStatusCode.NotFound, Request);
419433
}
434+
catch (UnknownCaseInstanceElementException)
435+
{
436+
return this.ToError(new Dictionary<string, string>
437+
{
438+
{ "bad_request", "case instance element doesn't exist" }
439+
}, HttpStatusCode.NotFound, Request);
440+
}
420441
catch (AggregateValidationException ex)
421442
{
422443
return this.ToError(ex.Errors, HttpStatusCode.BadRequest, Request);
@@ -444,6 +465,13 @@ private async Task<IActionResult> InternalReactivate(ReactivateCommand cmd)
444465
{ "bad_request", "case instance doesn't exist" }
445466
}, HttpStatusCode.NotFound, Request);
446467
}
468+
catch(UnknownCaseInstanceElementException)
469+
{
470+
return this.ToError(new Dictionary<string, string>
471+
{
472+
{ "bad_request", "case instance element doesn't exist" }
473+
}, HttpStatusCode.NotFound, Request);
474+
}
447475
catch (AggregateValidationException ex)
448476
{
449477
return this.ToError(ex.Errors, HttpStatusCode.BadRequest, Request);

src/CaseManagement.CMMN.Host/Startup.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -105,6 +105,12 @@ public void ConfigureServices(IServiceCollection services)
105105
policy.AddPolicy("get_forminstances", p => p.RequireClaim("scope", "get_forminstances"));
106106
// Case plan instance
107107
policy.AddPolicy("search_caseplaninstance", p => p.RequireClaim("scope", "search_caseplaninstance"));
108+
policy.AddPolicy("me_search_caseplaninstance", p =>
109+
{
110+
p.AuthenticationSchemes.Clear();
111+
p.AuthenticationSchemes.Add("IdentityServer");
112+
p.RequireAuthenticatedUser();
113+
});
108114
policy.AddPolicy("me_get_caseplaninstance", p =>
109115
{
110116
p.AuthenticationSchemes.Clear();

src/CaseManagement.CMMN/Builders/WorkflowBuilder.cs

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ public class WorkflowBuilder
1010
private readonly string _name;
1111
private readonly string _description;
1212
private readonly CaseFileAggregate _caseFile;
13+
private readonly ICollection<string> _roles;
1314
private ICollection<CasePlanElement> _elements { get; set; }
1415
private ICollection<Criteria> _exitCriterias { get; set; }
1516
private string _caseOwner;
@@ -19,6 +20,7 @@ private WorkflowBuilder(string casePlanId, string name, string description, Case
1920
_casePlanId = casePlanId;
2021
_name = name;
2122
_caseFile = caseFile;
23+
_roles = new List<string>();
2224
_elements = new List<CasePlanElement>();
2325
_exitCriterias = new List<Criteria>();
2426
}
@@ -167,9 +169,15 @@ public WorkflowBuilder SetCaseOwner(string caseOwner)
167169
return this;
168170
}
169171

172+
public WorkflowBuilder AddRole(string role)
173+
{
174+
this._roles.Add(role);
175+
return this;
176+
}
177+
170178
public CasePlanAggregate Build()
171179
{
172-
var result = CasePlanAggregate.New(_casePlanId, _name, _description, _caseOwner, _caseFile.Id, _caseFile.Version, _exitCriterias, _elements);
180+
var result = CasePlanAggregate.New(_casePlanId, _name, _description, _caseOwner, _caseFile.Id, _caseFile.Version, _exitCriterias, _elements, _roles);
173181
return result;
174182
}
175183

src/CaseManagement.CMMN/CMMNConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ public static class QueueNames
1616
public const string CasePlans = "caseplans";
1717
public const string FormInstances = "forminstances";
1818
public const string CaseWorkerTasks = "caseworkertasks";
19+
public const string Roles = "roles";
1920
}
2021

2122
public static class RouteNames

src/CaseManagement.CMMN/CaseFile/CommandHandlers/PublishCaseFileCommandHandler.cs

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@
33
using CaseManagement.CMMN.Domains;
44
using CaseManagement.CMMN.Infrastructures;
55
using CaseManagement.CMMN.Infrastructures.EvtStore;
6-
using CaseManagement.CMMN.Parser;
76
using System.Threading.Tasks;
87

98
namespace CaseManagement.CMMN.CaseFile.CommandHandlers
@@ -30,12 +29,6 @@ public async Task<string> Handle(PublishCaseFileCommand publishCaseFileCommand)
3029
var newCaseFile = caseFile.Publish(publishCaseFileCommand.Performer, publishCaseFileCommand.BypassUserValidation);
3130
await _commitAggregateHelper.Commit(caseFile, CaseFileAggregate.GetStreamName(caseFile.Id), CMMNConstants.QueueNames.CaseFiles);
3231
await _commitAggregateHelper.Commit(newCaseFile, CaseFileAggregate.GetStreamName(newCaseFile.Id), CMMNConstants.QueueNames.CaseFiles);
33-
var tDefinitions = CMMNParser.ParseWSDL(caseFile.Payload);
34-
foreach (var casePlan in CMMNParser.ExtractCasePlans(tDefinitions, caseFile))
35-
{
36-
await _commitAggregateHelper.Commit(casePlan, CasePlanAggregate.GetStreamName(casePlan.Id), CMMNConstants.QueueNames.CasePlans);
37-
}
38-
3932
return newCaseFile.Id;
4033
}
4134
}

src/CaseManagement.CMMN/CasePlan/EventHandlers/CasePlanEventHandler.cs

Lines changed: 17 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2,28 +2,38 @@
22
using CaseManagement.CMMN.Domains.Events;
33
using CaseManagement.CMMN.Infrastructures;
44
using CaseManagement.CMMN.Infrastructures.Bus;
5+
using CaseManagement.CMMN.Parser;
56
using CaseManagement.CMMN.Persistence;
6-
using System.Collections.Generic;
77
using System.Threading;
88
using System.Threading.Tasks;
99

1010
namespace CaseManagement.CMMN.CasePlan.EventHandlers
1111
{
12-
public class CasePlanEventHandler : IMessageBrokerConsumerGeneric<CasePlanAddedEvent>
12+
public class CasePlanEventHandler : IMessageBrokerConsumerGeneric<CaseFilePublishedEvent>
1313
{
14+
private readonly ICaseFileQueryRepository _caseFileQueryRepository;
1415
private readonly ICasePlanCommandRepository _casePlanCommandRepository;
16+
private readonly ICommitAggregateHelper _commitAggregateHelper;
1517

16-
public CasePlanEventHandler(ICasePlanCommandRepository casePlanCommandRepository)
18+
public CasePlanEventHandler(ICaseFileQueryRepository caseFileQueryRepository, ICasePlanCommandRepository casePlanCommandRepository, ICommitAggregateHelper commitAggregateHelper)
1719
{
20+
_caseFileQueryRepository = caseFileQueryRepository;
1821
_casePlanCommandRepository = casePlanCommandRepository;
22+
_commitAggregateHelper = commitAggregateHelper;
1923
}
2024

21-
public string QueueName => CMMNConstants.QueueNames.CasePlans;
25+
public string QueueName => CMMNConstants.QueueNames.CaseFiles;
2226

23-
public async Task Handle(CasePlanAddedEvent @event, CancellationToken cancellationToken)
27+
public async Task Handle(CaseFilePublishedEvent @event, CancellationToken cancellationToken)
2428
{
25-
var casePlan = CasePlanAggregate.New(new List<DomainEvent> { @event });
26-
_casePlanCommandRepository.Add(casePlan);
29+
var caseFile = await _caseFileQueryRepository.FindById(@event.AggregateId);
30+
var tDefinitions = CMMNParser.ParseWSDL(caseFile.Payload);
31+
foreach (var casePlan in CMMNParser.ExtractCasePlans(tDefinitions, caseFile))
32+
{
33+
_casePlanCommandRepository.Add(casePlan);
34+
await _commitAggregateHelper.Commit(casePlan, CasePlanAggregate.GetStreamName(casePlan.Id), CMMNConstants.QueueNames.CasePlans);
35+
}
36+
2737
await _casePlanCommandRepository.SaveChanges();
2838
}
2939
}

src/CaseManagement.CMMN/CasePlanInstance/CommandHandlers/ActivateCommandHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,7 +42,7 @@ public async Task Handle(ActivateCommand activateCommand)
4242
else
4343
{
4444
var roles = await _roleQueryRepository.FindRolesByUser(activateCommand.Performer);
45-
activation.Confirm(roles.Select(r => r.Name));
45+
activation.Confirm(roles.Select(r => r.Id));
4646
}
4747

4848
await _commitAggregateHelper.Commit(activation, CaseWorkerTaskAggregate.GetStreamName(id), CMMNConstants.QueueNames.CasePlanInstances);

src/CaseManagement.CMMN/CasePlanInstance/CommandHandlers/ConfirmFormCommandHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public async Task Handle(ConfirmFormCommand confirmFormCommand)
4545
else
4646
{
4747
var roles = await _roleQueryRepository.FindRolesByUser(confirmFormCommand.Performer);
48-
formInstance.Submit(roles.Select(r => r.Name), form, confirmFormCommand.Content);
48+
formInstance.Submit(roles.Select(r => r.Id), form, confirmFormCommand.Content);
4949
}
5050

5151
await _commitAggregateHelper.Commit(formInstance, FormInstanceAggregate.GetStreamName(id), CMMNConstants.QueueNames.FormInstances);

src/CaseManagement.CMMN/CasePlanInstance/CommandHandlers/CreateCaseInstanceCommandHandler.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,9 +25,12 @@ public CreateCaseInstanceCommandHandler(ICasePlanQueryRepository casePlanQueryRe
2525
throw new UnknownCaseDefinitionException();
2626
}
2727

28-
if (workflowDefinition.CaseOwner != command.Performer)
28+
if (!command.BypassUserValidation)
2929
{
30-
throw new UnauthorizedCaseWorkerException(command.Performer, null, null);
30+
if (workflowDefinition.CaseOwner != command.Performer)
31+
{
32+
throw new UnauthorizedCaseWorkerException(command.Performer, null, null);
33+
}
3134
}
3235

3336
var workflowInstance = Domains.CasePlanInstanceAggregate.New(workflowDefinition);

0 commit comments

Comments
 (0)