Skip to content

Commit fec52ef

Browse files
PR feedback
- use schema to strip whitespace - remove optional pending email fields from update record - add type hint for datetime
1 parent 07ef56f commit fec52ef

File tree

5 files changed

+47
-13
lines changed

5 files changed

+47
-13
lines changed

backend/compact-connect/lambdas/python/common/cc_common/data_model/data_client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import time
2-
from datetime import date
2+
from datetime import date, datetime
33
from urllib.parse import quote
44
from uuid import uuid4
55

@@ -2572,7 +2572,7 @@ def update_provider_email_verification_data(
25722572
provider_id: str,
25732573
pending_email_address: str,
25742574
verification_code: str,
2575-
verification_expiry,
2575+
verification_expiry: datetime,
25762576
) -> None:
25772577
"""
25782578
Update the provider record with email verification data.

backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/common.py

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6,12 +6,53 @@
66
from hashlib import md5
77
from typing import Any
88

9-
from marshmallow import Schema, ValidationError, validates_schema
9+
from marshmallow import Schema, ValidationError, pre_load, validates_schema
1010
from marshmallow.fields import Dict, String, Url
1111

1212
from cc_common.config import config
1313

1414

15+
class CCRequestSchema(Schema):
16+
"""
17+
Base class for Compact Connect request schemas.
18+
19+
This schema provides common request processing functionality such as
20+
whitespace trimming and other input sanitization that should be applied
21+
to all incoming API requests.
22+
23+
All request schemas should inherit from this class instead of directly
24+
from marshmallow.Schema to ensure consistent input processing.
25+
"""
26+
27+
@pre_load
28+
def strip_whitespace(self, in_data, **kwargs): # noqa: ARG002 unused-argument
29+
"""
30+
Pre-load hook that strips whitespace from all string values in the request data.
31+
32+
This method recursively processes the input data and strips leading and trailing
33+
whitespace from all string values. This ensures consistent input sanitization
34+
across all request schemas.
35+
36+
:param in_data: Input data dictionary from the request
37+
:param kwargs: Additional keyword arguments from marshmallow
38+
:return: Processed data with whitespace stripped from string values
39+
"""
40+
if not isinstance(in_data, dict):
41+
return in_data
42+
43+
def strip_strings(data):
44+
"""Recursively strip whitespace from string values in nested data structures."""
45+
if isinstance(data, dict):
46+
return {key: strip_strings(value) for key, value in data.items()}
47+
if isinstance(data, list):
48+
return [strip_strings(item) for item in data]
49+
if isinstance(data, str):
50+
return data.strip()
51+
return data
52+
53+
return strip_strings(in_data)
54+
55+
1556
class CCDataClass:
1657
"""
1758
Base class for Compact Connect data classes

backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/provider/api.py

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
from marshmallow.validate import Length, Regexp
55

66
from cc_common.data_model.schema.base_record import ForgivingSchema
7+
from cc_common.data_model.schema.common import CCRequestSchema
78
from cc_common.data_model.schema.fields import (
89
ActiveInactive,
910
Compact,
@@ -147,7 +148,7 @@ class ProviderRegistrationRequestSchema(Schema):
147148
token = String(required=True, allow_none=False)
148149

149150

150-
class ProviderEmailUpdateRequestSchema(Schema):
151+
class ProviderEmailUpdateRequestSchema(CCRequestSchema):
151152
"""
152153
Schema for provider email update requests.
153154
@@ -160,7 +161,7 @@ class ProviderEmailUpdateRequestSchema(Schema):
160161
newEmailAddress = Email(required=True, allow_none=False)
161162

162163

163-
class ProviderEmailVerificationRequestSchema(Schema):
164+
class ProviderEmailVerificationRequestSchema(CCRequestSchema):
164165
"""
165166
Schema for provider email verification requests.
166167

backend/compact-connect/lambdas/python/common/cc_common/data_model/schema/provider/record.py

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -202,11 +202,6 @@ class ProviderUpdatePreviousRecordSchema(ForgivingSchema):
202202
dateOfBirth = Date(required=True, allow_none=False)
203203
compactConnectRegisteredEmailAddress = Email(required=False, allow_none=False)
204204

205-
# Optional Email verification fields (only present if the provider has requested an email change)
206-
pendingEmailAddress = Email(required=False, allow_none=False)
207-
emailVerificationCode = String(required=False, allow_none=False, validate=Length(4, 4))
208-
emailVerificationExpiry = DateTime(required=False, allow_none=False)
209-
210205
currentHomeJurisdiction = CurrentHomeJurisdictionField(required=False, allow_none=False)
211206
dateOfUpdate = DateTime(required=True, allow_none=False)
212207

backend/compact-connect/lambdas/python/provider-data-v1/handlers/provider_users.py

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -223,9 +223,6 @@ def _patch_provider_email(event: dict, context: LambdaContext): # noqa: ARG001
223223
# Parse and validate the request body
224224
try:
225225
event_body = json.loads(event['body'])
226-
# Trim whitespace from email before validation
227-
if 'newEmailAddress' in event_body:
228-
event_body['newEmailAddress'] = event_body['newEmailAddress'].strip()
229226
validated_data = ProviderEmailUpdateRequestSchema().load(event_body)
230227
new_email_address = validated_data['newEmailAddress']
231228
except (json.JSONDecodeError, ValidationError) as e:

0 commit comments

Comments
 (0)