@things-factory/shell 10.0.0 → 10.0.4

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.
@@ -0,0 +1,5 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm';
2
+ export declare class IndexDomainOwner1785369600000 implements MigrationInterface {
3
+ up(queryRunner: QueryRunner): Promise<void>;
4
+ down(queryRunner: QueryRunner): Promise<void>;
5
+ }
@@ -0,0 +1,49 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.IndexDomainOwner1785369600000 = void 0;
4
+ const typeorm_1 = require("typeorm");
5
+ /**
6
+ * `domains.owner` 에 인덱스를 추가한다.
7
+ *
8
+ * 소유권으로 도메인을 찾는 조회(`owner = :userId`)가 인덱스 없이는 도메인 테이블을 훑는다.
9
+ * 체크인 가능 도메인 목록 계산이 이 조건을 쓰므로, 테넌트가 늘어나면 로그인 경로 비용이
10
+ * 도메인 수에 비례해 증가한다.
11
+ *
12
+ * - non-unique 다. 한 사용자가 여러 도메인을 소유할 수 있고 값이 비어 있을 수도 있으므로
13
+ * unique 로 만들면 기존 데이터에서 실패한다.
14
+ * - 데이터는 변경하지 않는다 (인덱스는 제약이 아니다). 되돌리기는 인덱스 삭제뿐이다.
15
+ * - idempotent — 같은 이름의 인덱스가 이미 있으면(엔티티 선언 + synchronize 로 생성된 경우 등)
16
+ * 아무것도 하지 않는다.
17
+ * - `TableIndex` API 만 사용하므로 지원 대상 드라이버가 각자의 DDL 로 생성한다.
18
+ */
19
+ const TABLE_NAME = 'domains';
20
+ const INDEX_NAME = 'ix_domain_1';
21
+ const COLUMN_NAMES = ['owner'];
22
+ class IndexDomainOwner1785369600000 {
23
+ async up(queryRunner) {
24
+ const table = await queryRunner.getTable(TABLE_NAME);
25
+ if (!table) {
26
+ return;
27
+ }
28
+ if (table.indices.some(index => index.name === INDEX_NAME)) {
29
+ return;
30
+ }
31
+ await queryRunner.createIndex(table, new typeorm_1.TableIndex({
32
+ name: INDEX_NAME,
33
+ columnNames: COLUMN_NAMES,
34
+ isUnique: false
35
+ }));
36
+ }
37
+ async down(queryRunner) {
38
+ const table = await queryRunner.getTable(TABLE_NAME);
39
+ if (!table) {
40
+ return;
41
+ }
42
+ if (!table.indices.some(index => index.name === INDEX_NAME)) {
43
+ return;
44
+ }
45
+ await queryRunner.dropIndex(table, INDEX_NAME);
46
+ }
47
+ }
48
+ exports.IndexDomainOwner1785369600000 = IndexDomainOwner1785369600000;
49
+ //# sourceMappingURL=1785369600000-IndexDomainOwner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"1785369600000-IndexDomainOwner.js","sourceRoot":"","sources":["../../server/migrations/1785369600000-IndexDomainOwner.ts"],"names":[],"mappings":";;;AAAA,qCAAqE;AAErE;;;;;;;;;;;;;GAaG;AACH,MAAM,UAAU,GAAG,SAAS,CAAA;AAC5B,MAAM,UAAU,GAAG,aAAa,CAAA;AAChC,MAAM,YAAY,GAAG,CAAC,OAAO,CAAC,CAAA;AAE9B,MAAa,6BAA6B;IACjC,KAAK,CAAC,EAAE,CAAC,WAAwB;QACtC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACpD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAM;QACR,CAAC;QAED,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;YAC3D,OAAM;QACR,CAAC;QAED,MAAM,WAAW,CAAC,WAAW,CAC3B,KAAK,EACL,IAAI,oBAAU,CAAC;YACb,IAAI,EAAE,UAAU;YAChB,WAAW,EAAE,YAAY;YACzB,QAAQ,EAAE,KAAK;SAChB,CAAC,CACH,CAAA;IACH,CAAC;IAEM,KAAK,CAAC,IAAI,CAAC,WAAwB;QACxC,MAAM,KAAK,GAAG,MAAM,WAAW,CAAC,QAAQ,CAAC,UAAU,CAAC,CAAA;QACpD,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,OAAM;QACR,CAAC;QAED,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,IAAI,KAAK,UAAU,CAAC,EAAE,CAAC;YAC5D,OAAM;QACR,CAAC;QAED,MAAM,WAAW,CAAC,SAAS,CAAC,KAAK,EAAE,UAAU,CAAC,CAAA;IAChD,CAAC;CACF;AAjCD,sEAiCC","sourcesContent":["import { MigrationInterface, QueryRunner, TableIndex } from 'typeorm'\n\n/**\n * `domains.owner` 에 인덱스를 추가한다.\n *\n * 소유권으로 도메인을 찾는 조회(`owner = :userId`)가 인덱스 없이는 도메인 테이블을 훑는다.\n * 체크인 가능 도메인 목록 계산이 이 조건을 쓰므로, 테넌트가 늘어나면 로그인 경로 비용이\n * 도메인 수에 비례해 증가한다.\n *\n * - non-unique 다. 한 사용자가 여러 도메인을 소유할 수 있고 값이 비어 있을 수도 있으므로\n * unique 로 만들면 기존 데이터에서 실패한다.\n * - 데이터는 변경하지 않는다 (인덱스는 제약이 아니다). 되돌리기는 인덱스 삭제뿐이다.\n * - idempotent — 같은 이름의 인덱스가 이미 있으면(엔티티 선언 + synchronize 로 생성된 경우 등)\n * 아무것도 하지 않는다.\n * - `TableIndex` API 만 사용하므로 지원 대상 드라이버가 각자의 DDL 로 생성한다.\n */\nconst TABLE_NAME = 'domains'\nconst INDEX_NAME = 'ix_domain_1'\nconst COLUMN_NAMES = ['owner']\n\nexport class IndexDomainOwner1785369600000 implements MigrationInterface {\n public async up(queryRunner: QueryRunner): Promise<void> {\n const table = await queryRunner.getTable(TABLE_NAME)\n if (!table) {\n return\n }\n\n if (table.indices.some(index => index.name === INDEX_NAME)) {\n return\n }\n\n await queryRunner.createIndex(\n table,\n new TableIndex({\n name: INDEX_NAME,\n columnNames: COLUMN_NAMES,\n isUnique: false\n })\n )\n }\n\n public async down(queryRunner: QueryRunner): Promise<void> {\n const table = await queryRunner.getTable(TABLE_NAME)\n if (!table) {\n return\n }\n\n if (!table.indices.some(index => index.name === INDEX_NAME)) {\n return\n }\n\n await queryRunner.dropIndex(table, INDEX_NAME)\n }\n}\n"]}
@@ -125,7 +125,18 @@ exports.Domain = Domain = tslib_1.__decorate([
125
125
  (0, typeorm_1.Index)('ix_domain_0', (domain) => [domain.subdomain, domain.deletedAt], {
126
126
  unique: true,
127
127
  where: '"deleted_at" IS NULL'
128
- }),
128
+ })
129
+ /*
130
+ * 소유권으로 도메인을 찾는 조회(`owner = :userId`)를 위한 인덱스.
131
+ * 체크인 가능 도메인 목록 계산이 이 조건을 쓰는데, 인덱스가 없으면 도메인 수에 비례해
132
+ * 테이블을 훑는다. 한 사용자가 여러 도메인을 소유할 수 있고 값이 비어 있을 수도 있으므로
133
+ * 반드시 non-unique 여야 한다.
134
+ *
135
+ * 기존 설치에는 `1785369600000-IndexDomainOwner` 마이그레이션이 같은 인덱스를 만든다
136
+ * (운영 설정은 `synchronize: false` 이므로 이 선언만으로는 반영되지 않는다).
137
+ */
138
+ ,
139
+ (0, typeorm_1.Index)('ix_domain_1', (domain) => [domain.owner]),
129
140
  (0, type_graphql_1.ObjectType)({
130
141
  description: 'Represents a domain entity, which is a logical grouping of users, roles, and resources within the system.'
131
142
  })
