Beispiel #1
0
        private static List <HumanTaskDefinitionAggregate> GetHumanTaskDefs()
        {
            var dressAppropriateForm = HumanTaskDefBuilder.New("dressAppropriateForm")
                                       .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                       .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                       .AddPresentationParameter("degree", ParameterTypes.STRING, "context.GetInput(\"degree\")")
                                       .AddPresentationParameter("city", ParameterTypes.STRING, "context.GetInput(\"city\")")
                                       .AddName("fr", "Température à $city$")
                                       .AddName("en", "Temperature in $city$")
                                       .AddSubject("fr", "Il fait $degree$", "text/html")
                                       .AddSubject("en", "Degree : $degree$", "text/html")
                                       .AddInputOperationParameter("degree", ParameterTypes.STRING, true)
                                       .AddInputOperationParameter("city", ParameterTypes.STRING, true)
                                       .Build();
            var captureClaimDetails = HumanTaskDefBuilder.New("captureClaimDetails")
                                      .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .AddName("fr", "Capturer les détails de la réclamation")
                                      .AddName("en", "Capture claim details")
                                      .SetRendering("{'type':'container','children':[{'id':'d2a121d7-fe66-4cb3-a7fb-b9f48219ab228','type':'txt','label':'Firstname','name':'firstName'},{'id':'c6a4ca0f-aa78-4743-9787-e5126375945bd','type':'txt','label':'Lastname','name':'lastName'},{'id':'20b21433-b934-4095-b942-06eb73a15b14e','type':'txt','label':'Claim','name':'claim'}]}")
                                      .AddOutputOperationParameter("firstName", ParameterTypes.STRING, true)
                                      .AddOutputOperationParameter("lastName", ParameterTypes.STRING, true)
                                      .AddOutputOperationParameter("claim", ParameterTypes.STRING, true)
                                      .Build();
            var takeTemperatureForm = HumanTaskDefBuilder.New("temperatureForm")
                                      .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .AddName("fr", "Saisir la température")
                                      .AddName("en", "Enter degree")
                                      .SetRendering("{'type':'container','children':[{'id':'ea71ffe8-517f-4f52-97f0-2658ee0bb1c92','type':'txt','label':'Degree','name':'degree'}]}")
                                      .AddOutputOperationParameter("degree", ParameterTypes.INT, true)
                                      .Build();
            var updateClaimantContactDetailsForm = HumanTaskDefBuilder.New("updateClaimantContactDetailsForm")
                                                   .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                                   .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                                   .AddName("fr", "Mettre à jour les informations de contact du 'Claimant'")
                                                   .AddName("en", "Update claimant contact details")
                                                   .SetRendering("{'type':'container','children':[{'id':'c6d8ca40-eb7a-48f4-8849-26afc0ffb4cda','type':'txt','label':'Firstname','name':'firstName'},{'id':'3e163681-2147-40f5-9c77-391ad5699c905','type':'txt','label':'Lastname','name':'lastName'}]}")
                                                   .AddOutputOperationParameter("firstName", ParameterTypes.STRING, true)
                                                   .AddOutputOperationParameter("lastName", ParameterTypes.STRING, true)
                                                   .Build();

            return(new List <HumanTaskDefinitionAggregate>
            {
                dressAppropriateForm,
                captureClaimDetails,
                takeTemperatureForm,
                updateClaimantContactDetailsForm
            });
        }
