11/* eslint-disable no-continue */
22import { LoggerBase } from '@crowd/logging'
33import { IAttributes } from '@crowd/types'
4+ import * as lodash from 'lodash'
45
5- import MemberAttributesRepository from '@/database/repositories/member/memberAttributesRepository'
6+ import { captureApiChange , memberEditProfileAction } from '@crowd/audit-logs'
7+ import { Error404 } from '@crowd/common'
8+ import { fetchMemberAttributes , getMemberManuallyChangedFields , setMemberManuallyChangedFields , updateMemberAttributes } from '@crowd/data-access-layer/src/members'
9+ import SequelizeRepository from '@/database/repositories/sequelizeRepository'
610
711import { IServiceOptions } from '../IServiceOptions'
812
@@ -16,11 +20,58 @@ export default class MemberAttributesService extends LoggerBase {
1620
1721 // Member attributes
1822 async list ( memberId : string ) : Promise < IAttributes > {
19- return MemberAttributesRepository . list ( memberId , this . options )
23+ const qx = SequelizeRepository . getQueryExecutor ( this . options )
24+
25+ // Get member attributes
26+ const result = await fetchMemberAttributes ( qx , memberId )
27+ if ( ! result . length ) {
28+ throw new Error404 ( 'Attributes not found for the given member!' )
29+ }
30+
31+ return result
2032 }
2133
2234 // Update member attributes
2335 async update ( memberId : string , data : IAttributes ) : Promise < IAttributes > {
24- return MemberAttributesRepository . update ( memberId , data , this . options )
36+ const qx = SequelizeRepository . getQueryExecutor ( this . options )
37+
38+ const currentMemberAttributes = await fetchMemberAttributes ( qx , memberId )
39+ if ( ! currentMemberAttributes ) {
40+ throw new Error404 ( 'Attributes not found for the given member!' )
41+ }
42+
43+ const existingManuallyChangedFields = ( await getMemberManuallyChangedFields ( qx , memberId ) ) || [ ]
44+
45+ const updatedManuallyChangedFields = [ ...existingManuallyChangedFields ]
46+
47+ const result = await captureApiChange (
48+ this . options ,
49+ memberEditProfileAction ( memberId , async ( captureOldState , captureNewState ) => {
50+ captureOldState ( { attributes : currentMemberAttributes } )
51+
52+ for ( const key of Object . keys ( data ) ) {
53+ if (
54+ ! currentMemberAttributes [ key ] ||
55+ ! lodash . isEqual ( currentMemberAttributes [ key ] . default , data [ key ] . default )
56+ ) {
57+ const fieldName = `attributes.${ key } `
58+ if ( ! updatedManuallyChangedFields . includes ( fieldName ) ) {
59+ updatedManuallyChangedFields . push ( fieldName )
60+ }
61+ }
62+ }
63+
64+ await updateMemberAttributes ( qx , memberId , data )
65+
66+ await setMemberManuallyChangedFields ( qx , memberId , updatedManuallyChangedFields )
67+
68+ captureNewState ( { attributes : data } )
69+
70+ // Get updated member attributes
71+ return fetchMemberAttributes ( qx , memberId )
72+ } ) ,
73+ )
74+
75+ return result
2576 }
2677}
0 commit comments