apexdevkit 1.5.22__tar.gz → 1.5.23__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/PKG-INFO +1 -1
  2. apexdevkit-1.5.23/apexdevkit/fastapi/__init__.py +10 -0
  3. apexdevkit-1.5.23/apexdevkit/fastapi/resource.py +342 -0
  4. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/router.py +6 -43
  5. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/pyproject.toml +1 -1
  6. apexdevkit-1.5.22/apexdevkit/fastapi/__init__.py +0 -26
  7. apexdevkit-1.5.22/apexdevkit/fastapi/resource.py +0 -177
  8. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/LICENSE +0 -0
  9. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/README.md +0 -0
  10. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/__init__.py +0 -0
  11. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/annotation/__init__.py +0 -0
  12. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/annotation/deprecate.py +0 -0
  13. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/error.py +0 -0
  14. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/builder.py +0 -0
  15. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/dependable.py +0 -0
  16. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/docs.py +0 -0
  17. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/response.py +0 -0
  18. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/schema.py +0 -0
  19. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/service.py +0 -0
  20. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/formatter.py +0 -0
  21. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/__init__.py +0 -0
  22. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/fake.py +0 -0
  23. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/fluent.py +0 -0
  24. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/httpx.py +0 -0
  25. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/json.py +0 -0
  26. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/url.py +0 -0
  27. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/py.typed +0 -0
  28. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/__init__.py +0 -0
  29. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/base.py +0 -0
  30. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/connector.py +0 -0
  31. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/database.py +0 -0
  32. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/in_memory.py +0 -0
  33. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/interface.py +0 -0
  34. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/testing/__init__.py +0 -0
  35. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/testing/database.py +0 -0
  36. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/testing/fake.py +0 -0
  37. {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/testing/rest.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: apexdevkit
3
- Version: 1.5.22
3
+ Version: 1.5.23
4
4
  Summary: Apex Development Tools for python.
5
5
  Author: Apex Dev
6
6
  Author-email: dev@apex.ge
@@ -0,0 +1,10 @@
1
+ from apexdevkit.fastapi.builder import FastApiBuilder, RestfulServiceBuilder
2
+ from apexdevkit.fastapi.dependable import inject
3
+ from apexdevkit.fastapi.service import RestfulRepositoryBuilder
4
+
5
+ __all__ = [
6
+ "FastApiBuilder",
7
+ "RestfulServiceBuilder",
8
+ "inject",
9
+ "RestfulRepositoryBuilder",
10
+ ]
@@ -0,0 +1,342 @@
1
+ from dataclasses import dataclass
2
+ from functools import cached_property
3
+ from typing import Annotated, Any, Callable
4
+
5
+ from fastapi import Path
6
+ from starlette.responses import JSONResponse
7
+
8
+ from apexdevkit.error import DoesNotExistError, ExistsError, ForbiddenError
9
+ from apexdevkit.fastapi.builder import RestfulServiceBuilder
10
+ from apexdevkit.fastapi.response import RestfulResponse
11
+ from apexdevkit.testing import RestfulName
12
+
13
+ _Response = JSONResponse | dict[str, Any]
14
+
15
+
16
+ @dataclass
17
+ class RestfulSubResource:
18
+ name: RestfulName
19
+ infra: RestfulServiceBuilder
20
+ parent: RestfulName
21
+
22
+ @property
23
+ def parent_id_alias(self) -> str:
24
+ return self.parent.singular + "_id"
25
+
26
+ @cached_property
27
+ def response(self) -> RestfulResponse:
28
+ return RestfulResponse(name=self.name)
29
+
30
+ def create_one(self, User, Item) -> Callable[..., _Response]: # type: ignore
31
+ ParentId = Annotated[str, Path(alias=self.parent_id_alias)]
32
+
33
+ def endpoint(user: User, parent_id: ParentId, item: Item) -> _Response:
34
+ try:
35
+ service = self.infra.with_user(user).with_parent(parent_id).build()
36
+ except DoesNotExistError as e:
37
+ return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
38
+
39
+ try:
40
+ item = service.create_one(item)
41
+ except ExistsError as e:
42
+ return JSONResponse(self.response.exists(e), 409)
43
+ except ForbiddenError as e:
44
+ return JSONResponse(self.response.forbidden(e), 403)
45
+
46
+ return self.response.created_one(item)
47
+
48
+ return endpoint
49
+
50
+ def create_many(self, User, Collection) -> Callable[..., _Response]: # type: ignore
51
+ ParentId = Annotated[str, Path(alias=self.parent_id_alias)]
52
+
53
+ def endpoint(user: User, parent_id: ParentId, items: Collection) -> _Response:
54
+ try:
55
+ service = self.infra.with_user(user).with_parent(parent_id).build()
56
+ except DoesNotExistError as e:
57
+ return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
58
+
59
+ try:
60
+ return self.response.created_many(service.create_many(items))
61
+ except ExistsError as e:
62
+ return JSONResponse(self.response.exists(e), 409)
63
+ except ForbiddenError as e:
64
+ return JSONResponse(self.response.forbidden(e), 403)
65
+
66
+ return endpoint
67
+
68
+ def read_one(self, User, ItemId) -> Callable[..., _Response]: # type: ignore
69
+ ParentId = Annotated[str, Path(alias=self.parent_id_alias)]
70
+
71
+ def endpoint(user: User, parent_id: ParentId, item_id: ItemId) -> _Response:
72
+ try:
73
+ service = self.infra.with_user(user).with_parent(parent_id).build()
74
+ except DoesNotExistError as e:
75
+ return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
76
+
77
+ try:
78
+ return self.response.found_one(service.read_one(item_id))
79
+ except DoesNotExistError as e:
80
+ return JSONResponse(self.response.not_found(e), 404)
81
+ except ForbiddenError as e:
82
+ return JSONResponse(self.response.forbidden(e), 403)
83
+
84
+ return endpoint
85
+
86
+ def read_all(self, User) -> Callable[..., _Response]: # type: ignore
87
+ ParentId = Annotated[str, Path(alias=self.parent_id_alias)]
88
+
89
+ def endpoint(user: User, parent_id: ParentId) -> _Response:
90
+ try:
91
+ service = self.infra.with_user(user).with_parent(parent_id).build()
92
+ except DoesNotExistError as e:
93
+ return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
94
+
95
+ try:
96
+ return self.response.found_many(list(service.read_all()))
97
+ except ForbiddenError as e:
98
+ return JSONResponse(self.response.forbidden(e), 403)
99
+
100
+ return endpoint
101
+
102
+ def update_one(self, User, ItemId, Updates) -> Callable[..., _Response]: # type: ignore
103
+ ParentId = Annotated[str, Path(alias=self.parent_id_alias)]
104
+
105
+ def endpoint(
106
+ user: User,
107
+ parent_id: ParentId,
108
+ item_id: ItemId,
109
+ updates: Updates,
110
+ ) -> _Response:
111
+ try:
112
+ service = self.infra.with_user(user).with_parent(parent_id).build()
113
+ except DoesNotExistError as e:
114
+ return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
115
+
116
+ try:
117
+ service.update_one(item_id, **updates)
118
+ except DoesNotExistError as e:
119
+ return JSONResponse(self.response.not_found(e), 404)
120
+ except ForbiddenError as e:
121
+ return JSONResponse(self.response.forbidden(e), 403)
122
+
123
+ return self.response.ok()
124
+
125
+ return endpoint
126
+
127
+ def update_many(self, User, Collection) -> Callable[..., _Response]: # type: ignore
128
+ ParentId = Annotated[str, Path(alias=self.parent_id_alias)]
129
+
130
+ def endpoint(user: User, parent_id: ParentId, items: Collection) -> _Response:
131
+ try:
132
+ service = self.infra.with_user(user).with_parent(parent_id).build()
133
+ except DoesNotExistError as e:
134
+ return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
135
+
136
+ try:
137
+ service.update_many(items)
138
+ except DoesNotExistError as e:
139
+ return JSONResponse(self.response.not_found(e), 404)
140
+ except ForbiddenError as e:
141
+ return JSONResponse(self.response.forbidden(e), 403)
142
+
143
+ return self.response.ok()
144
+
145
+ return endpoint
146
+
147
+ def replace_one(self, User, Item) -> Callable[..., _Response]: # type: ignore
148
+ ParentId = Annotated[str, Path(alias=self.parent_id_alias)]
149
+
150
+ def endpoint(user: User, parent_id: ParentId, item: Item) -> _Response:
151
+ try:
152
+ service = self.infra.with_user(user).with_parent(parent_id).build()
153
+ except DoesNotExistError as e:
154
+ return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
155
+
156
+ try:
157
+ service.replace_one(item)
158
+ except DoesNotExistError as e:
159
+ return JSONResponse(self.response.not_found(e), 404)
160
+ except ForbiddenError as e:
161
+ return JSONResponse(self.response.forbidden(e), 403)
162
+
163
+ return self.response.ok()
164
+
165
+ return endpoint
166
+
167
+ def replace_many(self, User, Collection) -> Callable[..., _Response]: # type: ignore
168
+ ParentId = Annotated[str, Path(alias=self.parent_id_alias)]
169
+
170
+ def endpoint(user: User, parent_id: ParentId, items: Collection) -> _Response:
171
+ try:
172
+ service = self.infra.with_user(user).with_parent(parent_id).build()
173
+ except DoesNotExistError as e:
174
+ return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
175
+
176
+ try:
177
+ service.replace_many(items)
178
+ except DoesNotExistError as e:
179
+ return JSONResponse(self.response.not_found(e), 404)
180
+ except ForbiddenError as e:
181
+ return JSONResponse(self.response.forbidden(e), 403)
182
+
183
+ return self.response.ok()
184
+
185
+ return endpoint
186
+
187
+ def delete_one(self, User, ItemId) -> Callable[..., _Response]: # type: ignore
188
+ ParentId = Annotated[str, Path(alias=self.parent_id_alias)]
189
+
190
+ def endpoint(user: User, parent_id: ParentId, item_id: ItemId) -> _Response:
191
+ try:
192
+ service = self.infra.with_user(user).with_parent(parent_id).build()
193
+ except DoesNotExistError as e:
194
+ return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
195
+
196
+ try:
197
+ service.delete_one(item_id)
198
+ except DoesNotExistError as e:
199
+ return JSONResponse(self.response.not_found(e), 404)
200
+ except ForbiddenError as e:
201
+ return JSONResponse(self.response.forbidden(e), 403)
202
+
203
+ return self.response.ok()
204
+
205
+ return endpoint
206
+
207
+
208
+ @dataclass
209
+ class RestfulRootResource:
210
+ name: RestfulName
211
+ infra: RestfulServiceBuilder
212
+
213
+ @cached_property
214
+ def response(self) -> RestfulResponse:
215
+ return RestfulResponse(name=self.name)
216
+
217
+ def create_one(self, User, Item) -> Callable[..., _Response]: # type: ignore
218
+ def endpoint(user: User, item: Item) -> _Response:
219
+ service = self.infra.with_user(user).build()
220
+
221
+ try:
222
+ item = service.create_one(item)
223
+ except ExistsError as e:
224
+ return JSONResponse(self.response.exists(e), 409)
225
+ except ForbiddenError as e:
226
+ return JSONResponse(self.response.forbidden(e), 403)
227
+
228
+ return self.response.created_one(item)
229
+
230
+ return endpoint
231
+
232
+ def create_many(self, User, Collection) -> Callable[..., _Response]: # type: ignore
233
+ def endpoint(user: User, items: Collection) -> _Response:
234
+ service = self.infra.with_user(user).build()
235
+
236
+ try:
237
+ return self.response.created_many(service.create_many(items))
238
+ except ExistsError as e:
239
+ return JSONResponse(self.response.exists(e), 409)
240
+ except ForbiddenError as e:
241
+ return JSONResponse(self.response.forbidden(e), 403)
242
+
243
+ return endpoint
244
+
245
+ def read_one(self, User, ItemId) -> Callable[..., _Response]: # type: ignore
246
+ def endpoint(user: User, item_id: ItemId) -> _Response:
247
+ service = self.infra.with_user(user).build()
248
+
249
+ try:
250
+ return self.response.found_one(service.read_one(item_id))
251
+ except DoesNotExistError as e:
252
+ return JSONResponse(self.response.not_found(e), 404)
253
+ except ForbiddenError as e:
254
+ return JSONResponse(self.response.forbidden(e), 403)
255
+
256
+ return endpoint
257
+
258
+ def read_all(self, User) -> Callable[..., _Response]: # type: ignore
259
+ def endpoint(user: User) -> _Response:
260
+ service = self.infra.with_user(user).build()
261
+
262
+ try:
263
+ return self.response.found_many(list(service.read_all()))
264
+ except ForbiddenError as e:
265
+ return JSONResponse(self.response.forbidden(e), 403)
266
+
267
+ return endpoint
268
+
269
+ def update_one(self, User, ItemId, Updates) -> Callable[..., _Response]: # type: ignore
270
+ def endpoint(user: User, item_id: ItemId, updates: Updates) -> _Response:
271
+ service = self.infra.with_user(user).build()
272
+
273
+ try:
274
+ service.update_one(item_id, **updates)
275
+ except DoesNotExistError as e:
276
+ return JSONResponse(self.response.not_found(e), 404)
277
+ except ForbiddenError as e:
278
+ return JSONResponse(self.response.forbidden(e), 403)
279
+
280
+ return self.response.ok()
281
+
282
+ return endpoint
283
+
284
+ def update_many(self, User, Collection) -> Callable[..., _Response]: # type: ignore
285
+ def endpoint(user: User, items: Collection) -> _Response:
286
+ service = self.infra.with_user(user).build()
287
+
288
+ try:
289
+ service.update_many(items)
290
+ except DoesNotExistError as e:
291
+ return JSONResponse(self.response.not_found(e), 404)
292
+ except ForbiddenError as e:
293
+ return JSONResponse(self.response.forbidden(e), 403)
294
+
295
+ return self.response.ok()
296
+
297
+ return endpoint
298
+
299
+ def replace_one(self, User, Item) -> Callable[..., _Response]: # type: ignore
300
+ def endpoint(user: User, item: Item) -> _Response:
301
+ service = self.infra.with_user(user).build()
302
+
303
+ try:
304
+ service.replace_one(item)
305
+ except DoesNotExistError as e:
306
+ return JSONResponse(self.response.not_found(e), 404)
307
+ except ForbiddenError as e:
308
+ return JSONResponse(self.response.forbidden(e), 403)
309
+
310
+ return self.response.ok()
311
+
312
+ return endpoint
313
+
314
+ def replace_many(self, User, Collection) -> Callable[..., _Response]: # type: ignore
315
+ def endpoint(user: User, items: Collection) -> _Response:
316
+ service = self.infra.with_user(user).build()
317
+
318
+ try:
319
+ service.replace_many(items)
320
+ except DoesNotExistError as e:
321
+ return JSONResponse(self.response.not_found(e), 404)
322
+ except ForbiddenError as e:
323
+ return JSONResponse(self.response.forbidden(e), 403)
324
+
325
+ return self.response.ok()
326
+
327
+ return endpoint
328
+
329
+ def delete_one(self, User, ItemId) -> Callable[..., _Response]: # type: ignore
330
+ def endpoint(user: User, item_id: ItemId) -> _Response:
331
+ service = self.infra.with_user(user).build()
332
+
333
+ try:
334
+ service.delete_one(item_id)
335
+ except DoesNotExistError as e:
336
+ return JSONResponse(self.response.not_found(e), 404)
337
+ except ForbiddenError as e:
338
+ return JSONResponse(self.response.forbidden(e), 403)
339
+
340
+ return self.response.ok()
341
+
342
+ return endpoint
@@ -6,7 +6,7 @@ from fastapi import APIRouter, Depends, Path
6
6
  from fastapi.responses import JSONResponse
7
7
 
8
8
  from apexdevkit.fastapi.builder import RestfulServiceBuilder
9
- from apexdevkit.fastapi.resource import RestfulResource
9
+ from apexdevkit.fastapi.resource import RestfulRootResource, RestfulSubResource
10
10
  from apexdevkit.fastapi.schema import RestfulSchema, SchemaFields
11
11
  from apexdevkit.fastapi.service import RawCollection, RawItem, RestfulService
12
12
  from apexdevkit.testing import RestfulName
@@ -50,17 +50,16 @@ class RestfulRouter:
50
50
  return RestfulSchema(name=self.name, fields=self.fields)
51
51
 
52
52
  @property
53
- def resource(self) -> RestfulResource:
54
- return RestfulResource(self.name, self.infra, RestfulName(self.parent))
53
+ def resource(self) -> RestfulRootResource | RestfulSubResource:
54
+ if not self.parent:
55
+ return RestfulRootResource(self.name, self.infra)
56
+
57
+ return RestfulSubResource(self.name, self.infra, RestfulName(self.parent))
55
58
 
56
59
  @property
57
60
  def id_alias(self) -> str:
58
61
  return self.name.singular + "_id"
59
62
 
60
- @property
61
- def parent_id_alias(self) -> str:
62
- return self.parent + "_id"
63
-
64
63
  @property
65
64
  def item_path(self) -> str:
66
65
  return "/{" + self.id_alias + "}"
@@ -97,10 +96,6 @@ class RestfulRouter:
97
96
  Any,
98
97
  Depends(extract_user),
99
98
  ],
