[Fix] - Trying to fix compile error

This commit is contained in:
adnanioricce 2025-01-14 23:53:39 -03:00
parent 0c4b7e1743
commit 00b140c99d
2 changed files with 130 additions and 66 deletions

@ -1,19 +1,32 @@
open Giraffe open Giraffe
open Microsoft.AspNetCore.Http open System
open System.IO
open Microsoft.AspNetCore.Builder open Microsoft.AspNetCore.Builder
open Microsoft.Extensions.DependencyInjection open Microsoft.AspNetCore.Cors.Infrastructure
open Microsoft.AspNetCore.Hosting
open Microsoft.Extensions.Hosting open Microsoft.Extensions.Hosting
open Thoth.Json open Microsoft.Extensions.Logging
type QueryFilter = open Microsoft.Extensions.DependencyInjection
| Equal of string * string open Microsoft.AspNetCore.Http
| GreaterThan of string * float
| LessThan of string * float #if FABLE_COMPILER
open Thoth.Json
#else
open Thoth.Json.Net
#endif
// Here you can write your code as usual
type QueryFilter =
| Equal of string * string
| GreaterThan of string * float
| LessThan of string * float
type QueryDSL =
{ Select: string list
Filters: QueryFilter list
Sort: (string * string) list } // Field and direction
type QueryDSL = {
Select : string list
Filters : QueryFilter list
Sort : (string * string) list // Field and direction
}
let parseQuery (body: string) = let parseQuery (body: string) =
// Example JSON parsing (using FSharp.Data or similar) // Example JSON parsing (using FSharp.Data or similar)
// Example query JSON: // Example query JSON:
@ -35,85 +48,133 @@ let parseQuery (body: string) =
// parsed.["sort"].AsArray() // parsed.["sort"].AsArray()
// |> Array.map (fun s -> s.[0].AsString(), s.[1].AsString()) // |> Array.map (fun s -> s.[0].AsString(), s.[1].AsString())
// |> List.ofArray // |> List.ofArray
//{ Select = selectFields; Filters = filters; Sort = sort } //{ Select = selectFields; Filters = filters; Sort = sort }
query query
with with ex ->
| ex -> failwithf "Failed to parse query: %s" ex.Message failwithf "Failed to parse query: %s" ex.Message
let fetchData (queryDsl: QueryDSL) = let fetchData (queryDsl: QueryDSL) =
// Mock database query (replace with actual DB logic) // Mock database query (replace with actual DB logic)
let mockData = [ let mockData =
Map.ofList [ "name", box "Alice"; "age", box 30 ] [ Map.ofList [ "name", box "Alice"; "age", box 30 ]
Map.ofList [ "name", box "Bob"; "age", box 25 ] Map.ofList [ "name", box "Bob"; "age", box 25 ]
Map.ofList [ "name", box "Charlie"; "age", box 35 ] Map.ofList [ "name", box "Charlie"; "age", box 35 ] ]
]
// Filter and transform the data based on the DSL // Filter and transform the data based on the DSL
mockData mockData
|> List.filter (fun row -> |> List.filter (fun row ->
queryDsl.Filters |> List.forall (function queryDsl.Filters
|> List.forall (function
| Equal(field, num) -> | Equal(field, num) ->
Map.tryFind field row Map.tryFind field row
|> Option.map(fun value -> (string value) = num) |> Option.map (fun value -> (string value) = num)
|> Option.defaultValue false |> Option.defaultValue false
//row.GetType().GetProperty(field).GetValue(row) = value //row.GetType().GetProperty(field).GetValue(row) = value
//| GreaterThan(field, num) -> row.[field] |> float > num //| GreaterThan(field, num) -> row.[field] |> float > num
| GreaterThan(field, num) -> | GreaterThan(field, num) ->
Map.tryFind field row Map.tryFind field row
|> Option.bind (fun value -> |> Option.bind (fun value ->
match value with match value with
| :? float as v -> Some (v > num) | :? float as v -> Some(v > num)
| :? int as v -> Some (float v > num) | :? int as v -> Some(float v > num)
| _ -> None) | _ -> None)
|> Option.defaultValue false |> Option.defaultValue false
| LessThan(field, num) -> | LessThan(field, num) ->
Map.tryFind field row Map.tryFind field row
|> Option.bind (fun value -> |> Option.bind (fun value ->
match value with match value with
| :? float as v -> Some (v < num) | :? float as v -> Some(v < num)
| :? int as v -> Some (float v < num) | :? int as v -> Some(float v < num)
| _ -> None) | _ -> None)
|> Option.defaultValue false)) |> Option.defaultValue false))
|> List.map (fun row -> |> List.map (fun row -> queryDsl.Select |> List.map (fun field -> field, row.[field]) |> dict)
queryDsl.Select |> List.map (fun field -> field, row.[field]) |> dict)
|> fun result -> result |> fun result -> result
let queryHandler = fun (next: HttpFunc) (ctx: HttpContext) -> let queryHandler =
task { fun (next: HttpFunc) (ctx: HttpContext) ->
//let! body = ctx.ReadBodyAsStringAsync() task {
let! body = ctx.ReadBodyBufferedFromRequestAsync() //let! body = ctx.ReadBodyAsStringAsync()
return! parseQuery body let! body = ctx.ReadBodyBufferedFromRequestAsync()
|> Result.map(fun queryDsl ->
let data = fetchData queryDsl return!
json data next ctx parseQuery body
) |> Result.map (fun queryDsl ->
|> Result.defaultWith (fun error -> json {|success = false;message = error|} next ctx) let data = fetchData queryDsl
} json data next ctx)
let webApp () = |> Result.defaultWith (fun error -> json {| success = false; message = error |} next ctx)
POST >=> route "query" >=> queryHandler }
// [
//subRoute "/foo" [ GET [ route "/bar" (text "Aloha!") ] ] let webApp =
// POST choose
// route "query" queryHandler [ POST >=> choose [ route "/query" >=> queryHandler ]
// RequestErrors.notFound "Not Found" setStatusCode 404 >=> text "Not Found" ]
// ---------------------------------
// ] // Error handler
// ---------------------------------
let errorHandler (ex: Exception) (logger: ILogger) =
logger.LogError(ex, "An unhandled exception has occurred while executing the request.")
clearResponse >=> setStatusCode 500 >=> text ex.Message
// ---------------------------------
// Config and Main
// ---------------------------------
let configureCors (builder: CorsPolicyBuilder) =
builder.WithOrigins("http://localhost:5000", "https://localhost:5001").AllowAnyMethod().AllowAnyHeader()
|> ignore
let configureApp (app: IApplicationBuilder) = let configureApp (app: IApplicationBuilder) =
app.UseGiraffe queryHandler let env = app.ApplicationServices.GetService<IWebHostEnvironment>()
(match env.IsDevelopment() with
| true -> app.UseDeveloperExceptionPage()
| false -> app.UseGiraffeErrorHandler(errorHandler).UseHttpsRedirection())
.UseCors(configureCors)
.UseStaticFiles()
.UseGiraffe(webApp)
let configureServices (services: IServiceCollection) = let configureServices (services: IServiceCollection) =
services.AddCors() |> ignore
services.AddGiraffe() |> ignore services.AddGiraffe() |> ignore
let configureLogging (builder: ILoggingBuilder) =
builder.AddConsole().AddDebug() |> ignore
[<EntryPoint>] [<EntryPoint>]
let main args = let main args =
Host.CreateDefaultBuilder(args) let contentRoot = Directory.GetCurrentDirectory()
.ConfigureWebHostDefaults(fun webBuilder -> let webRoot = Path.Combine(contentRoot, "WebRoot")
webBuilder
//.Configure(configureApp) Host
.ConfigureServices(configureServices) .CreateDefaultBuilder(args)
|> ignore) .ConfigureWebHostDefaults(fun webHostBuilder ->
webHostBuilder
//.UseContentRoot(contentRoot)
//.UseWebRoot(webRoot)
.Configure(Action<IApplicationBuilder> configureApp)
.ConfigureServices(configureServices)
.ConfigureLogging(configureLogging)
|> ignore)
.Build() .Build()
.Run() .Run()
0 0
//let configureApp (app: IApplicationBuilder) =
// app.UseGiraffe queryHandler
//let configureServices (services: IServiceCollection) =
// services.AddGiraffe() |> ignore
//[<EntryPoint>]
//let main args =
// Host.CreateDefaultBuilder(args)
// .ConfigureWebHostDefaults(fun webBuilder ->
// webBuilder
//.Configure(configureApp)
// .ConfigureServices(configureServices)
// |> ignore)
// .Build()
// .Run()
// 0

@ -5,9 +5,12 @@
<TargetFramework>net9.0</TargetFramework> <TargetFramework>net9.0</TargetFramework>
</PropertyGroup> </PropertyGroup>
<ItemGroup> <ItemGroup>
<!--<PackageReference Include="FSharp.Json" Version="0.4.1" />-->
<PackageReference Include="Giraffe" Version="6.*" /> <PackageReference Include="Giraffe" Version="6.*" />
<PackageReference Include="FSharp.Data" Version="4.*" /> <PackageReference Include="FSharp.Data" Version="6.4.0" />
<PackageReference Include="Thoth.Json" Version="10.4.0" /> <PackageReference Include="Thoth.Json" Version="10.4.0" />
<PackageReference Include="Thoth.Json.Net" Version="12.0.0" />
<!--<PackageReference Include="Thoth.Json.Net" Version="10.4.0" />-->
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Compile Include="Program.fs" /> <Compile Include="Program.fs" />