Skip to content

Commit e21d769

Browse files
Ticket #98 : Can display case plan instance
1 parent fbf17fc commit e21d769

33 files changed

Lines changed: 790 additions & 53 deletions

File tree

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -460,5 +460,38 @@ public async Task<IActionResult> Activate(string id, string elt, CancellationTok
460460
}, HttpStatusCode.BadRequest, Request);
461461
}
462462
}
463+
464+
[HttpGet("{id}/disable/{elt}")]
465+
[Authorize("disable_caseplaninstance")]
466+
public async Task<IActionResult> Disable(string id, string elt, CancellationToken token)
467+
{
468+
try
469+
{
470+
await _mediator.Send(new DisableCommand(id, elt), token);
471+
return new OkResult();
472+
}
473+
catch (UnknownCasePlanInstanceException)
474+
{
475+
return new NotFoundResult();
476+
}
477+
catch (UnknownCasePlanElementInstanceException)
478+
{
479+
return this.ToError(new Dictionary<string, string>
480+
{
481+
{ "bad_request", "case instance element doesn't exist" }
482+
}, HttpStatusCode.NotFound, Request);
483+
}
484+
catch (AggregateValidationException ex)
485+
{
486+
return this.ToError(ex.Errors, HttpStatusCode.BadRequest, Request);
487+
}
488+
catch (Exception ex)
489+
{
490+
return this.ToError(new Dictionary<string, string>
491+
{
492+
{ "invalid_request", ex.Message }
493+
}, HttpStatusCode.BadRequest, Request);
494+
}
495+
}
463496
}
464497
}

src/CaseManagement.CMMN.Host/Cmmns/claimCase.cmmn

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -40,20 +40,20 @@
4040
<cmmn:planItem id="PlanItem_1dphpiz" name="Capture claim details" definitionRef="HumanTask_1oeedji" />
4141
<cmmn:sentry id="Sentry_0e1zurk">
4242
<cmmn:planItemOnPart id="PlanItemOnPart_1preadf" sourceRef="PlanItem_04q2jwn">
43-
<cmmn:standardEvent>start</cmmn:standardEvent>
43+
<cmmn:standardEvent>manualStart</cmmn:standardEvent>
4444
</cmmn:planItemOnPart>
4545
</cmmn:sentry>
4646
<cmmn:sentry id="Sentry_0bz27li">
4747
<cmmn:planItemOnPart id="PlanItemOnPart_0ky2brq" sourceRef="PlanItem_126vzmb">
48-
<cmmn:standardEvent>start</cmmn:standardEvent>
48+
<cmmn:standardEvent>manualStart</cmmn:standardEvent>
4949
</cmmn:planItemOnPart>
5050
</cmmn:sentry>
5151
<cmmn:humanTask id="HumanTask_1oeedji" cmg:formId="captureClaimDetails" cmg:implementation="##WsHumanTask">
5252
<cmmn:extensionElements>
5353
<cmg:parameters />
5454
</cmmn:extensionElements>
5555
</cmmn:humanTask>
56-
<cmmn:humanTask id="HumanTask_1ewr6eu" name="Need 3rd party report" cmg:implementation="##WsHumanTask">
56+
<cmmn:humanTask id="HumanTask_1ewr6eu" name="Need 3rd party report">
5757
<cmmn:extensionElements>
5858
<cmg:parameters />
5959
</cmmn:extensionElements>
@@ -69,7 +69,7 @@
6969
</cmmn:extensionElements>
7070
</cmmn:humanTask>
7171
</cmmn:stage>
72-
<cmmn:humanTask id="HumanTask_1g95uki" name="Update claimant contact details">
72+
<cmmn:humanTask id="HumanTask_1g95uki" name="Update claimant contact details" cmg:implementation="##WsHumanTask" cmg:formId="updateClaimantContactDetailsForm">
7373
<cmmn:extensionElements>
7474
<cmg:parameters />
7575
</cmmn:extensionElements>

