@lucidcms/core
Version:
The core of the Lucid CMS. It's responsible for spinning up the API and serving the CMS.
1 lines • 7.75 kB
Source Map (JSON)
{"version":3,"file":"update-me.mjs","names":["accountServices.checks.checkUpdatePassword","securityAuditServices.logSecurityAudit","constants","accountServices.requestEmailChange"],"sources":["../../../src/services/account/update-me.ts"],"sourcesContent":["import constants from \"../../constants/constants.js\";\nimport { copy } from \"../../libs/i18n/index.js\";\nimport { UsersRepository } from \"../../libs/repositories/index.js\";\nimport type { LucidAuth } from \"../../types/hono.js\";\nimport { normalizeEmailInput } from \"../../utils/helpers/normalize-input.js\";\nimport type { ServiceFn } from \"../../utils/services/types.js\";\nimport { invalidateAuthCache } from \"../auth/helpers/auth-cache.js\";\nimport { accountServices, securityAuditServices } from \"../index.js\";\n\nconst updateMe: ServiceFn<\n\t[\n\t\t{\n\t\t\tauth: LucidAuth;\n\t\t\tfirstName?: string;\n\t\t\tlastName?: string;\n\t\t\tusername?: string;\n\t\t\temail?: string;\n\t\t\tcurrentPassword?: string;\n\t\t\tnewPassword?: string;\n\t\t\tpasswordConfirmation?: string;\n\t\t},\n\t],\n\tundefined\n> = async (context, data) => {\n\tif (data.newPassword && context.config.auth.password.enabled === false) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tstatus: 400,\n\t\t\t\tmessage: copy(\n\t\t\t\t\t\"server:core.auth.password.authentication.disabled.message\",\n\t\t\t\t),\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst Users = new UsersRepository(context.db.client, context.config.db);\n\tconst normalizedEmail =\n\t\tdata.email !== undefined ? normalizeEmailInput(data.email) : undefined;\n\n\tconst getUserRes = await Users.selectSingle({\n\t\tselect: [\"super_admin\", \"password\", \"first_name\", \"secret\", \"email\"],\n\t\twhere: [\n\t\t\t{\n\t\t\t\tkey: \"id\",\n\t\t\t\toperator: \"=\",\n\t\t\t\tvalue: data.auth.id,\n\t\t\t},\n\t\t],\n\t\tvalidation: {\n\t\t\tenabled: true,\n\t\t\tdefaultError: {\n\t\t\t\tmessage: copy(\"server:core.account.not.found.message\"),\n\t\t\t\tstatus: 404,\n\t\t\t},\n\t\t},\n\t});\n\tif (getUserRes.error) return getUserRes;\n\n\tconst emailChanged =\n\t\tnormalizedEmail !== undefined && normalizedEmail !== getUserRes.data.email;\n\n\tconst [userWithUsername, updatePassword] = await Promise.all([\n\t\tdata.username !== undefined\n\t\t\t? Users.selectSingle({\n\t\t\t\t\tselect: [\"id\"],\n\t\t\t\t\twhere: [\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: \"username\",\n\t\t\t\t\t\t\toperator: \"=\",\n\t\t\t\t\t\t\tvalue: data.username,\n\t\t\t\t\t\t},\n\t\t\t\t\t\t{\n\t\t\t\t\t\t\tkey: \"id\",\n\t\t\t\t\t\t\toperator: \"!=\",\n\t\t\t\t\t\t\tvalue: data.auth.id,\n\t\t\t\t\t\t},\n\t\t\t\t\t],\n\t\t\t\t})\n\t\t\t: undefined,\n\t\taccountServices.checks.checkUpdatePassword(context, {\n\t\t\tencryptedSecret: getUserRes.data.secret,\n\t\t\tpassword: getUserRes.data.password,\n\t\t\tcurrentPassword: data.currentPassword,\n\t\t\tnewPassword: data.newPassword,\n\t\t\tpasswordConfirmation: data.passwordConfirmation,\n\t\t\tencryptionKey: context.config.secrets.encryption,\n\t\t}),\n\t]);\n\tif (userWithUsername?.error) return userWithUsername;\n\tif (updatePassword.error) return updatePassword;\n\n\tif (data.username !== undefined && userWithUsername?.data !== undefined) {\n\t\treturn {\n\t\t\terror: {\n\t\t\t\ttype: \"basic\",\n\t\t\t\tstatus: 400,\n\t\t\t\terrors: {\n\t\t\t\t\tusername: {\n\t\t\t\t\t\tcode: \"invalid\",\n\t\t\t\t\t\tmessage: copy(\"server:core.users.username.duplicate\"),\n\t\t\t\t\t},\n\t\t\t\t},\n\t\t\t},\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\tconst [updateMeRes, updatePasswordAuditRes] = await Promise.all([\n\t\tUsers.updateSingle({\n\t\t\tdata: {\n\t\t\t\tfirst_name: data.firstName,\n\t\t\t\tlast_name: data.lastName,\n\t\t\t\tusername: data.username,\n\t\t\t\tupdated_at: new Date().toISOString(),\n\t\t\t\tpassword: updatePassword.data.newPassword,\n\t\t\t\tsecret: updatePassword.data.encryptSecret,\n\t\t\t\ttriggered_password_reset: updatePassword.data.triggerPasswordReset,\n\t\t\t},\n\t\t\twhere: [\n\t\t\t\t{\n\t\t\t\t\tkey: \"id\",\n\t\t\t\t\toperator: \"=\",\n\t\t\t\t\tvalue: data.auth.id,\n\t\t\t\t},\n\t\t\t],\n\t\t\treturning: [\"id\", \"first_name\", \"last_name\", \"email\"],\n\t\t\tvalidation: {\n\t\t\t\tenabled: true,\n\t\t\t\tdefaultError: {\n\t\t\t\t\tmessage: copy(\"server:core.routes.user.me.update.error.message\"),\n\t\t\t\t\tstatus: 400,\n\t\t\t\t},\n\t\t\t},\n\t\t}),\n\t\tupdatePassword.data.newPassword !== undefined\n\t\t\t? securityAuditServices.logSecurityAudit(context, {\n\t\t\t\t\tuserId: data.auth.id,\n\t\t\t\t\taction: constants.securityAudit.actions.passwordChange,\n\t\t\t\t\tperformedBy: data.auth.id,\n\t\t\t\t\tpreviousValue: constants.securityAudit.redactedValue,\n\t\t\t\t\tnewValue: constants.securityAudit.redactedValue,\n\t\t\t\t})\n\t\t\t: undefined,\n\t]);\n\n\tawait invalidateAuthCache(context);\n\n\tif (updateMeRes.error) return updateMeRes;\n\tif (updatePasswordAuditRes?.error) return updatePasswordAuditRes;\n\n\tif (emailChanged) {\n\t\tconst requestEmailChangeRes = await accountServices.requestEmailChange(\n\t\t\tcontext,\n\t\t\t{\n\t\t\t\tauth: data.auth,\n\t\t\t\toldEmail: getUserRes.data.email,\n\t\t\t\tnewEmail: normalizedEmail as string,\n\t\t\t\tfirstName: updateMeRes.data.first_name,\n\t\t\t\tlastName: updateMeRes.data.last_name,\n\t\t\t},\n\t\t);\n\t\tif (requestEmailChangeRes.error) return requestEmailChangeRes;\n\t}\n\n\tif (getUserRes.data.super_admin === 0) {\n\t\treturn {\n\t\t\terror: undefined,\n\t\t\tdata: undefined,\n\t\t};\n\t}\n\n\t// super admin specific\n\n\treturn {\n\t\terror: undefined,\n\t\tdata: undefined,\n\t};\n};\n\nexport default updateMe;\n"],"mappings":"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"}