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.
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/PKG-INFO +1 -1
- apexdevkit-1.5.23/apexdevkit/fastapi/__init__.py +10 -0
- apexdevkit-1.5.23/apexdevkit/fastapi/resource.py +342 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/router.py +6 -43
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/pyproject.toml +1 -1
- apexdevkit-1.5.22/apexdevkit/fastapi/__init__.py +0 -26
- apexdevkit-1.5.22/apexdevkit/fastapi/resource.py +0 -177
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/LICENSE +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/README.md +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/__init__.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/annotation/__init__.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/annotation/deprecate.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/error.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/builder.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/dependable.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/docs.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/response.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/schema.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/fastapi/service.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/formatter.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/__init__.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/fake.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/fluent.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/httpx.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/json.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/http/url.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/py.typed +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/__init__.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/base.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/connector.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/database.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/in_memory.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/repository/interface.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/testing/__init__.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/testing/database.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/testing/fake.py +0 -0
- {apexdevkit-1.5.22 → apexdevkit-1.5.23}/apexdevkit/testing/rest.py +0 -0
|
@@ -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
|
|
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) ->
|
|
54
|
-
|
|
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,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
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|