100
- ParentId=Annotated[
101
- str,
102
- Path(alias=self.parent_id_alias, default_factory=str),
103
- ],
104
99
  Item=Annotated[
105
100
  RawItem,
106
101
  Depends(self.schema.for_create_one()),
@@ -128,10 +123,6 @@ class RestfulRouter:
128
123
  Any,
129
124
  Depends(extract_user),
130
125
  ],
131
- ParentId=Annotated[
132
- str,
133
- Path(alias=self.parent_id_alias, default_factory=str),
134
- ],
135
126
  Collection=Annotated[
136
127
  RawCollection,
137
128
  Depends(self.schema.for_create_many()),
@@ -159,10 +150,6 @@ class RestfulRouter:
159
150
  Any,
160
151
  Depends(extract_user),
161
152
  ],
162
- ParentId=Annotated[
163
- str,
164
- Path(alias=self.parent_id_alias, default_factory=str),
165
- ],
166
153
  ItemId=Annotated[
167
154
  str,
168
155
  Path(alias=self.id_alias),
@@ -190,10 +177,6 @@ class RestfulRouter:
190
177
  Any,
191
178
  Depends(extract_user),
192
179
  ],
193
- ParentId=Annotated[
194
- str,
195
- Path(alias=self.parent_id_alias, default_factory=str),
196
- ],
197
180
  ),