Beispiel #2
0
        public void ConfigureServices(IServiceCollection services)
        {
            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCustomAuthentication(opts => { });
            services.AddAuthorization(policy =>
            {
                policy.AddPolicy("Authenticated", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("manage_humantaskinstance", p => p.RequireAuthenticatedUser());
            });
            services
            .AddMvc(opts => opts.EnableEndpointRouting = false)
            .AddApplicationPart(typeof(HumanTaskDefsController).Assembly)
            .AddNewtonsoftJson();
            services.AddLogging();
            var emptyTask = HumanTaskDefBuilder.New("emptyTask")
                            .SetTaskInitiatorUserIdentifiers(new List <string> {
                "taskInitiator"
            })
                            .SetPotentialOwnerUserIdentifiers(new List <string> {
                "administrator"
            })
                            .Build();
            var addClient = HumanTaskDefBuilder.New("addClient")
                            .SetTaskInitiatorUserIdentifiers(new List <string> {
                "taskInitiator"
            })
                            .SetPotentialOwnerUserIdentifiers(new List <string> {
                "administrator"
            })
                            .AddDescription("en-US", "<b>firstname is $firstName$, isGoldenClient $isGoldenClient$</b>", "text/html")
                            .AddPresentationParameter("firstName", ParameterTypes.STRING, "context.GetInput(\"firstName\")")
                            .AddPresentationParameter("isGoldenClient", ParameterTypes.BOOL, "context.GetInput(\"isGoldenClient\")")
                            .AddInputOperationParameter("firstName", ParameterTypes.STRING, true)
                            .AddInputOperationParameter("isGoldenClient", ParameterTypes.BOOL, false)
                            .AddOutputOperationParameter("wage", ParameterTypes.INT, true)
                            .Build();
            var noPotentialOwner = HumanTaskDefBuilder.New("noPotentialOwner")
                                   .SetTaskInitiatorUserIdentifiers(new List <string> {
                "taskInitiator"
            })
                                   .SetBusinessAdministratorUserIdentifiers(new List <string> {
                "businessAdmin"
            })
                                   .Build();
            var multiplePotentialOwners = HumanTaskDefBuilder.New("multiplePotentialOwners")
                                          .SetTaskInitiatorUserIdentifiers(new List <string> {
                "taskInitiator"
            })
                                          .SetPotentialOwnerUserIdentifiers(new List <string> {
                "administrator", "guest"
            })
                                          .Build();
            var startDeadLine = HumanTaskDefBuilder.New("startDeadLine")
                                .AddInputOperationParameter("firstName", ParameterTypes.STRING, true)
                                .SetTaskInitiatorUserIdentifiers(new List <string> {
                "taskInitiator"
            })
                                .SetPotentialOwnerUserIdentifiers(new List <string> {
                "administrator", "guest"
            })
                                .AddStartDeadLine("sendReminder", (dl) =>
            {
                dl.SetUntilExpression("P0Y0M0DT0H0M2S");
                dl.AddEscalation(eb =>
                {
                    eb.AddToPart("firstName", "context.GetInput(\"firstName\")");
                    eb.SetNotification("firstNotification");
                });
            })
                                .Build();
            var completionDeadLine = HumanTaskDefBuilder.New("completionDeadLine")
                                     .AddInputOperationParameter("firstName", ParameterTypes.STRING, true)
                                     .SetTaskInitiatorUserIdentifiers(new List <string> {
                "taskInitiator"
            })
                                     .SetPotentialOwnerUserIdentifiers(new List <string> {
                "administrator", "guest"
            })
                                     .AddCompletionDeadLine("sendReminder", (dl) =>
            {
                dl.SetUntilExpression("P0Y0M0DT0H0M2S");
                dl.AddEscalation(eb =>
                {
                    eb.AddToPart("firstName", "context.GetInput(\"firstName\")");
                    eb.SetNotification("secondNotification");
                });
            })
                                     .Build();
            var compositeTask = HumanTaskDefBuilder.New("compositeTask")
                                .SetTaskInitiatorUserIdentifiers(new List <string> {
                "taskInitiator"
            })
                                .SetPotentialOwnerUserIdentifiers(new List <string> {
                "administrator"
            })
                                .AddInputOperationParameter("firstName", ParameterTypes.STRING, true)
                                .AddInputOperationParameter("isGoldenClient", ParameterTypes.BOOL, false)
                                .SetParallelComposition(InstantiationPatterns.AUTOMATIC, cb =>
            {
                cb.AddSubTask("addClient", new List <ToPart>
                {
                    new ToPart {
                        Expression = "context.GetInput(\"firstName\")", Name = "firstName"
                    },
                    new ToPart {
                        Expression = "context.GetInput(\"isGoldenClient\")", Name = "isGoldenClient"
                    }
                });
            })
                                .Build();
            var compositeTaskWithAutomaticCompletionBehavior = HumanTaskDefBuilder.New("compositeTaskWithAutomaticCompletionBehavior")
                                                               .SetTaskInitiatorUserIdentifiers(new List <string> {
                "taskInitiator"
            })
                                                               .SetPotentialOwnerUserIdentifiers(new List <string> {
                "administrator"
            })
                                                               .AddInputOperationParameter("firstName", ParameterTypes.STRING, true)
                                                               .AddInputOperationParameter("isGoldenClient", ParameterTypes.BOOL, false)
                                                               .SetParallelComposition(InstantiationPatterns.AUTOMATIC, cb =>
            {
                cb.AddSubTask("addClient", new List <ToPart>
                {
                    new ToPart {
                        Expression = "context.GetInput(\"firstName\")", Name = "firstName"
                    },
                    new ToPart {
                        Expression = "context.GetInput(\"isGoldenClient\")", Name = "isGoldenClient"
                    }
                });
                cb.AddSubTask("emptyTask", new List <ToPart>());
            })
                                                               .SetAutomaticCompletion(cb =>
            {
                cb.AddCompletion("context.GetIntOutput(\"wage\", \"addClient\") > 2", new List <Copy>
                {
                    new Copy
                    {
                        From = "context.GetIntOutput(\"wage\", \"addClient\")",
                        To   = "wage"
                    }
                });
            })
                                                               .Build();
            var firstNotification = NotificationDefBuilder.New("firstNotification")
                                    .AddInputOperationParameter("firstName", ParameterTypes.STRING, true)
                                    .SetRecipientUserIdentifiers(new List <string> {
                "guest"
            })
                                    .AddName("en-US", "<b>firstName is $firstName$</b>")
                                    .AddPresentationParameter("firstName", ParameterTypes.STRING, "context.GetInput(\"firstName\")")
                                    .Build();
            var secondNotification = NotificationDefBuilder.New("secondNotification")
                                     .AddInputOperationParameter("firstName", ParameterTypes.STRING, true)
                                     .SetRecipientUserIdentifiers(new List <string> {
                "guest"
            })
                                     .AddName("en-US", "<b>firstName is $firstName$</b>")
                                     .AddPresentationParameter("firstName", ParameterTypes.STRING, "context.GetInput(\"firstName\")")
                                     .Build();

            services.AddHostedService <HumanTaskJobServerHostedService>();
            services.AddHumanTasksApi();
            services.AddHumanTaskServer()
            .AddHumanTaskDefs(new List <HumanTaskDefinitionAggregate>
            {
                addClient,
                noPotentialOwner,
                multiplePotentialOwners,
                startDeadLine,
                compositeTask,
                completionDeadLine,
                compositeTaskWithAutomaticCompletionBehavior,
                emptyTask
            })
            .AddNotificationDefs(new List <NotificationDefinitionAggregate>
            {
                firstNotification,
                secondNotification
            })
            .AddScheduledJobs(new List <ScheduleJob>
            {
                ScheduleJob.New <ProcessActivationTimerJob>(1 * 1000),
                ScheduleJob.New <ProcessDeadLinesJob>(1 * 1000)
            });
        }
Beispiel #3
0
        public void ConfigureServices(IServiceCollection services)
        {
            var sp = services.BuildServiceProvider();
            var httpClientFactory = sp.GetRequiredService <CaseManagement.Common.Factories.IHttpClientFactory>();

            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCustomAuthentication(opts => { });
            services.AddAuthorization(policy =>
            {
                // Case file
                policy.AddPolicy("add_casefile", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("update_casefile", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("publish_casefile", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("get_casefile", p => p.RequireAuthenticatedUser());
                // Case plan instance
                policy.AddPolicy("search_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("get_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("add_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("add_caseplaniteminstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("launch_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("close_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("suspend_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("reactivate_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("resume_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("terminate_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("activate_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("complete_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("disable_caseplaninstance", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("reenable_caseplaninstance", p => p.RequireAuthenticatedUser());
                // Case plan
                policy.AddPolicy("get_caseplan", p => p.RequireAuthenticatedUser());
                // Case worker task
                policy.AddPolicy("get_caseworkertasks", p => p.RequireAuthenticatedUser());
                policy.AddPolicy("Authenticated", p => p.RequireAuthenticatedUser());
                policy.AddPolicy(HumanTaskConstants.ScopeNames.ManageHumanTaskInstance, p => p.RequireAssertion(__ => true));
            });
            var emptyTask = HumanTaskDefBuilder.New("emptyTask")
                            .SetTaskInitiatorUserIdentifiers(new List <string> {
                "thabart"
            })
                            .SetPotentialOwnerUserIdentifiers(new List <string> {
                "thabart"
            })
                            .AddInputOperationParameter("city", ParameterTypes.STRING, true)
                            .AddOutputOperationParameter("firstname", ParameterTypes.STRING, true)
                            .Build();

            services.AddHumanTasksApi();
            services.AddHumanTaskServer()
            .AddHumanTaskDefs(new List <HumanTaskDefinitionAggregate>
            {
                emptyTask
            })
            .AddScheduledJobs(new List <ScheduleJob>
            {
                ScheduleJob.New <ProcessActivationTimerJob>(1 * 1000),
                ScheduleJob.New <ProcessDeadLinesJob>(1 * 1000)
            });
            services
            .AddMvc(opts => opts.EnableEndpointRouting = false)
            .AddApplicationPart(typeof(CaseFilesController).Assembly)
            .AddApplicationPart(typeof(HumanTaskDefsController).Assembly)
            .AddNewtonsoftJson();
            var files = Directory.EnumerateFiles(Path.Combine(Directory.GetCurrentDirectory(), "Cmmns"), "*.cmmn").ToList();

            services.AddCaseApi(callback: opt =>
            {
                opt.CallbackUrl        = "http://localhost/case-plan-instances/{id}/complete/{eltId}";
                opt.WSHumanTaskAPI     = "http://localhost";
                opt.OAuthTokenEndpoint = "http://localhost/token";
            }).AddDefinitions(files);
            services.AddSingleton <CaseManagement.Common.Factories.IHttpClientFactory>(httpClientFactory);
            services.AddMassTransitHostedService();
        }
Beispiel #4
0
        public void ConfigureServices(IServiceCollection services)
        {
            var files             = Directory.EnumerateFiles(Path.Combine(Directory.GetCurrentDirectory(), "Bpmns"), "*.bpmn").ToList();
            var sp                = services.BuildServiceProvider();
            var httpClientFactory = sp.GetRequiredService <CaseManagement.Common.Factories.IHttpClientFactory>();

            services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCustomAuthentication(opts => { });
            services.AddAuthorization(_ =>
            {
                _.AddPolicy("Authenticated", p => p.RequireAuthenticatedUser());
                _.AddPolicy(HumanTaskConstants.ScopeNames.ManageHumanTaskInstance, p => p.RequireAssertion(__ => true));
            });
            services
            .AddMvc(opts => opts.EnableEndpointRouting = false)
            .AddApplicationPart(typeof(ProcessFilesController).Assembly)
            .AddApplicationPart(typeof(HumanTaskDefsController).Assembly)
            .AddNewtonsoftJson();
            services.AddLogging();
            var emptyTask = HumanTaskDefBuilder.New("emptyTask")
                            .SetTaskInitiatorUserIdentifiers(new List <string> {
                "thabart"
            })
                            .SetPotentialOwnerUserIdentifiers(new List <string> {
                "thabart"
            })
                            .Build();
            var dressAppropriateForm = HumanTaskDefBuilder.New("dressAppropriateForm")
                                       .SetTaskInitiatorUserIdentifiers(new List <string> {
                "thabart"
            })
                                       .SetPotentialOwnerUserIdentifiers(new List <string> {
                "thabart"
            })
                                       .AddInputOperationParameter("degree", ParameterTypes.STRING, true)
                                       .AddInputOperationParameter("city", ParameterTypes.STRING, true)
                                       .Build();
            var takeTemperatureForm = HumanTaskDefBuilder.New("temperatureForm")
                                      .SetTaskInitiatorUserIdentifiers(new List <string> {
                "thabart"
            })
                                      .SetPotentialOwnerUserIdentifiers(new List <string> {
                "thabart"
            })
                                      .AddOutputOperationParameter("degree", ParameterTypes.INT, true)
                                      .Build();

            services.AddHumanTasksApi();
            services.AddHumanTaskServer()
            .AddHumanTaskDefs(new List <HumanTaskDefinitionAggregate>
            {
                emptyTask,
                dressAppropriateForm,
                takeTemperatureForm
            })
            .AddScheduledJobs(new List <ScheduleJob>
            {
                ScheduleJob.New <ProcessActivationTimerJob>(1 * 1000),
                ScheduleJob.New <ProcessDeadLinesJob>(1 * 1000)
            });
            services.AddProcessJobServer(callbackOpts: o =>
            {
                o.ApplicationAssembly = typeof(ProcessInstanceAggregate).Assembly;
            }, callbackServerOpts: o =>
            {
                o.WSHumanTaskAPI     = "http://localhost";
                o.OAuthTokenEndpoint = "http://localhost/token";
                o.CallbackUrl        = "http://localhost/processinstances/{id}/complete/{eltId}";
            })
            .AddProcessFiles(files)
            .AddDelegateConfigurations(new ConcurrentBag <DelegateConfigurationAggregate>
            {
                DelegateConfigurationAggregate.Create("GetWeatherInformationDelegate", typeof(GetWeatherInformationDelegate).FullName)
            });
            services.AddHostedService <HumanTaskJobServerHostedService>();
            services.AddSingleton <CaseManagement.Common.Factories.IHttpClientFactory>(httpClientFactory);
        }
Beispiel #5
0
        public void ConfigureServices(IServiceCollection services)
        {
            var dressAppropriateForm = HumanTaskDefBuilder.New("dressAppropriateForm")
                                       .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                       .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                       .AddPresentationParameter("degree", ParameterTypes.STRING, "context.GetInput(\"degree\")")
                                       .AddPresentationParameter("city", ParameterTypes.STRING, "context.GetInput(\"city\")")
                                       .AddName("fr", "Température à $city$")
                                       .AddName("en", "Temperature in $city$")
                                       .AddSubject("fr", "Il fait $degree$", "text/html")
                                       .AddSubject("en", "Degree : $degree$", "text/html")
                                       .AddInputOperationParameter("degree", ParameterTypes.STRING, true)
                                       .AddInputOperationParameter("city", ParameterTypes.STRING, true)
                                       .Build();
            var captureClaimDetails = HumanTaskDefBuilder.New("captureClaimDetails")
                                      .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .AddName("fr", "Capturer les détails de la réclamation")
                                      .AddName("en", "Capture claim details")
                                      .SetRendering("{'type':'container','children':[{'id':'d2a121d7-fe66-4cb3-a7fb-b9f48219ab228','type':'txt','label':'Firstname','name':'firstName'},{'id':'c6a4ca0f-aa78-4743-9787-e5126375945bd','type':'txt','label':'Lastname','name':'lastName'},{'id':'20b21433-b934-4095-b942-06eb73a15b14e','type':'txt','label':'Claim','name':'claim'}]}")
                                      .AddOutputOperationParameter("firstName", ParameterTypes.STRING, true)
                                      .AddOutputOperationParameter("lastName", ParameterTypes.STRING, true)
                                      .AddOutputOperationParameter("claim", ParameterTypes.STRING, true)
                                      .Build();
            var takeTemperatureForm = HumanTaskDefBuilder.New("temperatureForm")
                                      .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .AddName("fr", "Saisir la température")
                                      .AddName("en", "Enter degree")
                                      .SetRendering("{'type':'container','children':[{'id':'ea71ffe8-517f-4f52-97f0-2658ee0bb1c92','type':'txt','label':'Degree','name':'degree'}]}")
                                      .AddOutputOperationParameter("degree", ParameterTypes.INT, true)
                                      .Build();
            var updateClaimantContactDetailsForm = HumanTaskDefBuilder.New("updateClaimantContactDetailsForm")
                                                   .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                                   .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                                   .AddName("fr", "Mettre à jour les informations de contact du 'Claimant'")
                                                   .AddName("en", "Update claimant contact details")
                                                   .SetRendering("{'type':'container','children':[{'id':'c6d8ca40-eb7a-48f4-8849-26afc0ffb4cda','type':'txt','label':'Firstname','name':'firstName'},{'id':'3e163681-2147-40f5-9c77-391ad5699c905','type':'txt','label':'Lastname','name':'lastName'}]}")
                                                   .AddOutputOperationParameter("firstName", ParameterTypes.STRING, true)
                                                   .AddOutputOperationParameter("lastName", ParameterTypes.STRING, true)
                                                   .Build();

            services.AddMvc(opts => opts.EnableEndpointRouting = false).AddNewtonsoftJson();
            services.AddAuthentication(options =>
            {
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = ExtractKey("openid_puk.txt"),
                    ValidAudiences   = new List <string>
                    {
                        "http://localhost:60000",
                        "http://simpleidserver.northeurope.cloudapp.azure.com/openid"
                    },
                    ValidIssuers = new List <string>
                    {
                        "http://localhost:60000",
                        "http://simpleidserver.northeurope.cloudapp.azure.com/openid"
                    }
                };
            })
            .AddJwtBearer("OAuthScheme", options =>
            {
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = ExtractKey("oauth_puk.txt"),
                    ValidAudiences   = new List <string>
                    {
                        "bpmnClient",
                        "cmmnClient"
                    },
                    ValidIssuers = new List <string>
                    {
                        "http://localhost:60001",
                        "http://simpleidserver.northeurope.cloudapp.azure.com/oauth"
                    }
                };
            });
            services.AddAuthorization(_ => _.AddDefaultHumanTaskAuthorizationPolicy());
            services.AddCors(options => options.AddPolicy("AllowAll", p => p.AllowAnyOrigin()
                                                          .AllowAnyMethod()
                                                          .AllowAnyHeader()));
            services.AddHostedService <HumanTaskJobServerHostedService>();
            services.AddHumanTasksApi();
            services.AddHumanTaskServer()
            .AddHumanTaskDefs(new List <HumanTaskDefinitionAggregate>
            {
                captureClaimDetails,
                dressAppropriateForm,
                takeTemperatureForm,
                updateClaimantContactDetailsForm
            });
            services.AddSwaggerGen();
            services.Configure <ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
            });
        }
        public void ConfigureServices(IServiceCollection services)
        {
            var dressAppropriateForm = HumanTaskDefBuilder.New("dressAppropriateForm")
                                       .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                       .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                       .AddPresentationParameter("degree", ParameterTypes.STRING, "context.GetInput(\"degree\")")
                                       .AddPresentationParameter("city", ParameterTypes.STRING, "context.GetInput(\"city\")")
                                       .AddName("fr", "Température à $city$")
                                       .AddName("en", "Temperature in $city$")
                                       .AddSubject("fr", "Il fait $degree$", "text/html")
                                       .AddSubject("en", "Degree : $degree$", "text/html")
                                       .AddInputOperationParameter("degree", ParameterTypes.STRING, true)
                                       .AddInputOperationParameter("city", ParameterTypes.STRING, true)
                                       .Build();
            var captureClaimDetails = HumanTaskDefBuilder.New("captureClaimDetails")
                                      .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .AddName("fr", "Capturer les détails de la réclamation")
                                      .AddName("en", "Capture claim details")
                                      .SetRendering("{'type':'container','children':[{'id':'d2a121d7-fe66-4cb3-a7fb-b9f48219ab228','type':'txt','label':'Firstname','name':'firstName'},{'id':'c6a4ca0f-aa78-4743-9787-e5126375945bd','type':'txt','label':'Lastname','name':'lastName'},{'id':'20b21433-b934-4095-b942-06eb73a15b14e','type':'txt','label':'Claim','name':'claim'}]}")
                                      .AddOutputOperationParameter("firstName", ParameterTypes.STRING, true)
                                      .AddOutputOperationParameter("lastName", ParameterTypes.STRING, true)
                                      .AddOutputOperationParameter("claim", ParameterTypes.STRING, true)
                                      .Build();
            var takeTemperatureForm = HumanTaskDefBuilder.New("temperatureForm")
                                      .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                      .AddName("fr", "Saisir la température")
                                      .AddName("en", "Enter degree")
                                      .SetRendering("{'type':'container','children':[{'id':'ea71ffe8-517f-4f52-97f0-2658ee0bb1c92','type':'txt','label':'Degree','name':'degree'}]}")
                                      .AddOutputOperationParameter("degree", ParameterTypes.INT, true)
                                      .Build();
            var updateClaimantContactDetailsForm = HumanTaskDefBuilder.New("updateClaimantContactDetailsForm")
                                                   .SetTaskInitiatorUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                                   .SetPotentialOwnerUserIdentifiers(new List <string> {
                "businessanalyst"
            })
                                                   .AddName("fr", "Mettre à jour les informations de contact du 'Claimant'")
                                                   .AddName("en", "Update claimant contact details")
                                                   .SetRendering("{'type':'container','children':[{'id':'c6d8ca40-eb7a-48f4-8849-26afc0ffb4cda','type':'txt','label':'Firstname','name':'firstName'},{'id':'3e163681-2147-40f5-9c77-391ad5699c905','type':'txt','label':'Lastname','name':'lastName'}]}")
                                                   .AddOutputOperationParameter("firstName", ParameterTypes.STRING, true)
                                                   .AddOutputOperationParameter("lastName", ParameterTypes.STRING, true)
                                                   .Build();
            var updatePasswordForm = HumanTaskDefBuilder.New("updatePassword")
                                     .SetValidator(typeof(UpdatePasswordValidator).FullName)
                                     .SetPotentialOwnerUserRoles(new List <string> {
                "visitor"
            })
                                     .SetTaskInitiatorUserRoles(new List <string> {
                "visitor"
            })
                                     .AddName("fr", "Mettre à jour le mot de passe")
                                     .AddName("en", "Update password")
                                     .SetRendering("{'type':'container','children':[{'id':'99ef13cb-2030-4e9b-9bfe-bd26344d5620b','type':'header','translations':[{'language':'fr','value':'Mettre à jour le mot de passe'},{'language':'en','value':'Update password'}],'class':'mat-display-1'},{'id':'c31d0496-7c23-43b3-91b6-47f8a6c8881a5','name':'pwd','type':'pwd','validationRules':['REQUIRED'],'translations':[{'language':'fr','value':'Mot de passe'},{'language':'en','value':'Passwod'}]},{'id':'7119b7a9-67bf-4169-ad72-baad749528c17','name':'confirmpwd','type':'confirmpwd','validationRules':['REQUIRED','CONFIRMPWD'],'translations':[{'language':'fr','value':'Confirmer le mot de passe'},{'language':'en','value':'Confirm password'}]}]}")
                                     .AddOutputOperationParameter("pwd", ParameterTypes.STRING, true)
                                     .Build();

            services.AddMvc(opts => opts.EnableEndpointRouting = false).AddNewtonsoftJson();
            services.AddAuthentication(options =>
            {
                options.DefaultChallengeScheme    = JwtBearerDefaults.AuthenticationScheme;
                options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(options =>
            {
                options.Events = new JwtBearerEvents
                {
                    OnTokenValidated = async(ctx) =>
                    {
                        using (var httpClient = new HttpClient())
                        {
                            var authorization  = ctx.Request.Headers["Authorization"][0];
                            var bearer         = authorization.Split(" ").Last();
                            var requestMessage = new HttpRequestMessage
                            {
                                RequestUri = new Uri($"{_configuration["OpenIdUrl"]}/userinfo"),
                                Method     = HttpMethod.Get
                            };
                            requestMessage.Headers.Add("Authorization", $"Bearer {bearer}");
                            try
                            {
                                var httpResponse = await httpClient.SendAsync(requestMessage);
                                httpResponse.EnsureSuccessStatusCode();
                                var json     = await httpResponse.Content.ReadAsStringAsync();
                                var jObj     = JObject.Parse(json);
                                var identity = new ClaimsIdentity("userInfo");
                                foreach (var kvp in jObj)
                                {
                                    var key = kvp.Key;
                                    if (MAPPING_OPENIDCLAIM_TO_CLAIM.ContainsKey(key))
                                    {
                                        key = MAPPING_OPENIDCLAIM_TO_CLAIM[key];
                                    }

                                    if (kvp.Value.ToString().StartsWith('['))
                                    {
                                        var arr = JArray.Parse(kvp.Value.ToString()).Select(_ => _.ToString()).ToList();
                                        foreach (var str in arr)
                                        {
                                            identity.AddClaim(new Claim(key, str));
                                        }
                                    }
                                    else
                                    {
                                        identity.AddClaim(new Claim(key, kvp.Value.ToString()));
                                    }
                                }

                                var principal = new ClaimsPrincipal(identity);
                                ctx.Principal = principal;
                            }
                            catch (Exception) { }
                        }
                    }
                };
                options.TokenValidationParameters = new TokenValidationParameters
                {
                    IssuerSigningKey = ExtractKey("openid_puk.txt"),
                    ValidAudiences   = new List <string>
                    {
                        "bpmnClient",
                        "caseManagementTasklistWebsite",
                        "caseManagementWebsite",
                        "simpleIdServerWebsite",
                        "humanTaskClient",
                        "https://localhost:60000",
                        "https://simpleidserver.northeurope.cloudapp.azure.com/openid"
                    },
                    ValidIssuers = new List <string>
                    {
                        "https://localhost:60000",
                        "https://openid:60000",
                        "https://simpleidserver.northeurope.cloudapp.azure.com/openid"
                    }
                };
            });
            services.AddAuthorization(_ => _.AddDefaultHumanTaskAuthorizationPolicy());
            services.AddCors(options => options.AddPolicy("AllowAll", p => p.AllowAnyOrigin()
                                                          .AllowAnyMethod()
                                                          .AllowAnyHeader()));
            services.AddHostedService <HumanTaskJobServerHostedService>();
            services.AddHumanTasksApi();
            services.AddHumanTaskServer()
            .AddHumanTaskDefs(new List <HumanTaskDefinitionAggregate>
            {
                captureClaimDetails,
                dressAppropriateForm,
                takeTemperatureForm,
                updateClaimantContactDetailsForm,
                updatePasswordForm
            });
            services.AddSwaggerGen();
            services.Configure <ForwardedHeadersOptions>(options =>
            {
                options.ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto;
            });
        }