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

Commit bc917c4

Browse files
committed
Fix helper makeTodo function
1 parent 465e6f1 commit bc917c4

File tree

2 files changed

+28
-14
lines changed

2 files changed

+28
-14
lines changed

TodoBackendFSharp/Frank.fs

+13-8
Original file line numberDiff line numberDiff line change
@@ -27,15 +27,22 @@ 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]))
30+
let private makeItemUri (request: HttpRequestMessage) index =
31+
let uri = request.RequestUri
32+
let path = uri.AbsolutePath.Substring(1) // Skip the first '/'
33+
if path.[path.Length - 1] = '/' then
34+
Uri(uri.AbsoluteUri + string index)
35+
else uri
36+
37+
let private makeTodo request (todo: NewTodo) =
38+
{ Url = makeItemUri request todo.Id
3239
Title = todo.Title
3340
Completed = todo.Completed
3441
Order = todo.Order }
3542

3643
let getTodos (request: HttpRequestMessage) = async {
3744
let! todos = store.GetAll()
38-
let todos' = todos |> Array.map (makeTodo request.RequestUri)
45+
let todos' = todos |> Array.map (makeTodo request)
3946
return request.CreateResponse(todos') }
4047

4148
let postTodo (request: HttpRequestMessage) = async {
@@ -48,9 +55,7 @@ let postTodo (request: HttpRequestMessage) = async {
4855
let! index = store.Post newTodo
4956

5057
// Return the new todo item
51-
// TODO: Debug `this.Url.Link`.
52-
//let newUrl = Uri(this.Url.Link("GetTodo", dict ["id", index]))
53-
let todo = makeTodo request.RequestUri { newTodo with Id = index }
58+
let todo = makeTodo request { newTodo with Id = index }
5459
let response = request.CreateResponse(HttpStatusCode.Created, todo)
5560
response.Headers.Location <- todo.Url
5661
return response }
@@ -67,7 +72,7 @@ let getTodo (request: HttpRequestMessage) = async {
6772
let! todo = store.Get id
6873
match todo with
6974
| Some todo ->
70-
let todo' = makeTodo request.RequestUri todo
75+
let todo' = makeTodo request todo
7176
return request.CreateResponse(todo')
7277
| None -> return request.CreateResponse(HttpStatusCode.NotFound)
7378
| None -> return request.CreateResponse(HttpStatusCode.NotFound) }
@@ -88,7 +93,7 @@ let patchTodo (request: HttpRequestMessage) = async {
8893
match newTodo with
8994
| Some newTodo ->
9095
// Return the new todo item
91-
let todo = makeTodo request.RequestUri newTodo
96+
let todo = makeTodo request newTodo
9297
return request.CreateResponse(todo)
9398
| None -> return request.CreateResponse(HttpStatusCode.NotFound)
9499
| None -> return request.CreateResponse(HttpStatusCode.NotFound) }

TodoBackendFSharp/WebApi.fs

+15-6
Original file line numberDiff line numberDiff line change
@@ -28,8 +28,17 @@ open TodoStorage.InMemory
2828

2929
module private Utils =
3030

31-
let makeTodo (uri: Uri) (todo: NewTodo) =
32-
{ Url = Uri(uri.AbsoluteUri + todo.Id.ToString()) // TODO: Uri(this.Url.Link("GetTodo", dict ["id", i]))
31+
let makeItemUri (request: HttpRequestMessage) index =
32+
// TODO: Get the UrlHelper working
33+
//Uri(request.GetUrlHelper().Link("GetTodo", dict ["id", index]))
34+
let uri = request.RequestUri
35+
let path = uri.AbsolutePath.Substring(1) // Skip the first '/'
36+
if path.[path.Length - 1] = '/' then
37+
Uri(uri.AbsoluteUri + string index)
38+
else uri
39+
40+
let makeTodo request (todo: NewTodo) =
41+
{ Url = makeItemUri request todo.Id
3342
Title = todo.Title
3443
Completed = todo.Completed
3544
Order = todo.Order }
@@ -42,7 +51,7 @@ type TodosController() =
4251
member this.GetTodos() =
4352
async {
4453
let! todos = store.GetAll()
45-
let todos' = todos |> Array.map (Utils.makeTodo this.Request.RequestUri)
54+
let todos' = todos |> Array.map (Utils.makeTodo this.Request)
4655
return this.Request.CreateResponse(todos') }
4756
|> Async.StartAsTask
4857

@@ -64,7 +73,7 @@ type TodosController() =
6473
// TODO: Debug `this.Url.Link`.
6574
//let newUrl = Uri(this.Url.Link("GetTodo", dict ["id", index]))
6675
let newUrl = Uri(this.Request.RequestUri.AbsoluteUri + index.ToString())
67-
let todo = Utils.makeTodo this.Request.RequestUri { newTodo with Id = index }
76+
let todo = Utils.makeTodo this.Request { newTodo with Id = index }
6877
let response = this.Request.CreateResponse(HttpStatusCode.Created, todo)
6978
response.Headers.Location <- newUrl
7079
return response }
@@ -85,7 +94,7 @@ type TodoController() =
8594
let! todo = store.Get id
8695
match todo with
8796
| Some todo ->
88-
let todo' = Utils.makeTodo this.Request.RequestUri todo
97+
let todo' = Utils.makeTodo this.Request todo
8998
return this.Request.CreateResponse(todo')
9099
| None -> return this.Request.CreateResponse(HttpStatusCode.NotFound) }
91100
|> Async.StartAsTask
@@ -108,7 +117,7 @@ type TodoController() =
108117
match newTodo with
109118
| Some newTodo ->
110119
// Return the new todo item
111-
let todo = Utils.makeTodo this.Request.RequestUri newTodo
120+
let todo = Utils.makeTodo this.Request newTodo
112121
return this.Request.CreateResponse(todo)
113122
| None -> return this.Request.CreateResponse(HttpStatusCode.NotFound) }
114123
|> Async.StartAsTask

0 commit comments

Comments
 (0)