198
181
  methods=["GET"],
199
182
  status_code=200,
@@ -217,10 +200,6 @@ class RestfulRouter:
217
200
  Any,
218
201
  Depends(extract_user),
219
202
  ],
220
- ParentId=Annotated[
221
- str,
222
- Path(alias=self.parent_id_alias, default_factory=str),
223
- ],
224
203
  ItemId=Annotated[
225
204
  str,
226
205
  Path(alias=self.id_alias),
@@ -252,10 +231,6 @@ class RestfulRouter:
252
231
  Any,
253
232
  Depends(extract_user),
254
233
  ],
255
- ParentId=Annotated[
256
- str,
257
- Path(alias=self.parent_id_alias, default_factory=str),
258
- ],
259
234
  Collection=Annotated[
260
235
  RawCollection,
261
236
  Depends(self.schema.for_update_many()),
@@ -283,10 +258,6 @@ class RestfulRouter:
283
258
  Any,
284
259
  Depends(extract_user),
285
260
  ],
286
- ParentId=Annotated[
287
- str,
288
- Path(alias=self.parent_id_alias, default_factory=str),
289
- ],
290
261
  Item=Annotated[
291
262
  RawItem,
292
263
  Depends(self.schema.for_replace_one()),
@@ -314,10 +285,6 @@ class RestfulRouter:
314
285
  Any,
315
286
  Depends(extract_user),
316
287
  ],
