20
20
from domain .core .error import ConfigurationError
21
21
from domain .core .product_team import ProductTeam
22
22
from domain .core .questionnaire import Questionnaire , QuestionnaireResponse
23
+ from domain .core .timestamp import now
23
24
from domain .repository .device_reference_data_repository import (
24
25
DeviceReferenceDataRepository ,
25
26
)
@@ -39,6 +40,30 @@ def parse_mhs_device_payload(data, cache) -> CreateMhsDeviceIncomingParams:
39
40
return CreateMhsDeviceIncomingParams (** payload )
40
41
41
42
43
+ def read_spine_mhs_questionnaire (data , cache ) -> Questionnaire :
44
+ return QuestionnaireRepository ().read (QuestionnaireInstance .SPINE_MHS )
45
+
46
+
47
+ def check_expected_questionnaire_response_fields (data , cache ):
48
+ spine_mhs_questionnaire : Questionnaire = data [read_spine_mhs_questionnaire ]
49
+ expected_fields = sorted (spine_mhs_questionnaire .user_provided_fields )
50
+ payload : CreateMhsDeviceIncomingParams = data [parse_mhs_device_payload ]
51
+ spine_mhs_questionnaire_response = payload .questionnaire_responses [
52
+ QuestionnaireInstance .SPINE_MHS
53
+ ]
54
+ payload_fields = set (spine_mhs_questionnaire_response .__root__ [0 ].keys ())
55
+
56
+ # Find unexpected fields
57
+ unexpected_fields = payload_fields - set (expected_fields )
58
+ if unexpected_fields :
59
+ raise ConfigurationError (
60
+ f"Payload contains unexpected fields: { unexpected_fields } . "
61
+ f"Expected fields are: { expected_fields } ."
62
+ )
63
+ # Return questionnaire responses
64
+ return spine_mhs_questionnaire_response .__root__ [0 ]
65
+
66
+
42
67
def check_for_existing_mhs (data , cache ):
43
68
product_team : ProductTeam = data [read_product_team ]
44
69
product : CpmProduct = data [read_product ]
@@ -82,21 +107,41 @@ def read_device_reference_data(data, cache) -> DeviceReferenceData:
82
107
return device_reference_data
83
108
84
109
85
- def read_spine_mhs_questionnaire (data , cache ) -> Questionnaire :
86
- return QuestionnaireRepository ().read (QuestionnaireInstance .SPINE_MHS )
87
-
88
-
89
- def validate_spine_mhs_questionnaire_response (data , cache ) -> QuestionnaireResponse :
90
- spine_mhs_questionnaire : Questionnaire = data [read_spine_mhs_questionnaire ]
91
- payload : CreateMhsDeviceIncomingParams = data [parse_mhs_device_payload ]
110
+ def generate_spine_mhs_responses (data , cache ) -> list :
111
+ spine_mhs_questionnaire_responses = data [
112
+ check_expected_questionnaire_response_fields
113
+ ]
92
114
93
- spine_mhs_questionnaire_response = payload .questionnaire_responses [
94
- QuestionnaireInstance .SPINE_MHS
115
+ missing_fields_used_for_system_generated_fields = [
116
+ field
117
+ for field in ["Binding" , "MHS FQDN" ]
118
+ if not spine_mhs_questionnaire_responses .get (field )
95
119
]
96
120
97
- return spine_mhs_questionnaire .validate (
98
- data = spine_mhs_questionnaire_response .__root__ [0 ]
121
+ if missing_fields_used_for_system_generated_fields :
122
+ raise ConfigurationError (
123
+ f"The following required fields are missing in the response to spine_mhs: { ', ' .join (missing_fields_used_for_system_generated_fields )} "
124
+ )
125
+
126
+ # System generated fields:
127
+ spine_mhs_questionnaire_responses ["Address" ] = (
128
+ f"{ spine_mhs_questionnaire_responses .get ("Binding" )} { spine_mhs_questionnaire_responses .get ("MHS FQDN" )} "
99
129
)
130
+ spine_mhs_questionnaire_responses ["MHS Party key" ] = data [get_party_key ]
131
+ spine_mhs_questionnaire_responses ["Managing Organization" ] = (
132
+ spine_mhs_questionnaire_responses ["MHS Party key" ].split ("-" )[0 ]
133
+ )
134
+ spine_mhs_questionnaire_responses ["Date Approved" ] = str (now ())
135
+ spine_mhs_questionnaire_responses ["Date Requested" ] = str (now ())
136
+ spine_mhs_questionnaire_responses ["Date DNS Approved" ] = str (None )
137
+
138
+ return spine_mhs_questionnaire_responses
139
+
140
+
141
+ def validate_spine_mhs_questionnaire_response (data , cache ) -> QuestionnaireResponse :
142
+ spine_mhs_questionnaire : Questionnaire = data [read_spine_mhs_questionnaire ]
143
+ spine_mhs_response = data [generate_spine_mhs_responses ]
144
+ return spine_mhs_questionnaire .validate (spine_mhs_response )
100
145
101
146
102
147
def create_mhs_device (data , cache ) -> Device :
@@ -173,12 +218,14 @@ def set_http_status(data, cache) -> tuple[HTTPStatus, dict]:
173
218
parse_event_body ,
174
219
parse_path_params ,
175
220
parse_mhs_device_payload ,
221
+ read_spine_mhs_questionnaire ,
222
+ check_expected_questionnaire_response_fields ,
176
223
read_product_team ,
177
224
read_product ,
178
225
get_party_key ,
179
226
check_for_existing_mhs ,
180
227
read_device_reference_data ,
181
- read_spine_mhs_questionnaire ,
228
+ generate_spine_mhs_responses ,
182
229
validate_spine_mhs_questionnaire_response ,
183
230
create_mhs_device ,
184
231
create_party_key_tag ,
0 commit comments