Skip to content

Commit 630243a

Browse files
Thierry Habarthabarthierry-hue
authored andcommitted
Ticket #4 : Can launch case instance
1 parent 4c77e49 commit 630243a

94 files changed

Lines changed: 1668 additions & 839 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.

CaseManagement.sln

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,6 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "02. CMMN", "02. CMMN", "{CD
1313
EndProject
1414
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CaseManagement.CMMN", "src\CaseManagement.CMMN\CaseManagement.CMMN.csproj", "{CE4424E0-4EC0-45D0-9791-91864EDEA89B}"
1515
EndProject
16-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CaseManagement.BPMN.Tests", "tests\CaseManagement.BPMN.Tests\CaseManagement.BPMN.Tests.csproj", "{2FC26859-C75B-4C4C-82AE-E46D8B4996DD}"
17-
EndProject
18-
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CaseManagement.CMMN.Tests", "tests\CaseManagement.CMMN.Tests\CaseManagement.CMMN.Tests.csproj", "{5BBD9089-565C-47F9-A284-65A41BEB3EFC}"
19-
EndProject
2016
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "00. Other", "00. Other", "{9360C4A1-A2AA-4493-BBDC-4044D78D8F4B}"
2117
EndProject
2218
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "CaseManagement.Workflow", "src\CaseManagement.Workflow\CaseManagement.Workflow.csproj", "{E3E72DF1-F427-4FEA-8F84-FB194EA20D07}"
@@ -37,14 +33,6 @@ Global
3733
{CE4424E0-4EC0-45D0-9791-91864EDEA89B}.Debug|Any CPU.Build.0 = Debug|Any CPU
3834
{CE4424E0-4EC0-45D0-9791-91864EDEA89B}.Release|Any CPU.ActiveCfg = Release|Any CPU
3935
{CE4424E0-4EC0-45D0-9791-91864EDEA89B}.Release|Any CPU.Build.0 = Release|Any CPU
40-
{2FC26859-C75B-4C4C-82AE-E46D8B4996DD}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
41-
{2FC26859-C75B-4C4C-82AE-E46D8B4996DD}.Debug|Any CPU.Build.0 = Debug|Any CPU
42-
{2FC26859-C75B-4C4C-82AE-E46D8B4996DD}.Release|Any CPU.ActiveCfg = Release|Any CPU
43-
{2FC26859-C75B-4C4C-82AE-E46D8B4996DD}.Release|Any CPU.Build.0 = Release|Any CPU
44-
{5BBD9089-565C-47F9-A284-65A41BEB3EFC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
45-
{5BBD9089-565C-47F9-A284-65A41BEB3EFC}.Debug|Any CPU.Build.0 = Debug|Any CPU
46-
{5BBD9089-565C-47F9-A284-65A41BEB3EFC}.Release|Any CPU.ActiveCfg = Release|Any CPU
47-
{5BBD9089-565C-47F9-A284-65A41BEB3EFC}.Release|Any CPU.Build.0 = Release|Any CPU
4836
{E3E72DF1-F427-4FEA-8F84-FB194EA20D07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
4937
{E3E72DF1-F427-4FEA-8F84-FB194EA20D07}.Debug|Any CPU.Build.0 = Debug|Any CPU
5038
{E3E72DF1-F427-4FEA-8F84-FB194EA20D07}.Release|Any CPU.ActiveCfg = Release|Any CPU
@@ -60,8 +48,6 @@ Global
6048
GlobalSection(NestedProjects) = preSolution
6149
{D7A0C87C-CF5B-48CF-9A0F-FE7F6248BB30} = {4E0AA29C-B5C1-4888-BB6E-7141E7DBFB51}
6250
{CE4424E0-4EC0-45D0-9791-91864EDEA89B} = {CD2E7CFE-4E9C-4308-A0D3-41CD5AD90FD8}
63-
{2FC26859-C75B-4C4C-82AE-E46D8B4996DD} = {A632EFC3-730B-46D7-B669-91962DFA8947}
64-
{5BBD9089-565C-47F9-A284-65A41BEB3EFC} = {A632EFC3-730B-46D7-B669-91962DFA8947}
6551
{E3E72DF1-F427-4FEA-8F84-FB194EA20D07} = {9360C4A1-A2AA-4493-BBDC-4044D78D8F4B}
6652
{2D288182-CD6B-46AF-B420-F2038875F6BC} = {A632EFC3-730B-46D7-B669-91962DFA8947}
6753
EndGlobalSection

Doc.docx

4.65 KB
Binary file not shown.

src/CaseManagement.CMMN/Apis/CaseInstancesController.cs

Lines changed: 57 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,12 @@
1-
using CaseManagement.CMMN.CaseInstance.Commands;
2-
using CaseManagement.CMMN.CaseInstance.Handlers;
1+
using CaseManagement.CMMN.CaseInstance.CommandHandlers;
2+
using CaseManagement.CMMN.CaseInstance.Commands;
3+
using CaseManagement.CMMN.Domains;
4+
using CaseManagement.Workflow.Domains;
5+
using CaseManagement.Workflow.Persistence;
36
using Microsoft.AspNetCore.Mvc;
47
using Newtonsoft.Json.Linq;
8+
using System;
9+
using System.Linq;
510
using System.Net;
611
using System.Threading.Tasks;
712

@@ -12,10 +17,15 @@ public class CaseInstancesController : Controller
1217
{
1318
private readonly ICreateCaseInstanceCommandHandler _createCaseInstanceCommandHandler;
1419
private readonly ILaunchCaseInstanceCommandHandler _launchCaseInstanceCommandHandler;
20+
private readonly IConfirmFormCommandHandler _confirmFormCommandHandler;
21+
private readonly IProcessFlowInstanceQueryRepository _processFlowInstanceQueryRepository;
1522

16-
public CaseInstancesController(ICreateCaseInstanceCommandHandler createCaseInstanceCommandHandler, ILaunchCaseInstanceCommandHandler launchCaseInstanceCommandHandler)
23+
public CaseInstancesController(ICreateCaseInstanceCommandHandler createCaseInstanceCommandHandler, ILaunchCaseInstanceCommandHandler launchCaseInstanceCommandHandler, IConfirmFormCommandHandler confirmFormCommandHandler, IProcessFlowInstanceQueryRepository processFlowInstanceQueryRepository)
1724
{
1825
_createCaseInstanceCommandHandler = createCaseInstanceCommandHandler;
26+
_launchCaseInstanceCommandHandler = launchCaseInstanceCommandHandler;
27+
_confirmFormCommandHandler = confirmFormCommandHandler;
28+
_processFlowInstanceQueryRepository = processFlowInstanceQueryRepository;
1929
}
2030

2131
[HttpPost]
@@ -36,13 +46,54 @@ public async Task<IActionResult> Create([FromBody] CreateCaseInstanceCommand cre
3646
public async Task<IActionResult> Launch(string id)
3747
{
3848
await _launchCaseInstanceCommandHandler.Handle(new LaunchCaseInstanceCommand { CaseInstanceId = id });
39-
return null;
49+
return new OkResult();
50+
}
51+
52+
[HttpPost("{id}/confirm/{elt}")]
53+
public async Task<IActionResult> ConfirmForm(string id, string elt, [FromBody] ConfirmFormCommand confirmForm)
54+
{
55+
await _confirmFormCommandHandler.Handle(new ConfirmFormCommand { CaseInstanceId = id, CaseElementInstanceId = elt });
56+
return new OkResult();
4057
}
4158

4259
[HttpGet("{id}")]
4360
public async Task<IActionResult> Get(string id)
4461
{
45-
return null;
62+
var flowInstance = await _processFlowInstanceQueryRepository.FindFlowInstanceById(id);
63+
if (flowInstance == null)
64+
{
65+
return new NotFoundResult();
66+
}
67+
68+
return new OkObjectResult(ToDto(flowInstance));
69+
}
70+
71+
private static JObject ToDto(ProcessFlowInstance flowInstance)
72+
{
73+
var result = new JObject
74+
{
75+
{ "id", flowInstance.Id },
76+
{ "create_datetime", flowInstance.CreateDateTime },
77+
{ "status", Enum.GetName(typeof(ProcessFlowInstanceStatus), flowInstance.Status).ToLowerInvariant() }
78+
};
79+
var planItems = new JArray();
80+
foreach(var planItem in flowInstance.Elements.Where(e => e is CMMNPlanItem).Cast<CMMNPlanItem>())
81+
{
82+
planItems.Add(ToDto(planItem));
83+
}
84+
85+
result.Add("items", planItems);
86+
return result;
87+
}
88+
89+
private static JObject ToDto(CMMNPlanItem planItem)
90+
{
91+
return new JObject
92+
{
93+
{ "id", planItem.Id },
94+
{ "name", planItem.Name },
95+
{ "status", Enum.GetName(typeof(ProcessFlowInstanceElementStatus), planItem.Status).ToLowerInvariant() }
96+
};
4697
}
4798
}
48-
}
99+
}
Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,24 @@
1-
namespace Microsoft.AspNetCore.Builder
1+
using CaseManagement.CMMN.CaseInstance.EventHandlers;
2+
using CaseManagement.Workflow.Domains.Events;
3+
using CaseManagement.Workflow.Infrastructure.EvtBus;
4+
5+
namespace Microsoft.AspNetCore.Builder
26
{
37
public static class ApplicationBuilderExtensions
48
{
59
public static IApplicationBuilder UseCMMN(this IApplicationBuilder appBuilder)
610
{
11+
appBuilder.ConfigureEventBus();
712
appBuilder.UseMvc();
813
return appBuilder;
914
}
15+
16+
private static void ConfigureEventBus(this IApplicationBuilder app)
17+
{
18+
var evtBus = (IEventBus)app.ApplicationServices.GetService(typeof(IEventBus));
19+
evtBus.Subscribe<ProcessFlowInstanceCreatedEvent, ProcessFlowInstanceCreatedEventHandler>();
20+
evtBus.Subscribe<ProcessFlowInstanceLaunchedEvent, ProcessFlowInstanceLaunchedEventHandler>();
21+
evtBus.Subscribe<ProcessFlowInstanceFormConfirmedEvent, ProcessFlowInstanceFormConfirmedEventHandler>();
22+
}
1023
}
1124
}

src/CaseManagement.CMMN/CMMNServerBuilder.cs

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,31 +1,27 @@
11
using CaseManagement.CMMN.Persistence;
22
using CaseManagement.CMMN.Persistence.InMemory;
3+
using CaseManagement.Workflow;
34
using Microsoft.Extensions.DependencyInjection;
45
using System;
56
using System.Collections.Generic;
67

78
namespace CaseManagement.CMMN
89
{
9-
public class CMMNServerBuilder
10+
public class CMMNServerBuilder : WorkflowServerBuilder
1011
{
11-
private readonly IServiceCollection _services;
12-
13-
public CMMNServerBuilder(IServiceCollection services)
14-
{
15-
_services = services;
16-
}
12+
public CMMNServerBuilder(IServiceCollection services) : base(services) { }
1713

1814
public CMMNServerBuilder AddDefinitions(Action<CMMNDefinitionsBuilder> callback)
1915
{
2016
var builder = new CMMNDefinitionsBuilder();
2117
callback(builder);
22-
_services.AddSingleton<ICMMNDefinitionsQueryRepository>(new InMemoryCMMNDefinitionsQueryRepository(builder.Build()));
18+
Services.AddSingleton<ICMMNDefinitionsQueryRepository>(new InMemoryCMMNDefinitionsQueryRepository(builder.Build()));
2319
return this;
2420
}
2521

2622
public CMMNServerBuilder AddDefinitions(ICollection<tDefinitions> defs)
2723
{
28-
_services.AddSingleton<ICMMNDefinitionsQueryRepository>(new InMemoryCMMNDefinitionsQueryRepository(defs));
24+
Services.AddSingleton<ICMMNDefinitionsQueryRepository>(new InMemoryCMMNDefinitionsQueryRepository(defs));
2925
return this;
3026
}
3127
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
using CaseManagement.CMMN.CaseInstance.Commands;
2+
using CaseManagement.CMMN.Domains;
3+
using CaseManagement.Workflow.Domains;
4+
using CaseManagement.Workflow.Infrastructure.EvtBus;
5+
using CaseManagement.Workflow.Infrastructure.EvtStore;
6+
using Microsoft.Extensions.Options;
7+
using NEventStore;
8+
using System.Linq;
9+
using System.Threading.Tasks;
10+
11+
namespace CaseManagement.CMMN.CaseInstance.CommandHandlers
12+
{
13+
public class ConfirmFormCommandHandler : BaseCommandHandler<ProcessFlowInstance>, IConfirmFormCommandHandler
14+
{
15+
private readonly IEventStoreRepository<ProcessFlowInstance> _eventStoreRepository;
16+
17+
public ConfirmFormCommandHandler(IStoreEvents storeEvents, IEventBus eventBus, IEventStoreRepository<ProcessFlowInstance> eventStoreRepository, IAggregateSnapshotStore<ProcessFlowInstance> aggregateSnapshotStore, IOptions<SnapshotConfiguration> snapshotConfiguration) : base(storeEvents, eventBus, aggregateSnapshotStore, snapshotConfiguration)
18+
{
19+
_eventStoreRepository = eventStoreRepository;
20+
}
21+
22+
public async Task<bool> Handle(ConfirmFormCommand confirmFormCommand)
23+
{
24+
var caseInstance = await _eventStoreRepository.GetLastAggregate(confirmFormCommand.CaseInstanceId, ProcessFlowInstance.GetStreamName(confirmFormCommand.CaseInstanceId));
25+
if (caseInstance == null || string.IsNullOrWhiteSpace(caseInstance.Id))
26+
{
27+
// TODO : THROW EXCEPTION.
28+
}
29+
30+
var flowInstanceElt = caseInstance.Elements.FirstOrDefault(e => e.Id == confirmFormCommand.CaseElementInstanceId) as CMMNPlanItem;
31+
if (flowInstanceElt == null)
32+
{
33+
// TODO : THROW EXCEPTION.
34+
}
35+
36+
caseInstance.ConfirmForm(confirmFormCommand.CaseElementInstanceId);
37+
await Commit(caseInstance, caseInstance.GetStreamName());
38+
return true;
39+
}
40+
}
41+
}

src/CaseManagement.CMMN/CaseInstance/Handlers/CreateCaseInstanceCommandHandler.cs renamed to src/CaseManagement.CMMN/CaseInstance/CommandHandlers/CreateCaseInstanceCommandHandler.cs

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,24 @@
33
using CaseManagement.CMMN.Persistence;
44
using CaseManagement.Workflow.Builders;
55
using CaseManagement.Workflow.Domains;
6-
using CaseManagement.Workflow.Persistence;
6+
using CaseManagement.Workflow.Infrastructure.EvtBus;
7+
using CaseManagement.Workflow.Infrastructure.EvtStore;
8+
using Microsoft.Extensions.Options;
9+
using NEventStore;
710
using System;
811
using System.Collections.Generic;
912
using System.Linq;
1013
using System.Threading.Tasks;
1114

12-
namespace CaseManagement.CMMN.CaseInstance.Handlers
15+
namespace CaseManagement.CMMN.CaseInstance.CommandHandlers
1316
{
14-
public class CreateCaseInstanceCommandHandler : ICreateCaseInstanceCommandHandler
17+
public class CreateCaseInstanceCommandHandler : BaseCommandHandler<ProcessFlowInstance>, ICreateCaseInstanceCommandHandler
1518
{
1619
private readonly ICMMNDefinitionsQueryRepository _cmmnDefinitionsQueryRepository;
17-
private readonly IProcessFlowInstanceCommandRepository _processFlowInstanceCommandRepository;
1820

19-
public CreateCaseInstanceCommandHandler(ICMMNDefinitionsQueryRepository cmmnDefinitionsQueryRepository, IProcessFlowInstanceCommandRepository processFlowInstanceCommandRepository)
21+
public CreateCaseInstanceCommandHandler(ICMMNDefinitionsQueryRepository cmmnDefinitionsQueryRepository, IStoreEvents storeEvents, IEventBus eventBus, IAggregateSnapshotStore<ProcessFlowInstance> aggregateSnapshotStore,IOptions<SnapshotConfiguration> snapshotConfiguration) : base(storeEvents, eventBus, aggregateSnapshotStore, snapshotConfiguration)
2022
{
2123
_cmmnDefinitionsQueryRepository = cmmnDefinitionsQueryRepository;
22-
_processFlowInstanceCommandRepository = processFlowInstanceCommandRepository;
2324
}
2425

2526
public async Task<string> Handle(CreateCaseInstanceCommand createCaseInstanceCommand)
@@ -39,8 +40,7 @@ public async Task<string> Handle(CreateCaseInstanceCommand createCaseInstanceCom
3940
}
4041

4142
var processFlowInstance = BuildProcessFlowInstance(tCase);
42-
_processFlowInstanceCommandRepository.Add(processFlowInstance);
43-
await _processFlowInstanceCommandRepository.SaveChanges();
43+
await Commit(processFlowInstance, processFlowInstance.GetStreamName());
4444
return processFlowInstance.Id;
4545
}
4646

@@ -102,12 +102,12 @@ private static CMMNPlanItemDefinition BuildPlanItemDefinition(tPlanItemDefinitio
102102

103103
private static CMMNPlanItemDefinition BuildProcessTask(tProcessTask processTask)
104104
{
105-
return new CMMNProcessTask(processTask.name);
105+
return new CMMNProcessTask(processTask.name) { AssemblyQualifiedName = processTask.assemblyQualifiedName, IsBlocking = processTask.isBlocking };
106106
}
107107

108108
private static CMMNPlanItemDefinition BuildHumanTask(tHumanTask humanTask)
109109
{
110-
return new CMMNHumanTask(humanTask.name);
110+
return new CMMNHumanTask(humanTask.name) { FormId = humanTask.caseFormRef, IsBlocking = humanTask.isBlocking };
111111
}
112112

113113
private static CMMNSEntry BuildSEntry(tSentry sEntry)
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
using CaseManagement.CMMN.CaseInstance.Commands;
2+
using System.Threading.Tasks;
3+
4+
namespace CaseManagement.CMMN.CaseInstance.CommandHandlers
5+
{
6+
public interface IConfirmFormCommandHandler
7+
{
8+
Task<bool> Handle(ConfirmFormCommand confirmFormCommand);
9+
}
10+
}

src/CaseManagement.CMMN/CaseInstance/Handlers/ICreateCaseInstanceCommandHandler.cs renamed to src/CaseManagement.CMMN/CaseInstance/CommandHandlers/ICreateCaseInstanceCommandHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using CaseManagement.CMMN.CaseInstance.Commands;
22
using System.Threading.Tasks;
33

4-
namespace CaseManagement.CMMN.CaseInstance.Handlers
4+
namespace CaseManagement.CMMN.CaseInstance.CommandHandlers
55
{
66
public interface ICreateCaseInstanceCommandHandler
77
{

src/CaseManagement.CMMN/CaseInstance/Handlers/ILaunchCaseInstanceCommandHandler.cs renamed to src/CaseManagement.CMMN/CaseInstance/CommandHandlers/ILaunchCaseInstanceCommandHandler.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
using CaseManagement.CMMN.CaseInstance.Commands;
22
using System.Threading.Tasks;
33

4-
namespace CaseManagement.CMMN.CaseInstance.Handlers
4+
namespace CaseManagement.CMMN.CaseInstance.CommandHandlers
55
{
66
public interface ILaunchCaseInstanceCommandHandler
77
{

0 commit comments

Comments
 (0)