src/CaseManagement.CMMN.Host/Startup.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ public void ConfigureServices(IServiceCollection services)
9090
policy.AddPolicy("resume_caseplaninstance", p => p.RequireAuthenticatedUser());
9191
policy.AddPolicy("terminate_caseplaninstance", p => p.RequireAuthenticatedUser());
9292
policy.AddPolicy("activate_caseplaninstance", p => p.RequireAuthenticatedUser());
93+
policy.AddPolicy("disable_caseplaninstance", p => p.RequireAuthenticatedUser());
9394
policy.AddPolicy("complete_caseplaninstance", p =>
9495
{
9596
p.AddAuthenticationSchemes("OAuthScheme");

src/CaseManagement.CMMN.SqlServer.Host/Startup.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,7 @@ public void ConfigureServices(IServiceCollection services)
7676
policy.AddPolicy("terminate_caseplaninstance", p => p.RequireAuthenticatedUser());
7777
policy.AddPolicy("activate_caseplaninstance", p => p.RequireAuthenticatedUser());
7878
policy.AddPolicy("complete_caseplaninstance", p => p.RequireAuthenticatedUser());
79+
policy.AddPolicy("disable_caseplaninstance", p => p.RequireAuthenticatedUser());
7980
// Case plan
8081
policy.AddPolicy("get_caseplan", p => p.RequireAuthenticatedUser());
8182
// Case worker task

src/CaseManagement.CMMN/CMMNConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ public static class ExternalTransitionNames
3232
public const string RemoveReference = "removereference";
3333
public const string Delete = "delete";
3434
public const string Occur = "occur";
35+
public const string Disable = "disable";
3536
}
3637

3738
public static class RouteNames
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
using MediatR;
2+
3+
namespace CaseManagement.CMMN.CasePlanInstance.Commands
4+
{
5+
public class DisableCommand : IRequest<bool>
6+
{
7+
public DisableCommand(string casePlanInstanceId, string casePlanElementInstanceId)
8+
{
9+
CasePlanInstanceId = casePlanInstanceId;
10+
CasePlanElementInstanceId = casePlanElementInstanceId;
11+
}
12+
13+
public string CasePlanInstanceId { get; set; }
14+
public string CasePlanElementInstanceId { get; set; }
15+
}
16+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using CaseManagement.CMMN.CasePlanInstance.Exceptions;
2+
using CaseManagement.CMMN.Domains;
3+
using CaseManagement.Common.Bus;
4+
using CaseManagement.Common.EvtStore;
5+
using MediatR;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
9+
namespace CaseManagement.CMMN.CasePlanInstance.Commands.Handlers
10+
{
11+
public class DisableCommandHandler : IRequestHandler<DisableCommand, bool>
12+
{
13+
private readonly IEventStoreRepository _eventStoreRepository;
14+
private readonly IMessageBroker _messageBroker;
15+
16+
public DisableCommandHandler(IEventStoreRepository eventStoreRepository, IMessageBroker messageBroker)
17+
{
18+
_eventStoreRepository = eventStoreRepository;
19+
_messageBroker = messageBroker;
20+
}
21+
22+
public async Task<bool> Handle(DisableCommand command, CancellationToken token)
23+
{
24+
var casePlanInstance = await _eventStoreRepository.GetLastAggregate<CasePlanInstanceAggregate>(command.CasePlanInstanceId, CasePlanInstanceAggregate.GetStreamName(command.CasePlanInstanceId));
25+
if (casePlanInstance == null)
26+
{
27+
throw new UnknownCasePlanInstanceException(command.CasePlanInstanceId);
28+
}
29+
30+
var elt = casePlanInstance.GetChild(command.CasePlanElementInstanceId);
31+
if (elt == null)
32+
{
33+
throw new UnknownCasePlanElementInstanceException(command.CasePlanInstanceId, command.CasePlanElementInstanceId);
34+
}
35+
36+
casePlanInstance.MakeTransition(elt, CMMNTransitions.Disable);
37+
await _messageBroker.QueueExternalEvent(CMMNConstants.ExternalTransitionNames.Disable, command.CasePlanInstanceId, command.CasePlanElementInstanceId, token);
38+
return true;
39+
}
40+
}
41+
}
Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using CaseManagement.CMMN.Domains;
22
using CaseManagement.CMMN.Infrastructure.ExternalEvts;
3-
using CaseManagement.Common.Processors;
43
using System.Threading;
54
using System.Threading.Tasks;
65

@@ -14,19 +13,19 @@ protected BaseCasePlanItemProcessor(ISubscriberRepository subscriberRepository)
1413

1514
protected override async Task Handle(CMMNExecutionContext executionContext, T elt, CancellationToken cancellationToken)
1615
{
17-
var isNewElt = elt.LatestTransition == CMMNTransitions.Create;
1816
if (!executionContext.Instance.IsEntryCriteriaSatisfied(elt))
1917
{
2018
return;
2119
}
2220

23-
await Process(executionContext, elt, cancellationToken);
24-
if (isNewElt && executionContext.Instance.IsRepetitionRuleSatisfied(elt))
21+
var createNewOccurrence = await Process(executionContext, elt, cancellationToken);
22+
if (createNewOccurrence && executionContext.Instance.IsRepetitionRuleSatisfied(elt))
2523
{
26-
executionContext.Instance.TryCreateInstance(elt);
24+
var result = executionContext.Instance.TryCreateInstance(elt) as T;
25+
await Handle(executionContext, result, cancellationToken);
2726
}
2827
}
2928

30-
protected abstract Task Process(CMMNExecutionContext executionContext, T elt, CancellationToken cancellationToken);
29+
protected abstract Task<bool> Process(CMMNExecutionContext executionContext, T elt, CancellationToken cancellationToken);
3130
}
3231
}