317
- ParentId=Annotated[
318
- str,
319
- Path(alias=self.parent_id_alias, default_factory=str),
320
- ],
321
288
  Collection=Annotated[
322
289
  RawCollection,
323
290
  Depends(self.schema.for_replace_many()),
@@ -345,10 +312,6 @@ class RestfulRouter:
345
312
  Any,
346
313
  Depends(extract_user),
347
314
  ],
348
- ParentId=Annotated[
349
- str,
350
- Path(alias=self.parent_id_alias, default_factory=str),
351
- ],
352
315
  ItemId=Annotated[
353
316
  str,
354
317
  Path(alias=self.id_alias),
@@ -1,6 +1,6 @@
1
1
  [tool.poetry]
2
2
  name = "apexdevkit"
3
- version = "1.5.22"
3
+ version = "1.5.23"
4
4
  description = "Apex Development Tools for python."
5
5
  authors = ["Apex Dev <dev@apex.ge>"]
6
6
  readme = "README.md"
@@ -1,26 +0,0 @@
1
- from apexdevkit.fastapi.builder import FastApiBuilder
2
- from apexdevkit.fastapi.dependable import inject
3
- from apexdevkit.fastapi.docs import NoData, Response
4
- from apexdevkit.fastapi.response import (
5
- BadRequest,
6
- ErrorResponse,
7
- ResourceCreated,
8
- ResourceExists,
9
- ResourceFound,
10
- ResourceNotFound,
11
- SuccessResponse,
12
- )
13
-
14
- __all__ = [
15
- "FastApiBuilder",
16
- "inject",
17
- "NoData",
18
- "Response",
19
- "SuccessResponse",
20
- "ResourceCreated",
21
- "ResourceFound",
22
- "ResourceExists",
23
- "ResourceNotFound",
24
- "ErrorResponse",
25
- "BadRequest",
26
- ]
@@ -1,177 +0,0 @@
1
- from dataclasses import dataclass
2
- from functools import cached_property
3
- from typing import Any, Callable
4
-
5
- from starlette.responses import JSONResponse
6
-
7
- from apexdevkit.error import DoesNotExistError, ExistsError, ForbiddenError
8
- from apexdevkit.fastapi.builder import RestfulServiceBuilder
9
- from apexdevkit.fastapi.response import RestfulResponse
10
- from apexdevkit.testing import RestfulName
11
-
12
- _Response = JSONResponse | dict[str, Any]
13
-
14
-
15
- @dataclass
16
- class RestfulResource:
17
- name: RestfulName
18
- infra: RestfulServiceBuilder
19
- parent: RestfulName
20
-
21
- @cached_property
22
- def response(self) -> RestfulResponse:
23
- return RestfulResponse(name=self.name)
24
-
25
- def create_one(self, User, ParentId, Item) -> Callable[..., _Response]: # type: ignore
26
- def endpoint(user: User, parent_id: ParentId, item: Item) -> _Response:
27
- try:
28
- service = self.infra.with_user(user).with_parent(parent_id).build()
29
- except DoesNotExistError as e:
30
- return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
31
-
32
- try:
33
- item = service.create_one(item)
34
- except ExistsError as e:
35
- return JSONResponse(self.response.exists(e), 409)
36
- except ForbiddenError as e:
37
- return JSONResponse(self.response.forbidden(e), 403)
38
-
39
- return self.response.created_one(item)
40
-
41
- return endpoint
42
-
43
- def create_many(self, User, ParentId, Collection) -> Callable[..., _Response]: # type: ignore
44
- def endpoint(user: User, parent_id: ParentId, items: Collection) -> _Response:
45
- try:
46
- service = self.infra.with_user(user).with_parent(parent_id).build()
47
- except DoesNotExistError as e:
48
- return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
49
-
50
- try:
51
- return self.response.created_many(service.create_many(items))
52
- except ExistsError as e:
53
- return JSONResponse(self.response.exists(e), 409)
54
- except ForbiddenError as e:
55
- return JSONResponse(self.response.forbidden(e), 403)
56
-
57
- return endpoint
58
-
59
- def read_one(self, User, ParentId, ItemId) -> Callable[..., _Response]: # type: ignore
60
- def endpoint(user: User, parent_id: ParentId, item_id: ItemId) -> _Response:
61
- try:
62
- service = self.infra.with_user(user).with_parent(parent_id).build()
63
- except DoesNotExistError as e:
64
- return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
65
-
66
- try:
67
- return self.response.found_one(service.read_one(item_id))
68
- except DoesNotExistError as e:
69
- return JSONResponse(self.response.not_found(e), 404)
70
- except ForbiddenError as e:
71
- return JSONResponse(self.response.forbidden(e), 403)
72
-
73
- return endpoint
74
-
75
- def read_all(self, User, ParentId) -> Callable[..., _Response]: # type: ignore
76
- def endpoint(user: User, parent_id: ParentId) -> _Response:
77
- try:
78
- service = self.infra.with_user(user).with_parent(parent_id).build()
79
- except DoesNotExistError as e:
80
- return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
81
- try:
82
- return self.response.found_many(list(service.read_all()))
83
- except ForbiddenError as e:
84
- return JSONResponse(self.response.forbidden(e), 403)
85
-
86
- return endpoint
87
-
88
- def update_one(self, User, ParentId, ItemId, Updates) -> Callable[..., _Response]: # type: ignore
89
- def endpoint(
90
- user: User,
91
- parent_id: ParentId,
92
- item_id: ItemId,
93
- updates: Updates,
94
- ) -> _Response:
95
- try:
96
- service = self.infra.with_user(user).with_parent(parent_id).build()
97
- except DoesNotExistError as e:
98
- return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
99
- try:
100
- service.update_one(item_id, **updates)
101
- except DoesNotExistError as e:
102
- return JSONResponse(self.response.not_found(e), 404)
103
- except ForbiddenError as e:
104
- return JSONResponse(self.response.forbidden(e), 403)
105
-
106
- return self.response.ok()
107
-
108
- return endpoint
109
-
110
- def update_many(self, User, ParentId, Collection) -> Callable[..., _Response]: # type: ignore
111
- def endpoint(user: User, parent_id: ParentId, items: Collection) -> _Response:
112
- try:
113
- service = self.infra.with_user(user).with_parent(parent_id).build()
114
- except DoesNotExistError as e:
115
- return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
116
- try:
117
- service.update_many(items)
118
- except DoesNotExistError as e:
119
- return JSONResponse(self.response.not_found(e), 404)
120
- except ForbiddenError as e:
121
- return JSONResponse(self.response.forbidden(e), 403)
122
-
123
- return self.response.ok()
124
-
125
- return endpoint
126
-
127
- def replace_one(self, User, ParentId, Item) -> Callable[..., _Response]: # type: ignore
128
- def endpoint(user: User, parent_id: ParentId, item: Item) -> _Response:
129
- try:
130
- service = self.infra.with_user(user).with_parent(parent_id).build()
131
- except DoesNotExistError as e:
132
- return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
133
- try:
134
- service.replace_one(item)
135
- except DoesNotExistError as e:
136
- return JSONResponse(self.response.not_found(e), 404)
137
- except ForbiddenError as e:
138
- return JSONResponse(self.response.forbidden(e), 403)
139
-
140
- return self.response.ok()
141
-
142
- return endpoint
143
-
144
- def replace_many(self, User, ParentId, Collection) -> Callable[..., _Response]: # type: ignore
145
- def endpoint(user: User, parent_id: ParentId, items: Collection) -> _Response:
146
- try:
147
- service = self.infra.with_user(user).with_parent(parent_id).build()
148
- except DoesNotExistError as e:
149
- return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
150
- try:
151
- service.replace_many(items)
152
- except DoesNotExistError as e:
153
- return JSONResponse(self.response.not_found(e), 404)
154
- except ForbiddenError as e:
155
- return JSONResponse(self.response.forbidden(e), 403)
156
-
157
- return self.response.ok()
158
-
159
- return endpoint
160
-
161
- def delete_one(self, User, ParentId, ItemId) -> Callable[..., _Response]: # type: ignore
162
- def endpoint(user: User, parent_id: ParentId, item_id: ItemId) -> _Response:
163
- try:
164
- service = self.infra.with_user(user).with_parent(parent_id).build()
165
- except DoesNotExistError as e:
166
- return JSONResponse(RestfulResponse(self.parent).not_found(e), 404)
167
-
168
- try:
169
- service.delete_one(item_id)
170
- except DoesNotExistError as e:
171
- return JSONResponse(self.response.not_found(e), 404)
172
- except ForbiddenError as e:
173
- return JSONResponse(self.response.forbidden(e), 403)
174
-
175
- return self.response.ok()
176
-
177
- return endpoint
File without changes
File without changes