1+ import os
2+
13from enums .lambda_error import LambdaError
24from enums .logging_app_interaction import LoggingAppInteraction
5+ from models .feedback_model import Feedback
6+ from pydantic import ValidationError
37from services .send_feedback_service import SendFeedbackService
8+ from services .send_test_feedback_service import SendTestFeedbackService
49from utils .audit_logging_setup import LoggingService
510from utils .decorators .ensure_env_var import ensure_environment_variables
611from utils .decorators .handle_lambda_exceptions import handle_lambda_exceptions
712from utils .decorators .override_error_check import override_error_check
813from utils .decorators .set_audit_arg import set_request_context_for_logging
14+ from utils .exceptions import OdsErrorException
915from utils .lambda_exceptions import SendFeedbackException
1016from utils .lambda_response import ApiGatewayResponse
1117from utils .request_context import request_context
1218
1319logger = LoggingService (__name__ )
20+ failure_msg = "Failed to send feedback by email"
1421
1522
1623@set_request_context_for_logging
1724@override_error_check
1825@ensure_environment_variables (
19- ["FROM_EMAIL_ADDRESS" , "EMAIL_SUBJECT" , "EMAIL_RECIPIENT_SSM_PARAM_KEY" ]
26+ [
27+ "FROM_EMAIL_ADDRESS" ,
28+ "EMAIL_SUBJECT" ,
29+ "EMAIL_RECIPIENT_SSM_PARAM_KEY" ,
30+ "ITOC_TESTING_SLACK_BOT_TOKEN" ,
31+ "ITOC_TESTING_CHANNEL_ID" ,
32+ "ITOC_TESTING_TEAMS_WEBHOOK" ,
33+ "ITOC_TESTING_ODS_CODES" ,
34+ ]
2035)
2136@handle_lambda_exceptions
2237def lambda_handler (event , context ):
2338 request_context .app_interaction = LoggingAppInteraction .SEND_FEEDBACK .value
39+ ods_code = request_context .authorization .get ("selected_organisation" , {}).get (
40+ "org_ods_code"
41+ )
42+ if not ods_code :
43+ raise OdsErrorException ("No ODS code provided" )
2444
2545 logger .info ("Send feedback handler triggered" )
2646
@@ -32,14 +52,40 @@ def lambda_handler(event, context):
3252 )
3353 raise SendFeedbackException (400 , LambdaError .FeedbackMissingBody )
3454
55+ logger .info ("Parsing feedback content..." )
56+ try :
57+ feedback = Feedback .model_validate_json (event_body )
58+
59+ except ValidationError as e :
60+ logger .error (e )
61+ logger .error (
62+ LambdaError .FeedbackInvalidBody .to_str (),
63+ {"result" : failure_msg },
64+ )
65+ raise SendFeedbackException (400 , LambdaError .FeedbackInvalidBody )
66+
3567 logger .info ("Setting up SendFeedbackService..." )
36- feedback_service = SendFeedbackService ()
3768
69+ feedback_service = SendFeedbackService ()
3870 logger .info ("SendFeedbackService ready, start processing feedback" )
39- feedback_service .process_feedback (event_body )
4071
72+ feedback_service .process_feedback (feedback )
4173 logger .info ("Process complete" , {"Result" : "Successfully sent feedback by email" })
4274
75+ if is_itoc_test_feedback (ods_code ):
76+ logger .info ("Setting up SendTestFeedbackService" )
77+
78+ test_feedback_service = SendTestFeedbackService ()
79+ test_feedback_service .process_feedback (feedback )
80+
81+
82+
4383 return ApiGatewayResponse (
4484 200 , "Feedback email processed" , "POST"
4585 ).create_api_gateway_response ()
86+
87+
88+ def is_itoc_test_feedback (ods_code : str ) -> bool :
89+ ods_codes = os .environ ["ITOC_TESTING_ODS_CODES" ].split ("," )
90+ return ods_code in ods_codes
91+
0 commit comments