Skip to content

Commit cb816fb

Browse files
Ticket #98 : Finish to display case plan instance
1 parent e21d769 commit cb816fb

34 files changed

Lines changed: 763 additions & 38 deletions

File tree

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

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -493,5 +493,38 @@ public async Task<IActionResult> Disable(string id, string elt, CancellationToke
493493
}, HttpStatusCode.BadRequest, Request);
494494
}
495495
}
496+
497+
[HttpGet("{id}/reenable/{elt}")]
498+
[Authorize("reenable_caseplaninstance")]
499+
public async Task<IActionResult> Reenable(string id, string elt, CancellationToken token)
500+
{
501+
try
502+
{
503+
await _mediator.Send(new ReenableCommand(id, elt), token);
504+
return new OkResult();
505+
}
506+
catch (UnknownCasePlanInstanceException)
507+
{
508+
return new NotFoundResult();
509+
}
510+
catch (UnknownCasePlanElementInstanceException)
511+
{
512+
return this.ToError(new Dictionary<string, string>
513+
{
514+
{ "bad_request", "case instance element doesn't exist" }
515+
}, HttpStatusCode.NotFound, Request);
516+
}
517+
catch (AggregateValidationException ex)
518+
{
519+
return this.ToError(ex.Errors, HttpStatusCode.BadRequest, Request);
520+
}
521+
catch (Exception ex)
522+
{
523+
return this.ToError(new Dictionary<string, string>
524+
{
525+
{ "invalid_request", ex.Message }
526+
}, HttpStatusCode.BadRequest, Request);
527+
}
528+
}
496529
}
497530
}

src/CaseManagement.CMMN.Host/Startup.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
using System.Collections.Generic;
1515
using System.IO;
1616
using System.Linq;
17+
using System.Security.Claims;
1718
using System.Security.Cryptography;
1819

1920
namespace CaseManagement.CMMN.Host
@@ -91,9 +92,10 @@ public void ConfigureServices(IServiceCollection services)
9192
policy.AddPolicy("terminate_caseplaninstance", p => p.RequireAuthenticatedUser());
9293
policy.AddPolicy("activate_caseplaninstance", p => p.RequireAuthenticatedUser());
9394
policy.AddPolicy("disable_caseplaninstance", p => p.RequireAuthenticatedUser());
95+
policy.AddPolicy("reenable_caseplaninstance", p => p.RequireAuthenticatedUser());
9496
policy.AddPolicy("complete_caseplaninstance", p =>
9597
{
96-
p.AddAuthenticationSchemes("OAuthScheme");
98+
p.AddAuthenticationSchemes(JwtBearerDefaults.AuthenticationScheme, "OAuthScheme");
9799
p.RequireAssertion(_ =>
98100
{
99101
if (_.User == null || _.User.Claims == null || !_.User.Claims.Any())
@@ -107,7 +109,7 @@ public void ConfigureServices(IServiceCollection services)
107109
return true;
108110
}
109111

110-
cl = _.User.Claims.FirstOrDefault(_ => _.Type == "sub");
112+
cl = _.User.Claims.FirstOrDefault(_ => _.Type == "sub" || _.Type == ClaimTypes.NameIdentifier);
111113
if (cl != null)
112114
{
113115
return true;

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

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

src/CaseManagement.CMMN/CMMNConstants.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public static class ExternalTransitionNames
3333
public const string Delete = "delete";
3434
public const string Occur = "occur";
3535
public const string Disable = "disable";
36+
public const string Reenable = "reenable";
3637
}
3738

3839
public static class RouteNames
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 ReenableCommandHandler : IRequestHandler<ReenableCommand, bool>
12+
{
13+
private readonly IEventStoreRepository _eventStoreRepository;
14+
private readonly IMessageBroker _messageBroker;
15+
16+
public ReenableCommandHandler(IEventStoreRepository eventStoreRepository, IMessageBroker messageBroker)
17+
{
18+
_eventStoreRepository = eventStoreRepository;
19+
_messageBroker = messageBroker;
20+
}
21+
22+
public async Task<bool> Handle(ReenableCommand 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.Reenable);
37+
await _messageBroker.QueueExternalEvent(CMMNConstants.ExternalTransitionNames.Reenable, command.CasePlanInstanceId, command.CasePlanElementInstanceId, token);
38+
return true;
39+
}
40+
}
41+
}
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 ReenableCommand : IRequest<bool>
6+
{
7+
public ReenableCommand(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+
}

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ protected override async Task<bool> Process(CMMNExecutionContext executionContex
1515
var terminate = await TrySubscribe(executionContext, elt, CMMNConstants.ExternalTransitionNames.Terminate, cancellationToken);
1616
var manualStart = await TrySubscribe(executionContext, elt, CMMNConstants.ExternalTransitionNames.ManualStart, cancellationToken);
1717
var disable = await TrySubscribe(executionContext, elt, CMMNConstants.ExternalTransitionNames.Disable, cancellationToken);
18+
var reenable = await TrySubscribe(executionContext, elt, CMMNConstants.ExternalTransitionNames.Reenable, cancellationToken);
1819
if (elt.State == null)
1920
{
2021
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Create);
@@ -36,6 +37,7 @@ protected override async Task<bool> Process(CMMNExecutionContext executionContex
3637
if (disable.IsCaptured)
3738
{
3839
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Disable);
40+
await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.Disable, cancellationToken);
3941
return false;
4042
}
4143

@@ -45,6 +47,18 @@ protected override async Task<bool> Process(CMMNExecutionContext executionContex
4547
}
4648

4749
executionContext.Instance.MakeTransition(elt, CMMNTransitions.ManualStart);
50+
await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.ManualStart, cancellationToken);
51+
}
52+
53+
if (elt.State == TaskStageStates.Disabled)
54+
{
55+
if (reenable.IsCaptured)
56+
{
57+
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Reenable);
58+
await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.Reenable, cancellationToken);
59+
}
60+
61+
return false;
4862
}
4963

