1
Fork 0

fsharp(todolist-api): refactor: refactored to use Chiron for json stuff

Signed-off-by: prescientmoon <git@moonythm.dev>
This commit is contained in:
Matei Adriel 2020-01-02 16:51:22 +02:00 committed by prescientmoon
parent 6400fd753b
commit 3023f6c410
Signed by: prescientmoon
SSH key fingerprint: SHA256:UUF9JT2s8Xfyv76b8ZuVL7XrmimH4o49p4b+iexbVH4
5 changed files with 50 additions and 21 deletions

View file

@ -8,3 +8,4 @@ nuget Suave
nuget SQLProvider
nuget Npgsql
nuget FSharpPlus 1.1.0-CI00272
nuget Chiron

View file

@ -2,6 +2,15 @@ STORAGE: NONE
RESTRICTION: == netcoreapp3.1
NUGET
remote: https://api.nuget.org/v3/index.json
Aether (8.3.1)
FSharp.Core (>= 4.3.4)
Chiron (6.3.1)
Aether (>= 8.2)
FParsec (>= 1.0.3)
FSharp.Core (>= 4.3.4)
FParsec (1.0.3)
FSharp.Core (>= 4.2.3)
NETStandard.Library (>= 1.6.1)
FSharp.Core (4.7)
FSharpPlus (1.1.0-CI00272)
FSharp.Core (>= 4.6.2)

View file

@ -3,3 +3,4 @@ Suave
SQLProvider
Npgsql
FSharpPlus
Chiron

View file

@ -7,20 +7,20 @@ open Suave
open Suave.Operators
open Suave.Successful
open Suave.RequestErrors
open Suave.Json
open Suave.Filters
open Chiron
module Utils =
open System.Text
open Db.Types
let jsonToString json = json |> toJson |> Encoding.UTF8.GetString
let todoToRecord (todo: DbTodo) =
{ id = todo.Id
description = todo.Description
name = todo.Name }
let parseJson (input: byte array) = input |> Encoding.UTF8.GetString |> Json.parse |> Json.deserialize
module App =
open Utils
open Db
@ -34,12 +34,12 @@ module App =
| None -> id |> sprintf "Cannot find todo with id %i" |> NOT_FOUND
let todoById =
(fun (inner, _, _) -> inner |> todoToRecord |> jsonToString |> OK) |> withTodoById
withTodoById (fun (inner, _, _) -> inner |> todoToRecord |> Json.serialize |> Json.format |> OK)
let updateTodo =
(fun (todo, dbContext, id) ->
withTodoById (fun (todo, dbContext, id) ->
fun ctx -> async {
let body: Types.TodoDetails = ctx.request.rawForm |> fromJson
let body: Types.TodoDetails = parseJson ctx.request.rawForm
do! Queries.updateTodosById todo body dbContext
@ -49,10 +49,11 @@ module App =
id = id
}
let withNewBody = newBody |> toJson |> ok
return! withNewBody ctx
let writeBody = newBody |> Json.serialize |> Json.format |> OK
return! writeBody ctx
}
) |> withTodoById
)
let mainWebPart: WebPart = choose [
GET >=> pathScan "/todos/%i" todoById

View file

@ -15,27 +15,44 @@ module Context =
module Types =
open Context
open System.Runtime.Serialization
open Chiron
type DbTodo = DbContext.``public.todosEntity``
[<DataContract>]
type Todo =
{ [<field:DataMember(Name = "id")>]
id: int
[<field:DataMember(Name = "description")>]
{ id: int
description: string
[<field:DataMember(Name = "name")>]
name: string }
static member ToJson(todo: Todo) =
json {
do! Json.write "name" todo.name
do! Json.write "description" todo.description
do! Json.write "id" todo.id
}
static member FromJson(_: Todo) =
json {
let! name = Json.read "name"
let! description = Json.read "description"
let! id = Json.read "id"
return { name = name
description = description
id = id }
}
[<DataContract>]
type TodoDetails =
{ [<field:DataMember(Name = "description")>]
description: string
[<field:DataMember(Name = "name")>]
{ description: string
name: string }
static member FromJson(_: TodoDetails) =
json {
let! name = Json.read "name"
let! description = Json.read "description"
return { name = name
description = description }
}