diff --git a/src/eligibility_signposting_api/app.py b/src/eligibility_signposting_api/app.py index 97adea76..66a5bca0 100644 --- a/src/eligibility_signposting_api/app.py +++ b/src/eligibility_signposting_api/app.py @@ -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 @@ -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() diff --git a/src/eligibility_signposting_api/common/request_validator.py b/src/eligibility_signposting_api/common/request_validator.py index 7e4cc97a..12b36844 100644 --- a/src/eligibility_signposting_api/common/request_validator.py +++ b/src/eligibility_signposting_api/common/request_validator.py @@ -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, @@ -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 diff --git a/src/eligibility_signposting_api/model/campaign_config.py b/src/eligibility_signposting_api/model/campaign_config.py index a16c52fd..4eeb8b65 100644 --- a/src/eligibility_signposting_api/model/campaign_config.py +++ b/src/eligibility_signposting_api/model/campaign_config.py @@ -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) diff --git a/src/eligibility_signposting_api/views/eligibility.py b/src/eligibility_signposting_api/views/eligibility.py index 383d73d1..954c5540 100644 --- a/src/eligibility_signposting_api/views/eligibility.py +++ b/src/eligibility_signposting_api/views/eligibility.py @@ -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 @@ -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("/") def check_eligibility(