Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 0 additions & 2 deletions src/eligibility_signposting_api/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
from eligibility_signposting_api import audit, repos, services
from eligibility_signposting_api.common.cache_manager import FLASK_APP_CACHE_KEY, cache_manager
from eligibility_signposting_api.common.error_handler import handle_exception
from eligibility_signposting_api.common.request_validator import validate_request_params
from eligibility_signposting_api.config.config import config
from eligibility_signposting_api.logging.logs_helper import log_request_ids_from_headers
from eligibility_signposting_api.logging.logs_manager import add_lambda_request_id_to_logger, init_logging
Expand Down Expand Up @@ -49,7 +48,6 @@ def get_or_create_app() -> Flask:
@add_lambda_request_id_to_logger()
@tracing_setup()
@log_request_ids_from_headers()
@validate_request_params()
def lambda_handler(event: LambdaEvent, context: LambdaContext) -> dict[str, Any]: # pragma: no cover
"""Run the Flask app as an AWS Lambda."""
app = get_or_create_app()
Expand Down
16 changes: 8 additions & 8 deletions src/eligibility_signposting_api/common/request_validator.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@
from functools import wraps
from typing import Any

from mangum.types import LambdaContext, LambdaEvent
from flask import request
from flask.typing import ResponseReturnValue

from eligibility_signposting_api.common.api_error_response import (
INVALID_CATEGORY_ERROR,
Expand Down Expand Up @@ -55,24 +56,23 @@ def validate_nhs_number(path_nhs: str, header_nhs: str) -> bool:
def validate_request_params() -> Callable:
def decorator(func: Callable) -> Callable:
@wraps(func)
def wrapper(event: LambdaEvent, context: LambdaContext) -> dict[str, Any] | None:
path_nhs_no = event.get("pathParameters", {}).get("id")
header_nhs_no = event.get("headers", {}).get(NHS_NUMBER_HEADER)
def wrapper(*args, **kwargs) -> ResponseReturnValue:
nhs_number = kwargs.get("nhs_number")
header_nhs_no = request.headers.get(NHS_NUMBER_HEADER)

if not validate_nhs_number(path_nhs_no, header_nhs_no):
if not validate_nhs_number(nhs_number, header_nhs_no):
message = "You are not authorised to request information for the supplied NHS Number"
return NHS_NUMBER_MISMATCH_ERROR.log_and_generate_response(log_message=message, diagnostics=message)

query_params = event.get("queryStringParameters")
query_params = request.args
if query_params:
is_valid, problem = validate_query_params(query_params)
if not is_valid:
return problem

return func(event, context)
return func(*args, **kwargs)

return wrapper

return decorator


Expand Down
4 changes: 4 additions & 0 deletions src/eligibility_signposting_api/model/campaign_config.py
Original file line number Diff line number Diff line change
Expand Up @@ -204,6 +204,10 @@ def parse_dates(cls, v: str | date) -> date:
def serialize_dates(v: date, _info: SerializationInfo) -> str:
return v.strftime("%Y%m%d")

@cached_property
def virtual_cohort_labels(self) -> set[CohortLabel]:
return {cohort.cohort_label for cohort in self.iteration_cohorts if cohort.is_magic_cohort}

def __str__(self) -> str:
return json.dumps(self.model_dump(by_alias=True), indent=2)

Expand Down
7 changes: 7 additions & 0 deletions src/eligibility_signposting_api/views/eligibility.py
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@
from eligibility_signposting_api.audit.audit_context import AuditContext
from eligibility_signposting_api.audit.audit_service import AuditService
from eligibility_signposting_api.common.api_error_response import NHS_NUMBER_NOT_FOUND_ERROR
from eligibility_signposting_api.common.request_validator import validate_request_params
from eligibility_signposting_api.model.eligibility_status import Condition, EligibilityStatus, NHSNumber, Status
from eligibility_signposting_api.services import EligibilityService, UnknownPersonError
from eligibility_signposting_api.views.response_model import eligibility_response
Expand All @@ -32,6 +33,12 @@ def before_request() -> None:
AuditContext.add_request_details(request)


@eligibility_blueprint.get("/_status")
def api_status() -> ResponseReturnValue:
return make_response({"status": "ok", "timestamp": datetime.now(UTC).isoformat()}, HTTPStatus.OK)


@validate_request_params()
@eligibility_blueprint.get("/", defaults={"nhs_number": ""})
@eligibility_blueprint.get("/<nhs_number>")
def check_eligibility(
Expand Down
Loading