Skip to content

Commit 647bc48

Browse files
Add prefixes at the router layer
1 parent 752e03e commit 647bc48

File tree

10 files changed

+109
-61
lines changed

10 files changed

+109
-61
lines changed

aiida_restapi/routers/auth.py

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,9 +33,9 @@ class UserInDB(orm.User.Model):
3333

3434
pwd_context = PasswordHasher()
3535

36-
oauth2_scheme = OAuth2PasswordBearer(tokenUrl='token')
36+
oauth2_scheme = OAuth2PasswordBearer(tokenUrl=f'{config.API_CONFIG["PREFIX"]}/auth/token')
3737

38-
router = APIRouter()
38+
router = APIRouter(prefix='/auth')
3939

4040

4141
def verify_password(plain_password: str, hashed_password: str) -> bool:
@@ -113,7 +113,10 @@ async def get_current_active_user(
113113
return current_user
114114

115115

116-
@router.post('/token', response_model=Token)
116+
@router.post(
117+
'/token',
118+
response_model=Token,
119+
)
117120
async def login_for_access_token(
118121
form_data: OAuth2PasswordRequestForm = Depends(),
119122
) -> dict[str, t.Any]:
@@ -130,7 +133,10 @@ async def login_for_access_token(
130133
return {'access_token': access_token, 'token_type': 'bearer'}
131134

132135

133-
@router.get('/auth/me/', response_model=orm.User.Model)
136+
@router.get(
137+
'/me/',
138+
response_model=orm.User.Model,
139+
)
134140
async def read_users_me(
135141
current_user: t.Annotated[orm.User.Model, Depends(get_current_active_user)],
136142
) -> orm.User.Model:

aiida_restapi/routers/computers.py

Lines changed: 17 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,19 @@
1515

1616
from .auth import UserInDB, get_current_active_user
1717

18-
read_router = APIRouter()
19-
write_router = APIRouter()
18+
read_router = APIRouter(prefix='/computers')
19+
write_router = APIRouter(prefix='/computers')
2020

2121
repository = EntityRepository[orm.Computer, orm.Computer.Model](
2222
entity_class=orm.Computer,
2323
identifier='pk',
2424
)
2525

2626

27-
@read_router.get('/computers/schema')
27+
@read_router.get(
28+
'/schema',
29+
response_model=dict,
30+
)
2831
async def get_computers_schema(
2932
which: t.Literal['get', 'post'] = Query(
3033
'get',
@@ -46,7 +49,10 @@ async def get_computers_schema(
4649
raise HTTPException(status_code=500, detail=str(exception)) from exception
4750

4851

49-
@read_router.get('/computers/projectable_properties', response_model=list[str])
52+
@read_router.get(
53+
'/projectable_properties',
54+
response_model=list[str],
55+
)
5056
async def get_computer_projectable_properties() -> list[str]:
5157
"""Get projectable properties for AiiDA computers.
5258
@@ -56,7 +62,7 @@ async def get_computer_projectable_properties() -> list[str]:
5662

5763

5864
@read_router.get(
59-
'/computers',
65+
'',
6066
response_model=PaginatedResults[orm.Computer.Model],
6167
response_model_exclude_none=True,
6268
response_model_exclude_unset=True,
@@ -74,7 +80,7 @@ async def get_computers(
7480

7581

7682
@read_router.get(
77-
'/computers/{pk}',
83+
'/{pk}',
7884
response_model=orm.Computer.Model,
7985
response_model_exclude_none=True,
8086
response_model_exclude_unset=True,
@@ -96,7 +102,10 @@ async def get_computer(pk: str) -> orm.Computer.Model:
96102
raise HTTPException(status_code=500, detail=str(exception)) from exception
97103

98104

99-
@read_router.get('/computers/{pk}/metadata', response_model=dict[str, t.Any])
105+
@read_router.get(
106+
'/{pk}/metadata',
107+
response_model=dict[str, t.Any],
108+
)
100109
@with_dbenv()
101110
async def get_computer_metadata(pk: str) -> dict[str, t.Any]:
102111
"""Get metadata of an AiiDA computer by pk.
@@ -116,7 +125,7 @@ async def get_computer_metadata(pk: str) -> dict[str, t.Any]:
116125

117126

118127
@write_router.post(
119-
'/computers',
128+
'',
120129
response_model=orm.Computer.Model,
121130
response_model_exclude_none=True,
122131
response_model_exclude_unset=True,

aiida_restapi/routers/daemon.py

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,8 @@
1111

1212
from .auth import UserInDB, get_current_active_user
1313

14-
read_router = APIRouter()
15-
write_router = APIRouter()
14+
read_router = APIRouter(prefix='/daemon')
15+
write_router = APIRouter(prefix='/daemon')
1616

1717

1818
class DaemonStatusModel(BaseModel):
@@ -23,7 +23,7 @@ class DaemonStatusModel(BaseModel):
2323

2424

2525
@read_router.get(
26-
'/daemon/status',
26+
'/status',
2727
response_model=DaemonStatusModel,
2828
)
2929
@with_dbenv()
@@ -46,7 +46,7 @@ async def get_daemon_status() -> DaemonStatusModel:
4646

4747

4848
@write_router.post(
49-
'/daemon/start',
49+
'/start',
5050
response_model=DaemonStatusModel,
5151
)
5252
@with_dbenv()
@@ -73,7 +73,7 @@ async def get_daemon_start(
7373

7474

7575
@write_router.post(
76-
'/daemon/stop',
76+
'/stop',
7777
response_model=DaemonStatusModel,
7878
)
7979
@with_dbenv()

aiida_restapi/routers/groups.py

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,16 +15,19 @@
1515

1616
from .auth import UserInDB, get_current_active_user
1717

18-
read_router = APIRouter()
19-
write_router = APIRouter()
18+
read_router = APIRouter(prefix='/groups')
19+
write_router = APIRouter(prefix='/groups')
2020

2121
repository = EntityRepository[orm.Group, orm.Group.Model](
2222
entity_class=orm.Group,
2323
identifier='uuid',
2424
)
2525

2626

27-
@read_router.get('/groups/schema')
27+
@read_router.get(
28+
'/schema',
29+
response_model=dict,
30+
)
2831
async def get_groups_schema(
2932
which: t.Literal['get', 'post'] = Query(
3033
'get',
@@ -46,7 +49,10 @@ async def get_groups_schema(
4649
raise HTTPException(status_code=500, detail=str(exception)) from exception
4750

4851

49-
@read_router.get('/groups/projectable_properties', response_model=list[str])
52+
@read_router.get(
53+
'/projectable_properties',
54+
response_model=list[str],
55+
)
5056
async def get_group_projectable_properties() -> list[str]:
5157
"""Get projectable properties for AiiDA groups.
5258
@@ -56,7 +62,7 @@ async def get_group_projectable_properties() -> list[str]:
5662

5763

5864
@read_router.get(
59-
'/groups',
65+
'',
6066
response_model=PaginatedResults[orm.Group.Model],
6167
response_model_exclude_none=True,
6268
response_model_exclude_unset=True,
@@ -74,7 +80,7 @@ async def get_groups(
7480

7581

7682
@read_router.get(
77-
'/groups/{uuid}',
83+
'/{uuid}',
7884
response_model=orm.Group.Model,
7985
response_model_exclude_none=True,
8086
response_model_exclude_unset=True,
@@ -97,7 +103,7 @@ async def get_group(uuid: str) -> orm.Group.Model:
97103

98104

99105
@read_router.get(
100-
'/groups/{uuid}/extras',
106+
'/{uuid}/extras',
101107
response_model=dict[str, t.Any],
102108
)
103109
@with_dbenv()
@@ -118,7 +124,7 @@ async def get_group_extras(uuid: str) -> dict[str, t.Any]:
118124

119125

120126
@write_router.post(
121-
'/groups',
127+
'',
122128
response_model=orm.Group.Model,
123129
response_model_exclude_none=True,
124130
response_model_exclude_unset=True,

aiida_restapi/routers/nodes.py

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@
2222

2323
from .auth import UserInDB, get_current_active_user
2424

25-
read_router = APIRouter()
26-
write_router = APIRouter()
25+
read_router = APIRouter(prefix='/nodes')
26+
write_router = APIRouter(prefix='/nodes')
2727

2828
repository = NodeRepository[orm.Node, orm.Node.Model](
2929
entity_class=orm.Node,
@@ -40,7 +40,10 @@
4040
NodeModelUnion = model_registry.ModelUnion
4141

4242

43-
@read_router.get('/nodes/schema')
43+
@read_router.get(
44+
'/schema',
45+
response_model=dict,
46+
)
4447
async def get_nodes_schema(
4548
node_type: str | None = Query(
4649
None,
@@ -72,7 +75,10 @@ async def get_nodes_schema(
7275
raise HTTPException(status_code=500, detail=str(exception)) from exception
7376

7477

75-
@read_router.get('/nodes/projectable_properties')
78+
@read_router.get(
79+
'/projectable_properties',
80+
response_model=list[str],
81+
)
7682
@with_dbenv()
7783
async def get_node_projectable_properties(
7884
node_type: str | None = Query(
@@ -123,7 +129,10 @@ class NodeStatistics(pdt.BaseModel):
123129
)
124130

125131

126-
@read_router.get('/nodes/statistics', response_model=NodeStatistics)
132+
@read_router.get(
133+
'/statistics',
134+
response_model=NodeStatistics,
135+
)
127136
@with_dbenv()
128137
async def get_nodes_statistics(user: int | None = None) -> dict[str, t.Any]:
129138
"""Get node statistics.
@@ -152,7 +161,7 @@ async def get_nodes_statistics(user: int | None = None) -> dict[str, t.Any]:
152161
return backend.query().get_creation_statistics(user_pk=user)
153162

154163

155-
@read_router.get('/nodes/download_formats')
164+
@read_router.get('/download_formats')
156165
async def get_nodes_download_formats() -> dict[str, t.Any]:
157166
"""Get download formats for AiiDA nodes.
158167
@@ -169,7 +178,7 @@ async def get_nodes_download_formats() -> dict[str, t.Any]:
169178

170179

171180
@read_router.get(
172-
'/nodes',
181+
'',
173182
response_model=PaginatedResults[orm.Node.Model],
174183
response_model_exclude_none=True,
175184
response_model_exclude_unset=True,
@@ -196,7 +205,10 @@ class NodeType(pdt.BaseModel):
196205
node_schema: str = pdt.Field(description='The URL to access the schema of this node type.')
197206

198207

199-
@read_router.get('/nodes/types', response_model=list[NodeType])
208+
@read_router.get(
209+
'/types',
210+
response_model=list[NodeType],
211+
)
200212
async def get_node_types() -> list:
201213
"""Get all node types in machine-actionable format.
202214
@@ -206,9 +218,9 @@ async def get_node_types() -> list:
206218
>>> {
207219
>>> "label": "Int",
208220
>>> "node_type": "data.core.int.Int.",
209-
>>> "nodes": "/nodes?filters={\"node_type\":{\"data.core.int.Int.\"}}",
210-
>>> "projections": "/nodes/projectable_properties?type=data.core.int.Int.",
211-
>>> "node_schema": "/nodes/schema?type=data.core.int.Int.",
221+
>>> "nodes": ".../nodes?filters={\"node_type\":{\"data.core.int.Int.\"}}",
222+
>>> "projections": ".../nodes/projectable_properties?type=data.core.int.Int.",
223+
>>> "node_schema": ".../nodes/schema?type=data.core.int.Int.",
212224
>>> },
213225
>>> ...
214226
>>> ]
@@ -229,7 +241,7 @@ async def get_node_types() -> list:
229241

230242

231243
@read_router.get(
232-
'/nodes/{uuid}',
244+
'/{uuid}',
233245
response_model=orm.Node.Model,
234246
response_model_exclude_none=True,
235247
response_model_exclude_unset=True,
@@ -252,7 +264,7 @@ async def get_node(uuid: str) -> orm.Node.Model:
252264

253265

254266
@read_router.get(
255-
'/nodes/{uuid}/attributes',
267+
'/{uuid}/attributes',
256268
response_model=dict[str, t.Any],
257269
)
258270
@with_dbenv()
@@ -273,7 +285,7 @@ async def get_node_attributes(uuid: str) -> dict[str, t.Any]:
273285

274286

275287
@read_router.get(
276-
'/nodes/{uuid}/extras',
288+
'/{uuid}/extras',
277289
response_model=dict[str, t.Any],
278290
)
279291
@with_dbenv()
@@ -294,7 +306,7 @@ async def get_node_extras(uuid: str) -> dict[str, t.Any]:
294306

295307

296308
@read_router.get(
297-
'/nodes/{uuid}/links',
309+
'/{uuid}/links',
298310
response_model=PaginatedResults[NodeLinks],
299311
response_model_exclude_none=True,
300312
response_model_exclude_unset=True,
@@ -324,7 +336,10 @@ async def get_node_links(
324336
raise HTTPException(status_code=500, detail=str(exception)) from exception
325337

326338

327-
@read_router.get('/nodes/{uuid}/download')
339+
@read_router.get(
340+
'/{uuid}/download',
341+
response_class=StreamingResponse,
342+
)
328343
@with_dbenv()
329344
async def download_node(
330345
uuid: str,
@@ -414,7 +429,7 @@ class RepoDirMetadata(pdt.BaseModel):
414429

415430

416431
@read_router.get(
417-
'/nodes/{uuid}/repo/metadata',
432+
'/{uuid}/repo/metadata',
418433
response_model=dict[str, MetadataType],
419434
)
420435
@with_dbenv()
@@ -434,7 +449,10 @@ async def get_node_repo_file_metadata(uuid: str) -> dict[str, dict]:
434449
raise HTTPException(status_code=500, detail=str(exception)) from exception
435450

436451

437-
@read_router.get('/nodes/{uuid}/repo/contents')
452+
@read_router.get(
453+
'/{uuid}/repo/contents',
454+
response_class=StreamingResponse,
455+
)
438456
@with_dbenv()
439457
async def get_node_repo_file_contents(
440458
uuid: str,
@@ -491,7 +509,7 @@ def zip_stream() -> t.Generator[bytes, None, None]:
491509

492510

493511
@write_router.post(
494-
'/nodes',
512+
'',
495513
response_model=orm.Node.Model,
496514
response_model_exclude_none=True,
497515
response_model_exclude_unset=True,
@@ -518,7 +536,7 @@ async def create_node(
518536

519537

520538
@write_router.post(
521-
'/nodes/file-upload',
539+
'/file-upload',
522540
response_model=orm.Node.Model,
523541
response_model_exclude_none=True,
524542
response_model_exclude_unset=True,

0 commit comments

Comments
 (0)