@@ -27,15 +27,22 @@ open Newtonsoft.Json
27
27
open TodoStorage
28
28
open TodoStorage.InMemory
29
29
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
32
39
Title = todo.Title
33
40
Completed = todo.Completed
34
41
Order = todo.Order }
35
42
36
43
let getTodos ( request : HttpRequestMessage ) = async {
37
44
let! todos = store.GetAll()
38
- let todos ' = todos |> Array.map ( makeTodo request.RequestUri )
45
+ let todos ' = todos |> Array.map ( makeTodo request)
39
46
return request.CreateResponse( todos') }
40
47
41
48
let postTodo ( request : HttpRequestMessage ) = async {
@@ -48,9 +55,7 @@ let postTodo (request: HttpRequestMessage) = async {
48
55
let! index = store.Post newTodo
49
56
50
57
// 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 }
54
59
let response = request.CreateResponse( HttpStatusCode.Created, todo)
55
60
response.Headers.Location <- todo.Url
56
61
return response }
@@ -67,7 +72,7 @@ let getTodo (request: HttpRequestMessage) = async {
67
72
let! todo = store.Get id
68
73
match todo with
69
74
| Some todo ->
70
- let todo ' = makeTodo request.RequestUri todo
75
+ let todo ' = makeTodo request todo
71
76
return request.CreateResponse( todo')
72
77
| None -> return request.CreateResponse( HttpStatusCode.NotFound)
73
78
| None -> return request.CreateResponse( HttpStatusCode.NotFound) }
@@ -88,7 +93,7 @@ let patchTodo (request: HttpRequestMessage) = async {
88
93
match newTodo with
89
94
| Some newTodo ->
90
95
// Return the new todo item
91
- let todo = makeTodo request.RequestUri newTodo
96
+ let todo = makeTodo request newTodo
92
97
return request.CreateResponse( todo)
93
98
| None -> return request.CreateResponse( HttpStatusCode.NotFound)
94
99
| None -> return request.CreateResponse( HttpStatusCode.NotFound) }
0 commit comments