Skip to content

Commit 3c9512b

Browse files
committed
Add session endpoint
1 parent a733600 commit 3c9512b

File tree

5 files changed

+85
-19
lines changed

5 files changed

+85
-19
lines changed

src/scaup/main.py

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -8,15 +8,7 @@
88
from sqlalchemy.orm import sessionmaker
99

1010
from . import __version__
11-
from .routes import (
12-
containers,
13-
internal,
14-
proposals,
15-
samples,
16-
shipments,
17-
top_level_containers,
18-
sessions
19-
)
11+
from .routes import containers, internal, proposals, samples, sessions, shipments, top_level_containers
2012
from .utils.config import Config
2113

2214
app = FastAPI(version=__version__, title="Scaup API")

src/scaup/models/sessions.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -41,4 +41,4 @@ class SessionOut(OrmBaseModel):
4141
lt=2,
4242
description="The data for the session is archived and no longer available on disk", # noqa: E501
4343
)
44-
collectionGroups: Optional[int] = None
44+
collectionGroups: Optional[int] = None

src/scaup/routes/sessions.py

Lines changed: 10 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
from datetime import datetime
2-
31
from fastapi import APIRouter, Depends, HTTPException, Query
42
from fastapi.security import HTTPAuthorizationCredentials
53
from lims_utils.logging import app_logger
@@ -19,21 +17,24 @@
1917
def get_sessions(
2018
token: HTTPAuthorizationCredentials = Depends(auth_scheme),
2119
page: dict[str, int] = Depends(pagination),
22-
minEndDate: datetime | None = Query("Minimum session end date")
20+
minEndDate: str | None = Query(default=None, description="Minimum session end date"),
2321
):
2422
"""Get sessions a user can view (wrapper for Expeye endpoint)"""
23+
# TODO: replace search once Expeye supports filtering by beamline name
24+
url = f"/sessions?limit={page['limit']}&page={page['page']}&search=m"
25+
if minEndDate is not None:
26+
url += f"&minEndDate={minEndDate}"
27+
2528
expeye_response = ExternalRequest.request(
26-
token=token,
27-
url=f"/sessions?minEndDate={minEndDate}&limit={page['limit']}&page={page['page']}",
29+
token=token.credentials,
30+
url=url,
2831
)
2932

3033
if expeye_response.status_code != 200:
31-
app_logger.warning(
32-
f"Failed to fetch proposals from Expeye: {expeye_response.text}"
33-
)
34+
app_logger.warning(f"Failed to fetch proposals from Expeye: {expeye_response.text}")
3435
raise HTTPException(
3536
status_code=expeye_response.status_code,
3637
detail="Failed to fetch proposals",
3738
)
3839

39-
return expeye_response.json()
40+
return expeye_response.json()

tests/sessions/__init__.py

Whitespace-only changes.

tests/sessions/test_get.py

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
import responses
2+
3+
from scaup.utils.config import Config
4+
5+
6+
@responses.activate
7+
def test_get(client):
8+
"""Should get sessions data"""
9+
responses.get(
10+
f"{Config.ispyb_api.url}/sessions",
11+
status=200,
12+
json={
13+
"page": 1,
14+
"total": 99,
15+
"limit": 1,
16+
"items": [
17+
{
18+
"bltimeStamp": "2025-01-01T12:00:00Z",
19+
"visitNumber": 1,
20+
"parentProposal": "cm00001",
21+
"sessionId": 1,
22+
"purgedProcessedData": False,
23+
"proposalId": 1,
24+
"archived": False,
25+
}
26+
],
27+
},
28+
)
29+
30+
resp = client.get("/sessions")
31+
32+
assert resp.status_code == 200
33+
34+
assert resp.json()["total"] == 99
35+
36+
@responses.activate
37+
def test_min_end_date(client):
38+
"""Should include search params in expeye request"""
39+
resp_get = responses.get(
40+
f"{Config.ispyb_api.url}/sessions",
41+
status=200,
42+
json={
43+
"page": 1,
44+
"total": 99,
45+
"limit": 1,
46+
"items": [
47+
{
48+
"bltimeStamp": "2025-01-01T12:00:00Z",
49+
"visitNumber": 1,
50+
"parentProposal": "cm00001",
51+
"sessionId": 1,
52+
"purgedProcessedData": False,
53+
"proposalId": 1,
54+
"archived": False,
55+
}
56+
],
57+
},
58+
)
59+
60+
resp = client.get("/sessions?minEndDate=2025-01-01T00:00:00Z")
61+
62+
assert resp.status_code == 200
63+
assert resp_get.calls[0].request.url.endswith(
64+
"/sessions?limit=25&page=0&search=m&minEndDate=2025-01-01T00:00:00Z")
65+
66+
@responses.activate
67+
def test_invalid_response(client):
68+
"""Should propagate error if upstream API fails"""
69+
responses.get(f"{Config.ispyb_api.url}/sessions", status=404)
70+
71+
resp = client.get("/sessions")
72+
73+
assert resp.status_code == 404

0 commit comments

Comments
 (0)