From f55e103fddc72a3c57acbd8f877dc7d093e96a80 Mon Sep 17 00:00:00 2001 From: PSNAppZ Date: Thu, 4 Apr 2024 19:12:48 +0530 Subject: [PATCH 1/3] Refactored Request Model + Fixed Resolve API Response issue --- src/openg2p_spar_mapper_api/config.py | 2 +- .../controllers/async_mapper_controller.py | 139 ++++++++-------- .../controllers/sync_mapper_controller.py | 84 +++++----- .../services/id_fa_mapping_validations.py | 29 ++-- .../services/mapper.py | 77 ++++----- .../services/request_validations.py | 31 ++-- .../services/response_helper.py | 152 ++++++++---------- 7 files changed, 230 insertions(+), 284 deletions(-) diff --git a/src/openg2p_spar_mapper_api/config.py b/src/openg2p_spar_mapper_api/config.py index c96c731..276a2b0 100644 --- a/src/openg2p_spar_mapper_api/config.py +++ b/src/openg2p_spar_mapper_api/config.py @@ -22,7 +22,7 @@ class Settings(BaseSettings): """ openapi_version: str = __version__ - db_dbname: str = "mapper-db" + db_dbname: str = "openg2p_spar_db" default_callback_url: Optional[AnyUrl] = None default_callback_timeout: int = 10 diff --git a/src/openg2p_spar_mapper_api/controllers/async_mapper_controller.py b/src/openg2p_spar_mapper_api/controllers/async_mapper_controller.py index d817b99..ca023f7 100644 --- a/src/openg2p_spar_mapper_api/controllers/async_mapper_controller.py +++ b/src/openg2p_spar_mapper_api/controllers/async_mapper_controller.py @@ -1,7 +1,6 @@ import asyncio import logging import uuid - import httpx from openg2p_fastapi_common.controller import BaseController from openg2p_g2pconnect_common_lib.common.schemas import ( @@ -9,12 +8,16 @@ AsyncResponse, Request, ) -from openg2p_g2pconnect_common_lib.mapper.schemas.link import ( +from openg2p_g2pconnect_common_lib.mapper.schemas import ( + LinkRequest, + ResolveRequest, + UnlinkRequest, + UpdateRequest, SingleLinkResponse, + SingleResolveResponse, + SingleUnlinkResponse, + SingleUpdateResponse, ) -from openg2p_g2pconnect_common_lib.mapper.schemas.resolve import SingleResolveResponse -from openg2p_g2pconnect_common_lib.mapper.schemas.unlink import SingleUnlinkResponse -from openg2p_g2pconnect_common_lib.mapper.schemas.update import SingleUpdateResponse from ..config import Settings from ..services import ( @@ -85,116 +88,108 @@ def __init__(self, **kwargs): methods=["POST"], ) - async def link_async(self, request: Request): + async def link_async(self, link_request: LinkRequest): correlation_id = str(uuid.uuid4()) await asyncio.create_task( - self.handle_service_and_link_callback(request, correlation_id, "link") + self.handle_service_and_link_callback(link_request, correlation_id, "link") ) return AsyncResponseHelper.get_component().construct_success_async_response( - request, + link_request, correlation_id, ) - async def update_async(self, request: Request): - try: - RequestValidation.validate_request(request) - RequestValidation.validate_update_async_request_header(request) - except RequestValidationException as e: - error_response = ( - AsyncResponseHelper.get_component().construct_error_async_response( - request, e - ) - ) - return error_response + async def update_async(self, update_request: UpdateRequest): correlation_id = str(uuid.uuid4()) await asyncio.create_task( - self.handle_service_and_update_callback(request, correlation_id, "update") + self.handle_service_and_update_callback( + update_request, correlation_id, "update" + ) ) return AsyncResponseHelper.get_component().construct_success_async_response( - request, + update_request, correlation_id, ) - async def resolve_async(self, request: Request): + async def resolve_async(self, resolve_request: ResolveRequest): correlation_id = str(uuid.uuid4()) - try: - RequestValidation.validate_request(request) - RequestValidation.validate_resolve_async_request_header(request) - except RequestValidationException as e: - error_response = ( - AsyncResponseHelper.get_component().construct_error_async_response( - request, e - ) - ) - return error_response await asyncio.create_task( - self.handle_service_and_resolve_callback(request, correlation_id, "resolve") + self.handle_service_and_resolve_callback( + resolve_request, correlation_id, "resolve" + ) ) return AsyncResponseHelper.get_component().construct_success_async_response( - request, + resolve_request, correlation_id, ) - async def unlink_async(self, request: Request): + async def unlink_async(self, unlink_request: UnlinkRequest): correlation_id = str(uuid.uuid4()) try: - RequestValidation.validate_request(request) - RequestValidation.validate_unlink_async_request_header(request) + RequestValidation.get_component().validate_request(unlink_request) + RequestValidation.get_component().validate_unlink_async_request_header( + unlink_request + ) except RequestValidationException as e: error_response = ( AsyncResponseHelper.get_component().construct_error_async_response( - request, e + unlink_request, e ) ) return error_response await asyncio.create_task( - self.handle_service_and_resolve_callback(request, correlation_id, "unlink") + self.handle_service_and_resolve_callback( + unlink_request, correlation_id, "unlink" + ) ) return AsyncResponseHelper.get_component().construct_success_async_response( - request, + unlink_request, correlation_id, ) async def handle_service_and_link_callback( - self, request: Request, correlation_id: str, action: str + self, link_request: LinkRequest, correlation_id: str, action: str ): try: - RequestValidation.validate_async_request(request) - RequestValidation.validate_link_async_request_header(request) - single_link_responses: list[ - SingleLinkResponse - ] = await self.action_to_method[action](request) + RequestValidation.get_component().validate_async_request(link_request) + RequestValidation.get_component().validate_link_async_request_header( + link_request + ) + single_link_responses: list[SingleLinkResponse] = ( + await self.action_to_method[action](link_request) + ) async_call_back_request: ( AsyncCallbackRequest ) = AsyncResponseHelper.get_component().construct_success_async_callback_link_request( - request, correlation_id, single_link_responses + link_request, correlation_id, single_link_responses ) await self.make_callback( async_call_back_request, - url=request.header.sender_uri, + url=link_request.header.sender_uri, url_suffix=f"/on-{action}", ) except RequestValidationException as e: _logger.error(f"Error in handle_service_and_callback: {e}") - AsyncResponseHelper.get_component().construct_error_async_callback_request( - request, e + error_response = AsyncResponseHelper.get_component().construct_error_async_callback_request( + link_request, e + ) + await self.make_callback( + error_response, + url=link_request.header.sender_uri, + url_suffix=f"/on-{action}", ) - # await self.make_callback( - # error_response, - # url=request.header.sender_uri, - # url_suffix=f"/on-{action}", - # ) async def handle_service_and_update_callback( self, request: Request, correlation_id: str, action: str ): try: - RequestValidation.validate_async_request(request) - RequestValidation.validate_update_async_request_header(request) - single_update_responses: list[ - SingleUpdateResponse - ] = await self.action_to_method[action](request) + RequestValidation.get_component().validate_async_request(request) + RequestValidation.get_component().validate_update_async_request_header( + request + ) + single_update_responses: list[SingleUpdateResponse] = ( + await self.action_to_method[action](request) + ) async_call_back_request: ( AsyncCallbackRequest ) = AsyncResponseHelper.get_component().construct_success_async_callback_update_request( @@ -220,11 +215,13 @@ async def handle_service_and_resolve_callback( self, request: Request, correlation_id: str, action: str ): try: - RequestValidation.validate_async_request(request) - RequestValidation.validate_resolve_async_request_header(request) - single_resolve_responses: list[ - SingleResolveResponse - ] = await self.action_to_method[action](request) + RequestValidation.get_component().validate_async_request(request) + RequestValidation.get_component().validate_resolve_async_request_header( + request + ) + single_resolve_responses: list[SingleResolveResponse] = ( + await self.action_to_method[action](request) + ) async_call_back_request: ( AsyncCallbackRequest ) = AsyncResponseHelper.get_component().construct_success_async_callback_resolve_request( @@ -250,11 +247,13 @@ async def handle_service_and_unlink_callback( self, request: Request, correlation_id: str, action: str ): try: - RequestValidation.validate_async_request(request) - RequestValidation.validate_unlink_async_request_header(request) - single_unlink_responses: list[ - SingleUnlinkResponse - ] = await self.action_to_method[action](request) + RequestValidation.get_component().validate_async_request(request) + RequestValidation.get_component().validate_unlink_async_request_header( + request + ) + single_unlink_responses: list[SingleUnlinkResponse] = ( + await self.action_to_method[action](request) + ) async_call_back_request: ( AsyncCallbackRequest ) = AsyncResponseHelper.get_component().construct_success_async_callback_unlink_request( diff --git a/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py b/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py index cac6d2b..04c5caa 100644 --- a/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py +++ b/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py @@ -1,18 +1,16 @@ from openg2p_fastapi_common.controller import BaseController from openg2p_g2pconnect_common_lib.common.schemas import ( - Request, SyncResponse, ) -from openg2p_g2pconnect_common_lib.mapper.schemas.link import ( +from openg2p_g2pconnect_common_lib.mapper.schemas import ( + LinkRequest, + UnlinkRequest, + ResolveRequest, + UpdateRequest, SingleLinkResponse, -) -from openg2p_g2pconnect_common_lib.mapper.schemas.resolve import ( - SingleResolveResponse, -) -from openg2p_g2pconnect_common_lib.mapper.schemas.update import ( SingleUpdateResponse, + SingleResolveResponse, ) - from ..services import ( MapperService, RequestValidation, @@ -55,88 +53,94 @@ def __init__(self, **kwargs): methods=["POST"], ) - async def link_sync(self, request: Request): + async def link_sync(self, link_request: LinkRequest): try: - RequestValidation.validate_request(request) - RequestValidation.validate_link_request_header(request) + RequestValidation.get_component().validate_request(link_request) + RequestValidation.get_component().validate_link_request_header(link_request) except RequestValidationException as e: error_response = ( SyncResponseHelper.get_component().construct_error_sync_response( - request, e + link_request, e ) ) return error_response - single_link_responses: list[ - SingleLinkResponse - ] = await self.mapper_service.link(request) + single_link_responses: list[SingleLinkResponse] = ( + await self.mapper_service.link(link_request) + ) return SyncResponseHelper.get_component().construct_success_sync_link_response( - request, + link_request, single_link_responses, ) - async def update_sync(self, request: Request): + async def update_sync(self, update_request: UpdateRequest): try: - RequestValidation.validate_request(request) - RequestValidation.validate_update_request_header(request) + RequestValidation.get_component().validate_request(update_request) + RequestValidation.get_component().validate_update_request_header( + update_request + ) except RequestValidationException as e: error_response = ( SyncResponseHelper.get_component().construct_error_sync_response( - request, e + update_request, e ) ) return error_response - single_update_responses: list[ - SingleUpdateResponse - ] = await self.mapper_service.update(request) + single_update_responses: list[SingleUpdateResponse] = ( + await self.mapper_service.update(update_request) + ) return ( SyncResponseHelper.get_component().construct_success_sync_update_response( - request, + update_request, single_update_responses, ) ) - async def resolve_sync(self, request: Request): + async def resolve_sync(self, resolve_request: ResolveRequest): try: - RequestValidation.validate_request(request) - RequestValidation.validate_resolve_request_header(request) + RequestValidation.get_component().validate_request(resolve_request) + RequestValidation.get_component().validate_resolve_request_header( + resolve_request + ) except RequestValidationException as e: error_response = ( SyncResponseHelper.get_component().construct_error_sync_response( - request, e + resolve_request, e ) ) return error_response - single_resolve_responses: list[ - SingleResolveResponse - ] = await self.mapper_service.resolve(request) + single_resolve_responses: list[SingleResolveResponse] = ( + await self.mapper_service.resolve(resolve_request) + ) return ( SyncResponseHelper.get_component().construct_success_sync_resolve_response( - request, + resolve_request, single_resolve_responses, ) ) - async def unlink_sync(self, request: Request): + async def unlink_sync(self, unlink_request: UnlinkRequest): try: - RequestValidation.validate_request(request) - RequestValidation.validate_unlink_request_header(request) + RequestValidation.get_component().validate_request(unlink_request) + RequestValidation.get_component().validate_unlink_request_header( + unlink_request + ) except RequestValidationException as e: error_response = ( SyncResponseHelper.get_component().construct_error_sync_response( - request, e + unlink_request, e ) ) return error_response - single_unlink_responses: list[ - SingleResolveResponse - ] = await self.mapper_service.unlink(request) + single_unlink_responses: list[SingleResolveResponse] = ( + await self.mapper_service.unlink(unlink_request) + ) return ( SyncResponseHelper.get_component().construct_success_sync_unlink_response( - request, + unlink_request, single_unlink_responses, ) ) diff --git a/src/openg2p_spar_mapper_api/services/id_fa_mapping_validations.py b/src/openg2p_spar_mapper_api/services/id_fa_mapping_validations.py index 0d9e025..867d294 100644 --- a/src/openg2p_spar_mapper_api/services/id_fa_mapping_validations.py +++ b/src/openg2p_spar_mapper_api/services/id_fa_mapping_validations.py @@ -1,3 +1,4 @@ +from sqlalchemy import and_, select, or_ from openg2p_fastapi_common.service import BaseService from openg2p_g2pconnect_common_lib.common.schemas import StatusEnum from openg2p_g2pconnect_common_lib.mapper.schemas import ( @@ -10,7 +11,6 @@ UnlinkStatusReasonCode, UpdateStatusReasonCode, ) -from sqlalchemy import and_, select from ..models import IdFaMapping from .exceptions import ( @@ -22,9 +22,8 @@ class IdFaMappingValidations(BaseService): - @staticmethod async def validate_link_request( - connection, single_link_request: SingleLinkRequest + self, connection, single_link_request: SingleLinkRequest ) -> None: # Check if the ID is null if not single_link_request.id: @@ -62,9 +61,8 @@ async def validate_link_request( return None - @staticmethod async def validate_update_request( - connection, single_update_request: SingleUpdateRequest + self, connection, single_update_request: SingleUpdateRequest ) -> None: if not single_update_request.id: raise UpdateValidationException( @@ -98,27 +96,19 @@ async def validate_update_request( return None - @staticmethod async def validate_resolve_request( - connection, single_resolve_request: SingleResolveRequest + self, connection, single_resolve_request: SingleResolveRequest ) -> None: - if not single_resolve_request.id: + if not single_resolve_request.id and not single_resolve_request.fa: raise ResolveValidationException( - message="ID is null", + message="Either ID or FA are required", status=StatusEnum.rjct, - validation_error_type=ResolveStatusReasonCode.rjct_id_invalid, - ) - - if not single_resolve_request.fa: - raise ResolveValidationException( - message="FA is null", - status=StatusEnum.rjct, - validation_error_type=ResolveStatusReasonCode.rjct_fa_invalid, + validation_error_type=ResolveStatusReasonCode.rjct_reference_id_invalid, ) result = await connection.execute( select(IdFaMapping).where( - and_( + or_( IdFaMapping.id_value == single_resolve_request.id, IdFaMapping.fa_value == single_resolve_request.fa, ) @@ -134,9 +124,8 @@ async def validate_resolve_request( ) return None - @staticmethod async def validate_unlink_request( - connection, single_unlink_request: SingleUnlinkRequest + self, connection, single_unlink_request: SingleUnlinkRequest ) -> None: if not single_unlink_request.id: raise UnlinkValidationException( diff --git a/src/openg2p_spar_mapper_api/services/mapper.py b/src/openg2p_spar_mapper_api/services/mapper.py index 54ef0f5..183eba3 100644 --- a/src/openg2p_spar_mapper_api/services/mapper.py +++ b/src/openg2p_spar_mapper_api/services/mapper.py @@ -3,7 +3,7 @@ from openg2p_fastapi_common.context import dbengine from openg2p_fastapi_common.service import BaseService -from openg2p_g2pconnect_common_lib.common.schemas import Request, StatusEnum +from openg2p_g2pconnect_common_lib.common.schemas import StatusEnum from openg2p_g2pconnect_common_lib.mapper.schemas import ( LinkRequest, LinkStatusReasonCode, @@ -15,16 +15,16 @@ UnlinkRequest, UpdateRequest, UpdateStatusReasonCode, -) -from openg2p_g2pconnect_common_lib.mapper.schemas.resolve import ( + LinkRequestMessage, + UpdateRequestMessage, + ResolveRequestMessage, + UnlinkRequestMessage, ResolveScope, ResolveStatusReasonCode, SingleResolveRequest, -) -from openg2p_g2pconnect_common_lib.mapper.schemas.update import ( - AdditionalInfo, SingleUpdateRequest, ) + from sqlalchemy import and_, delete, select from sqlalchemy.ext.asyncio import async_sessionmaker @@ -43,14 +43,14 @@ class MapperService(BaseService): - async def link(self, request: Request): + async def link(self, link_request: LinkRequest): session_maker = async_sessionmaker(dbengine.get(), expire_on_commit=False) async with session_maker() as session: - linkRequest: LinkRequest = LinkRequest.model_validate(request.message) + link_request_message: LinkRequestMessage = link_request.message mappings_to_add = [] single_link_responses: list[SingleLinkResponse] = [] - for single_link_request in linkRequest.link_request: + for single_link_request in link_request_message.link_request: try: await IdFaMappingValidations.get_component().validate_link_request( connection=session, single_link_request=single_link_request @@ -113,20 +113,17 @@ def construct_single_link_response_for_failure(self, single_link_request, error) locale=single_link_request.locale, ) - async def update(self, request: Request): + async def update(self, update_request: UpdateRequest): session_maker = async_sessionmaker(dbengine.get(), expire_on_commit=False) async with session_maker() as session: - updateRequest: UpdateRequest = UpdateRequest.model_validate(request.message) + update_request_message: UpdateRequestMessage = update_request.message single_update_responses: list[SingleUpdateResponse] = [] - for single_update_request in updateRequest.update_request: + for single_update_request in update_request_message.update_request: try: await IdFaMappingValidations.get_component().validate_update_request( connection=session, single_update_request=single_update_request ) - single_update_request: SingleUpdateRequest = ( - SingleUpdateRequest.model_validate(single_update_request) - ) single_update_responses.append( self.construct_single_update_response_for_success( @@ -175,14 +172,6 @@ async def update_mapping(self, session, single_update_request): addl_info_copy = ( result.additional_info.copy() if result.additional_info else [] ) - [info["name"] for info in addl_info_copy] - # for info in single_update_request.additional_info: - # if info["name"] in addl_info_keys: - # addl_info_copy[ - # addl_info_keys.index(info["name"]) - # ] = info.model_dump() - # else: - # addl_info_copy.append(info.model_dump()) result.additional_info = addl_info_copy else: single_response.status = StatusEnum.rjct @@ -218,15 +207,14 @@ def construct_single_update_response_for_failure( locale=single_update_request.locale, ) - async def resolve(self, request: Request): + async def resolve(self, resolve_request: ResolveRequest): session_maker = async_sessionmaker(dbengine.get(), expire_on_commit=False) async with session_maker() as session: - resolveRequest: ResolveRequest = ResolveRequest.model_validate( - request.message - ) + resolve_request_message: ResolveRequestMessage = resolve_request.message + single_resolve_responses: list[SingleResolveResponse] = [] - for single_resolve_request in resolveRequest.resolve_request: + for single_resolve_request in resolve_request_message.resolve_request: try: await IdFaMappingValidations.get_component().validate_resolve_request( connection=session, @@ -238,11 +226,13 @@ async def resolve(self, request: Request): stmt, result = await self.construct_query( session, single_resolve_request ) - self.construct_single_resolve(single_resolve_request, result) + single_resolve_response = self.construct_single_resolve( + single_resolve_request, result + ) single_resolve_responses.append( self.construct_single_resolve_response_for_success( - single_resolve_request + single_resolve_response ) ) except ResolveValidationException as e: @@ -254,36 +244,33 @@ async def resolve(self, request: Request): await session.commit() return single_resolve_responses - def construct_single_resolve(self, single_resolve_request, result): + def construct_single_resolve( + self, single_resolve_request, result + ) -> SingleResolveResponse: single_response = self.construct_single_resolve_response_for_success( single_resolve_request ) if result: + single_response.status = StatusEnum.succ if single_resolve_request.scope == ResolveScope.details: single_response.fa = result.fa_value single_response.id = result.id_value single_response.additional_info = ( - [ - AdditionalInfo.model_validate(info) - for info in result.additional_info - ] + [info for info in result.additional_info] if result.additional_info else None ) elif single_resolve_request.scope == ResolveScope.yes_no: pass if single_resolve_request.fa and not single_resolve_request.id: - single_response.status = StatusEnum.succ single_response.status_reason_code = ( ResolveStatusReasonCode.succ_fa_active ) else: - single_response.status = StatusEnum.succ single_response.status_reason_code = ( ResolveStatusReasonCode.succ_id_active ) else: - single_response.status = StatusEnum.succ if single_resolve_request.id and single_resolve_request.fa: single_response.status_reason_code = ( ResolveStatusReasonCode.succ_fa_not_linked_to_id @@ -305,6 +292,7 @@ def construct_single_resolve(self, single_resolve_request, result): single_response.status_reason_message = ( "Mapping not found against given ID." ) + return single_response async def construct_query(self, session, single_resolve_request): single_response = self.construct_single_resolve_response_for_success( @@ -332,10 +320,7 @@ async def construct_query(self, session, single_resolve_request): stmt = select(IdFaMapping).where(id_query) elif single_resolve_request.fa: stmt = select(IdFaMapping).where(fa_query) - else: - single_response.status = StatusEnum.rjct - single_response.status_reason_code = ResolveStatusReasonCode.rjct_id_invalid - single_response.status_reason_message = "Neither ID (nor FA) is given." + result = await session.execute(stmt) result = result.scalar() return stmt, result @@ -360,19 +345,19 @@ def construct_single_resolve_response_for_failure( reference_id=single_resolve_request.reference_id, timestamp=datetime.now(), fa=single_resolve_request.fa, - status=StatusEnum.rjct, + status=error.status, status_reason_code=error.validation_error_type, status_reason_message=error.message, additional_info=None, locale=single_resolve_request.locale, ) - async def unlink(self, request: Request): + async def unlink(self, unlink_request: UnlinkRequest): session_maker = async_sessionmaker(dbengine.get(), expire_on_commit=False) async with session_maker() as session: - unlinkRequest: UnlinkRequest = UnlinkRequest.model_validate(request.message) + unlink_request_message: UnlinkRequestMessage = unlink_request.message single_unlink_responses: list[SingleUnlinkResponse] = [] - for single_unlink_request in unlinkRequest.unlink_request: + for single_unlink_request in unlink_request_message.unlink_request: try: await IdFaMappingValidations.get_component().validate_unlink_request( connection=session, single_unlink_request=single_unlink_request diff --git a/src/openg2p_spar_mapper_api/services/request_validations.py b/src/openg2p_spar_mapper_api/services/request_validations.py index 344d2c6..e3060f4 100644 --- a/src/openg2p_spar_mapper_api/services/request_validations.py +++ b/src/openg2p_spar_mapper_api/services/request_validations.py @@ -6,12 +6,12 @@ AsyncResponseStatusReasonCodeEnum, ) + from .exceptions import RequestValidationException class RequestValidation(BaseService): - @staticmethod - def validate_link_request_header(request) -> None: + def validate_link_request_header(self, request) -> None: if request.header.action != "link": raise RequestValidationException( code=SyncResponseStatusReasonCodeEnum.rjct_action_not_supported, @@ -19,8 +19,7 @@ def validate_link_request_header(request) -> None: ) return None - @staticmethod - def validate_update_request_header(request) -> None: + def validate_update_request_header(self, request) -> None: if request.header.action != "update": raise RequestValidationException( code=SyncResponseStatusReasonCodeEnum.rjct_action_not_supported, @@ -28,8 +27,7 @@ def validate_update_request_header(request) -> None: ) return None - @staticmethod - def validate_resolve_request_header(request) -> None: + def validate_resolve_request_header(self, request) -> None: if request.header.action != "resolve": raise RequestValidationException( code=SyncResponseStatusReasonCodeEnum.rjct_action_not_supported, @@ -37,8 +35,7 @@ def validate_resolve_request_header(request) -> None: ) return None - @staticmethod - def validate_unlink_request_header(request) -> None: + def validate_unlink_request_header(self, request) -> None: if request.header.action != "unlink": raise RequestValidationException( code=SyncResponseStatusReasonCodeEnum.rjct_action_not_supported, @@ -46,13 +43,11 @@ def validate_unlink_request_header(request) -> None: ) return None - @staticmethod - def validate_request(request) -> None: + def validate_request(self, request) -> None: # TODO: Validate the request return None - @staticmethod - def validate_link_async_request_header(request) -> None: + def validate_link_async_request_header(self, request) -> None: if request.header.action != "link": raise RequestValidationException( code=AsyncResponseStatusReasonCodeEnum.rjct_action_not_supported, @@ -60,8 +55,7 @@ def validate_link_async_request_header(request) -> None: ) return None - @staticmethod - def validate_update_async_request_header(request) -> None: + def validate_update_async_request_header(self, request) -> None: if request.header.action != "update": raise RequestValidationException( code=AsyncResponseStatusReasonCodeEnum.rjct_action_not_supported, @@ -69,8 +63,7 @@ def validate_update_async_request_header(request) -> None: ) return None - @staticmethod - def validate_resolve_async_request_header(request) -> None: + def validate_resolve_async_request_header(self, request) -> None: if request.header.action != "resolve": raise RequestValidationException( code=AsyncResponseStatusReasonCodeEnum.rjct_action_not_supported, @@ -78,8 +71,7 @@ def validate_resolve_async_request_header(request) -> None: ) return None - @staticmethod - def validate_unlink_async_request_header(request) -> None: + def validate_unlink_async_request_header(self, request) -> None: if request.header.action != "unlink": raise RequestValidationException( code=AsyncResponseStatusReasonCodeEnum.rjct_action_not_supported, @@ -87,7 +79,6 @@ def validate_unlink_async_request_header(request) -> None: ) return None - @staticmethod - def validate_async_request(request) -> None: + def validate_async_request(self, request) -> None: # TODO: Validate the request return None diff --git a/src/openg2p_spar_mapper_api/services/response_helper.py b/src/openg2p_spar_mapper_api/services/response_helper.py index 930265c..7f9e089 100644 --- a/src/openg2p_spar_mapper_api/services/response_helper.py +++ b/src/openg2p_spar_mapper_api/services/response_helper.py @@ -25,6 +25,10 @@ UnlinkResponse, UpdateRequest, UpdateResponse, + ResolveRequestMessage, + LinkRequestMessage, + UpdateRequestMessage, + UnlinkRequestMessage, ) from .exceptions import ( @@ -33,14 +37,14 @@ class SyncResponseHelper(BaseService): - @staticmethod def construct_success_sync_link_response( - request: Request, + self, + link_request: LinkRequest, single_link_responses: list[SingleLinkResponse], ) -> SyncResponse: - linkRequest: LinkRequest = LinkRequest.model_validate(request.message) + link_request_message: LinkRequestMessage = link_request.message linkResponse: LinkResponse = LinkResponse( - transaction_id=linkRequest.transaction_id, + transaction_id=link_request_message.transaction_id, correlation_id=None, link_response=single_link_responses, ) @@ -52,40 +56,33 @@ def construct_success_sync_link_response( if link.status == StatusEnum.succ ] ) - # if completed_count == 0: - # raise LinkValidationException( - # message="All requests in transaction failed.", - # status=StatusEnum.rjct, - # validation_error_type=LinkStatusReasonCode.rjct_errors_too_many, - # ) - return SyncResponse( header=SyncResponseHeader( version="1.0.0", - message_id=request.header.message_id, + message_id=link_request.header.message_id, message_ts=datetime.now().isoformat(), - action=request.header.action, + action=link_request.header.action, status=StatusEnum.succ, status_reason_code=None, status_reason_message=None, total_count=total_count, completed_count=completed_count, - sender_id=request.header.sender_id, - receiver_id=request.header.receiver_id, + sender_id=link_request.header.sender_id, + receiver_id=link_request.header.receiver_id, is_msg_encrypted=False, meta={}, ), message=linkResponse, ) - @staticmethod def construct_success_sync_update_response( - request: Request, + self, + update_request: UpdateRequest, single_update_responses: list[SingleUpdateResponse], ) -> SyncResponse: - updateRequest: UpdateRequest = UpdateRequest.model_validate(request.message) + update_request_message: UpdateRequestMessage = update_request.message updateResponse: UpdateResponse = UpdateResponse( - transaction_id=updateRequest.transaction_id, + transaction_id=update_request_message.transaction_id, correlation_id=None, update_response=single_update_responses, ) @@ -97,39 +94,33 @@ def construct_success_sync_update_response( if update.status == StatusEnum.succ ] ) - # if completed_count == 0: - # raise UpdateValidationException( - # message="All requests in transaction failed.", - # status=StatusEnum.rjct, - # validation_error_type=UpdateStatusReasonCode.rjct_errors_too_many, - # ) return SyncResponse( header=SyncResponseHeader( version="1.0.0", - message_id=request.header.message_id, + message_id=update_request.header.message_id, message_ts=datetime.now().isoformat(), - action=request.header.action, + action=update_request.header.action, status=StatusEnum.succ, status_reason_code=None, status_reason_message=None, total_count=total_count, completed_count=completed_count, - sender_id=request.header.sender_id, - receiver_id=request.header.receiver_id, + sender_id=update_request.header.sender_id, + receiver_id=update_request.header.receiver_id, is_msg_encrypted=False, meta={}, ), message=updateResponse, ) - @staticmethod def construct_success_sync_resolve_response( - request: Request, + self, + resolve_request: ResolveRequest, single_resolve_responses: list[SingleResolveResponse], ) -> SyncResponse: - resolveRequest: ResolveRequest = ResolveRequest.model_validate(request.message) + resolve_request_message: ResolveRequestMessage = resolve_request.message resolveResponse: ResolveResponse = ResolveResponse( - transaction_id=resolveRequest.transaction_id, + transaction_id=resolve_request_message.transaction_id, correlation_id=None, resolve_response=single_resolve_responses, ) @@ -141,39 +132,33 @@ def construct_success_sync_resolve_response( if resolve.status == StatusEnum.succ ] ) - # if completed_count == 0: - # raise ResolveValidationException( - # message="All requests in transaction failed.", - # status=StatusEnum.rjct, - # validation_error_type=ResolveStatusReasonCode.rjct_errors_too_many, - # ) return SyncResponse( header=SyncResponseHeader( version="1.0.0", - message_id=request.header.message_id, + message_id=resolve_request.header.message_id, message_ts=datetime.now().isoformat(), - action=request.header.action, + action=resolve_request.header.action, status=StatusEnum.succ, status_reason_code=None, status_reason_message=None, total_count=total_count, completed_count=completed_count, - sender_id=request.header.sender_id, - receiver_id=request.header.receiver_id, + sender_id=resolve_request.header.sender_id, + receiver_id=resolve_request.header.receiver_id, is_msg_encrypted=False, meta={}, ), message=resolveResponse, ) - @staticmethod def construct_success_sync_unlink_response( - request: Request, + self, + unlink_request: UnlinkRequest, single_unlink_responses: list[SingleUnlinkResponse], ) -> SyncResponse: - unlinkRequest: UnlinkRequest = UnlinkRequest.model_validate(request.message) + unlink_request_message: UnlinkRequestMessage = unlink_request.message unlinkResponse: UnlinkResponse = UnlinkResponse( - transaction_id=unlinkRequest.transaction_id, + transaction_id=unlink_request_message.transaction_id, correlation_id=None, unlink_response=single_unlink_responses, ) @@ -185,34 +170,27 @@ def construct_success_sync_unlink_response( if unlink.status == StatusEnum.succ ] ) - # if completed_count == 0: - # raise UnlinkValidationException( - # message="All requests in transaction failed.", - # status=StatusEnum.rjct, - # validation_error_type=ResolveStatusReasonCode.rjct_errors_too_many, - # ) return SyncResponse( header=SyncResponseHeader( version="1.0.0", - message_id=request.header.message_id, + message_id=unlink_request.header.message_id, message_ts=datetime.now().isoformat(), - action=request.header.action, + action=unlink_request.header.action, status=StatusEnum.succ, status_reason_code=None, status_reason_message=None, total_count=total_count, completed_count=completed_count, - sender_id=request.header.sender_id, - receiver_id=request.header.receiver_id, + sender_id=unlink_request.header.sender_id, + receiver_id=unlink_request.header.receiver_id, is_msg_encrypted=False, meta={}, ), message=unlinkResponse, ) - @staticmethod def construct_error_sync_response( - request: Request, exception: RequestValidationException + self, request: Request, exception: RequestValidationException ) -> SyncResponse: return SyncResponse( signature=None, @@ -261,7 +239,7 @@ def construct_error_async_response( def construct_success_async_callback_link_request( self, - request: Request, + link_request: LinkRequest, correlation_id: str, single_link_responses: list[SingleLinkResponse], ) -> AsyncCallbackRequest: @@ -269,10 +247,10 @@ def construct_success_async_callback_link_request( completed_count = len( [link for link in single_link_responses if link.status == StatusEnum.succ] ) - linkRequest: LinkRequest = LinkRequest.model_validate(request.message) + link_request_message: LinkRequestMessage = link_request.message linkResponse: LinkResponse = LinkResponse( - transaction_id=linkRequest.transaction_id, + transaction_id=link_request_message.transaction_id, correlation_id=None, link_response=single_link_responses, ) @@ -280,16 +258,16 @@ def construct_success_async_callback_link_request( signature=None, header=AsyncCallbackRequestHeader( version="1.0.0", - message_id=request.header.message_id, + message_id=link_request.header.message_id, message_ts=datetime.now().isoformat(), - action=request.header.action, + action=link_request.header.action, status=StatusEnum.succ, status_reason_code=None, status_reason_message=None, total_count=total_count, completed_count=completed_count, - sender_id=request.header.sender_id, - receiver_id=request.header.receiver_id, + sender_id=link_request.header.sender_id, + receiver_id=link_request.header.receiver_id, is_msg_encrypted=False, meta={}, ), @@ -298,7 +276,7 @@ def construct_success_async_callback_link_request( def construct_success_async_callback_update_request( self, - request: Request, + update_request: UpdateRequest, correlation_id: str, single_update_responses: list[SingleUpdateResponse], ) -> AsyncCallbackRequest: @@ -310,9 +288,9 @@ def construct_success_async_callback_update_request( if update.status == StatusEnum.succ ] ) - updateRequest: UpdateRequest = UpdateRequest.model_validate(request.message) + update_request_message: UpdateRequestMessage = update_request.message updateResponse: UpdateResponse = UpdateResponse( - transaction_id=updateRequest.transaction_id, + transaction_id=update_request_message.transaction_id, correlation_id=None, update_response=single_update_responses, ) @@ -320,16 +298,16 @@ def construct_success_async_callback_update_request( signature=None, header=AsyncCallbackRequestHeader( version="1.0.0", - message_id=request.header.message_id, + message_id=update_request.header.message_id, message_ts=datetime.now().isoformat(), - action=request.header.action, + action=update_request.header.action, status=StatusEnum.succ, status_reason_code=None, status_reason_message=None, total_count=total_count, completed_count=completed_count, - sender_id=request.header.sender_id, - receiver_id=request.header.receiver_id, + sender_id=update_request.header.sender_id, + receiver_id=update_request.header.receiver_id, is_msg_encrypted=False, meta={}, ), @@ -338,7 +316,7 @@ def construct_success_async_callback_update_request( def construct_success_async_callback_resolve_request( self, - request: Request, + resolve_request: ResolveRequest, correlation_id: str, single_resolve_responses: list[SingleResolveResponse], ) -> AsyncCallbackRequest: @@ -350,9 +328,9 @@ def construct_success_async_callback_resolve_request( if resolve.status == StatusEnum.succ ] ) - resolveRequest: ResolveRequest = ResolveRequest.model_validate(request.message) + resolve_request_message: ResolveRequestMessage = resolve_request.message resolveResponse: ResolveResponse = ResolveResponse( - transaction_id=resolveRequest.transaction_id, + transaction_id=resolve_request_message.transaction_id, correlation_id=None, resolve_response=single_resolve_responses, ) @@ -360,16 +338,16 @@ def construct_success_async_callback_resolve_request( signature=None, header=AsyncCallbackRequestHeader( version="1.0.0", - message_id=request.header.message_id, + message_id=resolve_request.header.message_id, message_ts=datetime.now().isoformat(), - action=request.header.action, + action=resolve_request.header.action, status=StatusEnum.succ, status_reason_code=None, status_reason_message=None, total_count=total_count, completed_count=completed_count, - sender_id=request.header.sender_id, - receiver_id=request.header.receiver_id, + sender_id=resolve_request.header.sender_id, + receiver_id=resolve_request.header.receiver_id, is_msg_encrypted=False, meta={}, ), @@ -378,7 +356,7 @@ def construct_success_async_callback_resolve_request( def construct_success_async_callback_unlink_request( self, - request: Request, + unlink_request: UnlinkRequest, correlation_id: str, single_unlink_responses: list[SingleUnlinkResponse], ) -> AsyncCallbackRequest: @@ -390,9 +368,9 @@ def construct_success_async_callback_unlink_request( if unlink.status == StatusEnum.succ ] ) - unlinkRequest: UnlinkRequest = UnlinkRequest.model_validate(request.message) + unlink_request_message: UnlinkRequestMessage = unlink_request.message unlinkResponse: UnlinkResponse = UnlinkResponse( - transaction_id=unlinkRequest.transaction_id, + transaction_id=unlink_request_message.transaction_id, correlation_id=None, unlink_response=single_unlink_responses, ) @@ -400,16 +378,16 @@ def construct_success_async_callback_unlink_request( signature=None, header=AsyncCallbackRequestHeader( version="1.0.0", - message_id=request.header.message_id, + message_id=unlink_request.header.message_id, message_ts=datetime.now().isoformat(), - action=request.header.action, + action=unlink_request.header.action, status=StatusEnum.succ, status_reason_code=None, status_reason_message=None, total_count=total_count, completed_count=completed_count, - sender_id=request.header.sender_id, - receiver_id=request.header.receiver_id, + sender_id=unlink_request.header.sender_id, + receiver_id=unlink_request.header.receiver_id, is_msg_encrypted=False, meta={}, ), From ba6537ab61e42537a85f2b3e478c80bd4ef3c4c0 Mon Sep 17 00:00:00 2001 From: PSNAppZ Date: Thu, 4 Apr 2024 20:12:39 +0530 Subject: [PATCH 2/3] Refactored Response Model --- .../controllers/sync_mapper_controller.py | 12 ++-- .../services/response_helper.py | 68 ++++++++++--------- 2 files changed, 44 insertions(+), 36 deletions(-) diff --git a/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py b/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py index 04c5caa..824f519 100644 --- a/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py +++ b/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py @@ -10,6 +10,10 @@ SingleLinkResponse, SingleUpdateResponse, SingleResolveResponse, + LinkResponse, + UnlinkResponse, + ResolveResponse, + UpdateResponse, ) from ..services import ( MapperService, @@ -31,25 +35,25 @@ def __init__(self, **kwargs): self.router.add_api_route( "/link", self.link_sync, - responses={200: {"model": SyncResponse}}, + responses={200: {"model": LinkResponse}}, methods=["POST"], ) self.router.add_api_route( "/update", self.update_sync, - responses={200: {"model": SyncResponse}}, + responses={200: {"model": UpdateResponse}}, methods=["POST"], ) self.router.add_api_route( "/resolve", self.resolve_sync, - responses={200: {"model": SyncResponse}}, + responses={200: {"model": ResolveResponse}}, methods=["POST"], ) self.router.add_api_route( "/unlink", self.unlink_sync, - responses={200: {"model": SyncResponse}}, + responses={200: {"model": UnlinkResponse}}, methods=["POST"], ) diff --git a/src/openg2p_spar_mapper_api/services/response_helper.py b/src/openg2p_spar_mapper_api/services/response_helper.py index 7f9e089..00d8615 100644 --- a/src/openg2p_spar_mapper_api/services/response_helper.py +++ b/src/openg2p_spar_mapper_api/services/response_helper.py @@ -29,6 +29,10 @@ LinkRequestMessage, UpdateRequestMessage, UnlinkRequestMessage, + LinkResponseMessage, + UnlinkResponseMessage, + UpdateResponseMessage, + ResolveResponseMessage, ) from .exceptions import ( @@ -41,22 +45,22 @@ def construct_success_sync_link_response( self, link_request: LinkRequest, single_link_responses: list[SingleLinkResponse], - ) -> SyncResponse: + ) -> LinkResponse: link_request_message: LinkRequestMessage = link_request.message - linkResponse: LinkResponse = LinkResponse( + link_response_message: LinkResponseMessage = LinkResponseMessage( transaction_id=link_request_message.transaction_id, correlation_id=None, link_response=single_link_responses, ) - total_count = len(linkResponse.link_response) + total_count = len(link_response_message.link_response) completed_count = len( [ link - for link in linkResponse.link_response + for link in link_response_message.link_response if link.status == StatusEnum.succ ] ) - return SyncResponse( + return LinkResponse( header=SyncResponseHeader( version="1.0.0", message_id=link_request.header.message_id, @@ -72,29 +76,29 @@ def construct_success_sync_link_response( is_msg_encrypted=False, meta={}, ), - message=linkResponse, + message=link_response_message, ) def construct_success_sync_update_response( self, update_request: UpdateRequest, single_update_responses: list[SingleUpdateResponse], - ) -> SyncResponse: + ) -> UpdateResponse: update_request_message: UpdateRequestMessage = update_request.message - updateResponse: UpdateResponse = UpdateResponse( + update_response_message: UpdateResponseMessage = UpdateResponseMessage( transaction_id=update_request_message.transaction_id, correlation_id=None, update_response=single_update_responses, ) - total_count = len(updateResponse.update_response) + total_count = len(update_response_message.update_response) completed_count = len( [ update - for update in updateResponse.update_response + for update in update_response_message.update_response if update.status == StatusEnum.succ ] ) - return SyncResponse( + return UpdateResponse( header=SyncResponseHeader( version="1.0.0", message_id=update_request.header.message_id, @@ -110,29 +114,29 @@ def construct_success_sync_update_response( is_msg_encrypted=False, meta={}, ), - message=updateResponse, + message=update_response_message, ) def construct_success_sync_resolve_response( self, resolve_request: ResolveRequest, single_resolve_responses: list[SingleResolveResponse], - ) -> SyncResponse: + ) -> ResolveResponse: resolve_request_message: ResolveRequestMessage = resolve_request.message - resolveResponse: ResolveResponse = ResolveResponse( + resolve_response_message: ResolveResponseMessage = ResolveResponseMessage( transaction_id=resolve_request_message.transaction_id, correlation_id=None, resolve_response=single_resolve_responses, ) - total_count = len(resolveResponse.resolve_response) + total_count = len(resolve_response_message.resolve_response) completed_count = len( [ resolve - for resolve in resolveResponse.resolve_response + for resolve in resolve_response_message.resolve_response if resolve.status == StatusEnum.succ ] ) - return SyncResponse( + return ResolveResponse( header=SyncResponseHeader( version="1.0.0", message_id=resolve_request.header.message_id, @@ -148,29 +152,29 @@ def construct_success_sync_resolve_response( is_msg_encrypted=False, meta={}, ), - message=resolveResponse, + message=resolve_response_message, ) def construct_success_sync_unlink_response( self, unlink_request: UnlinkRequest, single_unlink_responses: list[SingleUnlinkResponse], - ) -> SyncResponse: + ) -> UnlinkResponse: unlink_request_message: UnlinkRequestMessage = unlink_request.message - unlinkResponse: UnlinkResponse = UnlinkResponse( + unlink_response_message: UnlinkResponseMessage = UnlinkResponseMessage( transaction_id=unlink_request_message.transaction_id, correlation_id=None, unlink_response=single_unlink_responses, ) - total_count = len(unlinkResponse.unlink_response) + total_count = len(unlink_response_message.unlink_response) completed_count = len( [ unlink - for unlink in unlinkResponse.unlink_response + for unlink in unlink_response_message.unlink_response if unlink.status == StatusEnum.succ ] ) - return SyncResponse( + return UnlinkResponse( header=SyncResponseHeader( version="1.0.0", message_id=unlink_request.header.message_id, @@ -186,7 +190,7 @@ def construct_success_sync_unlink_response( is_msg_encrypted=False, meta={}, ), - message=unlinkResponse, + message=unlink_response_message, ) def construct_error_sync_response( @@ -249,7 +253,7 @@ def construct_success_async_callback_link_request( ) link_request_message: LinkRequestMessage = link_request.message - linkResponse: LinkResponse = LinkResponse( + link_response_message: LinkResponseMessage = LinkResponseMessage( transaction_id=link_request_message.transaction_id, correlation_id=None, link_response=single_link_responses, @@ -271,7 +275,7 @@ def construct_success_async_callback_link_request( is_msg_encrypted=False, meta={}, ), - message=linkResponse, + message=link_response_message, ) def construct_success_async_callback_update_request( @@ -289,7 +293,7 @@ def construct_success_async_callback_update_request( ] ) update_request_message: UpdateRequestMessage = update_request.message - updateResponse: UpdateResponse = UpdateResponse( + update_response_message: UpdateResponseMessage = UpdateResponseMessage( transaction_id=update_request_message.transaction_id, correlation_id=None, update_response=single_update_responses, @@ -311,7 +315,7 @@ def construct_success_async_callback_update_request( is_msg_encrypted=False, meta={}, ), - message=updateResponse, + message=update_response_message, ) def construct_success_async_callback_resolve_request( @@ -329,7 +333,7 @@ def construct_success_async_callback_resolve_request( ] ) resolve_request_message: ResolveRequestMessage = resolve_request.message - resolveResponse: ResolveResponse = ResolveResponse( + resolve_response_message: ResolveResponseMessage = ResolveResponseMessage( transaction_id=resolve_request_message.transaction_id, correlation_id=None, resolve_response=single_resolve_responses, @@ -351,7 +355,7 @@ def construct_success_async_callback_resolve_request( is_msg_encrypted=False, meta={}, ), - message=resolveResponse, + message=resolve_response_message, ) def construct_success_async_callback_unlink_request( @@ -369,7 +373,7 @@ def construct_success_async_callback_unlink_request( ] ) unlink_request_message: UnlinkRequestMessage = unlink_request.message - unlinkResponse: UnlinkResponse = UnlinkResponse( + unlink_response_message: UnlinkResponseMessage = UnlinkResponseMessage( transaction_id=unlink_request_message.transaction_id, correlation_id=None, unlink_response=single_unlink_responses, @@ -391,7 +395,7 @@ def construct_success_async_callback_unlink_request( is_msg_encrypted=False, meta={}, ), - message=unlinkResponse, + message=unlink_response_message, ) def construct_error_async_callback_request( From 6cbdec3f9e8a147bd5a6dd0371407aa199fdae54 Mon Sep 17 00:00:00 2001 From: PSNAppZ Date: Thu, 4 Apr 2024 20:13:38 +0530 Subject: [PATCH 3/3] Fix issues using pre-commit --- .../controllers/async_mapper_controller.py | 29 +++++++------- .../controllers/sync_mapper_controller.py | 38 +++++++++---------- .../services/id_fa_mapping_validations.py | 2 +- .../services/mapper.py | 25 +++++------- .../services/request_validations.py | 1 - .../services/response_helper.py | 14 +++---- 6 files changed, 51 insertions(+), 58 deletions(-) diff --git a/src/openg2p_spar_mapper_api/controllers/async_mapper_controller.py b/src/openg2p_spar_mapper_api/controllers/async_mapper_controller.py index ca023f7..f2d7ab8 100644 --- a/src/openg2p_spar_mapper_api/controllers/async_mapper_controller.py +++ b/src/openg2p_spar_mapper_api/controllers/async_mapper_controller.py @@ -1,6 +1,7 @@ import asyncio import logging import uuid + import httpx from openg2p_fastapi_common.controller import BaseController from openg2p_g2pconnect_common_lib.common.schemas import ( @@ -11,12 +12,12 @@ from openg2p_g2pconnect_common_lib.mapper.schemas import ( LinkRequest, ResolveRequest, - UnlinkRequest, - UpdateRequest, SingleLinkResponse, SingleResolveResponse, SingleUnlinkResponse, SingleUpdateResponse, + UnlinkRequest, + UpdateRequest, ) from ..config import Settings @@ -154,9 +155,9 @@ async def handle_service_and_link_callback( RequestValidation.get_component().validate_link_async_request_header( link_request ) - single_link_responses: list[SingleLinkResponse] = ( - await self.action_to_method[action](link_request) - ) + single_link_responses: list[ + SingleLinkResponse + ] = await self.action_to_method[action](link_request) async_call_back_request: ( AsyncCallbackRequest @@ -187,9 +188,9 @@ async def handle_service_and_update_callback( RequestValidation.get_component().validate_update_async_request_header( request ) - single_update_responses: list[SingleUpdateResponse] = ( - await self.action_to_method[action](request) - ) + single_update_responses: list[ + SingleUpdateResponse + ] = await self.action_to_method[action](request) async_call_back_request: ( AsyncCallbackRequest ) = AsyncResponseHelper.get_component().construct_success_async_callback_update_request( @@ -219,9 +220,9 @@ async def handle_service_and_resolve_callback( RequestValidation.get_component().validate_resolve_async_request_header( request ) - single_resolve_responses: list[SingleResolveResponse] = ( - await self.action_to_method[action](request) - ) + single_resolve_responses: list[ + SingleResolveResponse + ] = await self.action_to_method[action](request) async_call_back_request: ( AsyncCallbackRequest ) = AsyncResponseHelper.get_component().construct_success_async_callback_resolve_request( @@ -251,9 +252,9 @@ async def handle_service_and_unlink_callback( RequestValidation.get_component().validate_unlink_async_request_header( request ) - single_unlink_responses: list[SingleUnlinkResponse] = ( - await self.action_to_method[action](request) - ) + single_unlink_responses: list[ + SingleUnlinkResponse + ] = await self.action_to_method[action](request) async_call_back_request: ( AsyncCallbackRequest ) = AsyncResponseHelper.get_component().construct_success_async_callback_unlink_request( diff --git a/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py b/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py index 824f519..becc57e 100644 --- a/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py +++ b/src/openg2p_spar_mapper_api/controllers/sync_mapper_controller.py @@ -1,20 +1,18 @@ from openg2p_fastapi_common.controller import BaseController -from openg2p_g2pconnect_common_lib.common.schemas import ( - SyncResponse, -) from openg2p_g2pconnect_common_lib.mapper.schemas import ( LinkRequest, - UnlinkRequest, + LinkResponse, ResolveRequest, - UpdateRequest, + ResolveResponse, SingleLinkResponse, - SingleUpdateResponse, SingleResolveResponse, - LinkResponse, + SingleUpdateResponse, + UnlinkRequest, UnlinkResponse, - ResolveResponse, + UpdateRequest, UpdateResponse, ) + from ..services import ( MapperService, RequestValidation, @@ -69,9 +67,9 @@ async def link_sync(self, link_request: LinkRequest): ) return error_response - single_link_responses: list[SingleLinkResponse] = ( - await self.mapper_service.link(link_request) - ) + single_link_responses: list[ + SingleLinkResponse + ] = await self.mapper_service.link(link_request) return SyncResponseHelper.get_component().construct_success_sync_link_response( link_request, single_link_responses, @@ -91,9 +89,9 @@ async def update_sync(self, update_request: UpdateRequest): ) return error_response - single_update_responses: list[SingleUpdateResponse] = ( - await self.mapper_service.update(update_request) - ) + single_update_responses: list[ + SingleUpdateResponse + ] = await self.mapper_service.update(update_request) return ( SyncResponseHelper.get_component().construct_success_sync_update_response( update_request, @@ -115,9 +113,9 @@ async def resolve_sync(self, resolve_request: ResolveRequest): ) return error_response - single_resolve_responses: list[SingleResolveResponse] = ( - await self.mapper_service.resolve(resolve_request) - ) + single_resolve_responses: list[ + SingleResolveResponse + ] = await self.mapper_service.resolve(resolve_request) return ( SyncResponseHelper.get_component().construct_success_sync_resolve_response( resolve_request, @@ -139,9 +137,9 @@ async def unlink_sync(self, unlink_request: UnlinkRequest): ) return error_response - single_unlink_responses: list[SingleResolveResponse] = ( - await self.mapper_service.unlink(unlink_request) - ) + single_unlink_responses: list[ + SingleResolveResponse + ] = await self.mapper_service.unlink(unlink_request) return ( SyncResponseHelper.get_component().construct_success_sync_unlink_response( unlink_request, diff --git a/src/openg2p_spar_mapper_api/services/id_fa_mapping_validations.py b/src/openg2p_spar_mapper_api/services/id_fa_mapping_validations.py index 867d294..ce5858c 100644 --- a/src/openg2p_spar_mapper_api/services/id_fa_mapping_validations.py +++ b/src/openg2p_spar_mapper_api/services/id_fa_mapping_validations.py @@ -1,4 +1,3 @@ -from sqlalchemy import and_, select, or_ from openg2p_fastapi_common.service import BaseService from openg2p_g2pconnect_common_lib.common.schemas import StatusEnum from openg2p_g2pconnect_common_lib.mapper.schemas import ( @@ -11,6 +10,7 @@ UnlinkStatusReasonCode, UpdateStatusReasonCode, ) +from sqlalchemy import and_, or_, select from ..models import IdFaMapping from .exceptions import ( diff --git a/src/openg2p_spar_mapper_api/services/mapper.py b/src/openg2p_spar_mapper_api/services/mapper.py index 183eba3..c2162ea 100644 --- a/src/openg2p_spar_mapper_api/services/mapper.py +++ b/src/openg2p_spar_mapper_api/services/mapper.py @@ -6,25 +6,24 @@ from openg2p_g2pconnect_common_lib.common.schemas import StatusEnum from openg2p_g2pconnect_common_lib.mapper.schemas import ( LinkRequest, + LinkRequestMessage, LinkStatusReasonCode, ResolveRequest, + ResolveRequestMessage, + ResolveScope, + ResolveStatusReasonCode, SingleLinkResponse, + SingleResolveRequest, SingleResolveResponse, SingleUnlinkResponse, + SingleUpdateRequest, SingleUpdateResponse, UnlinkRequest, + UnlinkRequestMessage, UpdateRequest, - UpdateStatusReasonCode, - LinkRequestMessage, UpdateRequestMessage, - ResolveRequestMessage, - UnlinkRequestMessage, - ResolveScope, - ResolveStatusReasonCode, - SingleResolveRequest, - SingleUpdateRequest, + UpdateStatusReasonCode, ) - from sqlalchemy import and_, delete, select from sqlalchemy.ext.asyncio import async_sessionmaker @@ -256,9 +255,7 @@ def construct_single_resolve( single_response.fa = result.fa_value single_response.id = result.id_value single_response.additional_info = ( - [info for info in result.additional_info] - if result.additional_info - else None + list(result.additional_info) if result.additional_info else None ) elif single_resolve_request.scope == ResolveScope.yes_no: pass @@ -295,9 +292,7 @@ def construct_single_resolve( return single_response async def construct_query(self, session, single_resolve_request): - single_response = self.construct_single_resolve_response_for_success( - single_resolve_request - ) + self.construct_single_resolve_response_for_success(single_resolve_request) stmt = None id_query = IdFaMapping.id_value == single_resolve_request.id fa_query = IdFaMapping.fa_value == single_resolve_request.fa diff --git a/src/openg2p_spar_mapper_api/services/request_validations.py b/src/openg2p_spar_mapper_api/services/request_validations.py index e3060f4..fad0b47 100644 --- a/src/openg2p_spar_mapper_api/services/request_validations.py +++ b/src/openg2p_spar_mapper_api/services/request_validations.py @@ -6,7 +6,6 @@ AsyncResponseStatusReasonCodeEnum, ) - from .exceptions import RequestValidationException diff --git a/src/openg2p_spar_mapper_api/services/response_helper.py b/src/openg2p_spar_mapper_api/services/response_helper.py index 00d8615..b79bdf7 100644 --- a/src/openg2p_spar_mapper_api/services/response_helper.py +++ b/src/openg2p_spar_mapper_api/services/response_helper.py @@ -14,25 +14,25 @@ ) from openg2p_g2pconnect_common_lib.mapper.schemas import ( LinkRequest, + LinkRequestMessage, LinkResponse, + LinkResponseMessage, ResolveRequest, + ResolveRequestMessage, ResolveResponse, + ResolveResponseMessage, SingleLinkResponse, SingleResolveResponse, SingleUnlinkResponse, SingleUpdateResponse, UnlinkRequest, + UnlinkRequestMessage, UnlinkResponse, + UnlinkResponseMessage, UpdateRequest, - UpdateResponse, - ResolveRequestMessage, - LinkRequestMessage, UpdateRequestMessage, - UnlinkRequestMessage, - LinkResponseMessage, - UnlinkResponseMessage, + UpdateResponse, UpdateResponseMessage, - ResolveResponseMessage, ) from .exceptions import (