src/CaseManagement.CMMN/CasePlanInstance/Processors/BaseMilestoneOrTimerProcessor.cs

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using CaseManagement.CMMN.Domains;
22
using CaseManagement.CMMN.Infrastructure.ExternalEvts;
3-
using CaseManagement.Common.Processors;
43
using System.Threading;
54
using System.Threading.Tasks;
65

@@ -10,7 +9,7 @@ public abstract class BaseMilestoneOrTimerProcessor<T> : BaseCasePlanItemProcess
109
{
1110
public BaseMilestoneOrTimerProcessor(ISubscriberRepository subscriberRepository) : base(subscriberRepository) { }
1211

13-
protected override async Task Process(CMMNExecutionContext executionContext, T elt, CancellationToken token)
12+
protected override async Task<bool> Process(CMMNExecutionContext executionContext, T elt, CancellationToken token)
1413
{
1514
var terminateSubscription = await TrySubscribe(executionContext, elt, CMMNConstants.ExternalTransitionNames.Terminate, token);
1615
if (elt.State == MilestoneEventStates.Available)
@@ -21,8 +20,10 @@ protected override async Task Process(CMMNExecutionContext executionContext, T e
2120
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Terminate);
2221
}
2322

24-
return;
23+
return true;
2524
}
25+
26+
return false;
2627
}
2728

2829
protected abstract Task ProtectedProcess(CMMNExecutionContext executionContext, T elt, CancellationToken cancellationToken);
Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using CaseManagement.CMMN.Domains;
22
using CaseManagement.CMMN.Infrastructure.ExternalEvts;
3-
using CaseManagement.Common.Processors;
43
using System;
54
using System.Threading;
65
using System.Threading.Tasks;
@@ -11,10 +10,11 @@ public abstract class BaseTaskOrStageProcessor<T> : BaseCasePlanItemProcessor<T>
1110
{
1211
public BaseTaskOrStageProcessor(ISubscriberRepository subscriberRepository) : base(subscriberRepository) { }
1312

14-
protected override async Task Process(CMMNExecutionContext executionContext, T elt, CancellationToken cancellationToken)
13+
protected override async Task<bool> Process(CMMNExecutionContext executionContext, T elt, CancellationToken cancellationToken)
1514
{
1615
var terminate = await TrySubscribe(executionContext, elt, CMMNConstants.ExternalTransitionNames.Terminate, cancellationToken);
1716
var manualStart = await TrySubscribe(executionContext, elt, CMMNConstants.ExternalTransitionNames.ManualStart, cancellationToken);
17+
var disable = await TrySubscribe(executionContext, elt, CMMNConstants.ExternalTransitionNames.Disable, cancellationToken);
1818
if (elt.State == null)
1919
{
2020
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Create);
@@ -25,17 +25,23 @@ protected override async Task Process(CMMNExecutionContext executionContext, T e
2525
if (elt.ManualActivationRule != null && elt.IsManualActivationRuleSatisfied(executionContext.Instance.ExecutionContext))
2626
{
2727
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Enable);
28-
return;
28+
return false;
2929
}
3030

3131
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Start);
3232
}
3333

3434
if (elt.State == TaskStageStates.Enabled)
3535
{
36+
if (disable.IsCaptured)
37+
{
38+
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Disable);
39+
return false;
40+
}
41+
3642
if (!manualStart.IsCaptured)
3743
{
38-
return;
44+
return false;
3945
}
4046

4147
executionContext.Instance.MakeTransition(elt, CMMNTransitions.ManualStart);
@@ -45,22 +51,24 @@ protected override async Task Process(CMMNExecutionContext executionContext, T e
4551
{
4652
try
4753
{
48-
await ProtectedProcess(executionContext, elt, cancellationToken);
54+
if (terminate.IsCaptured)
55+
{
56+
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Terminate);
57+
return true;
58+
}
59+
60+
return await ProtectedProcess(executionContext, elt, cancellationToken);
4961
}
5062
catch(Exception ex)
5163
{
5264
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Fault, ex.ToString());
53-
return;
54-
}
55-
56-
if (terminate.IsCaptured)
57-
{
58-
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Terminate);
59-
return;
65+
return false;
6066
}
6167
}
68+
69+
return false;
6270
}
6371

64-
protected abstract Task ProtectedProcess(CMMNExecutionContext executionContext, T elt, CancellationToken cancellationToken);
72+
protected abstract Task<bool> ProtectedProcess(CMMNExecutionContext executionContext, T elt, CancellationToken cancellationToken);
6573
}
6674
}

0 commit comments

Comments
 (0)