Questions:
Possibles questions about this feature
Technical Refinement
Description
intl-user-service
We will add the new attribute on class
UserDetailsBaseDto
:path:
intl-user-service/src/users/dtos/users.dtos.ts
@ApiProperty({ required: false, description: 'Required acceptance agreement info', type: [RequiredAcceptanceAgreementInfoDto], nullable: true, }) @Type(() => RequiredAcceptanceAgreementInfoDto) @IsArray() @IsOptional() public requiredAcceptanceAgreementInfo?: RequiredAcceptanceAgreementInfoDto[] | null;
On
class UserDetailsDto
onconstructor
, we will add a mapper:const requiredAcceptanceAgreementInfo = userDetails.requiredAcceptanceAgreementInfo?.map( (ra: IRequiredAcceptanceAgreementInfo) => ra as RequiredAcceptanceAgreementInfoDto, );
this.requiredAcceptanceAgreementInfo = requiredAcceptanceAgreementInfo;
intl-packages | ctg-packages
We will add the attribute
requiredAcceptanceAgreementInfo
onTUserDetails
:path:
intl-packages/packages/users/src/schemata.ts
requiredAcceptanceAgreementInfo: t.union([t.array(TRequiredAcceptanceAgreementInfo), t.null]),
export const TRequiredAcceptanceAgreementInfo = t.interface({ id: t.string, updatedAt: t.string, });
intl-whitelabel-graphql
We will add the attribute
requiredAcceptanceAgreementInfo
onUpdateUserDetailsInput
path:
intl-whitelabel-graphql/src/functions/graphql/schemas/users.gql
input UpdateUserDetailsInput { ... requiredAcceptanceAgreementInfo: [RequiredAcceptanceAgreementInfoInput] }
We will run the command:
yarn run graphql:types
After that, will be created an automatic code on file:
intl-whitelabel-graphql/src/functions/graphql/generated/graphql.ts
, probably, will be many changes, but we can to discard all, except of change related aboutrequiredAcceptanceAgreementInfo
intl-whitelabel-app
We will create an update method to
requiredAcceptanceAgreementInfo
path:
intl-whitelabel-app/workspaces/frontend/src/state/auth/hooks/use-current-user.ts
const updateRequiredAcceptanceAgreementInfo = useCallback( async (sanityAcceptance: Array<IStaticPageRoute>) => { try { if (!user) { return; } const newAcceptanceAgreementInfo = sanityAcceptance.map(sp => { return user.details.requiredAcceptanceAgreementInfo.filter((userAcceptance: any) => { if (userAcceptance.id === sp._id) { userAcceptance.updatedAt = sp._updatedAt; return userAcceptance; } return { id: sp._id, updatedAt: sp._updatedAt, }; }); }); const input = { ...user, details: { ...user.details, requiredAcceptanceAgreementInfo: newAcceptanceAgreementInfo, }, }; const { data } = await updateMeMutation({ variables: { input } }); if (!data) { logger.error({ message: 'An error occurred updating acceptance agreement' }); toast.error(formatMessage({ id: 'updateInfoError' })); } } catch (error) { logger.error({ message: `An error occurred updating acceptance agreement: ${error}` }); toast.error(formatMessage({ id: 'updateInfoError' })); } }, [formatMessage, logger, updateMeMutation, user] );
And we will export this method from hook
return { ... updateRequiredAcceptanceAgreementInfo, };
Screenshots
TODO
POC
TODO
Impact Analysis
Signup
Authentication
Unit Test
Signup
Authentication
MOCKS
TODO
Useful Links
Workflows: Lucidchart document | Lucidchart
Existent behavior: Terms and Conditions - Technical Refinement - Discovery As-Is
Add Comment