Skip to content

Commit 107cbc5

Browse files
Add prefixes at the router layer
1 parent 9a80c60 commit 107cbc5

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,13 +15,16 @@
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](orm.Computer)
2222

2323

24-
@read_router.get('/computers/schema')
24+
@read_router.get(
25+
'/schema',
26+
response_model=dict,
27+
)
2528
async def get_computers_schema(
2629
which: t.Literal['get', 'post'] = Query(
2730
'get',
@@ -43,7 +46,10 @@ async def get_computers_schema(
4346
raise HTTPException(status_code=500, detail=str(exception)) from exception
4447

4548

46-
@read_router.get('/computers/projectable_properties', response_model=list[str])
49+
@read_router.get(
50+
'/projectable_properties',
51+
response_model=list[str],
52+
)
4753
async def get_computer_projectable_properties() -> list[str]:
4854
"""Get projectable properties for AiiDA computers.
4955
@@ -53,7 +59,7 @@ async def get_computer_projectable_properties() -> list[str]:
5359

5460

5561
@read_router.get(
56-
'/computers',
62+
'',
5763
response_model=PaginatedResults[orm.Computer.Model],
5864
response_model_exclude_none=True,
5965
response_model_exclude_unset=True,
@@ -71,7 +77,7 @@ async def get_computers(
7177

7278

7379
@read_router.get(
74-
'/computers/{pk}',
80+
'/{pk}',
7581
response_model=orm.Computer.Model,
7682
response_model_exclude_none=True,
7783
response_model_exclude_unset=True,
@@ -93,7 +99,10 @@ async def get_computer(pk: str) -> orm.Computer.Model:
9399
raise HTTPException(status_code=500, detail=str(exception)) from exception
94100

95101

96-
@read_router.get('/computers/{pk}/metadata', response_model=dict[str, t.Any])
102+
@read_router.get(
103+
'/{pk}/metadata',
104+
response_model=dict[str, t.Any],
105+
)
97106
@with_dbenv()
98107
async def get_computer_metadata(pk: str) -> dict[str, t.Any]:
99108
"""Get metadata of an AiiDA computer by pk.
@@ -113,7 +122,7 @@ async def get_computer_metadata(pk: str) -> dict[str, t.Any]:
113122

114123

115124
@write_router.post(
116-
'/computers',
125+
'',
117126
response_model=orm.Computer.Model,
118127
response_model_exclude_none=True,
119128
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,13 +15,16 @@
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](orm.Group)
2222

2323

24-
@read_router.get('/groups/schema')
24+
@read_router.get(
25+
'/schema',
26+
response_model=dict,
27+
)
2528
async def get_groups_schema(
2629
which: t.Literal['get', 'post'] = Query(
2730
'get',
@@ -43,7 +46,10 @@ async def get_groups_schema(
4346
raise HTTPException(status_code=500, detail=str(exception)) from exception
4447

4548

46-
@read_router.get('/groups/projectable_properties', response_model=list[str])
49+
@read_router.get(
50+
'/projectable_properties',
51+
response_model=list[str],
52+
)
4753
async def get_group_projectable_properties() -> list[str]:
4854
"""Get projectable properties for AiiDA groups.
4955
@@ -53,7 +59,7 @@ async def get_group_projectable_properties() -> list[str]:
5359

5460

5561
@read_router.get(
56-
'/groups',
62+
'',
5763
response_model=PaginatedResults[orm.Group.Model],
5864
response_model_exclude_none=True,
5965
response_model_exclude_unset=True,
@@ -71,7 +77,7 @@ async def get_groups(
7177

7278

7379
@read_router.get(
74-
'/groups/{uuid}',
80+
'/{uuid}',
7581
response_model=orm.Group.Model,
7682
response_model_exclude_none=True,
7783
response_model_exclude_unset=True,
@@ -94,7 +100,7 @@ async def get_group(uuid: str) -> orm.Group.Model:
94100

95101

96102
@read_router.get(
97-
'/groups/{uuid}/extras',
103+
'/{uuid}/extras',
98104
response_model=dict[str, t.Any],
99105
)
100106
@with_dbenv()
@@ -115,7 +121,7 @@ async def get_group_extras(uuid: str) -> dict[str, t.Any]:
115121

116122

117123
@write_router.post(
118-
'/groups',
124+
'',
119125
response_model=orm.Group.Model,
120126
response_model_exclude_none=True,
121127
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](orm.Node)
2929

@@ -37,7 +37,10 @@
3737
NodeModelUnion = model_registry.ModelUnion
3838

3939

40-
@read_router.get('/nodes/schema')
40+
@read_router.get(
41+
'/schema',
42+
response_model=dict,
43+
)
4144
async def get_nodes_schema(
4245
node_type: str | None = Query(
4346
None,
@@ -69,7 +72,10 @@ async def get_nodes_schema(
6972
raise HTTPException(status_code=500, detail=str(exception)) from exception
7073

7174

72-
@read_router.get('/nodes/projectable_properties')
75+
@read_router.get(
76+
'/projectable_properties',
77+
response_model=list[str],
78+
)
7379
@with_dbenv()
7480
async def get_node_projectable_properties(
7581
node_type: str | None = Query(
@@ -120,7 +126,10 @@ class NodeStatistics(pdt.BaseModel):
120126
)
121127

122128

123-
@read_router.get('/nodes/statistics', response_model=NodeStatistics)
129+
@read_router.get(
130+
'/statistics',
131+
response_model=NodeStatistics,
132+
)
124133
@with_dbenv()
125134
async def get_nodes_statistics(user: int | None = None) -> dict[str, t.Any]:
126135
"""Get node statistics.
@@ -149,7 +158,7 @@ async def get_nodes_statistics(user: int | None = None) -> dict[str, t.Any]:
149158
return backend.query().get_creation_statistics(user_pk=user)
150159

151160

152-
@read_router.get('/nodes/download_formats')
161+
@read_router.get('/download_formats')
153162
async def get_nodes_download_formats() -> dict[str, t.Any]:
154163
"""Get download formats for AiiDA nodes.
155164
@@ -166,7 +175,7 @@ async def get_nodes_download_formats() -> dict[str, t.Any]:
166175

167176

168177
@read_router.get(
169-
'/nodes',
178+
'',
170179
response_model=PaginatedResults[orm.Node.Model],
171180
response_model_exclude_none=True,
172181
response_model_exclude_unset=True,
@@ -193,7 +202,10 @@ class NodeType(pdt.BaseModel):
193202
node_schema: str = pdt.Field(description='The URL to access the schema of this node type.')
194203

195204

196-
@read_router.get('/nodes/types', response_model=list[NodeType])
205+
@read_router.get(
206+
'/types',
207+
response_model=list[NodeType],
208+
)
197209
async def get_node_types() -> list:
198210
"""Get all node types in machine-actionable format.
199211
@@ -203,9 +215,9 @@ async def get_node_types() -> list:
203215
>>> {
204216
>>> "label": "Int",
205217
>>> "node_type": "data.core.int.Int.",
206-
>>> "nodes": "/nodes?filters={\"node_type\":{\"data.core.int.Int.\"}}",
207-
>>> "projections": "/nodes/projectable_properties?type=data.core.int.Int.",
208-
>>> "node_schema": "/nodes/schema?type=data.core.int.Int.",
218+
>>> "nodes": ".../nodes?filters={\"node_type\":{\"data.core.int.Int.\"}}",
219+
>>> "projections": ".../nodes/projectable_properties?type=data.core.int.Int.",
220+
>>> "node_schema": ".../nodes/schema?type=data.core.int.Int.",
209221
>>> },
210222
>>> ...
211223
>>> ]
@@ -226,7 +238,7 @@ async def get_node_types() -> list:
226238

227239

228240
@read_router.get(
229-
'/nodes/{uuid}',
241+
'/{uuid}',
230242
response_model=orm.Node.Model,
231243
response_model_exclude_none=True,
232244
response_model_exclude_unset=True,
@@ -249,7 +261,7 @@ async def get_node(uuid: str) -> orm.Node.Model:
249261

250262

251263
@read_router.get(
252-
'/nodes/{uuid}/attributes',
264+
'/{uuid}/attributes',
253265
response_model=dict[str, t.Any],
254266
)
255267
@with_dbenv()
@@ -270,7 +282,7 @@ async def get_node_attributes(uuid: str) -> dict[str, t.Any]:
270282

271283

272284
@read_router.get(
273-
'/nodes/{uuid}/extras',
285+
'/{uuid}/extras',
274286
response_model=dict[str, t.Any],
275287
)
276288
@with_dbenv()
@@ -291,7 +303,7 @@ async def get_node_extras(uuid: str) -> dict[str, t.Any]:
291303

292304

293305
@read_router.get(
294-
'/nodes/{uuid}/links',
306+
'/{uuid}/links',
295307
response_model=PaginatedResults[NodeLinks],
296308
response_model_exclude_none=True,
297309
response_model_exclude_unset=True,
@@ -321,7 +333,10 @@ async def get_node_links(
321333
raise HTTPException(status_code=500, detail=str(exception)) from exception
322334

323335

324-
@read_router.get('/nodes/{uuid}/download')
336+
@read_router.get(
337+
'/{uuid}/download',
338+
response_class=StreamingResponse,
339+
)
325340
@with_dbenv()
326341
async def download_node(
327342
uuid: str,
@@ -411,7 +426,7 @@ class RepoDirMetadata(pdt.BaseModel):
411426

412427

413428
@read_router.get(
414-
'/nodes/{uuid}/repo/metadata',
429+
'/{uuid}/repo/metadata',
415430
response_model=dict[str, MetadataType],
416431
)
417432
@with_dbenv()
@@ -431,7 +446,10 @@ async def get_node_repo_file_metadata(uuid: str) -> dict[str, dict]:
431446
raise HTTPException(status_code=500, detail=str(exception)) from exception
432447

433448

434-
@read_router.get('/nodes/{uuid}/repo/contents')
449+
@read_router.get(
450+
'/{uuid}/repo/contents',
451+
response_class=StreamingResponse,
452+
)
435453
@with_dbenv()
436454
async def get_node_repo_file_contents(
437455
uuid: str,
@@ -488,7 +506,7 @@ def zip_stream() -> t.Generator[bytes, None, None]:
488506

489507

490508
@write_router.post(
491-
'/nodes',
509+
'',
492510
response_model=orm.Node.Model,
493511
response_model_exclude_none=True,
494512
response_model_exclude_unset=True,
@@ -515,7 +533,7 @@ async def create_node(
515533

516534

517535
@write_router.post(
518-
'/nodes/file-upload',
536+
'/file-upload',
519537
response_model=orm.Node.Model,
520538
response_model_exclude_none=True,
521539
response_model_exclude_unset=True,

0 commit comments

Comments
 (0)