storemw-core-api 1.0.134 → 1.0.136

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,5 +1,5 @@
1
1
  import { z } from "zod";
2
- export declare const enumAuthTokenTypes: readonly ["administrator", "worker", "customer", "member"];
2
+ export declare const enumAuthTokenTypes: readonly ["administrator", "worker", "customer", "member", "driver"];
3
3
  /** Auth Token (Only Operator) */
4
4
  export declare const schemaAuthTokenOperatorPayload: z.ZodObject<{
5
5
  scope: z.ZodObject<{
@@ -47,13 +47,13 @@ export type SchemaAuthTokenOperatorPayload = z.infer<typeof schemaAuthTokenOpera
47
47
  /** Auth Token (Except Operator) */
48
48
  export declare const schemaAuthTokenPayload: z.ZodObject<{
49
49
  scope: z.ZodObject<{
50
- target: z.ZodEnum<["administrator", "worker", "customer", "member"]>;
50
+ target: z.ZodEnum<["administrator", "worker", "customer", "member", "driver"]>;
51
51
  action: z.ZodString;
52
52
  }, "strip", z.ZodTypeAny, {
53
- target: "administrator" | "worker" | "customer" | "member";
53
+ target: "administrator" | "worker" | "customer" | "member" | "driver";
54
54
  action: string;
55
55
  }, {
56
- target: "administrator" | "worker" | "customer" | "member";
56
+ target: "administrator" | "worker" | "customer" | "member" | "driver";
57
57
  action: string;
58
58
  }>;
59
59
  payload: z.ZodEffects<z.ZodObject<{
@@ -84,7 +84,7 @@ export declare const schemaAuthTokenPayload: z.ZodObject<{
84
84
  }>;
85
85
  }, "strip", z.ZodTypeAny, {
86
86
  scope: {
87
- target: "administrator" | "worker" | "customer" | "member";
87
+ target: "administrator" | "worker" | "customer" | "member" | "driver";
88
88
  action: string;
89
89
  };
90
90
  payload: {
@@ -95,7 +95,7 @@ export declare const schemaAuthTokenPayload: z.ZodObject<{
95
95
  };
96
96
  }, {
97
97
  scope: {
98
- target: "administrator" | "worker" | "customer" | "member";
98
+ target: "administrator" | "worker" | "customer" | "member" | "driver";
99
99
  action: string;
100
100
  };
101
101
  payload: {
@@ -6,7 +6,8 @@ exports.enumAuthTokenTypes = [
6
6
  "administrator",
7
7
  "worker",
8
8
  "customer",
9
- "member"
9
+ "member",
10
+ "driver"
10
11
  ];
11
12
  const schemaAuthCredentialBase = zod_1.z.object({
12
13
  accountId: zod_1.z.string().min(1).optional(),
@@ -1 +1 @@
1
- {"version":3,"file":"schemaAuthToken.js","sourceRoot":"","sources":["../../../../src/schema/payload/auth/schemaAuthToken.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAIX,QAAA,kBAAkB,GAAG;IAC9B,eAAe;IACf,QAAQ;IACR,UAAU;IACV,QAAQ;CACF,CAAA;AAEV,MAAM,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC9B,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,MAAM,CACxD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,EAC5C;IACI,OAAO,EAAE,+CAA+C;IACxD,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE,8CAA8C;CACvE,CACJ,CAAC;AAEF,iCAAiC;AACpB,QAAA,8BAA8B,GAAG,OAAC,CAAC,MAAM,CAAC;IACnD,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC;QACZ,MAAM,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;QAC5B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,8CAA8C;KACrE,CAAC;IACF,OAAO,EAAE,wBAAwB,CAAC,IAAI,CAAC;QACnC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,IAAI;KACpB,CAAC;CACL,CAAC,CAAC;AAIH,mCAAmC;AACtB,QAAA,sBAAsB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3C,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC;QACZ,MAAM,EAAE,OAAC,CAAC,IAAI,CACV,0BAAkB,CACrB;QACD,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,8CAA8C;KACrE,CAAC;IACF,OAAO,EAAE,oBAAoB;CAChC,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\n\nimport { _, dayjs } from \"@/utils\";\n\nexport const enumAuthTokenTypes = [\n \"administrator\",\n \"worker\",\n \"customer\",\n \"member\"\n] as const\n\nconst schemaAuthCredentialBase = z.object({\n accountId: z.string().min(1).optional(),\n accountCode: z.string().min(1).optional(),\n username: z.string().min(1),\n password: z.string().min(1),\n});\n\nconst schemaAuthCredential = schemaAuthCredentialBase.refine(\n (data) => data.accountId || data.accountCode,\n {\n message: \"Either account_id or account_code is required\",\n path: [\"account_id\"], // You can point this to either or leave empty\n }\n);\n\n/** Auth Token (Only Operator) */\nexport const schemaAuthTokenOperatorPayload = z.object({\n scope: z.object({\n target: z.enum([\"operator\"]),\n action: z.string(), // can be \"\" if you want to allow empty string\n }),\n payload: schemaAuthCredentialBase.omit({\n accountId: true,\n accountCode: true\n })\n});\n\nexport type SchemaAuthTokenOperatorPayload = z.infer<typeof schemaAuthTokenOperatorPayload>;\n\n/** Auth Token (Except Operator) */\nexport const schemaAuthTokenPayload = z.object({\n scope: z.object({\n target: z.enum(\n enumAuthTokenTypes\n ),\n action: z.string(), // can be \"\" if you want to allow empty string\n }),\n payload: schemaAuthCredential\n});\n\nexport type SchemaAuthTokenPayload = z.infer<typeof schemaAuthTokenPayload>;"]}
1
+ {"version":3,"file":"schemaAuthToken.js","sourceRoot":"","sources":["../../../../src/schema/payload/auth/schemaAuthToken.ts"],"names":[],"mappings":";;;AAAA,6BAAwB;AAIX,QAAA,kBAAkB,GAAG;IAC9B,eAAe;IACf,QAAQ;IACR,UAAU;IACV,QAAQ;IACR,QAAQ;CACF,CAAA;AAEV,MAAM,wBAAwB,GAAG,OAAC,CAAC,MAAM,CAAC;IACtC,SAAS,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACvC,WAAW,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACzC,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC3B,QAAQ,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;CAC9B,CAAC,CAAC;AAEH,MAAM,oBAAoB,GAAG,wBAAwB,CAAC,MAAM,CACxD,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,IAAI,IAAI,CAAC,WAAW,EAC5C;IACI,OAAO,EAAE,+CAA+C;IACxD,IAAI,EAAE,CAAC,YAAY,CAAC,EAAE,8CAA8C;CACvE,CACJ,CAAC;AAEF,iCAAiC;AACpB,QAAA,8BAA8B,GAAG,OAAC,CAAC,MAAM,CAAC;IACnD,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC;QACZ,MAAM,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,UAAU,CAAC,CAAC;QAC5B,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,8CAA8C;KACrE,CAAC;IACF,OAAO,EAAE,wBAAwB,CAAC,IAAI,CAAC;QACnC,SAAS,EAAE,IAAI;QACf,WAAW,EAAE,IAAI;KACpB,CAAC;CACL,CAAC,CAAC;AAIH,mCAAmC;AACtB,QAAA,sBAAsB,GAAG,OAAC,CAAC,MAAM,CAAC;IAC3C,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC;QACZ,MAAM,EAAE,OAAC,CAAC,IAAI,CACV,0BAAkB,CACrB;QACD,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,EAAE,8CAA8C;KACrE,CAAC;IACF,OAAO,EAAE,oBAAoB;CAChC,CAAC,CAAC","sourcesContent":["import { z } from \"zod\";\n\nimport { _, dayjs } from \"@/utils\";\n\nexport const enumAuthTokenTypes = [\n \"administrator\",\n \"worker\",\n \"customer\",\n \"member\",\n \"driver\"\n] as const\n\nconst schemaAuthCredentialBase = z.object({\n accountId: z.string().min(1).optional(),\n accountCode: z.string().min(1).optional(),\n username: z.string().min(1),\n password: z.string().min(1),\n});\n\nconst schemaAuthCredential = schemaAuthCredentialBase.refine(\n (data) => data.accountId || data.accountCode,\n {\n message: \"Either account_id or account_code is required\",\n path: [\"account_id\"], // You can point this to either or leave empty\n }\n);\n\n/** Auth Token (Only Operator) */\nexport const schemaAuthTokenOperatorPayload = z.object({\n scope: z.object({\n target: z.enum([\"operator\"]),\n action: z.string(), // can be \"\" if you want to allow empty string\n }),\n payload: schemaAuthCredentialBase.omit({\n accountId: true,\n accountCode: true\n })\n});\n\nexport type SchemaAuthTokenOperatorPayload = z.infer<typeof schemaAuthTokenOperatorPayload>;\n\n/** Auth Token (Except Operator) */\nexport const schemaAuthTokenPayload = z.object({\n scope: z.object({\n target: z.enum(\n enumAuthTokenTypes\n ),\n action: z.string(), // can be \"\" if you want to allow empty string\n }),\n payload: schemaAuthCredential\n});\n\nexport type SchemaAuthTokenPayload = z.infer<typeof schemaAuthTokenPayload>;"]}
@@ -38,11 +38,7 @@ export declare const AuthService: (props: AuthServiceProps) => {
38
38
  account: any;
39
39
  user: any;
40
40
  user_locations: any[];
41
- parent_user_id: number;
42
- roles: never[];
43
- permissions: never[];
44
41
  is_owner: boolean;
45
- owner_id: number;
46
42
  }>;
47
43
  verifyAuthToken: (token: string, secret: string) => AuthJwtToken;
48
44
  };
@@ -67,20 +67,8 @@ const AuthService = (props) => {
67
67
  const userService = (0, services_1.UserService)({ userType: authType, ...rest });
68
68
  const accountService = (0, services_1.AccountService)({ ...rest, isOperator: true });
69
69
  const locationService = (0, services_1.LocationService)({ ...rest, locationType: "location" });
70
- // let payload: UserListProps = {
71
- // includePassword: true,
72
- // limit: 1,
73
- // offset: 0,
74
- // sortfield: "user_id",
75
- // sortorder: "ASC",
76
- // filters: [
77
- // { field: "username", operator: "=", value: `${data["username"]}` },
78
- // { field: "user_type", operator: "=", value: `${authType}` }
79
- // ],
80
- // datatypes: getUserInjectionFieldName(authType)
81
- // }
82
- // const { data: foundUser } = await userService.listUsers(payload)
83
70
  let foundUser = {};
71
+ // only for operator & administrator
84
72
  if (authType === "operator" || authType === "administrator") {
85
73
  // const operatorService = UserService({ ...rest })
86
74
  const _user = await userService.getUserByUsername({
@@ -90,7 +78,7 @@ const AuthService = (props) => {
90
78
  });
91
79
  foundUser = _user;
92
80
  }
93
- else {
81
+ else { // other user type
94
82
  let payload = {
95
83
  includePassword: true,
96
84
  limit: 1,
@@ -152,16 +140,16 @@ const AuthService = (props) => {
152
140
  account,
153
141
  user,
154
142
  user_locations: locations,
155
- parent_user_id: 0,
156
- roles: [
143
+ // parent_user_id: 0,
144
+ // roles: [
157
145
  // {
158
146
  // id: 23,
159
147
  // role_name: "123"
160
148
  // }
161
- ],
162
- permissions: [],
163
- is_owner: Boolean(user?.is_owner === 1),
164
- owner_id: 0
149
+ // ],
150
+ // permissions: [],
151
+ is_owner: Boolean(user?.is_owner),
152
+ // owner_id: 0
165
153
  };
166
154
  };
167
155
  return {
@@ -1 +1 @@
1
- {"version":3,"file":"AuthService.js","sourceRoot":"","sources":["../../../src/services/auth/AuthService.ts"],"names":[],"mappings":"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","sourcesContent":["// import { QueryList, QueryGet } from \"@/schema/common\";\nimport { DefaultServiceProps, throwError } from \"@/utils\";\nimport {\n UserService,\n // UserGetProps,\n UserType,\n UserListProps,\n // userTypes,\n AccountService,\n LocationService,\n LocationListProps\n} from \"@/services\";\n\nimport jwt, { JwtPayload } from \"jsonwebtoken\";\n\nimport { generateAuthToken, verifyPassword, verifyAuthToken, hashPassword } from \"@/utils\"\nimport { ModelAccountFields, ModelUserFields, UserModel } from \"@/models\";\n\nexport const authTypes = {\n operator: \"operator\",\n administrator: \"administrator\",\n worker: \"worker\",\n customer: \"customer\",\n member: \"member\",\n} as const\n\nexport type AuthType = typeof authTypes[keyof typeof authTypes]\n\nexport type AuthJwtToken = JwtPayload & {\n user?: { id: number, user_id: number, user_type: AuthType };\n account?: { id: number, account_id: number };\n};\n\nexport type AuthServiceProps = DefaultServiceProps & {\n secretKey: string,\n authType: AuthType\n};\n\nexport type AuthGetTokenProps = {\n authType: AuthType,\n accountId?: number,\n accountCode?: string,\n data:\n // get token\n {\n username: string,\n password: string\n }\n};\n\nexport const AuthService = (props: AuthServiceProps) => {\n\n const {\n secretKey,\n authType = \"administrator\",\n ...rest\n } = props\n\n const getUserInjectionFieldName = (authType: AuthType) => {\n\n if (authType === \"administrator\") return [\"administrator_injection_fields\"]\n if (authType === \"customer\") return [\"customer_injection_fields\"]\n if (authType === \"worker\") return [\"worker_injection_fields\"]\n\n return []\n }\n\n const getAuthToken = async ({ authType, data, accountId = 0, accountCode = \"\" }: AuthGetTokenProps) => {\n\n let _rest = rest\n\n // check the option pass in using account id or account code\n if (authType !== \"operator\") {\n // _rest.accountId = accountId\n\n // check if the accountId & accountCode is not empty\n if (!accountId && !accountCode) throwError(`accountId or accountCode is required`)\n\n let selectAccountId = `${accountId}`\n\n // check account id is choose \n if (selectAccountId === \"0\") {\n\n const globalAccountService = AccountService({ ...rest, isOperator: true })\n\n // use account code to find the account id\n if (accountCode) {\n\n let { data: responseAcc } = await globalAccountService.listAccounts({\n limit: 1,\n offset: 0,\n sortfield: `${ModelAccountFields.account_id}`,\n sortorder: `ASC`,\n filters: [{\n field: `${ModelAccountFields.account_code}`,\n operator: `=`,\n value: `${accountCode}`,\n }],\n datatypes: []\n })\n\n selectAccountId = responseAcc.length > 0 ? responseAcc[0].account_id : \"\"\n let selectAccountStatus = responseAcc.length > 0 ? responseAcc[0].account_status : \"\"\n\n if (selectAccountStatus !== true) throwError(`Inactive account: ${accountCode}`)\n\n }\n\n if (!selectAccountId) {\n throwError(`Invalid account code: ${accountCode}`)\n }\n\n }\n\n _rest.accountId = Number(selectAccountId)\n\n } else {\n _rest.accountId = accountId\n }\n\n const userService = UserService({ userType: authType as UserType, ...rest })\n const accountService = AccountService({ ...rest, isOperator: true })\n const locationService = LocationService({ ...rest, locationType: \"location\" })\n\n // let payload: UserListProps = {\n // includePassword: true,\n // limit: 1,\n // offset: 0,\n // sortfield: \"user_id\",\n // sortorder: \"ASC\",\n // filters: [\n // { field: \"username\", operator: \"=\", value: `${data[\"username\"]}` },\n // { field: \"user_type\", operator: \"=\", value: `${authType}` }\n // ],\n // datatypes: getUserInjectionFieldName(authType)\n // }\n\n // const { data: foundUser } = await userService.listUsers(payload)\n\n let foundUser: any = {}\n\n if (authType === \"operator\" || authType === \"administrator\") {\n\n // const operatorService = UserService({ ...rest })\n\n const _user = await userService.getUserByUsername({\n username: `${data[\"username\"]}`,\n includePassword: true,\n datatypes: getUserInjectionFieldName(authType) as any\n })\n\n foundUser = _user\n\n } else {\n\n let payload: UserListProps = {\n includePassword: true,\n limit: 1,\n offset: 0,\n sortfield: \"user_id\",\n sortorder: \"ASC\",\n filters: [\n { field: \"username\", operator: \"=\", value: `${data[\"username\"]}` },\n { field: \"user_type\", operator: \"=\", value: `${authType}` }\n ],\n datatypes: getUserInjectionFieldName(authType)\n }\n\n const { data: foundOtherUser } = await userService.listUsers(payload)\n\n foundUser = foundOtherUser.length > 0 ? foundOtherUser[0] : {}\n\n }\n\n if (!foundUser?.user_id) {\n throw Error(`Invalid username: ${data[\"username\"]} `)\n }\n\n let user = foundUser\n // foundUser.length > 0 ? foundUser[0] : {}\n\n let decryptedPass: boolean\n\n try {\n decryptedPass = await verifyPassword(data.password, user.password)\n } catch (error) {\n throw error\n }\n\n if (decryptedPass === false) {\n throw Error(`Invalid credential: ${data[\"username\"]} `)\n }\n\n // dont show out to result\n delete user.password\n\n let account: any = {}\n\n if (_rest.accountId && authType !== \"operator\") {\n account = await accountService.getAccount({ id: Number(_rest.accountId), datatypes: [] })\n }\n\n const authToken = generateAuthToken(user, account, secretKey)\n\n // get the locations for user\n const locationIds = user?.location_id ? user.location_id.split(\", \") : []\n\n let locations: any[] = []\n\n if (locationIds.length > 0) {\n const listPayload: LocationListProps = {\n limit: 100,\n offset: 0,\n sortfield: \"location_id\",\n sortorder: \"ASC\",\n filters: [{\n field: \"location_id\",\n operator: \"where_in\",\n value: locationIds.map((i: any) => Number(i))\n }],\n datatypes: []\n }\n\n const { data } = await locationService.listLocations(listPayload)\n locations = data\n }\n\n return {\n token: authToken,\n account,\n user,\n user_locations: locations,\n parent_user_id: 0,\n roles: [\n // {\n // id: 23,\n // role_name: \"123\"\n // }\n ],\n permissions: [],\n is_owner: Boolean(user?.is_owner === 1),\n owner_id: 0\n }\n };\n\n return {\n getAuthToken,\n verifyAuthToken,\n }\n\n}\n\n"]}
1
+ {"version":3,"file":"AuthService.js","sourceRoot":"","sources":["../../../src/services/auth/AuthService.ts"],"names":[],"mappings":";;;AAAA,yDAAyD;AACzD,mCAA0D;AAC1D,yCASoB;AAIpB,mCAA0F;AAC1F,qCAA0E;AAE7D,QAAA,SAAS,GAAG;IACrB,QAAQ,EAAE,UAAU;IACpB,aAAa,EAAE,eAAe;IAC9B,MAAM,EAAE,QAAQ;IAChB,QAAQ,EAAE,UAAU;IACpB,MAAM,EAAE,QAAQ;CACV,CAAA;AA0BH,MAAM,WAAW,GAAG,CAAC,KAAuB,EAAE,EAAE;IAEnD,MAAM,EACF,SAAS,EACT,QAAQ,GAAG,eAAe,EAC1B,GAAG,IAAI,EACV,GAAG,KAAK,CAAA;IAET,MAAM,yBAAyB,GAAG,CAAC,QAAkB,EAAE,EAAE;QAErD,IAAI,QAAQ,KAAK,eAAe;YAAE,OAAO,CAAC,gCAAgC,CAAC,CAAA;QAC3E,IAAI,QAAQ,KAAK,UAAU;YAAE,OAAO,CAAC,2BAA2B,CAAC,CAAA;QACjE,IAAI,QAAQ,KAAK,QAAQ;YAAE,OAAO,CAAC,yBAAyB,CAAC,CAAA;QAE7D,OAAO,EAAE,CAAA;IACb,CAAC,CAAA;IAED,MAAM,YAAY,GAAG,KAAK,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,SAAS,GAAG,CAAC,EAAE,WAAW,GAAG,EAAE,EAAqB,EAAE,EAAE;QAElG,IAAI,KAAK,GAAG,IAAI,CAAA;QAEhB,4DAA4D;QAC5D,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC1B,8BAA8B;YAE9B,oDAAoD;YACpD,IAAI,CAAC,SAAS,IAAI,CAAC,WAAW;gBAAE,IAAA,kBAAU,EAAC,sCAAsC,CAAC,CAAA;YAElF,IAAI,eAAe,GAAG,GAAG,SAAS,EAAE,CAAA;YAEpC,8BAA8B;YAC9B,IAAI,eAAe,KAAK,GAAG,EAAE,CAAC;gBAE1B,MAAM,oBAAoB,GAAG,IAAA,yBAAc,EAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;gBAE1E,0CAA0C;gBAC1C,IAAI,WAAW,EAAE,CAAC;oBAEd,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,MAAM,oBAAoB,CAAC,YAAY,CAAC;wBAChE,KAAK,EAAE,CAAC;wBACR,MAAM,EAAE,CAAC;wBACT,SAAS,EAAE,GAAG,2BAAkB,CAAC,UAAU,EAAE;wBAC7C,SAAS,EAAE,KAAK;wBAChB,OAAO,EAAE,CAAC;gCACN,KAAK,EAAE,GAAG,2BAAkB,CAAC,YAAY,EAAE;gCAC3C,QAAQ,EAAE,GAAG;gCACb,KAAK,EAAE,GAAG,WAAW,EAAE;6BAC1B,CAAC;wBACF,SAAS,EAAE,EAAE;qBAChB,CAAC,CAAA;oBAEF,eAAe,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,UAAU,CAAC,CAAC,CAAC,EAAE,CAAA;oBACzE,IAAI,mBAAmB,GAAG,WAAW,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,EAAE,CAAA;oBAErF,IAAI,mBAAmB,KAAK,IAAI;wBAAE,IAAA,kBAAU,EAAC,qBAAqB,WAAW,EAAE,CAAC,CAAA;gBAEpF,CAAC;gBAED,IAAI,CAAC,eAAe,EAAE,CAAC;oBACnB,IAAA,kBAAU,EAAC,yBAAyB,WAAW,EAAE,CAAC,CAAA;gBACtD,CAAC;YAEL,CAAC;YAED,KAAK,CAAC,SAAS,GAAG,MAAM,CAAC,eAAe,CAAC,CAAA;QAE7C,CAAC;aAAM,CAAC;YACJ,KAAK,CAAC,SAAS,GAAG,SAAS,CAAA;QAC/B,CAAC;QAED,MAAM,WAAW,GAAG,IAAA,sBAAW,EAAC,EAAE,QAAQ,EAAE,QAAoB,EAAE,GAAG,IAAI,EAAE,CAAC,CAAA;QAC5E,MAAM,cAAc,GAAG,IAAA,yBAAc,EAAC,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAA;QACpE,MAAM,eAAe,GAAG,IAAA,0BAAe,EAAC,EAAE,GAAG,IAAI,EAAE,YAAY,EAAE,UAAU,EAAE,CAAC,CAAA;QAE9E,IAAI,SAAS,GAAQ,EAAE,CAAA;QAEvB,oCAAoC;QACpC,IAAI,QAAQ,KAAK,UAAU,IAAI,QAAQ,KAAK,eAAe,EAAE,CAAC;YAE1D,mDAAmD;YAEnD,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,iBAAiB,CAAC;gBAC9C,QAAQ,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE;gBAC/B,eAAe,EAAE,IAAI;gBACrB,SAAS,EAAE,yBAAyB,CAAC,QAAQ,CAAQ;aACxD,CAAC,CAAA;YAEF,SAAS,GAAG,KAAK,CAAA;QAErB,CAAC;aAAM,CAAC,CAAC,kBAAkB;YAEvB,IAAI,OAAO,GAAkB;gBACzB,eAAe,EAAE,IAAI;gBACrB,KAAK,EAAE,CAAC;gBACR,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,SAAS;gBACpB,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE;oBACL,EAAE,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,UAAU,CAAC,EAAE,EAAE;oBAClE,EAAE,KAAK,EAAE,WAAW,EAAE,QAAQ,EAAE,GAAG,EAAE,KAAK,EAAE,GAAG,QAAQ,EAAE,EAAE;iBAC9D;gBACD,SAAS,EAAE,yBAAyB,CAAC,QAAQ,CAAC;aACjD,CAAA;YAED,MAAM,EAAE,IAAI,EAAE,cAAc,EAAE,GAAG,MAAM,WAAW,CAAC,SAAS,CAAC,OAAO,CAAC,CAAA;YAErE,SAAS,GAAG,cAAc,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAElE,CAAC;QAED,IAAI,CAAC,SAAS,EAAE,OAAO,EAAE,CAAC;YACtB,MAAM,KAAK,CAAC,qBAAqB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QACzD,CAAC;QAED,IAAI,IAAI,GAAG,SAAS,CAAA;QACpB,2CAA2C;QAE3C,IAAI,aAAsB,CAAA;QAE1B,IAAI,CAAC;YACD,aAAa,GAAG,MAAM,IAAA,sBAAc,EAAC,IAAI,CAAC,QAAQ,EAAE,IAAI,CAAC,QAAQ,CAAC,CAAA;QACtE,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACb,MAAM,KAAK,CAAA;QACf,CAAC;QAED,IAAI,aAAa,KAAK,KAAK,EAAE,CAAC;YAC1B,MAAM,KAAK,CAAC,uBAAuB,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAA;QAC3D,CAAC;QAED,0BAA0B;QAC1B,OAAO,IAAI,CAAC,QAAQ,CAAA;QAEpB,IAAI,OAAO,GAAQ,EAAE,CAAA;QAErB,IAAI,KAAK,CAAC,SAAS,IAAI,QAAQ,KAAK,UAAU,EAAE,CAAC;YAC7C,OAAO,GAAG,MAAM,cAAc,CAAC,UAAU,CAAC,EAAE,EAAE,EAAE,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,EAAE,SAAS,EAAE,EAAE,EAAE,CAAC,CAAA;QAC7F,CAAC;QAED,MAAM,SAAS,GAAG,IAAA,yBAAiB,EAAC,IAAI,EAAE,OAAO,EAAE,SAAS,CAAC,CAAA;QAE7D,6BAA6B;QAC7B,MAAM,WAAW,GAAG,IAAI,EAAE,WAAW,CAAC,CAAC,CAAC,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAA;QAEzE,IAAI,SAAS,GAAU,EAAE,CAAA;QAEzB,IAAI,WAAW,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACzB,MAAM,WAAW,GAAsB;gBACnC,KAAK,EAAE,GAAG;gBACV,MAAM,EAAE,CAAC;gBACT,SAAS,EAAE,aAAa;gBACxB,SAAS,EAAE,KAAK;gBAChB,OAAO,EAAE,CAAC;wBACN,KAAK,EAAE,aAAa;wBACpB,QAAQ,EAAE,UAAU;wBACpB,KAAK,EAAE,WAAW,CAAC,GAAG,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;qBAChD,CAAC;gBACF,SAAS,EAAE,EAAE;aAChB,CAAA;YAED,MAAM,EAAE,IAAI,EAAE,GAAG,MAAM,eAAe,CAAC,aAAa,CAAC,WAAW,CAAC,CAAA;YACjE,SAAS,GAAG,IAAI,CAAA;QACpB,CAAC;QAED,OAAO;YACH,KAAK,EAAE,SAAS;YAChB,OAAO;YACP,IAAI;YACJ,cAAc,EAAE,SAAS;YACzB,qBAAqB;YACrB,WAAW;YACX,IAAI;YACJ,cAAc;YACd,uBAAuB;YACvB,IAAI;YACJ,KAAK;YACL,mBAAmB;YACnB,QAAQ,EAAE,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC;YACjC,cAAc;SACjB,CAAA;IACL,CAAC,CAAC;IAEF,OAAO;QACH,YAAY;QACZ,eAAe,EAAf,uBAAe;KAClB,CAAA;AAEL,CAAC,CAAA;AA1LY,QAAA,WAAW,eA0LvB","sourcesContent":["// import { QueryList, QueryGet } from \"@/schema/common\";\nimport { DefaultServiceProps, throwError } from \"@/utils\";\nimport {\n UserService,\n // UserGetProps,\n UserType,\n UserListProps,\n // userTypes,\n AccountService,\n LocationService,\n LocationListProps\n} from \"@/services\";\n\nimport jwt, { JwtPayload } from \"jsonwebtoken\";\n\nimport { generateAuthToken, verifyPassword, verifyAuthToken, hashPassword } from \"@/utils\"\nimport { ModelAccountFields, ModelUserFields, UserModel } from \"@/models\";\n\nexport const authTypes = {\n operator: \"operator\",\n administrator: \"administrator\",\n worker: \"worker\",\n customer: \"customer\",\n member: \"member\",\n} as const\n\nexport type AuthType = typeof authTypes[keyof typeof authTypes]\n\nexport type AuthJwtToken = JwtPayload & {\n user?: { id: number, user_id: number, user_type: AuthType };\n account?: { id: number, account_id: number };\n};\n\nexport type AuthServiceProps = DefaultServiceProps & {\n secretKey: string,\n authType: AuthType\n};\n\nexport type AuthGetTokenProps = {\n authType: AuthType,\n accountId?: number,\n accountCode?: string,\n data:\n // get token\n {\n username: string,\n password: string\n }\n};\n\nexport const AuthService = (props: AuthServiceProps) => {\n\n const {\n secretKey,\n authType = \"administrator\",\n ...rest\n } = props\n\n const getUserInjectionFieldName = (authType: AuthType) => {\n\n if (authType === \"administrator\") return [\"administrator_injection_fields\"]\n if (authType === \"customer\") return [\"customer_injection_fields\"]\n if (authType === \"worker\") return [\"worker_injection_fields\"]\n\n return []\n }\n\n const getAuthToken = async ({ authType, data, accountId = 0, accountCode = \"\" }: AuthGetTokenProps) => {\n\n let _rest = rest\n\n // check the option pass in using account id or account code\n if (authType !== \"operator\") {\n // _rest.accountId = accountId\n\n // check if the accountId & accountCode is not empty\n if (!accountId && !accountCode) throwError(`accountId or accountCode is required`)\n\n let selectAccountId = `${accountId}`\n\n // check account id is choose \n if (selectAccountId === \"0\") {\n\n const globalAccountService = AccountService({ ...rest, isOperator: true })\n\n // use account code to find the account id\n if (accountCode) {\n\n let { data: responseAcc } = await globalAccountService.listAccounts({\n limit: 1,\n offset: 0,\n sortfield: `${ModelAccountFields.account_id}`,\n sortorder: `ASC`,\n filters: [{\n field: `${ModelAccountFields.account_code}`,\n operator: `=`,\n value: `${accountCode}`,\n }],\n datatypes: []\n })\n\n selectAccountId = responseAcc.length > 0 ? responseAcc[0].account_id : \"\"\n let selectAccountStatus = responseAcc.length > 0 ? responseAcc[0].account_status : \"\"\n\n if (selectAccountStatus !== true) throwError(`Inactive account: ${accountCode}`)\n\n }\n\n if (!selectAccountId) {\n throwError(`Invalid account code: ${accountCode}`)\n }\n\n }\n\n _rest.accountId = Number(selectAccountId)\n\n } else {\n _rest.accountId = accountId\n }\n\n const userService = UserService({ userType: authType as UserType, ...rest })\n const accountService = AccountService({ ...rest, isOperator: true })\n const locationService = LocationService({ ...rest, locationType: \"location\" })\n\n let foundUser: any = {}\n\n // only for operator & administrator\n if (authType === \"operator\" || authType === \"administrator\") {\n\n // const operatorService = UserService({ ...rest })\n\n const _user = await userService.getUserByUsername({\n username: `${data[\"username\"]}`,\n includePassword: true,\n datatypes: getUserInjectionFieldName(authType) as any\n })\n\n foundUser = _user\n\n } else { // other user type\n\n let payload: UserListProps = {\n includePassword: true,\n limit: 1,\n offset: 0,\n sortfield: \"user_id\",\n sortorder: \"ASC\",\n filters: [\n { field: \"username\", operator: \"=\", value: `${data[\"username\"]}` },\n { field: \"user_type\", operator: \"=\", value: `${authType}` }\n ],\n datatypes: getUserInjectionFieldName(authType)\n }\n\n const { data: foundOtherUser } = await userService.listUsers(payload)\n\n foundUser = foundOtherUser.length > 0 ? foundOtherUser[0] : {}\n\n }\n\n if (!foundUser?.user_id) {\n throw Error(`Invalid username: ${data[\"username\"]} `)\n }\n\n let user = foundUser\n // foundUser.length > 0 ? foundUser[0] : {}\n\n let decryptedPass: boolean\n\n try {\n decryptedPass = await verifyPassword(data.password, user.password)\n } catch (error) {\n throw error\n }\n\n if (decryptedPass === false) {\n throw Error(`Invalid credential: ${data[\"username\"]} `)\n }\n\n // dont show out to result\n delete user.password\n\n let account: any = {}\n\n if (_rest.accountId && authType !== \"operator\") {\n account = await accountService.getAccount({ id: Number(_rest.accountId), datatypes: [] })\n }\n\n const authToken = generateAuthToken(user, account, secretKey)\n\n // get the locations for user\n const locationIds = user?.location_id ? user.location_id.split(\", \") : []\n\n let locations: any[] = []\n\n if (locationIds.length > 0) {\n const listPayload: LocationListProps = {\n limit: 100,\n offset: 0,\n sortfield: \"location_id\",\n sortorder: \"ASC\",\n filters: [{\n field: \"location_id\",\n operator: \"where_in\",\n value: locationIds.map((i: any) => Number(i))\n }],\n datatypes: []\n }\n\n const { data } = await locationService.listLocations(listPayload)\n locations = data\n }\n\n return {\n token: authToken,\n account,\n user,\n user_locations: locations,\n // parent_user_id: 0,\n // roles: [\n // {\n // id: 23,\n // role_name: \"123\"\n // }\n // ],\n // permissions: [],\n is_owner: Boolean(user?.is_owner),\n // owner_id: 0\n }\n };\n\n return {\n getAuthToken,\n verifyAuthToken,\n }\n\n}\n\n"]}
@@ -1,3 +1,4 @@
1
+ import { z } from "zod";
1
2
  import { UserPropReplaceProps } from "./UserPropService";
2
3
  import { CustomerCreateProps, CustomerUpdateProps } from "./CustomerService";
3
4
  import { AdministratorCreateProps, AdministratorUpdateProps } from "./AdministratorService";
@@ -131,6 +132,9 @@ export type UserReplacePasswordProps = {
131
132
  };
132
133
  isOperator: boolean;
133
134
  };
135
+ export declare const loginUsernameReservedWords: string[];
136
+ export declare const loginUsernameSchema: z.ZodEffects<z.ZodEffects<z.ZodString, string, string>, string, string>;
137
+ export declare const loginPasswordSchema: z.ZodString;
134
138
  export declare const UserService: (props: UserServiceProps) => {
135
139
  getUser: (args_0: UserGetProps) => Promise<any>;
136
140
  getUserByUsername: (args_0: UserGetByUsernameProps) => Promise<any>;
@@ -1,7 +1,8 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.UserService = exports.userTypes = void 0;
3
+ exports.UserService = exports.loginPasswordSchema = exports.loginUsernameSchema = exports.loginUsernameReservedWords = exports.userTypes = void 0;
4
4
  const models_1 = require("../../models");
5
+ const zod_1 = require("zod");
5
6
  const UserPropService_1 = require("./UserPropService");
6
7
  const CustomerService_1 = require("./CustomerService");
7
8
  const AdministratorService_1 = require("./AdministratorService");
@@ -84,6 +85,38 @@ const getUpdatePayload = async (userType, data, contact) => {
84
85
  }
85
86
  return false;
86
87
  };
88
+ // Example reserved words for username
89
+ exports.loginUsernameReservedWords = [
90
+ "admin", "administrator", "root", "system", "operator", "moderator", "owner", "manager",
91
+ "user", "users", "account", "guest", "login", "logout", "signup", "register", "auth",
92
+ "api", "www", "app", "support", "help", "dashboard", "portal", "console", "control", "ops",
93
+ "test", "demo", "beta", "alpha", "dev", "development", "staging", "prod", "production",
94
+ "security", "privacy", "terms", "policy", "legal", "about", "company", "team", "teams",
95
+ "billing", "payment", "invoice", "finance", "financeadmin", "subscription", "plan", "plans",
96
+ "rootadmin", "superuser", "staff", "moderation", "systemadmin", "sysadmin", "internal",
97
+ "management", "supportdesk", "helpdesk", "contact", "feedback", "news", "blog", "media",
98
+ "press", "events", "calendar", "forum", "community", "chat", "messaging", "notifications",
99
+ "alerts", "reports", "analytics", "metrics", "logs", "history", "archive", "backup",
100
+ "restore", "files", "documents", "resources", "library", "gallery", "images", "videos",
101
+ "downloads", "uploads", "templates", "home", "index", "static", "public", "webmaster"
102
+ ];
103
+ // Zod schema for username
104
+ exports.loginUsernameSchema = zod_1.z
105
+ .string()
106
+ .min(5, { message: "Login username must be at least 5 characters" })
107
+ .max(63, { message: "Login username must be at most 63 characters" })
108
+ .regex(/^[a-z0-9]([a-z0-9-_]{3,61}[a-z0-9])?$/, "Login username can only contain lowercase letters, numbers, hyphens, and underscores, cannot start or end with a hyphen or underscore")
109
+ .transform((val) => val.toLowerCase().trim()) // normalize
110
+ .refine((val) => !exports.loginUsernameReservedWords.includes(val), {
111
+ message: "This login username is reserved. Please choose another one",
112
+ });
113
+ // Zod schema for password
114
+ exports.loginPasswordSchema = zod_1.z
115
+ .string()
116
+ .min(8, { message: "Password must be at least 8 characters" })
117
+ .max(64, { message: "Password must be at most 64 characters" })
118
+ .regex(/[a-zA-Z]/, "Password must include at least one letter")
119
+ .regex(/[0-9!@#$%^&*()_\-+=]/, "Password must include at least one number or special character");
87
120
  const UserService = (props) => {
88
121
  const { userType = "administrator", ...rest } = props;
89
122
  const userModel = (0, models_1.UserModel)({ ...rest });
@@ -137,14 +170,44 @@ const UserService = (props) => {
137
170
  throw new Error(`Invalid user contact no.: ${msg}, provided: ${countryCode} ${phoneNumber}`);
138
171
  }
139
172
  };
173
+ const validateLoginUsernameFormat = (loginUsername) => {
174
+ try {
175
+ return exports.loginUsernameSchema.parse(loginUsername); // throws if invalid
176
+ }
177
+ catch (err) {
178
+ if (err instanceof zod_1.z.ZodError) {
179
+ throw new Error(`Invalid login username: "${loginUsername}". ` +
180
+ err.errors.map((e) => e.message).join("; "));
181
+ }
182
+ throw err;
183
+ }
184
+ };
185
+ const validateLoginPasswordFormat = (loginPassword) => {
186
+ try {
187
+ return exports.loginPasswordSchema.parse(loginPassword); // throws if invalid
188
+ }
189
+ catch (err) {
190
+ if (err instanceof zod_1.z.ZodError) {
191
+ throw new Error(`Invalid login password: "${loginPassword}". ` +
192
+ err.errors.map((e) => e.message).join("; "));
193
+ }
194
+ throw err;
195
+ }
196
+ };
140
197
  const createUser = async ({ data, userType: overrideUserType }) => {
141
198
  const _userType = overrideUserType || userType;
142
199
  // validate the credential contact no
200
+ const userLoginUsername = data.user.loginUsername;
201
+ const userLoginPassword = data.user.loginPassword;
143
202
  const userContactCountryCode = data.user.contact.countryCode;
144
203
  const userContactPhoneNumber = data.user.contact.phoneNumber;
145
204
  // validate the contact no only can be digit in text only
146
205
  // validate the country code in prefix
147
206
  await validateUserContact(userContactCountryCode, userContactPhoneNumber);
207
+ // validate login username
208
+ validateLoginUsernameFormat(userLoginUsername);
209
+ // validate login password
210
+ validateLoginPasswordFormat(userLoginPassword);
148
211
  // check the username duplicated?
149
212
  const checkUsername = await userModel.list({
150
213
  limit: 1,
@@ -332,11 +395,19 @@ const UserService = (props) => {
332
395
  const updateUser = async ({ id, data, userType: overrideUserType }) => {
333
396
  const _userType = overrideUserType || userType;
334
397
  // validate the credential contact no
398
+ const userLoginUsername = data.user.loginUsername;
399
+ const userLoginPassword = data.user?.loginPassword ?? "";
335
400
  const userContactCountryCode = data.user.contact.countryCode;
336
401
  const userContactPhoneNumber = data.user.contact.phoneNumber;
337
402
  // validate the contact no only can be digit in text only
338
403
  // validate the country code in prefix
339
404
  await validateUserContact(userContactCountryCode, userContactPhoneNumber);
405
+ // validate login username
406
+ validateLoginUsernameFormat(userLoginUsername);
407
+ // validate login password
408
+ if (userLoginPassword) {
409
+ validateLoginPasswordFormat(userLoginPassword);
410
+ }
340
411
  // check the username duplicated?
341
412
  const checkUsername = await userModel.list({
342
413
  limit: 1,
@@ -1 +1 @@
1
- {"version":3,"file":"UserService.js","sourceRoot":"","sources":["../../../src/services/user/UserService.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n UserModel,\n ModelCountry,\n CountryModel,\n ModelUserFields,\n ModelAdministratorFields,\n ModelCountryFields\n} from \"@/models\";\n\nimport { UserPropService, UserPropReplaceProps } from \"./UserPropService\";\nimport { CustomerGetProps, CustomerCreateProps, CustomerListProps, CustomerUpdateProps, CustomerService } from \"./CustomerService\";\nimport { AdministratorGetProps, AdministratorCreateProps, AdministratorUpdateProps, AdministratorListProps, AdministratorService } from \"./AdministratorService\";\nimport { WorkerCreateProps, WorkerGetProps, WorkerUpdateProps, WorkerListProps, WorkerService } from \"./WorkerService\";\nimport { DriverCreateProps, DriverGetProps, DriverUpdateProps, DriverListProps, DriverService } from \"./DriverService\";\nimport { RetailerCreateProps, RetailerGetProps, RetailerUpdateProps, RetailerListProps, RetailerService } from \"./RetailerService\";\nimport { MemberCreateProps, MemberGetProps, MemberUpdateProps, MemberListProps, MemberService } from \"./MemberService\";\nimport { AgentCreateProps, AgentGetProps, AgentUpdateProps, AgentListProps, AgentService } from \"./AgentService\";\n\nimport { QueryList, QueryGet } from \"@/schema/common\";\nimport { buildSqlRelation, buildSqlRawSelect, buildSqlWhere, buildSqlSelect, buildSqlLimitOffset, buildSqlOrderBy, buildInjectionFieldsSqlSelect } from \"@/lib\";\n\nimport { DefaultServiceProps, throwError } from \"@/utils\";\n\nimport { hashPassword } from \"@/utils\";\nimport { OperatorCreateProps, OperatorGetProps, OperatorListProps, OperatorService, OperatorUpdateProps } from \"./OperatorService\";\n\nimport { ServiceFactory } from \"@/lib\";\n\nexport const userTypes = {\n operator: \"operator\",\n administrator: \"administrator\",\n worker: \"worker\",\n supplier: \"supplier\",\n customer: \"customer\",\n driver: \"driver\",\n retailer: \"retailer\",\n member: \"member\",\n agent: \"agent\",\n} as const\n\nexport type UserType = typeof userTypes[keyof typeof userTypes]\n\nexport type UserServiceProps = DefaultServiceProps & {\n userType: UserType\n};\n\nexport type UserGetProps = QueryGet & {\n id: number,\n overrideUserType?: UserType | \"\"\n includePassword?: boolean,\n skipFilterAccountId?: boolean\n skipFilterUserType?: boolean\n};\n\nexport type UserGetByUsernameProps = QueryGet & {\n username: string,\n overrideUserType?: UserType | \"\"\n includePassword?: boolean,\n skipFilterAccountId?: boolean\n};\n\nexport type UserListProps = QueryList & {\n // id: number,\n includePassword?: boolean\n skipFilterAccountId?: boolean\n skipFilterUserType?: boolean\n};\n\nexport type UserRemoveProps = {\n ids: BigInt[]\n};\n\nexport type User = {\n loginUsername: string\n loginPassword: string\n address: string\n // contact: string\n contact: {\n countryCode: number; // e.g., 1 for Canada\n phoneNumber: string; // digits only, mobile or landline\n }\n email: string\n firstname: string\n lastname: string\n status: boolean\n}\n\nexport type UserOptionalLoginPassword = Omit<User, \"loginPassword\"> & {\n loginPassword?: string\n}\n\nexport type UserCreateProps = {\n userType?: UserType,\n data: {\n user: User\n } & (\n // operator\n {\n operator: Omit<OperatorCreateProps[\"data\"][\"operator\"], \"userId\">,\n } |\n // customer\n {\n customer: Omit<CustomerCreateProps[\"data\"][\"customer\"], \"userId\">,\n } |\n // administrator\n {\n administrator: Omit<AdministratorCreateProps[\"data\"][\"administrator\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // worker\n {\n worker: Omit<WorkerCreateProps[\"data\"][\"worker\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // driver\n {\n driver: Omit<DriverCreateProps[\"data\"][\"driver\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // member\n {\n member: Omit<MemberCreateProps[\"data\"][\"member\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n } |\n // agent\n {\n agent: Omit<AgentCreateProps[\"data\"][\"agent\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n } |\n // retailer\n {\n retailer: Omit<RetailerCreateProps[\"data\"][\"retailer\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n }\n )\n}\n\nexport type UserUpdateProps = {\n id: number,\n userType?: UserType,\n data: {\n user: UserOptionalLoginPassword\n } & (\n // operator\n {\n operator: Omit<OperatorUpdateProps[\"data\"][\"operator\"], \"userId\">\n } |\n // customer\n {\n customer: Omit<CustomerUpdateProps[\"data\"][\"customer\"], \"userId\">\n } |\n // administrator\n {\n administrator: Omit<AdministratorUpdateProps[\"data\"][\"administrator\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // worker\n {\n worker: Omit<WorkerUpdateProps[\"data\"][\"worker\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // driver\n {\n driver: Omit<DriverUpdateProps[\"data\"][\"driver\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // member\n {\n member: Omit<MemberUpdateProps[\"data\"][\"member\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n } |\n // agent\n {\n agent: Omit<AgentUpdateProps[\"data\"][\"agent\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n } |\n // retailer\n {\n retailer: Omit<RetailerUpdateProps[\"data\"][\"retailer\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n }\n )\n}\n\nexport type UserReplacePasswordProps = {\n id: number,\n data: {\n unhashLoginPassword: string\n },\n isOperator: boolean\n}\n\nlet mainSqlSelect = {\n [`usr.${ModelUserFields.user_id}`]: \"user_id\",\n [`usr.${ModelUserFields.user_type}`]: \"user_type\",\n [`usr.${ModelUserFields.login_username}`]: \"username\",\n [`usr.${ModelUserFields.firstname}`]: \"firstname\",\n [`usr.${ModelUserFields.lastname}`]: \"lastname\",\n [`CONCAT(usr.${ModelUserFields.contact_country_code}, usr.${ModelUserFields.contact_phone_number})`]: \"contact\",\n [`usr.${ModelUserFields.contact_country_code}`]: \"contact_country_code\",\n [`usr.${ModelUserFields.contact_phone_number}`]: \"contact_phone_number\",\n [`usr.${ModelUserFields.email}`]: \"email\",\n [`usr.${ModelUserFields.address}`]: \"address\",\n [`usr.${ModelUserFields.status}`]: \"status\",\n}\n\nlet defaultSqlSelect = {\n [`usr.${ModelUserFields.createdatetime}`]: \"createdatetime\",\n [`creator.${ModelUserFields.login_username}`]: \"createusername\",\n [`usr.${ModelUserFields.updatedatetime}`]: \"updatedatetime\",\n [`updater.${ModelUserFields.login_username}`]: \"updateusername\",\n [`usr.${ModelUserFields.isdelete}`]: \"isdelete\",\n [`usr.${ModelUserFields.istrash}`]: \"istrash\",\n [`usr.${ModelUserFields.accountid}`]: \"accountid\",\n}\n\nconst getCreatePayload = async (\n userType: UserType,\n data: UserCreateProps[\"data\"],\n contact: {\n countryCode: number,\n phoneNumber: string\n }\n) => {\n\n if (\"user\" in data) {\n\n // have to hash the password\n\n return {\n [`${ModelUserFields.login_username}`]: data.user.loginUsername,\n [`${ModelUserFields.login_password}`]: await hashPassword(data.user.loginPassword),\n [`${ModelUserFields.address}`]: data.user.address,\n [`${ModelUserFields.contact_country_code}`]: contact.countryCode,\n [`${ModelUserFields.contact_phone_number}`]: contact.phoneNumber,\n [`${ModelUserFields.email}`]: data.user.email,\n [`${ModelUserFields.firstname}`]: data.user.firstname,\n [`${ModelUserFields.lastname}`]: data.user.lastname,\n [`${ModelUserFields.status}`]: Boolean(data.user.status),\n [`${ModelUserFields.user_type}`]: `${userType}`\n }\n }\n\n return false\n\n}\n\nconst getUpdatePayload = async (\n userType: UserType,\n data: UserUpdateProps[\"data\"],\n contact: {\n countryCode: number,\n phoneNumber: string\n }\n) => {\n\n if (\"user\" in data) {\n\n const newHashPassword = data?.user?.loginPassword ? await hashPassword(data.user.loginPassword) : \"\"\n\n return {\n [`${ModelUserFields.login_username}`]: data.user.loginUsername,\n ...(newHashPassword ? { [`${ModelUserFields.login_password}`]: newHashPassword } : {}),\n [`${ModelUserFields.address}`]: data.user.address,\n [`${ModelUserFields.contact_country_code}`]: contact.countryCode,\n [`${ModelUserFields.contact_phone_number}`]: contact.phoneNumber,\n [`${ModelUserFields.email}`]: data.user.email,\n [`${ModelUserFields.firstname}`]: data.user.firstname,\n [`${ModelUserFields.lastname}`]: data.user.lastname,\n [`${ModelUserFields.status}`]: Boolean(data.user.status),\n [`${ModelUserFields.user_type}`]: `${userType}`\n }\n }\n\n return false\n\n}\n\nexport const UserService = (props: UserServiceProps) => {\n\n const {\n userType = \"administrator\",\n ...rest\n } = props\n\n const userModel = UserModel({ ...rest })\n const countryModel = CountryModel({ ...rest })\n\n const userPropService = UserPropService({ ...rest, userPropType: \"LOCATION_ID\" })\n const customerService = CustomerService({ ...rest })\n const administratorService = AdministratorService({ ...rest })\n const operatorService = OperatorService({ ...rest })\n const workerService = WorkerService({ ...rest })\n const driverService = DriverService({ ...rest })\n const retailerService = RetailerService({ ...rest })\n const memberService = MemberService({ ...rest })\n const agentService = AgentService({ ...rest })\n\n const validateUserContactPhoneNumber = (val: string) => {\n // Must be numeric\n if (!/^\\d+$/.test(val)) {\n throw new Error(`Contact No. only allowed numbers`);\n }\n\n // Must have realistic length (4 to 15 digits)\n if (val.length < 4 || val.length > 15) {\n throw new Error(`Contact No. length must be between 4 and 15 digits`);\n }\n\n return true;\n };\n\n const validateUserContactCountryCode = async (countryCode: number) => {\n\n // 1. Load active countries\n const activeCountries: ModelCountry[] = await countryModel.list({\n where: {\n [`${ModelCountryFields.isdelete}`]: false,\n [`${ModelCountryFields.istrash}`]: false,\n [`${ModelCountryFields.status}`]: true\n }\n })\n\n // Check if country code exists\n const exists = activeCountries.some(c => c.phone_code === countryCode);\n\n if (!exists) {\n throw new Error(`Invalid country code: ${countryCode}`);\n }\n\n return true; // valid\n\n }\n\n const validateUserContact = async (countryCode: number, phoneNumber: string) => {\n\n try {\n // validate the phone number without country code\n validateUserContactPhoneNumber(phoneNumber)\n\n // validate user contact country code\n await validateUserContactCountryCode(countryCode)\n\n return true\n\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid user contact no.: ${msg}, provided: ${countryCode} ${phoneNumber}`);\n }\n\n }\n\n const createUser = async ({ data, userType: overrideUserType }: UserCreateProps) => {\n\n const _userType = overrideUserType || userType\n\n // validate the credential contact no\n const userContactCountryCode = data.user.contact.countryCode\n const userContactPhoneNumber = data.user.contact.phoneNumber\n\n // validate the contact no only can be digit in text only\n // validate the country code in prefix\n await validateUserContact(userContactCountryCode, userContactPhoneNumber)\n\n // check the username duplicated?\n const checkUsername = await userModel.list({\n limit: 1,\n offset: 0,\n orderBy: {\n [`${ModelUserFields.user_id}`]: \"asc\"\n },\n include: [],\n where: {\n [`${ModelUserFields.login_username}`]: data.user.loginUsername,\n [`${ModelUserFields.accountid}`]: Number(rest.accountId),\n [`${ModelUserFields.isdelete}`]: false,\n [`${ModelUserFields.istrash}`]: false\n },\n })\n\n // console.log('ch', checkUsername)\n\n if (checkUsername.length > 0) throwError(`Duplicated username: ${data.user.loginUsername}(${checkUsername[0]?.user_type})`)\n\n // validation before insertion\n if (_userType === \"member\" && \"member\" in data) {\n\n const memberOwnerUserId = data?.member?.ownerUserId ?? \"\";\n\n // validate owner user id\n if (memberOwnerUserId) {\n await memberService.validateMemberOwnerUserId(memberOwnerUserId)\n }\n\n }\n\n if (_userType === \"agent\" && \"agent\" in data) {\n\n const agentOwnerUserId = data?.agent?.ownerUserId ?? \"\";\n\n // validate owner user id\n if (agentOwnerUserId) {\n await agentService.validateAgentOwnerUserId(agentOwnerUserId)\n }\n\n }\n\n const _data = await getCreatePayload(\n _userType,\n data,\n {\n countryCode: userContactCountryCode,\n phoneNumber: userContactPhoneNumber\n }\n )\n\n if (!_data) {\n throw new Error(`Invalid create payload: ${JSON.stringify(_data)}`);\n }\n\n // create user\n let responseUser = await userModel.create({ data: _data })\n\n let newUserId = responseUser.user_id\n\n let response: any = {}\n\n if (_userType === \"customer\" && \"customer\" in data) {\n\n let dataCustomer: CustomerCreateProps[\"data\"] = {\n customer: {\n ...data.customer,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create customer\n await customerService.createCustomer({ data: dataCustomer })\n\n response = await customerService.getCustomer({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"administrator\" && \"administrator\" in data) {\n\n let dataAdministrator: AdministratorCreateProps[\"data\"] = {\n administrator: {\n ...data.administrator,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create administrator\n await administratorService.createAdministrator({ data: dataAdministrator })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(newUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await administratorService.getAdministrator({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"operator\" && \"operator\" in data) {\n\n let dataOperator: OperatorCreateProps[\"data\"] = {\n operator: {\n ...data.operator,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create operator\n await operatorService.createOperator({ data: dataOperator })\n\n response = await operatorService.getOperator({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"worker\" && \"worker\" in data) {\n\n let dataWorker: WorkerCreateProps[\"data\"] = {\n worker: {\n ...data.worker,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create worker\n await workerService.createWorker({ data: dataWorker })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(newUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await workerService.getWorker({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"driver\" && \"driver\" in data) {\n\n let dataDriver: DriverCreateProps[\"data\"] = {\n driver: {\n ...data.driver,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create driver\n await driverService.createDriver({ data: dataDriver })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(newUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await driverService.getDriver({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"member\" && \"member\" in data) {\n\n let dataMember: MemberCreateProps[\"data\"] = {\n member: {\n ...data.member,\n // userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create member\n await memberService.createMember({ userId: Number(newUserId), data: dataMember })\n\n // replace user prop\n // await userPropService.replaceUserProp({\n // userPropType: \"LOCATION_ID\",\n // data: {\n // userProp: {\n // userId: Number(newUserId),\n // locationIds: data.props.locationIds\n // }\n // }\n // })\n\n response = await memberService.getMember({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"agent\" && \"agent\" in data) {\n\n let dataAgent: AgentCreateProps[\"data\"] = {\n agent: {\n ...data.agent,\n // userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create agent\n await agentService.createAgent({ userId: Number(newUserId), data: dataAgent })\n\n // replace user prop\n // await userPropService.replaceUserProp({\n // userPropType: \"LOCATION_ID\",\n // data: {\n // userProp: {\n // userId: Number(newUserId),\n // locationIds: data.props.locationIds\n // }\n // }\n // })\n\n response = await agentService.getAgent({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"retailer\" && \"retailer\" in data) {\n\n let dataRetailer: RetailerCreateProps[\"data\"] = {\n retailer: {\n ...data.retailer,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create retailer\n await retailerService.createRetailer({ data: dataRetailer })\n\n response = await retailerService.getRetailer({ id: Number(newUserId), datatypes: [] })\n }\n\n return response\n }\n\n const updateUser = async ({ id, data, userType: overrideUserType }: UserUpdateProps) => {\n\n const _userType = overrideUserType || userType\n\n // validate the credential contact no\n const userContactCountryCode = data.user.contact.countryCode\n const userContactPhoneNumber = data.user.contact.phoneNumber\n\n // validate the contact no only can be digit in text only\n // validate the country code in prefix\n await validateUserContact(userContactCountryCode, userContactPhoneNumber)\n\n // check the username duplicated?\n const checkUsername = await userModel.list({\n limit: 1,\n offset: 0,\n orderBy: {\n [`${ModelUserFields.user_id}`]: \"asc\"\n },\n include: [],\n where: {\n [`${ModelUserFields.login_username}`]: data.user.loginUsername,\n [`${ModelUserFields.isdelete}`]: false,\n [`${ModelUserFields.istrash}`]: false,\n [`${ModelUserFields.accountid}`]: rest.accountId,\n },\n })\n\n // console.log('ch', checkUsername)\n\n if (checkUsername.length > 0) {\n if (Number(checkUsername[0]?.user_id) !== Number(id)) { // if not self user id\n throwError(`Duplicated username: ${data.user.loginUsername}(${checkUsername[0]?.user_type})`)\n }\n }\n\n // validation before insertion\n // if (_userType === \"member\" && \"member\" in data) {\n // }\n\n const _data = await getUpdatePayload(\n _userType,\n data,\n {\n countryCode: userContactCountryCode,\n phoneNumber: userContactPhoneNumber\n }\n )\n\n if (!_data) {\n throw new Error(`Invalid update payload: ${JSON.stringify(_data)}`);\n }\n\n // update user\n let responseUser = await userModel.update({ id, data: _data })\n\n let updateUserId = responseUser.user_id\n\n let response: any = {}\n\n if (_userType === \"customer\" && \"customer\" in data) {\n\n let dataCustomer: CustomerUpdateProps[\"data\"] = {\n customer: {\n ...data.customer\n }\n }\n\n await customerService.updateCustomer({ userId: Number(updateUserId), data: dataCustomer })\n\n response = await customerService.getCustomer({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"operator\" && \"operator\" in data) {\n\n let dataOperator: OperatorUpdateProps[\"data\"] = {\n operator: {\n ...data.operator\n }\n }\n\n await operatorService.updateOperator({ userId: Number(updateUserId), data: dataOperator })\n\n response = await operatorService.getOperator({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"administrator\" && \"administrator\" in data) {\n\n let dataCustomer: AdministratorUpdateProps[\"data\"] = {\n administrator: {\n ...data.administrator\n }\n }\n\n await administratorService.updateAdministrator({ userId: Number(updateUserId), data: dataCustomer })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(updateUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await administratorService.getAdministrator({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"worker\" && \"worker\" in data) {\n\n let dataWorker: WorkerUpdateProps[\"data\"] = {\n worker: {\n ...data.worker\n }\n }\n\n await workerService.updateWorker({ userId: Number(updateUserId), data: dataWorker })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(updateUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await workerService.getWorker({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"driver\" && \"driver\" in data) {\n\n let dataDriver: DriverUpdateProps[\"data\"] = {\n driver: {\n ...data.driver\n }\n }\n\n await driverService.updateDriver({ userId: Number(updateUserId), data: dataDriver })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(updateUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await driverService.getDriver({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"member\" && \"member\" in data) {\n\n let dataMember: MemberUpdateProps[\"data\"] = {\n member: {\n ...data.member\n }\n }\n\n await memberService.updateMember({ userId: Number(updateUserId), data: dataMember })\n\n // replace user prop\n // await userPropService.replaceUserProp({\n // userPropType: \"LOCATION_ID\",\n // data: {\n // userProp: {\n // userId: Number(updateUserId),\n // locationIds: data.props.locationIds\n // }\n // }\n // })\n\n response = await memberService.getMember({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"agent\" && \"agent\" in data) {\n\n let dataAgent: AgentUpdateProps[\"data\"] = {\n agent: {\n ...data.agent\n }\n }\n\n await agentService.updateAgent({ userId: Number(updateUserId), data: dataAgent })\n\n // replace user prop\n // await userPropService.replaceUserProp({\n // userPropType: \"LOCATION_ID\",\n // data: {\n // userProp: {\n // userId: Number(updateUserId),\n // locationIds: data.props.locationIds\n // }\n // }\n // })\n\n response = await agentService.getAgent({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"retailer\" && \"retailer\" in data) {\n\n let dataRetailer: RetailerUpdateProps[\"data\"] = {\n retailer: {\n ...data.retailer\n }\n }\n\n await retailerService.updateRetailer({ userId: Number(updateUserId), data: dataRetailer })\n\n response = await retailerService.getRetailer({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n return response\n }\n\n const getUser = async ({ id, datatypes = [], includePassword = false, overrideUserType = \"\", skipFilterAccountId = false, skipFilterUserType = false }: UserGetProps) => {\n\n let data: any = {}\n\n if (skipFilterUserType === true) {\n\n let { data } = await listUsers({\n includePassword,\n limit: 1,\n offset: 0,\n filters: [{ field: \"user_id\", operator: \"=\", value: id }],\n sortfield: \"user_id\",\n sortorder: \"ASC\",\n datatypes,\n skipFilterAccountId,\n skipFilterUserType\n })\n\n return data[0] ?? null;\n }\n\n const _userType = overrideUserType ? overrideUserType : userType\n\n if (_userType === \"customer\") {\n data = await customerService.getCustomer({ id, datatypes: datatypes as CustomerGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"operator\") {\n data = await operatorService.getOperator({ id, datatypes: datatypes as OperatorGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"administrator\") {\n data = await administratorService.getAdministrator({ id, datatypes: datatypes as AdministratorGetProps[\"datatypes\"], includePassword, skipFilterAccountId })\n }\n\n if (_userType === \"worker\") {\n data = await workerService.getWorker({ id, datatypes: datatypes as WorkerGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"driver\") {\n data = await driverService.getDriver({ id, datatypes: datatypes as DriverGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"member\") {\n data = await memberService.getMember({ id, datatypes: datatypes as MemberGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"agent\") {\n data = await agentService.getAgent({ id, datatypes: datatypes as AgentGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"retailer\") {\n data = await retailerService.getRetailer({ id, datatypes: datatypes as RetailerGetProps[\"datatypes\"], includePassword })\n }\n\n if (!data) {\n throw new Error(`Invalid id: ${id}`);\n }\n\n return data\n };\n\n const getUserByUsername = async ({ username, datatypes = [], includePassword = false, overrideUserType = \"\", skipFilterAccountId = false }: UserGetByUsernameProps) => {\n\n let data: any = {}\n\n const _userType = overrideUserType ? overrideUserType : userType\n\n // if (_userType === \"customer\") {\n // data = await customerService.getCustomer({ id, datatypes: datatypes as CustomerGetProps[\"datatypes\"], includePassword })\n // }\n\n if (_userType === \"operator\") {\n data = await operatorService.getOperatorByUsername({ username, datatypes: datatypes as OperatorGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"administrator\") {\n data = await administratorService.getAdministratorByUsername({ username, datatypes: datatypes as AdministratorGetProps[\"datatypes\"], includePassword, skipFilterAccountId })\n }\n\n // if (_userType === \"worker\") {\n // data = await workerService.getWorker({ id, datatypes: datatypes as WorkerGetProps[\"datatypes\"], includePassword })\n // }\n\n // if (_userType === \"driver\") {\n // data = await driverService.getDriver({ id, datatypes: datatypes as DriverGetProps[\"datatypes\"], includePassword })\n // }\n\n // if (_userType === \"member\") {\n // data = await memberService.getMember({ id, datatypes: datatypes as MemberGetProps[\"datatypes\"], includePassword })\n // }\n\n // if (_userType === \"agent\") {\n // data = await agentService.getAgent({ id, datatypes: datatypes as AgentGetProps[\"datatypes\"], includePassword })\n // }\n\n // if (_userType === \"retailer\") {\n // data = await retailerService.getRetailer({ id, datatypes: datatypes as RetailerGetProps[\"datatypes\"], includePassword })\n // }\n\n if (!data) {\n throw new Error(`Invalid username: ${username}`);\n }\n\n return data\n };\n\n const listUsers = async ({ limit, offset, filters = [], sortfield, sortorder, datatypes, includePassword = false, skipFilterAccountId = false, skipFilterUserType = false }: UserListProps) => {\n\n let data: any[] = [];\n let total = 0;\n\n if (skipFilterUserType === true) {\n\n mainSqlSelect = {\n ...mainSqlSelect,\n ...(includePassword ? { [`usr.${ModelUserFields.login_password}`]: \"password\" } : {}),\n }\n\n let sqlSelect = [\n `COUNT(usr.*) OVER() as filtered_count`,\n buildSqlSelect(``, mainSqlSelect),\n buildSqlSelect(``, defaultSqlSelect)\n ]\n\n let sqlRelation = [\n buildSqlRelation(\"left\", \"usr\", \"users\", \"creator\", [\"usr.createuserid = creator.user_id\", \"creator.isdelete = false\", \"creator.istrash = false\"]),\n buildSqlRelation(\"left\", \"usr\", \"users\", \"updater\", [\"usr.updateuserid = updater.user_id\", \"updater.isdelete = false\", \"updater.istrash = false\"])\n ]\n\n let sqlGroupBy: string[] = [\n ...Object.keys(mainSqlSelect),\n ...Object.keys(defaultSqlSelect)\n ]\n\n let filterColumns = {\n ...mainSqlSelect,\n ...defaultSqlSelect\n }\n\n let sqlWhere = [\n `usr.isdelete = false`,\n `usr.istrash = false`,\n ...(filters.length ? [buildSqlWhere(filters, filterColumns)?.where] : []),\n ]\n\n let sqlOrderby = buildSqlOrderBy(sortfield, sortorder)\n let sqlLimitOffset = buildSqlLimitOffset(limit, offset)\n\n const sqlRaw = buildSqlRawSelect({\n tableName: \"users\",\n mainAlias: \"usr\",\n accountId: rest.accountId,\n sqlSelect,\n sqlRelation,\n sqlWhere,\n sqlGroupBy,\n sqlOrderby,\n sqlLimitOffset,\n skipFilterAccountId\n })\n\n data = await userModel.raw(sqlRaw)\n\n const response = {\n data: data.map(({ filtered_count, ...rest }) => rest),\n total: data.length ? Number(data[0].filtered_count) : 0\n }\n\n return response\n }\n\n if (userType === \"customer\") {\n ({ data, total } = await customerService.listCustomers(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as CustomerListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"operator\") {\n ({ data, total } = await operatorService.listOperators(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as OperatorListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"administrator\") {\n ({ data, total } = await administratorService.listAdministrators(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as AdministratorListProps[\"datatypes\"], skipFilterAccountId }\n ))\n }\n\n if (userType === \"worker\") {\n ({ data, total } = await workerService.listWorkers(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as WorkerListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"driver\") {\n ({ data, total } = await driverService.listDrivers(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as DriverListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"member\") {\n ({ data, total } = await memberService.listMembers(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as MemberListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"agent\") {\n ({ data, total } = await agentService.listAgents(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as AgentListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"retailer\") {\n ({ data, total } = await retailerService.listRetailers(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as RetailerListProps[\"datatypes\"] }\n ))\n }\n\n return {\n data,\n total\n }\n };\n\n const removeUsers = async ({ ids }: UserRemoveProps) => {\n\n if (!ids.length) throwError('id is required');\n\n let response: any[] = []\n\n if (userType === \"customer\") {\n response = await customerService.removeCustomers({ userIds: ids })\n }\n\n if (userType === \"operator\") {\n response = await operatorService.removeOperators({ userIds: ids })\n }\n\n if (userType === \"administrator\") {\n\n // have to check the ids is is_owner account\n const { data: administrators } = await administratorService.listAdministrators({\n limit: 9999,\n offset: 0,\n filters: [{\n field: `${ModelAdministratorFields.user_id}`,\n operator: \"where_in\",\n value: ids\n }],\n sortfield: `${ModelAdministratorFields.administrator_id}`,\n sortorder: \"ASC\",\n datatypes: []\n })\n\n const ownerAdministrators = administrators.filter(i => i.is_owner === true)\n\n if (ownerAdministrators.length > 0) {\n throw new Error(`Cannot delete on administrator owner user ids: ${ownerAdministrators.map(i => i.user_id)}`);\n }\n\n response = await administratorService.removeAdministrators({ userIds: ids })\n await userPropService.removeUserProps({ userIds: ids })\n }\n\n if (userType === \"worker\") {\n response = await workerService.removeWorkers({ userIds: ids })\n await userPropService.removeUserProps({ userIds: ids })\n }\n\n if (userType === \"driver\") {\n response = await driverService.removeDrivers({ userIds: ids })\n await userPropService.removeUserProps({ userIds: ids })\n }\n\n if (userType === \"member\") {\n response = await memberService.removeMembers({ userIds: ids })\n // await userPropService.removeUserProps({ userIds: ids })\n }\n\n if (userType === \"agent\") {\n response = await agentService.removeAgents({ userIds: ids })\n // await userPropService.removeUserProps({ userIds: ids })\n }\n\n if (userType === \"retailer\") {\n response = await retailerService.removeRetailers({ userIds: ids })\n // await userPropService.removeUserProps({ userIds: ids })\n }\n\n // remove user\n let responseUser = await userModel.remove({ ids: ids.map(i => Number(i)) })\n\n response.forEach((i, index) => {\n i.user = responseUser[index]\n })\n\n return response\n };\n\n const replacePassword = async ({ id, data, isOperator = false }: UserReplacePasswordProps) => {\n\n const passwordUserModel = UserModel({\n ...rest,\n ...(isOperator === true ? { isOperator } : {})\n })\n\n // update user password\n let responseUser = await passwordUserModel.update({\n id,\n data: {\n login_password: await hashPassword(data?.unhashLoginPassword)\n }\n })\n\n let updateUserId = responseUser.user_id\n\n let response = await getUser({ id: Number(updateUserId), includePassword: false, datatypes: [] })\n\n return response\n }\n\n const getDataTypes = () => {\n\n let data: any[] = [];\n let total = 0;\n\n if (userType === \"customer\") {\n data = customerService.getDataTypes()\n }\n\n if (userType === \"operator\") {\n data = operatorService.getDataTypes()\n }\n\n if (userType === \"administrator\") {\n data = administratorService.getDataTypes()\n }\n\n if (userType === \"worker\") {\n data = workerService.getDataTypes()\n }\n\n if (userType === \"driver\") {\n data = driverService.getDataTypes()\n }\n\n if (userType === \"member\") {\n data = memberService.getDataTypes()\n }\n\n if (userType === \"agent\") {\n data = agentService.getDataTypes()\n }\n\n if (userType === \"retailer\") {\n data = retailerService.getDataTypes()\n }\n\n return data\n };\n\n // return {\n // createUser,\n // updateUser,\n // getUser,\n // listUsers,\n // removeUsers,\n // replacePassword,\n // getUserDataTypes\n // }\n\n const methodConfigs = {\n getUser: { fn: getUser, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"get user\" },\n getUserByUsername: { fn: getUserByUsername, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"get user by username\" },\n listUsers: { fn: listUsers, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"list users\" },\n createUser: { fn: createUser, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"create user\" },\n updateUser: { fn: updateUser, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"update user\" },\n replacePassword: { fn: replacePassword, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"replace user password\" },\n removeUsers: { fn: removeUsers, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"remove users\" },\n getDataTypes: { fn: getDataTypes, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"get user datatypes\" },\n validateUserContact: { fn: validateUserContact, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"validate user contact\" },\n };\n\n return ServiceFactory(\"UserService\", rest, methodConfigs);\n\n}\n\n"]}
1
+ {"version":3,"file":"UserService.js","sourceRoot":"","sources":["../../../src/services/user/UserService.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n UserModel,\n ModelCountry,\n CountryModel,\n ModelUserFields,\n ModelAdministratorFields,\n ModelCountryFields\n} from \"@/models\";\n\nimport { z } from \"zod\";\n\nimport { UserPropService, UserPropReplaceProps } from \"./UserPropService\";\nimport { CustomerGetProps, CustomerCreateProps, CustomerListProps, CustomerUpdateProps, CustomerService } from \"./CustomerService\";\nimport { AdministratorGetProps, AdministratorCreateProps, AdministratorUpdateProps, AdministratorListProps, AdministratorService } from \"./AdministratorService\";\nimport { WorkerCreateProps, WorkerGetProps, WorkerUpdateProps, WorkerListProps, WorkerService } from \"./WorkerService\";\nimport { DriverCreateProps, DriverGetProps, DriverUpdateProps, DriverListProps, DriverService } from \"./DriverService\";\nimport { RetailerCreateProps, RetailerGetProps, RetailerUpdateProps, RetailerListProps, RetailerService } from \"./RetailerService\";\nimport { MemberCreateProps, MemberGetProps, MemberUpdateProps, MemberListProps, MemberService } from \"./MemberService\";\nimport { AgentCreateProps, AgentGetProps, AgentUpdateProps, AgentListProps, AgentService } from \"./AgentService\";\n\nimport { QueryList, QueryGet } from \"@/schema/common\";\nimport { buildSqlRelation, buildSqlRawSelect, buildSqlWhere, buildSqlSelect, buildSqlLimitOffset, buildSqlOrderBy, buildInjectionFieldsSqlSelect } from \"@/lib\";\n\nimport { DefaultServiceProps, throwError } from \"@/utils\";\n\nimport { hashPassword } from \"@/utils\";\nimport { OperatorCreateProps, OperatorGetProps, OperatorListProps, OperatorService, OperatorUpdateProps } from \"./OperatorService\";\n\nimport { ServiceFactory } from \"@/lib\";\n\nexport const userTypes = {\n operator: \"operator\",\n administrator: \"administrator\",\n worker: \"worker\",\n supplier: \"supplier\",\n customer: \"customer\",\n driver: \"driver\",\n retailer: \"retailer\",\n member: \"member\",\n agent: \"agent\",\n} as const\n\nexport type UserType = typeof userTypes[keyof typeof userTypes]\n\nexport type UserServiceProps = DefaultServiceProps & {\n userType: UserType\n};\n\nexport type UserGetProps = QueryGet & {\n id: number,\n overrideUserType?: UserType | \"\"\n includePassword?: boolean,\n skipFilterAccountId?: boolean\n skipFilterUserType?: boolean\n};\n\nexport type UserGetByUsernameProps = QueryGet & {\n username: string,\n overrideUserType?: UserType | \"\"\n includePassword?: boolean,\n skipFilterAccountId?: boolean\n};\n\nexport type UserListProps = QueryList & {\n // id: number,\n includePassword?: boolean\n skipFilterAccountId?: boolean\n skipFilterUserType?: boolean\n};\n\nexport type UserRemoveProps = {\n ids: BigInt[]\n};\n\nexport type User = {\n loginUsername: string\n loginPassword: string\n address: string\n // contact: string\n contact: {\n countryCode: number; // e.g., 1 for Canada\n phoneNumber: string; // digits only, mobile or landline\n }\n email: string\n firstname: string\n lastname: string\n status: boolean\n}\n\nexport type UserOptionalLoginPassword = Omit<User, \"loginPassword\"> & {\n loginPassword?: string\n}\n\nexport type UserCreateProps = {\n userType?: UserType,\n data: {\n user: User\n } & (\n // operator\n {\n operator: Omit<OperatorCreateProps[\"data\"][\"operator\"], \"userId\">,\n } |\n // customer\n {\n customer: Omit<CustomerCreateProps[\"data\"][\"customer\"], \"userId\">,\n } |\n // administrator\n {\n administrator: Omit<AdministratorCreateProps[\"data\"][\"administrator\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // worker\n {\n worker: Omit<WorkerCreateProps[\"data\"][\"worker\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // driver\n {\n driver: Omit<DriverCreateProps[\"data\"][\"driver\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // member\n {\n member: Omit<MemberCreateProps[\"data\"][\"member\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n } |\n // agent\n {\n agent: Omit<AgentCreateProps[\"data\"][\"agent\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n } |\n // retailer\n {\n retailer: Omit<RetailerCreateProps[\"data\"][\"retailer\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n }\n )\n}\n\nexport type UserUpdateProps = {\n id: number,\n userType?: UserType,\n data: {\n user: UserOptionalLoginPassword\n } & (\n // operator\n {\n operator: Omit<OperatorUpdateProps[\"data\"][\"operator\"], \"userId\">\n } |\n // customer\n {\n customer: Omit<CustomerUpdateProps[\"data\"][\"customer\"], \"userId\">\n } |\n // administrator\n {\n administrator: Omit<AdministratorUpdateProps[\"data\"][\"administrator\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // worker\n {\n worker: Omit<WorkerUpdateProps[\"data\"][\"worker\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // driver\n {\n driver: Omit<DriverUpdateProps[\"data\"][\"driver\"], \"userId\">\n props: {\n locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n }\n } |\n // member\n {\n member: Omit<MemberUpdateProps[\"data\"][\"member\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n } |\n // agent\n {\n agent: Omit<AgentUpdateProps[\"data\"][\"agent\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n } |\n // retailer\n {\n retailer: Omit<RetailerUpdateProps[\"data\"][\"retailer\"], \"userId\">\n // props: {\n // locationIds: UserPropReplaceProps[\"data\"][\"userProp\"][\"locationIds\"]\n // }\n }\n )\n}\n\nexport type UserReplacePasswordProps = {\n id: number,\n data: {\n unhashLoginPassword: string\n },\n isOperator: boolean\n}\n\nlet mainSqlSelect = {\n [`usr.${ModelUserFields.user_id}`]: \"user_id\",\n [`usr.${ModelUserFields.user_type}`]: \"user_type\",\n [`usr.${ModelUserFields.login_username}`]: \"username\",\n [`usr.${ModelUserFields.firstname}`]: \"firstname\",\n [`usr.${ModelUserFields.lastname}`]: \"lastname\",\n [`CONCAT(usr.${ModelUserFields.contact_country_code}, usr.${ModelUserFields.contact_phone_number})`]: \"contact\",\n [`usr.${ModelUserFields.contact_country_code}`]: \"contact_country_code\",\n [`usr.${ModelUserFields.contact_phone_number}`]: \"contact_phone_number\",\n [`usr.${ModelUserFields.email}`]: \"email\",\n [`usr.${ModelUserFields.address}`]: \"address\",\n [`usr.${ModelUserFields.status}`]: \"status\",\n}\n\nlet defaultSqlSelect = {\n [`usr.${ModelUserFields.createdatetime}`]: \"createdatetime\",\n [`creator.${ModelUserFields.login_username}`]: \"createusername\",\n [`usr.${ModelUserFields.updatedatetime}`]: \"updatedatetime\",\n [`updater.${ModelUserFields.login_username}`]: \"updateusername\",\n [`usr.${ModelUserFields.isdelete}`]: \"isdelete\",\n [`usr.${ModelUserFields.istrash}`]: \"istrash\",\n [`usr.${ModelUserFields.accountid}`]: \"accountid\",\n}\n\nconst getCreatePayload = async (\n userType: UserType,\n data: UserCreateProps[\"data\"],\n contact: {\n countryCode: number,\n phoneNumber: string\n }\n) => {\n\n if (\"user\" in data) {\n\n // have to hash the password\n\n return {\n [`${ModelUserFields.login_username}`]: data.user.loginUsername,\n [`${ModelUserFields.login_password}`]: await hashPassword(data.user.loginPassword),\n [`${ModelUserFields.address}`]: data.user.address,\n [`${ModelUserFields.contact_country_code}`]: contact.countryCode,\n [`${ModelUserFields.contact_phone_number}`]: contact.phoneNumber,\n [`${ModelUserFields.email}`]: data.user.email,\n [`${ModelUserFields.firstname}`]: data.user.firstname,\n [`${ModelUserFields.lastname}`]: data.user.lastname,\n [`${ModelUserFields.status}`]: Boolean(data.user.status),\n [`${ModelUserFields.user_type}`]: `${userType}`\n }\n }\n\n return false\n\n}\n\nconst getUpdatePayload = async (\n userType: UserType,\n data: UserUpdateProps[\"data\"],\n contact: {\n countryCode: number,\n phoneNumber: string\n }\n) => {\n\n if (\"user\" in data) {\n\n const newHashPassword = data?.user?.loginPassword ? await hashPassword(data.user.loginPassword) : \"\"\n\n return {\n [`${ModelUserFields.login_username}`]: data.user.loginUsername,\n ...(newHashPassword ? { [`${ModelUserFields.login_password}`]: newHashPassword } : {}),\n [`${ModelUserFields.address}`]: data.user.address,\n [`${ModelUserFields.contact_country_code}`]: contact.countryCode,\n [`${ModelUserFields.contact_phone_number}`]: contact.phoneNumber,\n [`${ModelUserFields.email}`]: data.user.email,\n [`${ModelUserFields.firstname}`]: data.user.firstname,\n [`${ModelUserFields.lastname}`]: data.user.lastname,\n [`${ModelUserFields.status}`]: Boolean(data.user.status),\n [`${ModelUserFields.user_type}`]: `${userType}`\n }\n }\n\n return false\n\n}\n\n// Example reserved words for username\nexport const loginUsernameReservedWords = [\n \"admin\", \"administrator\", \"root\", \"system\", \"operator\", \"moderator\", \"owner\", \"manager\",\n \"user\", \"users\", \"account\", \"guest\", \"login\", \"logout\", \"signup\", \"register\", \"auth\",\n \"api\", \"www\", \"app\", \"support\", \"help\", \"dashboard\", \"portal\", \"console\", \"control\", \"ops\",\n \"test\", \"demo\", \"beta\", \"alpha\", \"dev\", \"development\", \"staging\", \"prod\", \"production\",\n \"security\", \"privacy\", \"terms\", \"policy\", \"legal\", \"about\", \"company\", \"team\", \"teams\",\n \"billing\", \"payment\", \"invoice\", \"finance\", \"financeadmin\", \"subscription\", \"plan\", \"plans\",\n \"rootadmin\", \"superuser\", \"staff\", \"moderation\", \"systemadmin\", \"sysadmin\", \"internal\",\n \"management\", \"supportdesk\", \"helpdesk\", \"contact\", \"feedback\", \"news\", \"blog\", \"media\",\n \"press\", \"events\", \"calendar\", \"forum\", \"community\", \"chat\", \"messaging\", \"notifications\",\n \"alerts\", \"reports\", \"analytics\", \"metrics\", \"logs\", \"history\", \"archive\", \"backup\",\n \"restore\", \"files\", \"documents\", \"resources\", \"library\", \"gallery\", \"images\", \"videos\",\n \"downloads\", \"uploads\", \"templates\", \"home\", \"index\", \"static\", \"public\", \"webmaster\"\n];\n\n// Zod schema for username\nexport const loginUsernameSchema = z\n .string()\n .min(5, { message: \"Login username must be at least 5 characters\" })\n .max(63, { message: \"Login username must be at most 63 characters\" })\n .regex(\n /^[a-z0-9]([a-z0-9-_]{3,61}[a-z0-9])?$/,\n \"Login username can only contain lowercase letters, numbers, hyphens, and underscores, cannot start or end with a hyphen or underscore\"\n )\n .transform((val) => val.toLowerCase().trim()) // normalize\n .refine((val) => !loginUsernameReservedWords.includes(val), {\n message: \"This login username is reserved. Please choose another one\",\n });\n\n// Zod schema for password\nexport const loginPasswordSchema = z\n .string()\n .min(8, { message: \"Password must be at least 8 characters\" })\n .max(64, { message: \"Password must be at most 64 characters\" })\n .regex(/[a-zA-Z]/, \"Password must include at least one letter\")\n .regex(/[0-9!@#$%^&*()_\\-+=]/, \"Password must include at least one number or special character\");\n\nexport const UserService = (props: UserServiceProps) => {\n\n const {\n userType = \"administrator\",\n ...rest\n } = props\n\n const userModel = UserModel({ ...rest })\n const countryModel = CountryModel({ ...rest })\n\n const userPropService = UserPropService({ ...rest, userPropType: \"LOCATION_ID\" })\n const customerService = CustomerService({ ...rest })\n const administratorService = AdministratorService({ ...rest })\n const operatorService = OperatorService({ ...rest })\n const workerService = WorkerService({ ...rest })\n const driverService = DriverService({ ...rest })\n const retailerService = RetailerService({ ...rest })\n const memberService = MemberService({ ...rest })\n const agentService = AgentService({ ...rest })\n\n const validateUserContactPhoneNumber = (val: string) => {\n // Must be numeric\n if (!/^\\d+$/.test(val)) {\n throw new Error(`Contact No. only allowed numbers`);\n }\n\n // Must have realistic length (4 to 15 digits)\n if (val.length < 4 || val.length > 15) {\n throw new Error(`Contact No. length must be between 4 and 15 digits`);\n }\n\n return true;\n };\n\n const validateUserContactCountryCode = async (countryCode: number) => {\n\n // 1. Load active countries\n const activeCountries: ModelCountry[] = await countryModel.list({\n where: {\n [`${ModelCountryFields.isdelete}`]: false,\n [`${ModelCountryFields.istrash}`]: false,\n [`${ModelCountryFields.status}`]: true\n }\n })\n\n // Check if country code exists\n const exists = activeCountries.some(c => c.phone_code === countryCode);\n\n if (!exists) {\n throw new Error(`Invalid country code: ${countryCode}`);\n }\n\n return true; // valid\n\n }\n\n const validateUserContact = async (countryCode: number, phoneNumber: string) => {\n\n try {\n // validate the phone number without country code\n validateUserContactPhoneNumber(phoneNumber)\n\n // validate user contact country code\n await validateUserContactCountryCode(countryCode)\n\n return true\n\n } catch (error: unknown) {\n const msg = error instanceof Error ? error.message : String(error);\n throw new Error(`Invalid user contact no.: ${msg}, provided: ${countryCode} ${phoneNumber}`);\n }\n\n }\n\n const validateLoginUsernameFormat = (loginUsername: string) => {\n try {\n return loginUsernameSchema.parse(loginUsername); // throws if invalid\n } catch (err) {\n if (err instanceof z.ZodError) {\n throw new Error(\n `Invalid login username: \"${loginUsername}\". ` +\n err.errors.map((e) => e.message).join(\"; \")\n );\n }\n throw err;\n }\n };\n\n const validateLoginPasswordFormat = (loginPassword: string) => {\n try {\n return loginPasswordSchema.parse(loginPassword); // throws if invalid\n } catch (err) {\n if (err instanceof z.ZodError) {\n throw new Error(\n `Invalid login password: \"${loginPassword}\". ` +\n err.errors.map((e) => e.message).join(\"; \")\n );\n }\n throw err;\n }\n };\n\n const createUser = async ({ data, userType: overrideUserType }: UserCreateProps) => {\n\n const _userType = overrideUserType || userType\n\n // validate the credential contact no\n const userLoginUsername = data.user.loginUsername\n const userLoginPassword = data.user.loginPassword\n const userContactCountryCode = data.user.contact.countryCode\n const userContactPhoneNumber = data.user.contact.phoneNumber\n\n // validate the contact no only can be digit in text only\n // validate the country code in prefix\n await validateUserContact(userContactCountryCode, userContactPhoneNumber)\n\n // validate login username\n validateLoginUsernameFormat(userLoginUsername)\n\n // validate login password\n validateLoginPasswordFormat(userLoginPassword)\n\n // check the username duplicated?\n const checkUsername = await userModel.list({\n limit: 1,\n offset: 0,\n orderBy: {\n [`${ModelUserFields.user_id}`]: \"asc\"\n },\n include: [],\n where: {\n [`${ModelUserFields.login_username}`]: data.user.loginUsername,\n [`${ModelUserFields.accountid}`]: Number(rest.accountId),\n [`${ModelUserFields.isdelete}`]: false,\n [`${ModelUserFields.istrash}`]: false\n },\n })\n\n // console.log('ch', checkUsername)\n\n if (checkUsername.length > 0) throwError(`Duplicated username: ${data.user.loginUsername}(${checkUsername[0]?.user_type})`)\n\n // validation before insertion\n if (_userType === \"member\" && \"member\" in data) {\n\n const memberOwnerUserId = data?.member?.ownerUserId ?? \"\";\n\n // validate owner user id\n if (memberOwnerUserId) {\n await memberService.validateMemberOwnerUserId(memberOwnerUserId)\n }\n\n }\n\n if (_userType === \"agent\" && \"agent\" in data) {\n\n const agentOwnerUserId = data?.agent?.ownerUserId ?? \"\";\n\n // validate owner user id\n if (agentOwnerUserId) {\n await agentService.validateAgentOwnerUserId(agentOwnerUserId)\n }\n\n }\n\n const _data = await getCreatePayload(\n _userType,\n data,\n {\n countryCode: userContactCountryCode,\n phoneNumber: userContactPhoneNumber\n }\n )\n\n if (!_data) {\n throw new Error(`Invalid create payload: ${JSON.stringify(_data)}`);\n }\n\n // create user\n let responseUser = await userModel.create({ data: _data })\n\n let newUserId = responseUser.user_id\n\n let response: any = {}\n\n if (_userType === \"customer\" && \"customer\" in data) {\n\n let dataCustomer: CustomerCreateProps[\"data\"] = {\n customer: {\n ...data.customer,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create customer\n await customerService.createCustomer({ data: dataCustomer })\n\n response = await customerService.getCustomer({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"administrator\" && \"administrator\" in data) {\n\n let dataAdministrator: AdministratorCreateProps[\"data\"] = {\n administrator: {\n ...data.administrator,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create administrator\n await administratorService.createAdministrator({ data: dataAdministrator })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(newUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await administratorService.getAdministrator({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"operator\" && \"operator\" in data) {\n\n let dataOperator: OperatorCreateProps[\"data\"] = {\n operator: {\n ...data.operator,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create operator\n await operatorService.createOperator({ data: dataOperator })\n\n response = await operatorService.getOperator({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"worker\" && \"worker\" in data) {\n\n let dataWorker: WorkerCreateProps[\"data\"] = {\n worker: {\n ...data.worker,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create worker\n await workerService.createWorker({ data: dataWorker })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(newUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await workerService.getWorker({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"driver\" && \"driver\" in data) {\n\n let dataDriver: DriverCreateProps[\"data\"] = {\n driver: {\n ...data.driver,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create driver\n await driverService.createDriver({ data: dataDriver })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(newUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await driverService.getDriver({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"member\" && \"member\" in data) {\n\n let dataMember: MemberCreateProps[\"data\"] = {\n member: {\n ...data.member,\n // userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create member\n await memberService.createMember({ userId: Number(newUserId), data: dataMember })\n\n // replace user prop\n // await userPropService.replaceUserProp({\n // userPropType: \"LOCATION_ID\",\n // data: {\n // userProp: {\n // userId: Number(newUserId),\n // locationIds: data.props.locationIds\n // }\n // }\n // })\n\n response = await memberService.getMember({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"agent\" && \"agent\" in data) {\n\n let dataAgent: AgentCreateProps[\"data\"] = {\n agent: {\n ...data.agent,\n // userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create agent\n await agentService.createAgent({ userId: Number(newUserId), data: dataAgent })\n\n // replace user prop\n // await userPropService.replaceUserProp({\n // userPropType: \"LOCATION_ID\",\n // data: {\n // userProp: {\n // userId: Number(newUserId),\n // locationIds: data.props.locationIds\n // }\n // }\n // })\n\n response = await agentService.getAgent({ id: Number(newUserId), datatypes: [] })\n }\n\n if (_userType === \"retailer\" && \"retailer\" in data) {\n\n let dataRetailer: RetailerCreateProps[\"data\"] = {\n retailer: {\n ...data.retailer,\n userId: Number(newUserId) ?? \"\"\n }\n }\n\n // create retailer\n await retailerService.createRetailer({ data: dataRetailer })\n\n response = await retailerService.getRetailer({ id: Number(newUserId), datatypes: [] })\n }\n\n return response\n }\n\n const updateUser = async ({ id, data, userType: overrideUserType }: UserUpdateProps) => {\n\n const _userType = overrideUserType || userType\n\n // validate the credential contact no\n const userLoginUsername = data.user.loginUsername\n const userLoginPassword = data.user?.loginPassword ?? \"\"\n const userContactCountryCode = data.user.contact.countryCode\n const userContactPhoneNumber = data.user.contact.phoneNumber\n\n // validate the contact no only can be digit in text only\n // validate the country code in prefix\n await validateUserContact(userContactCountryCode, userContactPhoneNumber)\n\n // validate login username\n validateLoginUsernameFormat(userLoginUsername)\n\n // validate login password\n if (userLoginPassword) {\n validateLoginPasswordFormat(userLoginPassword)\n }\n\n // check the username duplicated?\n const checkUsername = await userModel.list({\n limit: 1,\n offset: 0,\n orderBy: {\n [`${ModelUserFields.user_id}`]: \"asc\"\n },\n include: [],\n where: {\n [`${ModelUserFields.login_username}`]: data.user.loginUsername,\n [`${ModelUserFields.isdelete}`]: false,\n [`${ModelUserFields.istrash}`]: false,\n [`${ModelUserFields.accountid}`]: rest.accountId,\n },\n })\n\n // console.log('ch', checkUsername)\n\n if (checkUsername.length > 0) {\n if (Number(checkUsername[0]?.user_id) !== Number(id)) { // if not self user id\n throwError(`Duplicated username: ${data.user.loginUsername}(${checkUsername[0]?.user_type})`)\n }\n }\n\n // validation before insertion\n // if (_userType === \"member\" && \"member\" in data) {\n // }\n\n const _data = await getUpdatePayload(\n _userType,\n data,\n {\n countryCode: userContactCountryCode,\n phoneNumber: userContactPhoneNumber\n }\n )\n\n if (!_data) {\n throw new Error(`Invalid update payload: ${JSON.stringify(_data)}`);\n }\n\n // update user\n let responseUser = await userModel.update({ id, data: _data })\n\n let updateUserId = responseUser.user_id\n\n let response: any = {}\n\n if (_userType === \"customer\" && \"customer\" in data) {\n\n let dataCustomer: CustomerUpdateProps[\"data\"] = {\n customer: {\n ...data.customer\n }\n }\n\n await customerService.updateCustomer({ userId: Number(updateUserId), data: dataCustomer })\n\n response = await customerService.getCustomer({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"operator\" && \"operator\" in data) {\n\n let dataOperator: OperatorUpdateProps[\"data\"] = {\n operator: {\n ...data.operator\n }\n }\n\n await operatorService.updateOperator({ userId: Number(updateUserId), data: dataOperator })\n\n response = await operatorService.getOperator({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"administrator\" && \"administrator\" in data) {\n\n let dataCustomer: AdministratorUpdateProps[\"data\"] = {\n administrator: {\n ...data.administrator\n }\n }\n\n await administratorService.updateAdministrator({ userId: Number(updateUserId), data: dataCustomer })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(updateUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await administratorService.getAdministrator({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"worker\" && \"worker\" in data) {\n\n let dataWorker: WorkerUpdateProps[\"data\"] = {\n worker: {\n ...data.worker\n }\n }\n\n await workerService.updateWorker({ userId: Number(updateUserId), data: dataWorker })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(updateUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await workerService.getWorker({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"driver\" && \"driver\" in data) {\n\n let dataDriver: DriverUpdateProps[\"data\"] = {\n driver: {\n ...data.driver\n }\n }\n\n await driverService.updateDriver({ userId: Number(updateUserId), data: dataDriver })\n\n // replace user prop\n await userPropService.replaceUserProp({\n userPropType: \"LOCATION_ID\",\n data: {\n userProp: {\n userId: Number(updateUserId),\n locationIds: data.props.locationIds\n }\n }\n })\n\n response = await driverService.getDriver({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"member\" && \"member\" in data) {\n\n let dataMember: MemberUpdateProps[\"data\"] = {\n member: {\n ...data.member\n }\n }\n\n await memberService.updateMember({ userId: Number(updateUserId), data: dataMember })\n\n // replace user prop\n // await userPropService.replaceUserProp({\n // userPropType: \"LOCATION_ID\",\n // data: {\n // userProp: {\n // userId: Number(updateUserId),\n // locationIds: data.props.locationIds\n // }\n // }\n // })\n\n response = await memberService.getMember({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"agent\" && \"agent\" in data) {\n\n let dataAgent: AgentUpdateProps[\"data\"] = {\n agent: {\n ...data.agent\n }\n }\n\n await agentService.updateAgent({ userId: Number(updateUserId), data: dataAgent })\n\n // replace user prop\n // await userPropService.replaceUserProp({\n // userPropType: \"LOCATION_ID\",\n // data: {\n // userProp: {\n // userId: Number(updateUserId),\n // locationIds: data.props.locationIds\n // }\n // }\n // })\n\n response = await agentService.getAgent({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n if (_userType === \"retailer\" && \"retailer\" in data) {\n\n let dataRetailer: RetailerUpdateProps[\"data\"] = {\n retailer: {\n ...data.retailer\n }\n }\n\n await retailerService.updateRetailer({ userId: Number(updateUserId), data: dataRetailer })\n\n response = await retailerService.getRetailer({ id: Number(updateUserId), datatypes: [] })\n\n }\n\n return response\n }\n\n const getUser = async ({ id, datatypes = [], includePassword = false, overrideUserType = \"\", skipFilterAccountId = false, skipFilterUserType = false }: UserGetProps) => {\n\n let data: any = {}\n\n if (skipFilterUserType === true) {\n\n let { data } = await listUsers({\n includePassword,\n limit: 1,\n offset: 0,\n filters: [{ field: \"user_id\", operator: \"=\", value: id }],\n sortfield: \"user_id\",\n sortorder: \"ASC\",\n datatypes,\n skipFilterAccountId,\n skipFilterUserType\n })\n\n return data[0] ?? null;\n }\n\n const _userType = overrideUserType ? overrideUserType : userType\n\n if (_userType === \"customer\") {\n data = await customerService.getCustomer({ id, datatypes: datatypes as CustomerGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"operator\") {\n data = await operatorService.getOperator({ id, datatypes: datatypes as OperatorGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"administrator\") {\n data = await administratorService.getAdministrator({ id, datatypes: datatypes as AdministratorGetProps[\"datatypes\"], includePassword, skipFilterAccountId })\n }\n\n if (_userType === \"worker\") {\n data = await workerService.getWorker({ id, datatypes: datatypes as WorkerGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"driver\") {\n data = await driverService.getDriver({ id, datatypes: datatypes as DriverGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"member\") {\n data = await memberService.getMember({ id, datatypes: datatypes as MemberGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"agent\") {\n data = await agentService.getAgent({ id, datatypes: datatypes as AgentGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"retailer\") {\n data = await retailerService.getRetailer({ id, datatypes: datatypes as RetailerGetProps[\"datatypes\"], includePassword })\n }\n\n if (!data) {\n throw new Error(`Invalid id: ${id}`);\n }\n\n return data\n };\n\n const getUserByUsername = async ({ username, datatypes = [], includePassword = false, overrideUserType = \"\", skipFilterAccountId = false }: UserGetByUsernameProps) => {\n\n let data: any = {}\n\n const _userType = overrideUserType ? overrideUserType : userType\n\n // if (_userType === \"customer\") {\n // data = await customerService.getCustomer({ id, datatypes: datatypes as CustomerGetProps[\"datatypes\"], includePassword })\n // }\n\n if (_userType === \"operator\") {\n data = await operatorService.getOperatorByUsername({ username, datatypes: datatypes as OperatorGetProps[\"datatypes\"], includePassword })\n }\n\n if (_userType === \"administrator\") {\n data = await administratorService.getAdministratorByUsername({ username, datatypes: datatypes as AdministratorGetProps[\"datatypes\"], includePassword, skipFilterAccountId })\n }\n\n // if (_userType === \"worker\") {\n // data = await workerService.getWorker({ id, datatypes: datatypes as WorkerGetProps[\"datatypes\"], includePassword })\n // }\n\n // if (_userType === \"driver\") {\n // data = await driverService.getDriver({ id, datatypes: datatypes as DriverGetProps[\"datatypes\"], includePassword })\n // }\n\n // if (_userType === \"member\") {\n // data = await memberService.getMember({ id, datatypes: datatypes as MemberGetProps[\"datatypes\"], includePassword })\n // }\n\n // if (_userType === \"agent\") {\n // data = await agentService.getAgent({ id, datatypes: datatypes as AgentGetProps[\"datatypes\"], includePassword })\n // }\n\n // if (_userType === \"retailer\") {\n // data = await retailerService.getRetailer({ id, datatypes: datatypes as RetailerGetProps[\"datatypes\"], includePassword })\n // }\n\n if (!data) {\n throw new Error(`Invalid username: ${username}`);\n }\n\n return data\n };\n\n const listUsers = async ({ limit, offset, filters = [], sortfield, sortorder, datatypes, includePassword = false, skipFilterAccountId = false, skipFilterUserType = false }: UserListProps) => {\n\n let data: any[] = [];\n let total = 0;\n\n if (skipFilterUserType === true) {\n\n mainSqlSelect = {\n ...mainSqlSelect,\n ...(includePassword ? { [`usr.${ModelUserFields.login_password}`]: \"password\" } : {}),\n }\n\n let sqlSelect = [\n `COUNT(usr.*) OVER() as filtered_count`,\n buildSqlSelect(``, mainSqlSelect),\n buildSqlSelect(``, defaultSqlSelect)\n ]\n\n let sqlRelation = [\n buildSqlRelation(\"left\", \"usr\", \"users\", \"creator\", [\"usr.createuserid = creator.user_id\", \"creator.isdelete = false\", \"creator.istrash = false\"]),\n buildSqlRelation(\"left\", \"usr\", \"users\", \"updater\", [\"usr.updateuserid = updater.user_id\", \"updater.isdelete = false\", \"updater.istrash = false\"])\n ]\n\n let sqlGroupBy: string[] = [\n ...Object.keys(mainSqlSelect),\n ...Object.keys(defaultSqlSelect)\n ]\n\n let filterColumns = {\n ...mainSqlSelect,\n ...defaultSqlSelect\n }\n\n let sqlWhere = [\n `usr.isdelete = false`,\n `usr.istrash = false`,\n ...(filters.length ? [buildSqlWhere(filters, filterColumns)?.where] : []),\n ]\n\n let sqlOrderby = buildSqlOrderBy(sortfield, sortorder)\n let sqlLimitOffset = buildSqlLimitOffset(limit, offset)\n\n const sqlRaw = buildSqlRawSelect({\n tableName: \"users\",\n mainAlias: \"usr\",\n accountId: rest.accountId,\n sqlSelect,\n sqlRelation,\n sqlWhere,\n sqlGroupBy,\n sqlOrderby,\n sqlLimitOffset,\n skipFilterAccountId\n })\n\n data = await userModel.raw(sqlRaw)\n\n const response = {\n data: data.map(({ filtered_count, ...rest }) => rest),\n total: data.length ? Number(data[0].filtered_count) : 0\n }\n\n return response\n }\n\n if (userType === \"customer\") {\n ({ data, total } = await customerService.listCustomers(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as CustomerListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"operator\") {\n ({ data, total } = await operatorService.listOperators(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as OperatorListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"administrator\") {\n ({ data, total } = await administratorService.listAdministrators(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as AdministratorListProps[\"datatypes\"], skipFilterAccountId }\n ))\n }\n\n if (userType === \"worker\") {\n ({ data, total } = await workerService.listWorkers(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as WorkerListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"driver\") {\n ({ data, total } = await driverService.listDrivers(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as DriverListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"member\") {\n ({ data, total } = await memberService.listMembers(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as MemberListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"agent\") {\n ({ data, total } = await agentService.listAgents(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as AgentListProps[\"datatypes\"] }\n ))\n }\n\n if (userType === \"retailer\") {\n ({ data, total } = await retailerService.listRetailers(\n { includePassword, limit, offset, filters, sortfield, sortorder, datatypes: datatypes as RetailerListProps[\"datatypes\"] }\n ))\n }\n\n return {\n data,\n total\n }\n };\n\n const removeUsers = async ({ ids }: UserRemoveProps) => {\n\n if (!ids.length) throwError('id is required');\n\n let response: any[] = []\n\n if (userType === \"customer\") {\n response = await customerService.removeCustomers({ userIds: ids })\n }\n\n if (userType === \"operator\") {\n response = await operatorService.removeOperators({ userIds: ids })\n }\n\n if (userType === \"administrator\") {\n\n // have to check the ids is is_owner account\n const { data: administrators } = await administratorService.listAdministrators({\n limit: 9999,\n offset: 0,\n filters: [{\n field: `${ModelAdministratorFields.user_id}`,\n operator: \"where_in\",\n value: ids\n }],\n sortfield: `${ModelAdministratorFields.administrator_id}`,\n sortorder: \"ASC\",\n datatypes: []\n })\n\n const ownerAdministrators = administrators.filter(i => i.is_owner === true)\n\n if (ownerAdministrators.length > 0) {\n throw new Error(`Cannot delete on administrator owner user ids: ${ownerAdministrators.map(i => i.user_id)}`);\n }\n\n response = await administratorService.removeAdministrators({ userIds: ids })\n await userPropService.removeUserProps({ userIds: ids })\n }\n\n if (userType === \"worker\") {\n response = await workerService.removeWorkers({ userIds: ids })\n await userPropService.removeUserProps({ userIds: ids })\n }\n\n if (userType === \"driver\") {\n response = await driverService.removeDrivers({ userIds: ids })\n await userPropService.removeUserProps({ userIds: ids })\n }\n\n if (userType === \"member\") {\n response = await memberService.removeMembers({ userIds: ids })\n // await userPropService.removeUserProps({ userIds: ids })\n }\n\n if (userType === \"agent\") {\n response = await agentService.removeAgents({ userIds: ids })\n // await userPropService.removeUserProps({ userIds: ids })\n }\n\n if (userType === \"retailer\") {\n response = await retailerService.removeRetailers({ userIds: ids })\n // await userPropService.removeUserProps({ userIds: ids })\n }\n\n // remove user\n let responseUser = await userModel.remove({ ids: ids.map(i => Number(i)) })\n\n response.forEach((i, index) => {\n i.user = responseUser[index]\n })\n\n return response\n };\n\n const replacePassword = async ({ id, data, isOperator = false }: UserReplacePasswordProps) => {\n\n const passwordUserModel = UserModel({\n ...rest,\n ...(isOperator === true ? { isOperator } : {})\n })\n\n // update user password\n let responseUser = await passwordUserModel.update({\n id,\n data: {\n login_password: await hashPassword(data?.unhashLoginPassword)\n }\n })\n\n let updateUserId = responseUser.user_id\n\n let response = await getUser({ id: Number(updateUserId), includePassword: false, datatypes: [] })\n\n return response\n }\n\n const getDataTypes = () => {\n\n let data: any[] = [];\n let total = 0;\n\n if (userType === \"customer\") {\n data = customerService.getDataTypes()\n }\n\n if (userType === \"operator\") {\n data = operatorService.getDataTypes()\n }\n\n if (userType === \"administrator\") {\n data = administratorService.getDataTypes()\n }\n\n if (userType === \"worker\") {\n data = workerService.getDataTypes()\n }\n\n if (userType === \"driver\") {\n data = driverService.getDataTypes()\n }\n\n if (userType === \"member\") {\n data = memberService.getDataTypes()\n }\n\n if (userType === \"agent\") {\n data = agentService.getDataTypes()\n }\n\n if (userType === \"retailer\") {\n data = retailerService.getDataTypes()\n }\n\n return data\n };\n\n // return {\n // createUser,\n // updateUser,\n // getUser,\n // listUsers,\n // removeUsers,\n // replacePassword,\n // getUserDataTypes\n // }\n\n const methodConfigs = {\n getUser: { fn: getUser, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"get user\" },\n getUserByUsername: { fn: getUserByUsername, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"get user by username\" },\n listUsers: { fn: listUsers, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"list users\" },\n createUser: { fn: createUser, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"create user\" },\n updateUser: { fn: updateUser, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"update user\" },\n replacePassword: { fn: replacePassword, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"replace user password\" },\n removeUsers: { fn: removeUsers, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"remove users\" },\n getDataTypes: { fn: getDataTypes, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"get user datatypes\" },\n validateUserContact: { fn: validateUserContact, allowUserTypes: [\"operator\", \"administrator\"] as const, actionName: \"validate user contact\" },\n };\n\n return ServiceFactory(\"UserService\", rest, methodConfigs);\n\n}\n\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "storemw-core-api",
3
- "version": "1.0.134",
3
+ "version": "1.0.136",
4
4
  "description": "STOREMW Core API",
5
5
  "main": "dist/app.js",
6
6
  "types": "dist/app.d.ts",