fsharp-giraffe-server.Program.mustache Maven / Gradle / Ivy
namespace {{packageName}}
open System
open System.Net.Http
open System.Security.Claims
open System.Threading
open Microsoft.AspNetCore
open Microsoft.AspNetCore.Builder
open Microsoft.AspNetCore.Hosting
open Microsoft.AspNetCore.Http
open Microsoft.AspNetCore.Http.Features
open Microsoft.AspNetCore.Authentication
open Microsoft.AspNetCore.Authentication.Cookies
open Microsoft.Extensions.Configuration
open Microsoft.Extensions.Logging
open Microsoft.Extensions.DependencyInjection
open FSharp.Control.Tasks.V2.ContextInsensitive
open System.Diagnostics
open Giraffe.GiraffeViewEngine
open AspNet.Security.ApiKey.Providers
{{#apiInfo}}
{{#apis}}
open {{classFilename}}HandlerParams
{{/apis}}
{{/apiInfo}}
open Giraffe
module App =
// ---------------------------------
// Error handler
// ---------------------------------
let errorHandler (ex : Exception) (logger : ILogger) =
logger.LogError(EventId(), ex, "An unhandled exception has occurred while executing the request.")
clearResponse >=> setStatusCode 500 >=> text ex.Message
// ---------------------------------
// Web app
// ---------------------------------
let HttpGet = GET
let HttpPost = POST
let HttpPut = PUT
let HttpDelete = DELETE
let authFailure : HttpHandler =
setStatusCode 401 >=> text "You must be authenticated to access this resource."
let webApp =
choose (CustomHandlers.handlers @ [
{{#apiInfo}}
{{#apis}}
{{#operations}}
{{#operation}}
{{httpMethod}} >=> {{^hasPathParams}}route{{/hasPathParams}}{{#hasPathParams}}routeBind<{{operationId}}PathParams>{{/hasPathParams}} "{{contextPath}}{{path}}" {{^pathParams}}>=>{{/pathParams}} {{#pathParams}}(fun x -> {{/pathParams}}{{#authMethods}}{{#isOAuth}}requiresAuthentication authFailure{{/isOAuth}}{{#isApiKey}}challenge ApiKeyDefaults.AuthenticationScheme >=> requiresAuthentication authFailure{{/isApiKey}} >=> {{/authMethods}} {{classname}}Handler.{{operationId}}{{#pathParams}} x){{/pathParams}};
{{/operation}}
{{/operations}}
{{/apis}}
RequestErrors.notFound (text "Not Found")
{{/apiInfo}}
])
// ---------------------------------
// Main
// ---------------------------------
let configureApp (app : IApplicationBuilder) =
app.UseGiraffeErrorHandler(errorHandler)
.UseStaticFiles()
.UseAuthentication()
.UseResponseCaching() |> ignore
CustomHandlers.configureApp app |> ignore
app.UseGiraffe webApp |> ignore
let configureServices (services : IServiceCollection) =
services
.AddResponseCaching()
.AddGiraffe()
|> AuthSchemes.configureServices
|> CustomHandlers.configureServices services
|> ignore
services.AddDataProtection() |> ignore
let configureLogging (loggerBuilder : ILoggingBuilder) =
loggerBuilder.AddFilter(fun lvl -> lvl.Equals LogLevel.Error)
.AddConsole()
.AddDebug() |> ignore
[]
let main _ =
let builder = WebHost.CreateDefaultBuilder()
.Configure(Action configureApp)
.ConfigureServices(configureServices)
.ConfigureLogging(configureLogging)
|> CustomHandlers.configureWebHost
builder.Build()
.Run()
0