@things-factory/contact 10.1.29 → 10.1.32

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.
@@ -6,7 +6,14 @@ const auth_base_1 = require("@things-factory/auth-base");
6
6
  const shell_1 = require("@things-factory/shell");
7
7
  const env_1 = require("@things-factory/env");
8
8
  const contact_1 = require("../service/contact/contact");
9
- const { defaultPassword } = env_1.config.get('password');
9
+ /*
10
+ * 기본값 `{}` 없이 구조 분해하면 **모듈을 읽는 순간** 던진다 — 함수가 불리는 때가 아니라 import 때다.
11
+ * `password` 절은 `auth-base` 가 자기 `config.<mode>.js` 로 싣고 있어 development · production 에서는
12
+ * 값이 있지만, 그 두 모드 밖에서는 없다. 앱의 시험이 organization 을 지나는 그래프를 읽으면 그 자리에서
13
+ * 통째로 멈춘다(operato-plant, 2026-09-19). 값이 없을 때의 길은 아래 44 줄이 이미 갖고 있다.
14
+ * `auth-base` 의 `user.ts` 도 같은 자리에 같은 대비를 두고 있다.
15
+ */
16
+ const { defaultPassword } = env_1.config.get('password', {});
10
17
  async function registerContactAsSystemUser({ contactId, roleName }, context) {
11
18
  const { domain, user, tx } = context.state;
12
19
  const contactRepository = (0, shell_1.getRepository)(contact_1.Contact, tx);
@@ -1 +1 @@
1
- {"version":3,"file":"register-contact-as-system-user.js","sourceRoot":"","sources":["../../server/controllers/register-contact-as-system-user.ts"],"names":[],"mappings":"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","sourcesContent":["import { ILike } from 'typeorm'\nimport { Role, User, UserStatus } from '@things-factory/auth-base'\nimport { getRepository } from '@things-factory/shell'\nimport { config } from '@things-factory/env'\nimport { Contact, ContactField } from '../service/contact/contact'\n\nconst { defaultPassword } = config.get('password')\n\nexport async function registerContactAsSystemUser(\n { contactId, roleName }: { contactId: string; roleName?: string },\n context: ResolverContext\n) {\n const { domain, user, tx } = context.state\n\n const contactRepository = getRepository(Contact, tx)\n\n const contact = await contactRepository.findOne({\n where: {\n id: contactId,\n domain: { id: domain.id }\n }\n })\n\n if (!contact) {\n throw new Error(context.t('error.contact-not-found', { contactId }))\n }\n\n const email = contact.getContactItem(ContactField.Email, 'work')\n\n if (!email) {\n throw new Error(context.t('error.contact-email-not-set', { contactId }))\n }\n\n const userRepository = getRepository(User, tx)\n const existingUser = await userRepository.findOne({\n where: { email: ILike(email) },\n relations: ['domains', 'roles']\n })\n\n if (existingUser && !existingUser.domains.find(d => d.id === domain.id)) {\n existingUser.domains = [...existingUser.domains, domain]\n }\n\n if (!existingUser && !defaultPassword) {\n throw new Error(context.t('error.contact-initial-password-required'))\n }\n\n const salt = !existingUser && User.generateSalt()\n\n const newUser: Partial<User> = existingUser\n ? existingUser\n : {\n name: contact.name,\n email,\n userType: 'user',\n domains: [domain],\n status: UserStatus.ACTIVATED,\n salt,\n passwordUpdatedAt: new Date(),\n password: User.encode(defaultPassword, salt),\n updater: user,\n creator: user\n }\n\n if (roleName) {\n const roleRepository = getRepository(Role, tx)\n const role = await roleRepository.findOne({\n where: {\n name: roleName,\n domain: { id: domain.id }\n }\n })\n\n if (!role) {\n throw new Error(context.t('error.contact-role-not-found', { roleName }))\n }\n\n if (newUser.roles) {\n if (!newUser.roles.find(role => role.name == roleName)) {\n newUser.roles = [...newUser.roles, role]\n }\n } else {\n newUser.roles = [role]\n }\n }\n\n return await userRepository.save(newUser)\n}\n"]}
1
+ {"version":3,"file":"register-contact-as-system-user.js","sourceRoot":"","sources":["../../server/controllers/register-contact-as-system-user.ts"],"names":[],"mappings":"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","sourcesContent":["import { ILike } from 'typeorm'\nimport { Role, User, UserStatus } from '@things-factory/auth-base'\nimport { getRepository } from '@things-factory/shell'\nimport { config } from '@things-factory/env'\nimport { Contact, ContactField } from '../service/contact/contact'\n\n/*\n * 기본값 `{}` 없이 구조 분해하면 **모듈을 읽는 순간** 던진다 — 함수가 불리는 때가 아니라 import 때다.\n * `password` 절은 `auth-base` 가 자기 `config.<mode>.js` 로 싣고 있어 development · production 에서는\n * 값이 있지만, 그 두 모드 밖에서는 없다. 앱의 시험이 organization 을 지나는 그래프를 읽으면 그 자리에서\n * 통째로 멈춘다(operato-plant, 2026-09-19). 값이 없을 때의 길은 아래 44 줄이 이미 갖고 있다.\n * `auth-base` 의 `user.ts` 도 같은 자리에 같은 대비를 두고 있다.\n */\nconst { defaultPassword } = config.get('password', {})\n\nexport async function registerContactAsSystemUser(\n { contactId, roleName }: { contactId: string; roleName?: string },\n context: ResolverContext\n) {\n const { domain, user, tx } = context.state\n\n const contactRepository = getRepository(Contact, tx)\n\n const contact = await contactRepository.findOne({\n where: {\n id: contactId,\n domain: { id: domain.id }\n }\n })\n\n if (!contact) {\n throw new Error(context.t('error.contact-not-found', { contactId }))\n }\n\n const email = contact.getContactItem(ContactField.Email, 'work')\n\n if (!email) {\n throw new Error(context.t('error.contact-email-not-set', { contactId }))\n }\n\n const userRepository = getRepository(User, tx)\n const existingUser = await userRepository.findOne({\n where: { email: ILike(email) },\n relations: ['domains', 'roles']\n })\n\n if (existingUser && !existingUser.domains.find(d => d.id === domain.id)) {\n existingUser.domains = [...existingUser.domains, domain]\n }\n\n if (!existingUser && !defaultPassword) {\n throw new Error(context.t('error.contact-initial-password-required'))\n }\n\n const salt = !existingUser && User.generateSalt()\n\n const newUser: Partial<User> = existingUser\n ? existingUser\n : {\n name: contact.name,\n email,\n userType: 'user',\n domains: [domain],\n status: UserStatus.ACTIVATED,\n salt,\n passwordUpdatedAt: new Date(),\n password: User.encode(defaultPassword, salt),\n updater: user,\n creator: user\n }\n\n if (roleName) {\n const roleRepository = getRepository(Role, tx)\n const role = await roleRepository.findOne({\n where: {\n name: roleName,\n domain: { id: domain.id }\n }\n })\n\n if (!role) {\n throw new Error(context.t('error.contact-role-not-found', { roleName }))\n }\n\n if (newUser.roles) {\n if (!newUser.roles.find(role => role.name == roleName)) {\n newUser.roles = [...newUser.roles, role]\n }\n } else {\n newUser.roles = [role]\n }\n }\n\n return await userRepository.save(newUser)\n}\n"]}