@@ -1 +1 @@
1
- {"version":3,"file":"domain.js","sourceRoot":"","sources":["../../../server/service/domain/domain.ts"],"names":[],"mappings":"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","sourcesContent":["import {\n Column,\n CreateDateColumn,\n ManyToOne,\n OneToMany,\n RelationId,\n Entity,\n Index,\n UpdateDateColumn,\n DeleteDateColumn,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Directive, Field, ID } from 'type-graphql'\nimport { ScalarObject } from '../common-types/scalar-object.js'\nimport { EnvVar } from '../env-var/env-var.js'\n// import { config } from '@things-factory/env'\n// import { encryptJsonTransformer } from '../../typeorm/encrypt-json-transform.js'\n\n// const ORMCONFIG = config.get('ormconfig', {})\n// const DATABASE_TYPE = ORMCONFIG.type\n\nexport type IPList = {\n whitelist?: string[]\n blacklist?: string[]\n protectedlist?: string[]\n privileges?: {\n category: string\n privilege: string\n }[]\n}\n\n@Entity()\n@Index('ix_domain_0', (domain: Domain) => [domain.subdomain, domain.deletedAt], {\n unique: true,\n where: '\"deleted_at\" IS NULL'\n})\n@ObjectType({\n description:\n 'Represents a domain entity, which is a logical grouping of users, roles, and resources within the system.'\n})\nexport class Domain {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'The unique identifier of the domain.' })\n readonly id: string\n\n @Field({ description: 'The name of the domain.' })\n @Column({ unique: true })\n name: string\n\n @Field({ nullable: true, description: 'A description of the domain.' })\n @Column({ nullable: true })\n description: string\n\n @Field({ nullable: true, description: 'The external type of the domain, if applicable.' })\n @Column({ nullable: true })\n extType: string\n\n @Field({ nullable: true, description: 'The timezone of the domain, if applicable.' })\n @Column({ nullable: true })\n timezone: string\n\n @Directive('@deprecated(reason: \"Use `parent`\")')\n @Field({\n nullable: true,\n description: 'A flag indicating if the domain is a system domain. Deprecated, use `parent` instead.'\n })\n @Column({ default: false })\n systemFlag: boolean\n\n @Field({ nullable: true, description: 'The subdomain of the domain, if applicable.' })\n @Column({ nullable: true })\n subdomain: string\n\n @Field({ nullable: true, description: 'The parent domain, if this domain is a subdomain.' })\n @ManyToOne(type => Domain, { nullable: true })\n parent: Domain\n\n @RelationId((domain: Domain) => domain.parent)\n parentId?: string\n\n @OneToMany(type => Domain, domain => domain.parent)\n @Field(type => Domain, { nullable: true, description: 'The child domains, if any, under this domain.' })\n children: Domain[]\n\n @OneToMany(type => EnvVar, envVar => envVar.domain)\n @Field(type => [EnvVar], { nullable: true, description: 'The environment variables associated with the domain.' })\n envVars: EnvVar[]\n\n @Field({ nullable: true, description: 'The brand name associated with the domain, if any.' })\n @Column({ nullable: true })\n brandName: string\n\n @Field({ nullable: true, description: 'The brand image URL associated with the domain, if any.' })\n @Column({ nullable: true })\n brandImage: string\n\n @Field({ nullable: true, description: 'The content image URL associated with the domain, if any.' })\n @Column({ nullable: true })\n contentImage: string\n\n @Field({ nullable: true, description: 'The owner of the domain, if applicable.' })\n @Column({ nullable: true })\n owner: string\n\n @Field({ nullable: true, description: 'The theme associated with the domain, if any.' })\n @Column({ nullable: true })\n theme: string\n\n @Column('simple-json', { nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description: 'A list of IPs and their associated access levels for the domain.'\n })\n iplist?: IPList\n\n // TODO: 암호화 처리가 필요하면, 이렇게 설정을 변경하라.\n // @Column({\n // type:\n // DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n // ? 'longtext'\n // : DATABASE_TYPE == 'oracle'\n // ? 'clob'\n // : DATABASE_TYPE == 'mssql'\n // ? 'nvarchar'\n // : 'text', // PostgreSQL, SQLite\n // length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined,\n // transformer: encryptJsonTransformer\n // })\n @Column('simple-json', { nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Additional attributes associated with the domain.' })\n attributes?: any\n\n @Field({ nullable: true, description: 'The date and time when the domain was created.' })\n @CreateDateColumn()\n createdAt: Date\n\n @Field({ nullable: true, description: 'The date and time when the domain was last updated.' })\n @UpdateDateColumn()\n updatedAt: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'The date and time when the domain was deleted, if applicable.' })\n deletedAt?: Date\n}\n"]}
1
+ {"version":3,"file":"domain.js","sourceRoot":"","sources":["../../../server/service/domain/domain.ts"],"names":[],"mappings":";;;;AAAA,qCAWgB;AAChB,+CAA+D;AAC/D,uEAA+D;AAC/D,sDAA8C;AAoCvC,IAAM,MAAM,GAAZ,MAAM,MAAM;CAuGlB,CAAA;AAvGY,wBAAM;AAGR;IAFR,IAAA,gCAAsB,EAAC,MAAM,CAAC;IAC9B,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,iBAAE,EAAE,EAAE,WAAW,EAAE,sCAAsC,EAAE,CAAC;;kCACxD;AAInB;IAFC,IAAA,oBAAK,EAAC,EAAE,WAAW,EAAE,yBAAyB,EAAE,CAAC;IACjD,IAAA,gBAAM,EAAC,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC;;oCACb;AAIZ;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;IACtE,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;2CACR;AAInB;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,iDAAiD,EAAE,CAAC;IACzF,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;uCACZ;AAIf;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,4CAA4C,EAAE,CAAC;IACpF,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;wCACX;AAQhB;IANC,IAAA,wBAAS,EAAC,qCAAqC,CAAC;IAChD,IAAA,oBAAK,EAAC;QACL,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,uFAAuF;KACrG,CAAC;IACD,IAAA,gBAAM,EAAC,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC;;0CACR;AAInB;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,6CAA6C,EAAE,CAAC;IACrF,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCACV;AAIjB;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC;IAC3F,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;sCACtC,MAAM;sCAAA;AAGd;IADC,IAAA,oBAAU,EAAC,CAAC,MAAc,EAAE,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;;wCAC7B;AAIjB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;IAClD,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,+CAA+C,EAAE,CAAC;;wCACtF;AAIlB;IAFC,IAAA,mBAAS,EAAC,IAAI,CAAC,EAAE,CAAC,mBAAM,EAAE,MAAM,CAAC,EAAE,CAAC,MAAM,CAAC,MAAM,CAAC;IAClD,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,CAAC,mBAAM,CAAC,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,uDAAuD,EAAE,CAAC;;uCACjG;AAIjB;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,oDAAoD,EAAE,CAAC;IAC5F,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;yCACV;AAIjB;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,yDAAyD,EAAE,CAAC;IACjG,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;0CACT;AAIlB;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,2DAA2D,EAAE,CAAC;IACnG,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;4CACP;AAIpB;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;IACjF,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qCACd;AAIb;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,+CAA+C,EAAE,CAAC;IACvF,IAAA,gBAAM,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;;qCACd;AAOb;IALC,IAAA,gBAAM,EAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,+BAAY,EAAE;QAC3B,QAAQ,EAAE,IAAI;QACd,WAAW,EAAE,kEAAkE;KAChF,CAAC;;sCACa;AAiBf;IAFC,IAAA,gBAAM,EAAC,aAAa,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC;IACzC,IAAA,oBAAK,EAAC,IAAI,CAAC,EAAE,CAAC,+BAAY,EAAE,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,mDAAmD,EAAE,CAAC;;0CAClG;AAIhB;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,gDAAgD,EAAE,CAAC;IACxF,IAAA,0BAAgB,GAAE;sCACR,IAAI;yCAAA;AAIf;IAFC,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,qDAAqD,EAAE,CAAC;IAC7F,IAAA,0BAAgB,GAAE;sCACR,IAAI;yCAAA;AAIf;IAFC,IAAA,0BAAgB,GAAE;IAClB,IAAA,oBAAK,EAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,WAAW,EAAE,+DAA+D,EAAE,CAAC;sCAC5F,IAAI;yCAAA;iBAtGL,MAAM;IAnBlB,IAAA,gBAAM,GAAE;IACR,IAAA,eAAK,EAAC,aAAa,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,SAAS,EAAE,MAAM,CAAC,SAAS,CAAC,EAAE;QAC9E,MAAM,EAAE,IAAI;QACZ,KAAK,EAAE,sBAAsB;KAC9B,CAAC;IACF;;;;;;;;OAQG;;IACF,IAAA,eAAK,EAAC,aAAa,EAAE,CAAC,MAAc,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACxD,IAAA,yBAAU,EAAC;QACV,WAAW,EACT,2GAA2G;KAC9G,CAAC;GACW,MAAM,CAuGlB","sourcesContent":["import {\n Column,\n CreateDateColumn,\n ManyToOne,\n OneToMany,\n RelationId,\n Entity,\n Index,\n UpdateDateColumn,\n DeleteDateColumn,\n PrimaryGeneratedColumn\n} from 'typeorm'\nimport { ObjectType, Directive, Field, ID } from 'type-graphql'\nimport { ScalarObject } from '../common-types/scalar-object.js'\nimport { EnvVar } from '../env-var/env-var.js'\n// import { config } from '@things-factory/env'\n// import { encryptJsonTransformer } from '../../typeorm/encrypt-json-transform.js'\n\n// const ORMCONFIG = config.get('ormconfig', {})\n// const DATABASE_TYPE = ORMCONFIG.type\n\nexport type IPList = {\n whitelist?: string[]\n blacklist?: string[]\n protectedlist?: string[]\n privileges?: {\n category: string\n privilege: string\n }[]\n}\n\n@Entity()\n@Index('ix_domain_0', (domain: Domain) => [domain.subdomain, domain.deletedAt], {\n unique: true,\n where: '\"deleted_at\" IS NULL'\n})\n/*\n * 소유권으로 도메인을 찾는 조회(`owner = :userId`)를 위한 인덱스.\n * 체크인 가능 도메인 목록 계산이 이 조건을 쓰는데, 인덱스가 없으면 도메인 수에 비례해\n * 테이블을 훑는다. 한 사용자가 여러 도메인을 소유할 수 있고 값이 비어 있을 수도 있으므로\n * 반드시 non-unique 여야 한다.\n *\n * 기존 설치에는 `1785369600000-IndexDomainOwner` 마이그레이션이 같은 인덱스를 만든다\n * (운영 설정은 `synchronize: false` 이므로 이 선언만으로는 반영되지 않는다).\n */\n@Index('ix_domain_1', (domain: Domain) => [domain.owner])\n@ObjectType({\n description:\n 'Represents a domain entity, which is a logical grouping of users, roles, and resources within the system.'\n})\nexport class Domain {\n @PrimaryGeneratedColumn('uuid')\n @Field(type => ID, { description: 'The unique identifier of the domain.' })\n readonly id: string\n\n @Field({ description: 'The name of the domain.' })\n @Column({ unique: true })\n name: string\n\n @Field({ nullable: true, description: 'A description of the domain.' })\n @Column({ nullable: true })\n description: string\n\n @Field({ nullable: true, description: 'The external type of the domain, if applicable.' })\n @Column({ nullable: true })\n extType: string\n\n @Field({ nullable: true, description: 'The timezone of the domain, if applicable.' })\n @Column({ nullable: true })\n timezone: string\n\n @Directive('@deprecated(reason: \"Use `parent`\")')\n @Field({\n nullable: true,\n description: 'A flag indicating if the domain is a system domain. Deprecated, use `parent` instead.'\n })\n @Column({ default: false })\n systemFlag: boolean\n\n @Field({ nullable: true, description: 'The subdomain of the domain, if applicable.' })\n @Column({ nullable: true })\n subdomain: string\n\n @Field({ nullable: true, description: 'The parent domain, if this domain is a subdomain.' })\n @ManyToOne(type => Domain, { nullable: true })\n parent: Domain\n\n @RelationId((domain: Domain) => domain.parent)\n parentId?: string\n\n @OneToMany(type => Domain, domain => domain.parent)\n @Field(type => Domain, { nullable: true, description: 'The child domains, if any, under this domain.' })\n children: Domain[]\n\n @OneToMany(type => EnvVar, envVar => envVar.domain)\n @Field(type => [EnvVar], { nullable: true, description: 'The environment variables associated with the domain.' })\n envVars: EnvVar[]\n\n @Field({ nullable: true, description: 'The brand name associated with the domain, if any.' })\n @Column({ nullable: true })\n brandName: string\n\n @Field({ nullable: true, description: 'The brand image URL associated with the domain, if any.' })\n @Column({ nullable: true })\n brandImage: string\n\n @Field({ nullable: true, description: 'The content image URL associated with the domain, if any.' })\n @Column({ nullable: true })\n contentImage: string\n\n @Field({ nullable: true, description: 'The owner of the domain, if applicable.' })\n @Column({ nullable: true })\n owner: string\n\n @Field({ nullable: true, description: 'The theme associated with the domain, if any.' })\n @Column({ nullable: true })\n theme: string\n\n @Column('simple-json', { nullable: true })\n @Field(type => ScalarObject, {\n nullable: true,\n description: 'A list of IPs and their associated access levels for the domain.'\n })\n iplist?: IPList\n\n // TODO: 암호화 처리가 필요하면, 이렇게 설정을 변경하라.\n // @Column({\n // type:\n // DATABASE_TYPE == 'mysql' || DATABASE_TYPE == 'mariadb'\n // ? 'longtext'\n // : DATABASE_TYPE == 'oracle'\n // ? 'clob'\n // : DATABASE_TYPE == 'mssql'\n // ? 'nvarchar'\n // : 'text', // PostgreSQL, SQLite\n // length: DATABASE_TYPE == 'mssql' ? 'MAX' : undefined,\n // transformer: encryptJsonTransformer\n // })\n @Column('simple-json', { nullable: true })\n @Field(type => ScalarObject, { nullable: true, description: 'Additional attributes associated with the domain.' })\n attributes?: any\n\n @Field({ nullable: true, description: 'The date and time when the domain was created.' })\n @CreateDateColumn()\n createdAt: Date\n\n @Field({ nullable: true, description: 'The date and time when the domain was last updated.' })\n @UpdateDateColumn()\n updatedAt: Date\n\n @DeleteDateColumn()\n @Field({ nullable: true, description: 'The date and time when the domain was deleted, if applicable.' })\n deletedAt?: Date\n}\n"]}
@@ -46,7 +46,12 @@ let EnvVarMutation = class EnvVarMutation {
46
46
  if (_updateRecords.length > 0) {
47
47
  for (let i = 0; i < _updateRecords.length; i++) {
48
48
  const updateRecord = _updateRecords[i];
49
- const envVar = await envVarRepo.findOneBy({ id: updateRecord.id });
49
+ const envVar = await envVarRepo.findOne({
50
+ where: { domain: { id: domain.id }, id: updateRecord.id }
51
+ });
52
+ if (!envVar) {
53
+ throw new Error(`failed to find envVar to update: ${updateRecord.id}`);
54
+ }
50
55
  const result = await envVarRepo.save({
51
56
  ...envVar,
52
57
  ...updateRecord
@@ -1 +1 @@
1
- {"version":3,"file":"env-var-mutation.js","sourceRoot":"","sources":["../../../server/service/env-var/env-var-mutation.ts"],"names":[],"mappings":";;;;AAAA,+CAAsE;AACtE,gEAA8D;AAC9D,qCAA4B;AAE5B,uCAAkC;AAClC,iDAAuD;AAGhD,IAAM,cAAc,GAApB,MAAM,cAAc;IAInB,AAAN,KAAK,CAAC,YAAY,CAAgB,MAAiB,EAAS,OAAY;QACtE,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAC1C,MAAM,UAAU,GAAG,IAAA,2BAAa,EAAS,gBAAM,EAAE,EAAE,CAAC,CAAA;QAEpD,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC;YAC3B,GAAG,MAAM;YACT,MAAM;SACP,CAAC,CAAA;IACJ,CAAC;IAKK,AAAN,KAAK,CAAC,YAAY,CAAY,EAAU,EAAiB,MAAmB,EAAS,OAAY;QAC/F,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,MAAM,UAAU,GAAG,IAAA,2BAAa,EAAC,gBAAM,EAAE,EAAE,CAAC,CAAA;QAE5C,MAAM,cAAc,GAAG,MAAM,UAAU,CAAC,OAAO,CAAC;YAC9C,KAAK,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE;SACzC,CAAC,CAAA;QAEF,IAAI,CAAC,cAAc,EAAE,CAAC;YACpB,MAAM,IAAI,KAAK,CAAC,gCAAgC,CAAC,CAAA;QACnD,CAAC;QAED,OAAO,MAAM,UAAU,CAAC,IAAI,CAAC,cAAc,CAAC,CAAA;IAC9C,CAAC;IAKK,AAAN,KAAK,CAAC,qBAAqB,CACc,OAAsB,EACtD,OAAY;QAEnB,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAE1C,IAAI,OAAO,GAAG,EAAE,CAAA;QAChB,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAA;QACzF,MAAM,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC,CAAC,KAAU,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,WAAW,EAAE,KAAK,GAAG,CAAC,CAAA;QACzF,MAAM,UAAU,GAAG,EAAE,CAAC,aAAa,CAAC,gBAAM,CAAC,CAAA;QAE3C,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,SAAS,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;gBAEnC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC;oBACnC,GAAG,SAAS;oBACZ,MAAM;iBACP,CAAC,CAAA;gBAEF,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QAED,IAAI,cAAc,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9B,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,cAAc,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBAC/C,MAAM,YAAY,GAAG,cAAc,CAAC,CAAC,CAAC,CAAA;gBACtC,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,SAAS,CAAC,EAAE,EAAE,EAAE,YAAY,CAAC,EAAE,EAAE,CAAC,CAAA;gBAElE,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,IAAI,CAAC;oBACnC,GAAG,MAAM;oBACT,GAAG,YAAY;iBAChB,CAAC,CAAA;gBAEF,OAAO,CAAC,IAAI,CAAC,EAAE,GAAG,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,CAAC,CAAA;YAC1C,CAAC;QACH,CAAC;QAED,OAAO,OAAO,CAAA;IAChB,CAAC;IAKK,AAAN,KAAK,CAAC,YAAY,CAAY,EAAU,EAAS,OAAY;QAC3D,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEpC,MAAM,UAAU,GAAG,IAAA,2BAAa,EAAC,gBAAM,EAAE,EAAE,CAAC,CAAA;QAE5C,MAAM,MAAM,GAAG,MAAM,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC,CAAA;QAEzE,OAAO,IAAI,CAAA;IACb,CAAC;IAKK,AAAN,KAAK,CAAC,aAAa,CAA+B,GAAa,EAAS,OAAY;QAClF,MAAM,EAAE,MAAM,EAAE,EAAE,EAAE,GAAG,OAAO,CAAC,KAAK,CAAA;QAEpC,MAAM,EAAE,CAAC,aAAa,CAAC,gBAAM,CAAC,CAAC,MAAM,CAAC;YACpC,MAAM,EAAE,EAAE,EAAE,EAAE,MAAM,CAAC,EAAE,EAAE;YACzB,EAAE,EAAE,IAAA,YAAE,EAAC,GAAG,CAAC;SACZ,CAAC,CAAA;QAEF,OAAO,IAAI,CAAA;IACb,CAAC;CACF,CAAA;AAvGY,wCAAc;AAInB;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,gBAAM,EAAE,EAAE,WAAW,EAAE,sBAAsB,EAAE,CAAC;IACjD,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IAAqB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;6CAAjB,wBAAS;;kDAQlD;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,gBAAM,EAAE,EAAE,WAAW,EAAE,8BAA8B,EAAE,CAAC;IACzD,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,EAAC,QAAQ,CAAC,CAAA;IAAuB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;qDAAnB,0BAAW;;kDAc3E;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,CAAC,gBAAM,CAAC,EAAE,EAAE,WAAW,EAAE,yCAAyC,EAAE,CAAC;IAEvF,mBAAA,IAAA,kBAAG,EAAC,SAAS,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,0BAAW,CAAC,CAAC,CAAA;IACrC,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;2DAqCP;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,kBAAkB,EAAE,CAAC;IAC9C,mBAAA,IAAA,kBAAG,EAAC,IAAI,CAAC,CAAA;IAAc,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;kDAQ/C;AAKK;IAHL,IAAA,wBAAS,EAAC,cAAc,CAAC;IACzB,IAAA,wBAAS,EAAC,kFAAkF,CAAC;IAC7F,IAAA,uBAAQ,EAAC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,4BAA4B,EAAE,CAAC;IACvD,mBAAA,IAAA,kBAAG,EAAC,KAAK,EAAE,IAAI,CAAC,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAA;IAAiB,mBAAA,IAAA,kBAAG,GAAE,CAAA;;;;mDAStE;yBAtGU,cAAc;IAD1B,IAAA,uBAAQ,EAAC,gBAAM,CAAC;GACJ,cAAc,CAuG1B","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from '../../initializers/database.js'\nimport { In } from 'typeorm'\n\nimport { EnvVar } from './env-var'\nimport { NewEnvVar, EnvVarPatch } from './env-var-type'\n\n@Resolver(EnvVar)\nexport class EnvVarMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"env-var\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => EnvVar, { description: 'To create new EnvVar' })\n async createEnvVar(@Arg('envVar') envVar: NewEnvVar, @Ctx() context: any): Promise<EnvVar> {\n const { domain, user, tx } = context.state\n const repository = getRepository<EnvVar>(EnvVar, tx)\n\n return await repository.save({\n ...envVar,\n domain\n })\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"env-var\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => EnvVar, { description: 'To modify EnvVar information' })\n async updateEnvVar(@Arg('id') id: string, @Arg('envVar') envVar: EnvVarPatch, @Ctx() context: any): Promise<EnvVar> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(EnvVar, tx)\n\n const existingEnvVar = await repository.findOne({\n where: { id, domain: { id: domain.id } }\n })\n\n if (!existingEnvVar) {\n throw new Error('Environment variable not found')\n }\n\n return await repository.save(existingEnvVar)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"env-var\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [EnvVar], { description: \"To modify multiple EnvVars' information\" })\n async updateMultipleEnvVars(\n @Arg('patches', type => [EnvVarPatch]) patches: EnvVarPatch[],\n @Ctx() context: any\n ): Promise<EnvVar[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const envVarRepo = tx.getRepository(EnvVar)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await envVarRepo.save({\n ...newRecord,\n domain\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const envVar = await envVarRepo.findOneBy({ id: updateRecord.id })\n\n const result = await envVarRepo.save({\n ...envVar,\n ...updateRecord\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"env-var\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete EnvVar' })\n async deleteEnvVar(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {\n const { domain, tx } = context.state\n\n const repository = getRepository(EnvVar, tx)\n\n const envVar = await repository.delete({ domain: { id: domain.id }, id })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"env-var\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple EnvVars' })\n async deleteEnvVars(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(EnvVar).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n}\n"]}
1
+ {"version":3,"file":"env-var-mutation.js","sourceRoot":"","sources":["../../../server/service/env-var/env-var-mutation.ts"],"names":[],"mappings":"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","sourcesContent":["import { Resolver, Mutation, Arg, Ctx, Directive } from 'type-graphql'\nimport { getRepository } from '../../initializers/database.js'\nimport { In } from 'typeorm'\n\nimport { EnvVar } from './env-var'\nimport { NewEnvVar, EnvVarPatch } from './env-var-type'\n\n@Resolver(EnvVar)\nexport class EnvVarMutation {\n @Directive('@transaction')\n @Directive('@privilege(category: \"env-var\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => EnvVar, { description: 'To create new EnvVar' })\n async createEnvVar(@Arg('envVar') envVar: NewEnvVar, @Ctx() context: any): Promise<EnvVar> {\n const { domain, user, tx } = context.state\n const repository = getRepository<EnvVar>(EnvVar, tx)\n\n return await repository.save({\n ...envVar,\n domain\n })\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"env-var\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => EnvVar, { description: 'To modify EnvVar information' })\n async updateEnvVar(@Arg('id') id: string, @Arg('envVar') envVar: EnvVarPatch, @Ctx() context: any): Promise<EnvVar> {\n const { domain, user, tx } = context.state\n\n const repository = getRepository(EnvVar, tx)\n\n const existingEnvVar = await repository.findOne({\n where: { id, domain: { id: domain.id } }\n })\n\n if (!existingEnvVar) {\n throw new Error('Environment variable not found')\n }\n\n return await repository.save(existingEnvVar)\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"env-var\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => [EnvVar], { description: \"To modify multiple EnvVars' information\" })\n async updateMultipleEnvVars(\n @Arg('patches', type => [EnvVarPatch]) patches: EnvVarPatch[],\n @Ctx() context: any\n ): Promise<EnvVar[]> {\n const { domain, user, tx } = context.state\n\n let results = []\n const _createRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === '+')\n const _updateRecords = patches.filter((patch: any) => patch.cuFlag.toUpperCase() === 'M')\n const envVarRepo = tx.getRepository(EnvVar)\n\n if (_createRecords.length > 0) {\n for (let i = 0; i < _createRecords.length; i++) {\n const newRecord = _createRecords[i]\n\n const result = await envVarRepo.save({\n ...newRecord,\n domain\n })\n\n results.push({ ...result, cuFlag: '+' })\n }\n }\n\n if (_updateRecords.length > 0) {\n for (let i = 0; i < _updateRecords.length; i++) {\n const updateRecord = _updateRecords[i]\n const envVar = await envVarRepo.findOne({\n where: { domain: { id: domain.id }, id: updateRecord.id }\n })\n\n if (!envVar) {\n throw new Error(`failed to find envVar to update: ${updateRecord.id}`)\n }\n\n const result = await envVarRepo.save({\n ...envVar,\n ...updateRecord\n })\n\n results.push({ ...result, cuFlag: 'M' })\n }\n }\n\n return results\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"env-var\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete EnvVar' })\n async deleteEnvVar(@Arg('id') id: string, @Ctx() context: any): Promise<boolean> {\n const { domain, tx } = context.state\n\n const repository = getRepository(EnvVar, tx)\n\n const envVar = await repository.delete({ domain: { id: domain.id }, id })\n\n return true\n }\n\n @Directive('@transaction')\n @Directive('@privilege(category: \"env-var\", privilege: \"mutation\", domainOwnerGranted: true)')\n @Mutation(returns => Boolean, { description: 'To delete multiple EnvVars' })\n async deleteEnvVars(@Arg('ids', type => [String]) ids: string[], @Ctx() context: any): Promise<boolean> {\n const { domain, tx } = context.state\n\n await tx.getRepository(EnvVar).delete({\n domain: { id: domain.id },\n id: In(ids)\n })\n\n return true\n }\n}\n"]}