|
1 | 1 | using Microsoft.AspNetCore.Http; |
2 | 2 | using Microsoft.AspNetCore.Mvc; |
| 3 | +using Microsoft.Extensions.Logging; |
3 | 4 | using RoyalCode.SmartProblems; |
4 | 5 | using RoyalCode.SmartSearch.AspNetCore.HttpResults; |
5 | | -using RoyalCode.SmartSearch.Exceptions; |
6 | 6 |
|
7 | 7 | namespace RoyalCode.SmartSearch.AspNetCore.Internals; |
8 | 8 |
|
@@ -31,45 +31,25 @@ public FirstEntityEndpoint(Action<ICriteria<TEntity>>? searchAction = null) |
31 | 31 | /// </summary> |
32 | 32 | /// <param name="filtro">Filter object with search criteria.</param> |
33 | 33 | /// <param name="orderby">Sorting criteria.</param> |
34 | | - /// <param name="searchable">Search service for the entity.</param> |
| 34 | + /// <param name="criteria">Search service for the entity.</param> |
| 35 | + /// <param name="logger">Logger for logging errors.</param> |
35 | 36 | /// <param name="ct">Cancellation token.</param> |
36 | 37 | /// <returns>HTTP 200 result with the item, 204 if not found, or 400 in case of sorting error.</returns> |
37 | 38 | [ProduceProblems(ProblemCategory.InvalidParameter, ProblemCategory.InternalServerError)] |
38 | | - public async Task<MatchFirst<TEntity>> First( |
| 39 | + public Task<MatchFirst<TEntity>> First( |
39 | 40 | [AsParameters] TFilter filtro, |
40 | 41 | [FromQuery] Sorting[]? orderby, |
41 | | - [FromServices] ICriteria<TEntity> searchable, |
| 42 | + [FromServices] ICriteria<TEntity> criteria, |
| 43 | + [FromServices] ILogger<ICriteria<TEntity>> logger, |
42 | 44 | CancellationToken ct) |
43 | 45 | { |
44 | | - try |
45 | | - { |
46 | | - var search = searchable |
47 | | - .OrderBy(orderby) |
48 | | - .FilterBy(filtro); |
49 | | - |
50 | | - if (searchAction is not null) |
51 | | - searchAction(search); |
52 | | - |
53 | | - var entity = await search.FirstOrDefaultAsync(ct); |
54 | | - |
55 | | - if (entity is null) |
56 | | - { |
57 | | - return TypedResults.NoContent(); |
58 | | - } |
59 | | - |
60 | | - return entity; |
61 | | - } |
62 | | - catch (OrderByException obex) |
63 | | - { |
64 | | - return Problems.InvalidParameter(obex.Message, nameof(orderby)) |
65 | | - .With("propertyName", obex.PropertyName) |
66 | | - .With("typeName", obex.TypeName) |
67 | | - .With("orderby", orderby); |
68 | | - } |
69 | | - catch (Exception ex) |
70 | | - { |
71 | | - return Problems.InternalError(ex); |
72 | | - } |
| 46 | + return Performer.FirstAsync( |
| 47 | + filtro, |
| 48 | + orderby, |
| 49 | + criteria, |
| 50 | + searchAction, |
| 51 | + logger, |
| 52 | + ct); |
73 | 53 | } |
74 | 54 | } |
75 | 55 |
|
@@ -100,46 +80,30 @@ public FirstEntityEndpoint(Action<TId, ICriteria<TEntity>>? searchAction = null) |
100 | 80 | /// <param name="id">Additional identifier for the search.</param> |
101 | 81 | /// <param name="filtro">Filter object with search criteria.</param> |
102 | 82 | /// <param name="orderby">Sorting criteria.</param> |
103 | | - /// <param name="searchable">Search service for the entity.</param> |
| 83 | + /// <param name="criteria">Search service for the entity.</param> |
| 84 | + /// <param name="logger">Logger for logging errors.</param> |
104 | 85 | /// <param name="ct">Cancellation token.</param> |
105 | 86 | /// <returns>HTTP 200 result with the item, 204 if not found, or 400 in case of sorting error.</returns> |
106 | 87 | [ProduceProblems(ProblemCategory.InvalidParameter, ProblemCategory.InternalServerError)] |
107 | | - public async Task<MatchFirst<TEntity>> First( |
| 88 | + public Task<MatchFirst<TEntity>> First( |
108 | 89 | [FromRoute] TId id, |
109 | 90 | [AsParameters] TFilter filtro, |
110 | 91 | [FromQuery] Sorting[]? orderby, |
111 | | - [FromServices] ICriteria<TEntity> searchable, |
| 92 | + [FromServices] ICriteria<TEntity> criteria, |
| 93 | + [FromServices] ILogger<ICriteria<TEntity>> logger, |
112 | 94 | CancellationToken ct) |
113 | 95 | { |
114 | | - try |
115 | | - { |
116 | | - var search = searchable |
117 | | - .OrderBy(orderby) |
118 | | - .FilterBy(filtro); |
119 | | - |
120 | | - if (searchAction is not null) |
121 | | - searchAction(id, search); |
122 | | - |
123 | | - var entity = await search.FirstOrDefaultAsync(ct); |
124 | | - |
125 | | - if (entity is null) |
126 | | - { |
127 | | - return TypedResults.NoContent(); |
128 | | - } |
129 | | - |
130 | | - return entity; |
131 | | - } |
132 | | - catch (OrderByException obex) |
133 | | - { |
134 | | - return Problems.InvalidParameter(obex.Message, nameof(orderby)) |
135 | | - .With("propertyName", obex.PropertyName) |
136 | | - .With("typeName", obex.TypeName) |
137 | | - .With("orderby", orderby); |
138 | | - } |
139 | | - catch (Exception ex) |
140 | | - { |
141 | | - return Problems.InternalError(ex); |
142 | | - } |
| 96 | + Action<ICriteria<TEntity>>? searchAction = null; |
| 97 | + if (this.searchAction is not null) |
| 98 | + searchAction = c => this.searchAction(id, c); |
| 99 | + |
| 100 | + return Performer.FirstAsync( |
| 101 | + filtro, |
| 102 | + orderby, |
| 103 | + criteria, |
| 104 | + searchAction, |
| 105 | + logger, |
| 106 | + ct); |
143 | 107 | } |
144 | 108 | } |
145 | 109 |
|
@@ -172,47 +136,31 @@ public FirstEntityEndpoint(Action<TId1, TId2, ICriteria<TEntity>>? searchAction |
172 | 136 | /// <param name="relatedId">Additional identifier, related to the first, for the search.</param> |
173 | 137 | /// <param name="filtro">Filter object with search criteria.</param> |
174 | 138 | /// <param name="orderby">Sorting criteria.</param> |
175 | | - /// <param name="searchable">Search service for the entity.</param> |
| 139 | + /// <param name="criteria">Search service for the entity.</param> |
| 140 | + /// <param name="logger">Logger for logging errors.</param> |
176 | 141 | /// <param name="ct">Cancellation token.</param> |
177 | 142 | /// <returns>HTTP 200 result with the item, 204 if not found, or 400 in case of sorting error.</returns> |
178 | 143 | [ProduceProblems(ProblemCategory.InvalidParameter, ProblemCategory.InternalServerError)] |
179 | | - public async Task<MatchFirst<TEntity>> First( |
| 144 | + public Task<MatchFirst<TEntity>> First( |
180 | 145 | [FromRoute] TId1 id, |
181 | 146 | [FromRoute] TId2 relatedId, |
182 | 147 | [AsParameters] TFilter filtro, |
183 | 148 | [FromQuery] Sorting[]? orderby, |
184 | | - [FromServices] ICriteria<TEntity> searchable, |
| 149 | + [FromServices] ICriteria<TEntity> criteria, |
| 150 | + [FromServices] ILogger<ICriteria<TEntity>> logger, |
185 | 151 | CancellationToken ct) |
186 | 152 | { |
187 | | - try |
188 | | - { |
189 | | - var search = searchable |
190 | | - .OrderBy(orderby) |
191 | | - .FilterBy(filtro); |
192 | | - |
193 | | - if (searchAction is not null) |
194 | | - searchAction(id, relatedId, search); |
195 | | - |
196 | | - var entity = await search.FirstOrDefaultAsync(ct); |
197 | | - |
198 | | - if (entity is null) |
199 | | - { |
200 | | - return TypedResults.NoContent(); |
201 | | - } |
202 | | - |
203 | | - return entity; |
204 | | - } |
205 | | - catch (OrderByException obex) |
206 | | - { |
207 | | - return Problems.InvalidParameter(obex.Message, nameof(orderby)) |
208 | | - .With("propertyName", obex.PropertyName) |
209 | | - .With("typeName", obex.TypeName) |
210 | | - .With("orderby", orderby); |
211 | | - } |
212 | | - catch (Exception ex) |
213 | | - { |
214 | | - return Problems.InternalError(ex); |
215 | | - } |
| 153 | + Action<ICriteria<TEntity>>? searchAction = null; |
| 154 | + if (this.searchAction is not null) |
| 155 | + searchAction = c => this.searchAction(id, relatedId, c); |
| 156 | + |
| 157 | + return Performer.FirstAsync( |
| 158 | + filtro, |
| 159 | + orderby, |
| 160 | + criteria, |
| 161 | + searchAction, |
| 162 | + logger, |
| 163 | + ct); |
216 | 164 | } |
217 | 165 | } |
218 | 166 |
|
@@ -247,47 +195,31 @@ public FirstEntityEndpoint(Action<TId1, TId2, TId3, ICriteria<TEntity>>? searchA |
247 | 195 | /// <param name="subRelatedId">Third additional identifier for the search.</param> |
248 | 196 | /// <param name="filtro">Filter object with search criteria.</param> |
249 | 197 | /// <param name="orderby">Sorting criteria.</param> |
250 | | - /// <param name="searchable">Search service for the entity.</param> |
| 198 | + /// <param name="criteria">Search service for the entity.</param> |
| 199 | + /// <param name="logger">Logger for logging errors.</param> |
251 | 200 | /// <param name="ct">Cancellation token.</param> |
252 | 201 | /// <returns>HTTP 200 result with the item, 204 if not found, or 400 in case of sorting error.</returns> |
253 | 202 | [ProduceProblems(ProblemCategory.InvalidParameter, ProblemCategory.InternalServerError)] |
254 | | - public async Task<MatchFirst<TEntity>> First( |
| 203 | + public Task<MatchFirst<TEntity>> First( |
255 | 204 | [FromRoute] TId1 id, |
256 | 205 | [FromRoute] TId2 relatedId, |
257 | 206 | [FromRoute] TId3 subRelatedId, |
258 | 207 | [AsParameters] TFilter filtro, |
259 | 208 | [FromQuery] Sorting[]? orderby, |
260 | | - [FromServices] ICriteria<TEntity> searchable, |
| 209 | + [FromServices] ICriteria<TEntity> criteria, |
| 210 | + [FromServices] ILogger<ICriteria<TEntity>> logger, |
261 | 211 | CancellationToken ct) |
262 | 212 | { |
263 | | - try |
264 | | - { |
265 | | - var search = searchable |
266 | | - .OrderBy(orderby) |
267 | | - .FilterBy(filtro); |
268 | | - |
269 | | - if (searchAction is not null) |
270 | | - searchAction(id, relatedId, subRelatedId, search); |
271 | | - |
272 | | - var entity = await search.FirstOrDefaultAsync(ct); |
273 | | - |
274 | | - if (entity is null) |
275 | | - { |
276 | | - return TypedResults.NoContent(); |
277 | | - } |
278 | | - |
279 | | - return entity; |
280 | | - } |
281 | | - catch (OrderByException obex) |
282 | | - { |
283 | | - return Problems.InvalidParameter(obex.Message, nameof(orderby)) |
284 | | - .With("propertyName", obex.PropertyName) |
285 | | - .With("typeName", obex.TypeName) |
286 | | - .With("orderby", orderby); |
287 | | - } |
288 | | - catch (Exception ex) |
289 | | - { |
290 | | - return Problems.InternalError(ex); |
291 | | - } |
| 213 | + Action<ICriteria<TEntity>>? searchAction = null; |
| 214 | + if (this.searchAction is not null) |
| 215 | + searchAction = c => this.searchAction(id, relatedId, subRelatedId, c); |
| 216 | + |
| 217 | + return Performer.FirstAsync( |
| 218 | + filtro, |
| 219 | + orderby, |
| 220 | + criteria, |
| 221 | + searchAction, |
| 222 | + logger, |
| 223 | + ct); |
292 | 224 | } |
293 | 225 | } |
0 commit comments