5064
if (elt.State == TaskStageStates.Active)
@@ -54,6 +68,7 @@ protected override async Task<bool> Process(CMMNExecutionContext executionContex
5468
if (terminate.IsCaptured)
5569
{
5670
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Terminate);
71+
await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.Terminate, cancellationToken);
5772
return true;
5873
}
5974

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,7 @@ protected override async Task<bool> ProtectedProcess(CMMNExecutionContext execut
3535
if (completeSubscription.IsCaptured)
3636
{
3737
executionContext.Instance.MakeTransition(elt, CMMNTransitions.Complete);
38+
await TryReset(executionContext, elt, CMMNConstants.ExternalTransitionNames.Complete, cancellationToken);
3839
return true;
3940
}
4041

src/CaseManagement.CMMN/CasePlanInstance/Results/CasePlanInstanceResult.cs

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,15 @@ namespace CaseManagement.CMMN.CasePlanInstance.Results
77
{
88
public class CasePlanInstanceResult
99
{
10+
public CasePlanInstanceResult()
11+
{
12+
ExecutionContext = new Dictionary<string, string>();
13+
Files = new List<CasePlanInstanceFileItemResult>();
14+
Roles = new List<CasePlanInstanceRoleResult>();
15+
Children = new List<CasePlanItemInstanceResult>();
16+
WorkerTasks = new List<WorkerTaskResult>();
17+
}
18+
1019
public string Id { get; set; }
1120
public string CaseFileId { get; set; }
1221
public string CasePlanId { get; set; }
@@ -16,6 +25,7 @@ public class CasePlanInstanceResult
1625
public ICollection<CasePlanInstanceFileItemResult> Files { get; set; }
1726
public ICollection<CasePlanInstanceRoleResult> Roles { get; set; }
1827
public ICollection<CasePlanItemInstanceResult> Children { get; set; }
28+
public ICollection<WorkerTaskResult> WorkerTasks { get; set; }
1929
public DateTime CreateDateTime { get; set; }
2030
public DateTime UpdateDateTime { get; set; }
2131

@@ -36,6 +46,24 @@ public static CasePlanInstanceFileItemResult ToDTO(CasePlanInstanceFileItem resu
3646
}
3747
}
3848

49+
public class WorkerTaskResult
50+
{
51+
public string CasePlanElementInstanceId { get; set; }
52+
public string ExternalId { get; set; }
53+
public DateTime CreateDateTime { get; set; }
54+
55+
public static WorkerTaskResult ToDTO(CasePlanInstanceWorkerTask workerTask)
56+
{
57+
return new WorkerTaskResult
58+
{
59+
CasePlanElementInstanceId = workerTask.CasePlanElementInstanceId,
60+
CreateDateTime = workerTask.CreateDateTime,
61+
ExternalId = workerTask.ExternalId
62+
};
63+
}
64+
}
65+
66+
3967
public class CasePlanInstanceRoleResult
4068
{
4169
public string Id { get; set; }
@@ -60,11 +88,12 @@ public class CasePlanItemInstanceResult
6088
public string Name { get; set; }
6189
public string Type { get; set; }
6290
public string State { get; set; }
91+
public string FormId { get; set; }
6392
public ICollection<TransitionHistoryResult> TransitionHistories { get; set; }
6493

6594
public static CasePlanItemInstanceResult ToDto(BaseCasePlanItemInstance casePlanItemInstance)
6695
{
67-
string stateStr = null;
96+
string stateStr = null, formId = null;
6897
if (casePlanItemInstance is BaseTaskOrStageElementInstance)
6998
{
7099
var state = ((BaseTaskOrStageElementInstance)casePlanItemInstance).State;
@@ -77,13 +106,20 @@ public static CasePlanItemInstanceResult ToDto(BaseCasePlanItemInstance casePlan
77106
stateStr = state == null ? null : Enum.GetName(typeof(MilestoneEventStates), state);
78107
}
79108

109+
if (casePlanItemInstance is HumanTaskElementInstance)
110+
{
111+
var humanTaskInstance = casePlanItemInstance as HumanTaskElementInstance;
112+
formId = humanTaskInstance.FormId;
113+
}
114+
80115
return new CasePlanItemInstanceResult
81116
{
82117
Id = casePlanItemInstance.Id,
83118
Name = casePlanItemInstance.Name,
84119
NbOccurrence = casePlanItemInstance.NbOccurrence,
85120
EltId = casePlanItemInstance.EltId,
86121
State = stateStr,
122+
FormId = formId,
87123
Type = Enum.GetName(typeof(CasePlanElementInstanceTypes), casePlanItemInstance.Type).ToUpperInvariant(),
88124
TransitionHistories = casePlanItemInstance.TransitionHistories.Select(_ => TransitionHistoryResult.ToDto(_)).ToList()
89125
};
@@ -134,6 +170,7 @@ public static CasePlanInstanceResult ToDto(CasePlanInstanceAggregate casePlanIns
134170
UpdateDateTime = casePlanInstance.UpdateDateTime,
135171
Children = children,
136172
Files = casePlanInstance.Files.Select(_ => CasePlanInstanceFileItemResult.ToDTO(_)).ToList(),
173+
WorkerTasks = casePlanInstance.WorkerTasks.Select(_ => WorkerTaskResult.ToDTO(_)).ToList(),
137174
ExecutionContext = casePlanInstance.ExecutionContext == null ? new Dictionary<string, string>() : casePlanInstance.ExecutionContext.Variables.ToDictionary(k => k.Key, k => k.Value)
138175
};
139176
}

src/CaseManagement.CMMN/Domains/CasePlanInstance/BaseCaseEltInstance.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,15 +73,15 @@ public void MakeTransition(CMMNTransitions transition, string message, DateTime
7373
result = TaskStageStates.Disabled;
7474
break;
7575
case CMMNTransitions.Reenable:
76-
if (state != TaskStageStates.Enabled)
76+
if (state != TaskStageStates.Disabled)
7777
{
7878
throw new AggregateValidationException(new List<KeyValuePair<string, string>>
7979
{
8080
new KeyValuePair<string, string>( "transition", "planitem instance is not disabled")
8181
});
8282
}
8383

84-
result = TaskStageStates.Disabled;
84+
result = TaskStageStates.Enabled;
8585
break;
8686
case CMMNTransitions.Fault:
8787
if (state != TaskStageStates.Active)

0 commit comments

Comments
 (0)