1
1
// Copyright (c) Martin Costello, 2021. All rights reserved.
2
2
// Licensed under the Apache 2.0 license. See the LICENSE file in the project root for full license information.
3
3
4
- using System . Security . Claims ;
5
4
using Microsoft . AspNetCore . Http . HttpResults ;
6
5
using Microsoft . EntityFrameworkCore ;
7
6
using NodaTime ;
@@ -69,20 +68,20 @@ public static IEndpointRouteBuilder MapTodoApiRoutes(this IEndpointRouteBuilder
69
68
// Get all Todo items
70
69
group . MapGet ( "/" , async (
71
70
ITodoService service ,
72
- ClaimsPrincipal user ,
71
+ TodoUser user ,
73
72
CancellationToken cancellationToken ) =>
74
73
{
75
- return await service . GetListAsync ( user . GetUserId ( ) , cancellationToken ) ;
74
+ return await service . GetListAsync ( user , cancellationToken ) ;
76
75
} ) ;
77
76
78
77
// Get a specific Todo item
79
78
group . MapGet ( "/{id}" , async Task < Results < Ok < TodoItemModel > , ProblemHttpResult > > (
80
79
Guid id ,
81
- ClaimsPrincipal user ,
80
+ TodoUser user ,
82
81
ITodoService service ,
83
82
CancellationToken cancellationToken ) =>
84
83
{
85
- var model = await service . GetAsync ( user . GetUserId ( ) , id , cancellationToken ) ;
84
+ var model = await service . GetAsync ( user , id , cancellationToken ) ;
86
85
return model switch
87
86
{
88
87
null => TypedResults . Problem ( "Item not found." , statusCode : StatusCodes . Status404NotFound ) ,
@@ -94,7 +93,7 @@ public static IEndpointRouteBuilder MapTodoApiRoutes(this IEndpointRouteBuilder
94
93
// Create a new Todo item
95
94
group . MapPost ( "/" , async Task < Results < Created < CreatedTodoItemModel > , ProblemHttpResult > > (
96
95
CreateTodoItemModel model ,
97
- ClaimsPrincipal user ,
96
+ TodoUser user ,
98
97
ITodoService service ,
99
98
CancellationToken cancellationToken ) =>
100
99
{
@@ -103,7 +102,7 @@ public static IEndpointRouteBuilder MapTodoApiRoutes(this IEndpointRouteBuilder
103
102
return TypedResults . Problem ( "No item text specified." , statusCode : StatusCodes . Status400BadRequest ) ;
104
103
}
105
104
106
- var id = await service . AddItemAsync ( user . GetUserId ( ) , model . Text , cancellationToken ) ;
105
+ var id = await service . AddItemAsync ( user , model . Text , cancellationToken ) ;
107
106
108
107
return TypedResults . Created ( $ "/api/items/{ id } ", new CreatedTodoItemModel ( ) { Id = id } ) ;
109
108
} )
@@ -112,11 +111,11 @@ public static IEndpointRouteBuilder MapTodoApiRoutes(this IEndpointRouteBuilder
112
111
// Mark a Todo item as completed
113
112
group . MapPost ( "/{id}/complete" , async Task < Results < NoContent , ProblemHttpResult > > (
114
113
Guid id ,
115
- ClaimsPrincipal user ,
114
+ TodoUser user ,
116
115
ITodoService service ,
117
116
CancellationToken cancellationToken ) =>
118
117
{
119
- var wasCompleted = await service . CompleteItemAsync ( user . GetUserId ( ) , id , cancellationToken ) ;
118
+ var wasCompleted = await service . CompleteItemAsync ( user , id , cancellationToken ) ;
120
119
121
120
return wasCompleted switch
122
121
{
@@ -131,11 +130,11 @@ public static IEndpointRouteBuilder MapTodoApiRoutes(this IEndpointRouteBuilder
131
130
// Delete a Todo item
132
131
group . MapDelete ( "/{id}" , async Task < Results < NoContent , ProblemHttpResult > > (
133
132
Guid id ,
134
- ClaimsPrincipal user ,
133
+ TodoUser user ,
135
134
ITodoService service ,
136
135
CancellationToken cancellationToken ) =>
137
136
{
138
- var wasDeleted = await service . DeleteItemAsync ( user . GetUserId ( ) , id , cancellationToken ) ;
137
+ var wasDeleted = await service . DeleteItemAsync ( user , id , cancellationToken ) ;
139
138
return wasDeleted switch
140
139
{
141
140
true => TypedResults . NoContent ( ) ,
@@ -152,4 +151,21 @@ public static IEndpointRouteBuilder MapTodoApiRoutes(this IEndpointRouteBuilder
152
151
153
152
return builder ;
154
153
}
154
+
155
+ private readonly struct TodoUser
156
+ {
157
+ private TodoUser ( string id )
158
+ {
159
+ Id = id ;
160
+ }
161
+
162
+ public string Id { get ; }
163
+
164
+ public static implicit operator string ( TodoUser value ) => value . Id ;
165
+
166
+ public static ValueTask < TodoUser > BindAsync ( HttpContext context )
167
+ {
168
+ return ValueTask . FromResult ( new TodoUser ( context . User . GetUserId ( ) ) ) ;
169
+ }
170
+ }
155
171
}
0 commit comments