namespace FundLab.Api open System open Giraffe open Microsoft.AspNetCore.Http type EmptyPortfolioResponse = { status: string message: string } module App = let private unauthorized : HttpHandler = setStatusCode 401 >=> setHttpHeader "WWW-Authenticate" "Bearer" >=> text "Unauthorized" let private requireBearer (next: HttpFunc) (ctx: HttpContext) = let expectedToken = Environment.GetEnvironmentVariable("FUND_LAB_AUTH_TOKEN") |> Option.ofObj |> Option.defaultValue "" let authorizationHeader = ctx.Request.Headers.Authorization.ToString() match Authentication.authorize expectedToken authorizationHeader with | AuthDecision.Authorized -> next ctx | AuthDecision.Unauthorized -> unauthorized next ctx let private health : HttpHandler = json ({ service = "fund-lab-api" status = "ok" } : HealthResponse) let private emptyPortfolio : HttpHandler = json { status = "empty" message = "尚未创建基金/尚未选择投资" } let createApplication () : HttpHandler = choose [ GET >=> route "/health" >=> health subRoute "/api" ( requireBearer >=> choose [ GET >=> route "/portfolio/summary" >=> emptyPortfolio ] ) setStatusCode 404 >=> text "Not Found" ]