"""Logic for updating payee action states.""" from marshmallow import ValidationError from owsresponse import response from abacus_state.constants.constants import ( ACTION_STATUSES, PARENT_TABLE_NAMES, PAYEE_ACTION_NAMES, ) from abacus_state.constants.error import ERROR_INVALID_ACTION_STATUS from abacus_state.models.abacus_state import AbacusState from abacus_state.schemas.abacus_state import AbacusStateDetailSchema from abacus_state.utils.format_error import validation_error def update_payee_state(abacus_state: AbacusState, **params) -> response.Response: """Update payee state by abacus_state_id. Args: abacus_state (AbacusState): AbacusState instance to be updated params (dict): dict of fields to be updated (i.e. action_status, message) Returns: an owsresponse Response object """ try: action_status = params.get('action_status') _validate_status_update(abacus_state.action_name, action_status) except ValidationError as e: return validation_error(e.messages[0]) abacus_state.update_attributes(**params) AbacusState.commit_changes() return response.Response( message=AbacusStateDetailSchema().dump(abacus_state), status=200 ) def _validate_status_update( action_name: str, action_status: str | None, ): """Validate if status update is valid. Args: action_name (str): 'banking_eligibility' action_status (str): status of action (i.e. 'completed', 'error', etc) """ if action_name != PAYEE_ACTION_NAMES.BANKING_ELIGIBILITY or action_status not in [ ACTION_STATUSES.INIT, ACTION_STATUSES.RUNNING, ACTION_STATUSES.COMPLETE, ACTION_STATUSES.REJECTED, ]: raise ValidationError( message=ERROR_INVALID_ACTION_STATUS.format( action_name=action_name, action_status=action_status, parent_table_name=PARENT_TABLE_NAMES.PAYEE, ) )