Skip to content
This repository was archived by the owner on Sep 29, 2020. It is now read-only.

Commit 465e6f1

Browse files
committed
Refactor out helper makeTodo method
1 parent 55fe442 commit 465e6f1

File tree

4 files changed

+38
-69
lines changed

4 files changed

+38
-69
lines changed

TodoBackendFSharp/Frank.fs

+11-24
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,15 @@ open Newtonsoft.Json
2727
open TodoStorage
2828
open TodoStorage.InMemory
2929

30+
let private makeTodo (uri: Uri) (todo: NewTodo) =
31+
{ Url = Uri(uri.AbsoluteUri + todo.Id.ToString()) // TODO: Uri(this.Url.Link("GetTodo", dict ["id", i]))
32+
Title = todo.Title
33+
Completed = todo.Completed
34+
Order = todo.Order }
35+
3036
let getTodos (request: HttpRequestMessage) = async {
3137
let! todos = store.GetAll()
32-
let todos' =
33-
todos
34-
|> Array.map (fun x ->
35-
{ Url = Uri(request.RequestUri.AbsoluteUri + x.Id.ToString())
36-
Title = x.Title
37-
Completed = x.Completed
38-
Order = x.Order })
38+
let todos' = todos |> Array.map (makeTodo request.RequestUri)
3939
return request.CreateResponse(todos') }
4040

4141
let postTodo (request: HttpRequestMessage) = async {
@@ -50,14 +50,9 @@ let postTodo (request: HttpRequestMessage) = async {
5050
// Return the new todo item
5151
// TODO: Debug `this.Url.Link`.
5252
//let newUrl = Uri(this.Url.Link("GetTodo", dict ["id", index]))
53-
let newUrl = Uri(request.RequestUri.AbsoluteUri + index.ToString())
54-
let todo =
55-
{ Url = newUrl
56-
Title = newTodo.Title
57-
Completed = newTodo.Completed
58-
Order = newTodo.Order }
53+
let todo = makeTodo request.RequestUri { newTodo with Id = index }
5954
let response = request.CreateResponse(HttpStatusCode.Created, todo)
60-
response.Headers.Location <- newUrl
55+
response.Headers.Location <- todo.Url
6156
return response }
6257

6358
let deleteTodos (request: HttpRequestMessage) =
@@ -72,11 +67,7 @@ let getTodo (request: HttpRequestMessage) = async {
7267
let! todo = store.Get id
7368
match todo with
7469
| Some todo ->
75-
let todo' =
76-
{ Url = request.RequestUri
77-
Title = todo.Title
78-
Completed = todo.Completed
79-
Order = todo.Order }
70+
let todo' = makeTodo request.RequestUri todo
8071
return request.CreateResponse(todo')
8172
| None -> return request.CreateResponse(HttpStatusCode.NotFound)
8273
| None -> return request.CreateResponse(HttpStatusCode.NotFound) }
@@ -97,11 +88,7 @@ let patchTodo (request: HttpRequestMessage) = async {
9788
match newTodo with
9889
| Some newTodo ->
9990
// Return the new todo item
100-
let todo =
101-
{ Url = request.RequestUri
102-
Title = newTodo.Title
103-
Completed = newTodo.Completed
104-
Order = newTodo.Order }
91+
let todo = makeTodo request.RequestUri newTodo
10592
return request.CreateResponse(todo)
10693
| None -> return request.CreateResponse(HttpStatusCode.NotFound)
10794
| None -> return request.CreateResponse(HttpStatusCode.NotFound) }

TodoBackendFSharp/Owin.fs

+11-23
Original file line numberDiff line numberDiff line change
@@ -52,27 +52,27 @@ let methodNotAllowed (env: OwinEnv) =
5252
env.[Constants.responseReasonPhrase] <- "Method Not Allowed"
5353
async.Return()
5454

55-
let makeItemUri env index =
55+
let private makeItemUri env index =
5656
let environ = Environment.toEnvironment env
5757
let baseUri = Uri(environ.GetBaseUri().Value)
5858
if environ.RequestPathBase = "/" then
5959
Uri(baseUri, sprintf "/%i" index)
6060
else
6161
Uri(baseUri, sprintf "%s/%i" environ.RequestPathBase index)
6262

63+
let private makeTodo env (todo: NewTodo) =
64+
{ Url = makeItemUri env todo.Id
65+
Title = todo.Title
66+
Completed = todo.Completed
67+
Order = todo.Order }
68+
6369
(**
6470
* Root resource handlers
6571
*)
6672

6773
let getTodos (env: OwinEnv) = async {
6874
let! todos = store.GetAll()
69-
let todos' =
70-
todos
71-
|> Array.map (fun x ->
72-
{ Url = makeItemUri env x.Id
73-
Title = x.Title
74-
Completed = x.Completed
75-
Order = x.Order })
75+
let todos' = todos |> Array.map (makeTodo env)
7676
let result = serialize todos'
7777
let stream : Stream = unbox env.[Constants.responseBody]
7878
do! stream.AsyncWrite(result, 0, result.Length) }
@@ -87,11 +87,7 @@ let postTodo (env: OwinEnv) = async {
8787
let! index = store.Post newTodo
8888

8989
// Return the new todo item
90-
let todo =
91-
{ Url = makeItemUri env index
92-
Title = newTodo.Title
93-
Completed = newTodo.Completed
94-
Order = newTodo.Order }
90+
let todo = makeTodo env { newTodo with Id = index }
9591
env.[Constants.responseStatusCode] <- 201
9692
env.[Constants.responseReasonPhrase] <- "Created"
9793
let headers : OwinHeaders = unbox env.[Constants.responseHeaders]
@@ -115,11 +111,7 @@ let getTodo index (env: OwinEnv) = async {
115111
let! todo = store.Get index
116112
match todo with
117113
| Some todo ->
118-
let todo' =
119-
{ Url = makeItemUri env index
120-
Title = todo.Title
121-
Completed = todo.Completed
122-
Order = todo.Order }
114+
let todo' = makeTodo env todo
123115
let result = serialize todo'
124116
let stream : Stream = unbox env.[Constants.responseBody]
125117
do! stream.AsyncWrite(result, 0, result.Length)
@@ -137,11 +129,7 @@ let patchTodo index (env: OwinEnv) = async {
137129
match newTodo with
138130
| Some newTodo ->
139131
// Return the new todo item
140-
let todo =
141-
{ Url = makeItemUri env index
142-
Title = newTodo.Title
143-
Completed = newTodo.Completed
144-
Order = newTodo.Order }
132+
let todo = makeTodo env newTodo
145133
env.[Constants.responseStatusCode] <- 200
146134
env.[Constants.responseReasonPhrase] <- "OK"
147135
let result = serialize todo

TodoBackendFSharp/TodoStorage.fs

+4
Original file line numberDiff line numberDiff line change
@@ -213,3 +213,7 @@ module Sql =
213213
| Success _ -> return Some()
214214
| Failure _ -> return None }
215215
}
216+
217+
let demo this that = this + that
218+
type Demo (this) =
219+
member x.Invoke(that) = this + that

TodoBackendFSharp/WebApi.fs

+12-22
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,14 @@ open Newtonsoft.Json
2626
open TodoStorage
2727
open TodoStorage.InMemory
2828

29+
module private Utils =
30+
31+
let makeTodo (uri: Uri) (todo: NewTodo) =
32+
{ Url = Uri(uri.AbsoluteUri + todo.Id.ToString()) // TODO: Uri(this.Url.Link("GetTodo", dict ["id", i]))
33+
Title = todo.Title
34+
Completed = todo.Completed
35+
Order = todo.Order }
36+
2937
[<RoutePrefix("webapi")>]
3038
[<Route("")>]
3139
type TodosController() =
@@ -34,13 +42,7 @@ type TodosController() =
3442
member this.GetTodos() =
3543
async {
3644
let! todos = store.GetAll()
37-
let todos' =
38-
todos
39-
|> Array.map (fun x ->
40-
{ Url = Uri(this.Request.RequestUri.AbsoluteUri + x.Id.ToString()) // TODO: Uri(this.Url.Link("GetTodo", dict ["id", i]))
41-
Title = x.Title
42-
Completed = x.Completed
43-
Order = x.Order })
45+
let todos' = todos |> Array.map (Utils.makeTodo this.Request.RequestUri)
4446
return this.Request.CreateResponse(todos') }
4547
|> Async.StartAsTask
4648

@@ -62,11 +64,7 @@ type TodosController() =
6264
// TODO: Debug `this.Url.Link`.
6365
//let newUrl = Uri(this.Url.Link("GetTodo", dict ["id", index]))
6466
let newUrl = Uri(this.Request.RequestUri.AbsoluteUri + index.ToString())
65-
let todo =
66-
{ Url = newUrl
67-
Title = newTodo.Title
68-
Completed = newTodo.Completed
69-
Order = newTodo.Order }
67+
let todo = Utils.makeTodo this.Request.RequestUri { newTodo with Id = index }
7068
let response = this.Request.CreateResponse(HttpStatusCode.Created, todo)
7169
response.Headers.Location <- newUrl
7270
return response }
@@ -87,11 +85,7 @@ type TodoController() =
8785
let! todo = store.Get id
8886
match todo with
8987
| Some todo ->
90-
let todo' =
91-
{ Url = this.Request.RequestUri
92-
Title = todo.Title
93-
Completed = todo.Completed
94-
Order = todo.Order }
88+
let todo' = Utils.makeTodo this.Request.RequestUri todo
9589
return this.Request.CreateResponse(todo')
9690
| None -> return this.Request.CreateResponse(HttpStatusCode.NotFound) }
9791
|> Async.StartAsTask
@@ -114,11 +108,7 @@ type TodoController() =
114108
match newTodo with
115109
| Some newTodo ->
116110
// Return the new todo item
117-
let todo =
118-
{ Url = this.Request.RequestUri
119-
Title = newTodo.Title
120-
Completed = newTodo.Completed
121-
Order = newTodo.Order }
111+
let todo = Utils.makeTodo this.Request.RequestUri newTodo
122112
return this.Request.CreateResponse(todo)
123113
| None -> return this.Request.CreateResponse(HttpStatusCode.NotFound) }
124114
|> Async.StartAsTask

0 commit comments

Comments
 (0)