-
Notifications
You must be signed in to change notification settings - Fork 31
Create endpoint for MCC ARO requests #645
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: main
Are you sure you want to change the base?
Changes from 5 commits
6985cb1
bc1fa8f
cecb4e6
6fea273
c459cfe
2564305
b4c0c69
d4d0a88
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,3 +1,39 @@ | ||
| from fastapi import APIRouter | ||
| from fastapi import APIRouter, Query | ||
| from sqlalchemy import desc | ||
| from sqlmodel import select | ||
|
|
||
| from gs.backend.api.v1.mcc.models.responses import ARORequestsResponse | ||
| from gs.backend.data.database.engine import get_db_session | ||
| from gs.backend.data.enums.aro_requests import ARORequestStatus | ||
| from gs.backend.data.tables.transactional_tables import ARORequest | ||
|
|
||
| aro_requests_router = APIRouter(tags=["MCC", "ARO Requests"]) | ||
|
|
||
|
|
||
| @aro_requests_router.get("/", response_model=ARORequestsResponse) | ||
| async def get_aro_requests( | ||
| count: int = Query(default=100), | ||
| offset: int = Query(default=0), | ||
| filters: list[ARORequestStatus] = Query(default=[]), | ||
| ) -> ARORequestsResponse: | ||
| """ | ||
| Gets all ARO requests with optional filtering and pagination | ||
|
|
||
| :param count: Number of most recent requests to return. If ≤ 0, returns all data | ||
| :param offset: Starting point for paging | ||
| :param filters: List of request statuses to filter by. If empty, no filtering is applied | ||
| :return: ARO requests matching the criteria | ||
| """ | ||
| with get_db_session() as session: | ||
|
||
| query = select(ARORequest).order_by(desc(ARORequest.created_on)) # type: ignore | ||
|
|
||
| if filters: | ||
| query = query.where(ARORequest.status.in_(filters)) # type: ignore | ||
| if offset > 0: | ||
| query = query.offset(offset) | ||
| if count > 0: | ||
| query = query.limit(count) | ||
|
|
||
| requests = list(session.exec(query).all()) | ||
|
|
||
| return ARORequestsResponse(data=requests) | ||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
|
|
@@ -71,6 +71,7 @@ def test_get_db_session(monkeypatch, db_session: Session): | |
| "gs.backend.data.data_wrappers.mcc_wrappers.packet_telemetry_wrapper", | ||
| "gs.backend.data.data_wrappers.mcc_wrappers.packet_wrapper", | ||
| "gs.backend.data.data_wrappers.mcc_wrappers.telemetry_wrapper", | ||
| "gs.backend.api.v1.mcc.endpoints.aro_requests", | ||
|
||
| ] | ||
|
|
||
| for path in path_list: | ||
|
|
||
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,137 @@ | ||
| from datetime import datetime | ||
|
||
| from decimal import Decimal | ||
| from uuid import UUID | ||
|
|
||
| import pytest | ||
| from fastapi.testclient import TestClient | ||
| from gs.backend.data.data_wrappers.aro_wrapper.aro_request_wrapper import add_request | ||
| from gs.backend.data.data_wrappers.aro_wrapper.aro_user_data_wrapper import add_user | ||
| from gs.backend.data.enums.aro_requests import ARORequestStatus | ||
| from gs.backend.main import app | ||
|
|
||
|
|
||
| @pytest.fixture | ||
| def client(): | ||
| return TestClient(app) | ||
|
|
||
|
|
||
| # Create user for request 1 | ||
| @pytest.fixture | ||
| def test_user1(): | ||
| user = add_user( | ||
| call_sign="TEST01", | ||
| email="test1@example.com", | ||
| f_name="Test", | ||
| l_name="User1", | ||
| phone_number="1234567890", | ||
| ) | ||
| return user | ||
|
|
||
|
|
||
| # Create user for request 2 | ||
| @pytest.fixture | ||
| def test_user2(): | ||
| user = add_user( | ||
| call_sign="TEST02", | ||
| email="test2@example.com", | ||
| f_name="Test", | ||
| l_name="User2", | ||
| phone_number="0987654321", | ||
| ) | ||
| return user | ||
|
|
||
|
|
||
| # Test data for request 1 | ||
| @pytest.fixture | ||
| def request1_data(test_user1): | ||
| dt_str = "2021-01-01T00:00:00Z" | ||
| dt = datetime.fromisoformat(dt_str.replace("Z", "+00:00")) | ||
| return { | ||
| "aro_id": test_user1.id, | ||
| "long": Decimal("123.456"), | ||
| "lat": Decimal("49.282"), | ||
| "created_on": dt, | ||
| "request_sent_obc": dt, | ||
| "taken_date": dt, | ||
| "transmission": dt, | ||
| "status": ARORequestStatus.PENDING, | ||
| } | ||
|
|
||
|
|
||
| # Test data for request 2 | ||
| @pytest.fixture | ||
| def request2_data(test_user2): | ||
| dt_str = "2021-01-01T00:00:00Z" | ||
| dt = datetime.fromisoformat(dt_str.replace("Z", "+00:00")) | ||
| return { | ||
| "aro_id": test_user2.id, | ||
| "long": Decimal("123.456"), | ||
| "lat": Decimal("49.282"), | ||
| "created_on": dt, | ||
| "request_sent_obc": dt, | ||
| "taken_date": dt, | ||
| "transmission": dt, | ||
| "status": ARORequestStatus.COMPLETED, | ||
| } | ||
|
|
||
|
|
||
| # Add request1 to database | ||
| @pytest.fixture | ||
| def test_request1_creation(client, request1_data): | ||
| request = add_request( | ||
| aro_id=request1_data["aro_id"], | ||
| long=request1_data["long"], | ||
| lat=request1_data["lat"], | ||
| created_on=request1_data["created_on"], | ||
| request_sent_obc=request1_data["request_sent_obc"], | ||
| taken_date=request1_data["taken_date"], | ||
| transmission=request1_data["transmission"], | ||
| status=request1_data["status"], | ||
| ) | ||
| return request | ||
|
|
||
|
|
||
| # Add request2 to database | ||
| @pytest.fixture | ||
| def test_request2_creation(client, request2_data): | ||
| request = add_request( | ||
| aro_id=request2_data["aro_id"], | ||
| long=request2_data["long"], | ||
| lat=request2_data["lat"], | ||
| created_on=request2_data["created_on"], | ||
| request_sent_obc=request2_data["request_sent_obc"], | ||
| taken_date=request2_data["taken_date"], | ||
| transmission=request2_data["transmission"], | ||
| status=request2_data["status"], | ||
| ) | ||
| return request | ||
|
|
||
|
|
||
| def test_get_all_requests(client, request1_data, request2_data, test_request1_creation, test_request2_creation): | ||
| response = client.get( | ||
| "/api/v1/mcc/requests?count=2&offset=0&filters=pending&filters=completed", | ||
| headers={"Content-Type": "application/json"}, | ||
| ) | ||
| assert response.status_code == 200 | ||
| requests = response.json()["data"] | ||
| assert len(requests) == 2 | ||
|
|
||
| request1_response = requests[0] | ||
| assert request1_response["aro_id"] == request1_data["aro_id"] | ||
| assert request1_response["long"] == request1_data["long"] | ||
| assert request1_response["lat"] == request1_data["lat"] | ||
| assert request1_response["created_on"] == request1_data["created_on"] | ||
| assert request1_response["request_sent_obc"] == request1_data["request_sent_obc"] | ||
| assert request1_response["taken_date"] == request1_data["taken_date"] | ||
| assert request1_response["transmission"] == request1_data["transmission"] | ||
| assert request1_response["status"] == request1_data["status"].value | ||
|
|
||
| request2_response = requests[1] | ||
| assert request2_response["aro_id"] == request2_data["aro_id"] | ||
| assert request2_response["long"] == request2_data["long"] | ||
| assert request2_response["lat"] == request2_data["lat"] | ||
| assert request2_response["created_on"] == request2_data["created_on"].isoformat() | ||
| assert request2_response["request_sent_obc"] == request2_data["request_sent_obc"].isoformat() | ||
| assert request2_response["taken_date"] == request2_data["taken_date"].isoformat() | ||
| assert request2_response["transmission"] == request2_data["transmission"].isoformat() | ||
| assert request2_response["status"] == request2_data["status"].value | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
You should also define a requests base model which you pass in like this. I believe that tells fastapi to look for an incoming json object with the params defined in the base model.


There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I am using query parameters to pass in the parameters currently. Does that work or should I switch to a request model?