@spfn/cms 0.1.0-alpha.7 → 0.1.0-alpha.71
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.
- package/README.md +28 -416
- package/dist/{helpers/locale.actions.d.ts → actions-BpTAYuBA.d.ts} +70 -7
- package/dist/actions.d.ts +2 -9
- package/dist/actions.js +97 -10
- package/dist/actions.js.map +1 -1
- package/dist/api.d.ts +214 -0
- package/dist/api.js +353 -0
- package/dist/api.js.map +1 -0
- package/dist/client.d.ts +136 -127
- package/dist/client.js +1199 -59
- package/dist/client.js.map +1 -1
- package/dist/{types.d.ts → index-Dh5FjWzR.d.ts} +45 -7
- package/dist/index.d.ts +108 -16
- package/dist/index.js +610 -23
- package/dist/index.js.map +1 -1
- package/dist/label-sync-generator-B0EmvtWM.d.ts +32 -0
- package/dist/lib/contracts/labels.d.ts +151 -0
- package/dist/lib/contracts/labels.js +168 -0
- package/dist/lib/contracts/labels.js.map +1 -0
- package/dist/lib/contracts/published-cache.d.ts +48 -0
- package/dist/lib/contracts/published-cache.js +49 -0
- package/dist/lib/contracts/published-cache.js.map +1 -0
- package/dist/lib/contracts/values.d.ts +71 -0
- package/dist/lib/contracts/values.js +103 -0
- package/dist/lib/contracts/values.js.map +1 -0
- package/dist/locale.constants-BMBK70YM.d.ts +104 -0
- package/dist/{entities → server/entities}/cms-audit-logs.d.ts +15 -70
- package/dist/server/entities/cms-audit-logs.js +78 -0
- package/dist/server/entities/cms-audit-logs.js.map +1 -0
- package/dist/{entities → server/entities}/cms-draft-cache.d.ts +13 -73
- package/dist/server/entities/cms-draft-cache.js +38 -0
- package/dist/server/entities/cms-draft-cache.js.map +1 -0
- package/dist/{entities → server/entities}/cms-label-values.d.ts +16 -67
- package/dist/server/entities/cms-label-values.js +81 -0
- package/dist/server/entities/cms-label-values.js.map +1 -0
- package/dist/{entities → server/entities}/cms-label-versions.d.ts +16 -49
- package/dist/server/entities/cms-label-versions.js +76 -0
- package/dist/server/entities/cms-label-versions.js.map +1 -0
- package/dist/{entities → server/entities}/cms-labels.d.ts +17 -14
- package/dist/server/entities/cms-labels.js +42 -0
- package/dist/server/entities/cms-labels.js.map +1 -0
- package/dist/{entities → server/entities}/cms-published-cache.d.ts +14 -69
- package/dist/server/entities/cms-published-cache.js +36 -0
- package/dist/server/entities/cms-published-cache.js.map +1 -0
- package/dist/server/entities/index.d.ts +7 -0
- package/dist/server/entities/index.js +218 -0
- package/dist/server/entities/index.js.map +1 -0
- package/dist/server/generators/index.d.ts +19 -0
- package/dist/server/generators/index.js +753 -0
- package/dist/server/generators/index.js.map +1 -0
- package/dist/server/labels/index.d.ts +1 -0
- package/dist/server/labels/index.js +32 -0
- package/dist/server/labels/index.js.map +1 -0
- package/dist/server/repositories/index.d.ts +209 -0
- package/dist/server/repositories/index.js +441 -0
- package/dist/server/repositories/index.js.map +1 -0
- package/dist/server/routes/labels/[id]/index.js +508 -0
- package/dist/server/routes/labels/[id]/index.js.map +1 -0
- package/dist/{routes/labels/[id] → server/routes/labels/_id_}/index.d.ts +5 -3
- package/dist/server/routes/labels/by-key/[key]/index.js +458 -0
- package/dist/server/routes/labels/by-key/[key]/index.js.map +1 -0
- package/dist/server/routes/labels/by-key/_key_/index.d.ts +10 -0
- package/dist/server/routes/labels/index.d.ts +12 -0
- package/dist/server/routes/labels/index.js +620 -0
- package/dist/server/routes/labels/index.js.map +1 -0
- package/dist/server/routes/published-cache/index.d.ts +11 -0
- package/dist/server/routes/published-cache/index.js +369 -0
- package/dist/server/routes/published-cache/index.js.map +1 -0
- package/dist/server/routes/values/[labelId]/[version]/index.js +479 -0
- package/dist/server/routes/values/[labelId]/[version]/index.js.map +1 -0
- package/dist/server/routes/values/[labelId]/index.js +474 -0
- package/dist/server/routes/values/[labelId]/index.js.map +1 -0
- package/dist/server/routes/values/_labelId_/_version_/index.d.ts +10 -0
- package/dist/server/routes/values/_labelId_/index.d.ts +10 -0
- package/dist/server.d.ts +78 -7
- package/dist/server.js +1750 -247
- package/dist/server.js.map +1 -1
- package/migrations/0000_init.sql +3 -0
- package/migrations/0001_far_lady_vermin.sql +86 -0
- package/migrations/0002_heavy_the_enforcers.sql +2 -0
- package/migrations/meta/0000_snapshot.json +15 -0
- package/migrations/meta/0001_snapshot.json +687 -0
- package/migrations/meta/0002_snapshot.json +686 -0
- package/migrations/meta/_journal.json +27 -0
- package/package.json +55 -36
- package/dist/actions.d.ts.map +0 -1
- package/dist/client.d.ts.map +0 -1
- package/dist/cms.config.d.ts +0 -77
- package/dist/cms.config.d.ts.map +0 -1
- package/dist/cms.config.js +0 -111
- package/dist/cms.config.js.map +0 -1
- package/dist/entities/cms-audit-logs.d.ts.map +0 -1
- package/dist/entities/cms-audit-logs.js +0 -103
- package/dist/entities/cms-audit-logs.js.map +0 -1
- package/dist/entities/cms-draft-cache.d.ts.map +0 -1
- package/dist/entities/cms-draft-cache.js +0 -112
- package/dist/entities/cms-draft-cache.js.map +0 -1
- package/dist/entities/cms-label-values.d.ts.map +0 -1
- package/dist/entities/cms-label-values.js +0 -105
- package/dist/entities/cms-label-values.js.map +0 -1
- package/dist/entities/cms-label-versions.d.ts.map +0 -1
- package/dist/entities/cms-label-versions.js +0 -80
- package/dist/entities/cms-label-versions.js.map +0 -1
- package/dist/entities/cms-labels.d.ts.map +0 -1
- package/dist/entities/cms-labels.js +0 -48
- package/dist/entities/cms-labels.js.map +0 -1
- package/dist/entities/cms-published-cache.d.ts.map +0 -1
- package/dist/entities/cms-published-cache.js +0 -103
- package/dist/entities/cms-published-cache.js.map +0 -1
- package/dist/entities/index.d.ts +0 -10
- package/dist/entities/index.d.ts.map +0 -1
- package/dist/entities/index.js +0 -10
- package/dist/entities/index.js.map +0 -1
- package/dist/generators/index.d.ts +0 -19
- package/dist/generators/index.d.ts.map +0 -1
- package/dist/generators/index.js +0 -19
- package/dist/generators/index.js.map +0 -1
- package/dist/generators/label-sync-generator.d.ts +0 -33
- package/dist/generators/label-sync-generator.d.ts.map +0 -1
- package/dist/generators/label-sync-generator.js +0 -87
- package/dist/generators/label-sync-generator.js.map +0 -1
- package/dist/helpers/locale.actions.d.ts.map +0 -1
- package/dist/helpers/locale.actions.js +0 -210
- package/dist/helpers/locale.actions.js.map +0 -1
- package/dist/helpers/locale.constants.d.ts +0 -10
- package/dist/helpers/locale.constants.d.ts.map +0 -1
- package/dist/helpers/locale.constants.js +0 -10
- package/dist/helpers/locale.constants.js.map +0 -1
- package/dist/helpers/locale.d.ts +0 -17
- package/dist/helpers/locale.d.ts.map +0 -1
- package/dist/helpers/locale.js +0 -20
- package/dist/helpers/locale.js.map +0 -1
- package/dist/helpers/sync.d.ts +0 -41
- package/dist/helpers/sync.d.ts.map +0 -1
- package/dist/helpers/sync.js +0 -309
- package/dist/helpers/sync.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/init.d.ts +0 -31
- package/dist/init.d.ts.map +0 -1
- package/dist/init.js +0 -36
- package/dist/init.js.map +0 -1
- package/dist/labels/helpers.d.ts +0 -31
- package/dist/labels/helpers.d.ts.map +0 -1
- package/dist/labels/helpers.js +0 -60
- package/dist/labels/helpers.js.map +0 -1
- package/dist/labels/index.d.ts +0 -7
- package/dist/labels/index.d.ts.map +0 -1
- package/dist/labels/index.js +0 -7
- package/dist/labels/index.js.map +0 -1
- package/dist/repositories/cms-draft-cache.repository.d.ts +0 -62
- package/dist/repositories/cms-draft-cache.repository.d.ts.map +0 -1
- package/dist/repositories/cms-draft-cache.repository.js +0 -56
- package/dist/repositories/cms-draft-cache.repository.js.map +0 -1
- package/dist/repositories/cms-label-values.repository.d.ts +0 -32
- package/dist/repositories/cms-label-values.repository.d.ts.map +0 -1
- package/dist/repositories/cms-label-values.repository.js +0 -72
- package/dist/repositories/cms-label-values.repository.js.map +0 -1
- package/dist/repositories/cms-labels.repository.d.ts +0 -53
- package/dist/repositories/cms-labels.repository.d.ts.map +0 -1
- package/dist/repositories/cms-labels.repository.js +0 -77
- package/dist/repositories/cms-labels.repository.js.map +0 -1
- package/dist/repositories/cms-published-cache.repository.d.ts +0 -53
- package/dist/repositories/cms-published-cache.repository.d.ts.map +0 -1
- package/dist/repositories/cms-published-cache.repository.js +0 -54
- package/dist/repositories/cms-published-cache.repository.js.map +0 -1
- package/dist/repositories/index.d.ts +0 -8
- package/dist/repositories/index.d.ts.map +0 -1
- package/dist/repositories/index.js +0 -9
- package/dist/repositories/index.js.map +0 -1
- package/dist/routes/labels/[id]/contract.d.ts +0 -68
- package/dist/routes/labels/[id]/contract.d.ts.map +0 -1
- package/dist/routes/labels/[id]/contract.js +0 -84
- package/dist/routes/labels/[id]/contract.js.map +0 -1
- package/dist/routes/labels/[id]/index.d.ts.map +0 -1
- package/dist/routes/labels/[id]/index.js +0 -96
- package/dist/routes/labels/[id]/index.js.map +0 -1
- package/dist/routes/labels/by-key/[key]/contract.d.ts +0 -24
- package/dist/routes/labels/by-key/[key]/contract.d.ts.map +0 -1
- package/dist/routes/labels/by-key/[key]/contract.js +0 -28
- package/dist/routes/labels/by-key/[key]/contract.js.map +0 -1
- package/dist/routes/labels/by-key/[key]/index.d.ts +0 -8
- package/dist/routes/labels/by-key/[key]/index.d.ts.map +0 -1
- package/dist/routes/labels/by-key/[key]/index.js +0 -32
- package/dist/routes/labels/by-key/[key]/index.js.map +0 -1
- package/dist/routes/labels/contract.d.ts +0 -59
- package/dist/routes/labels/contract.d.ts.map +0 -1
- package/dist/routes/labels/contract.js +0 -75
- package/dist/routes/labels/contract.js.map +0 -1
- package/dist/routes/labels/index.d.ts +0 -10
- package/dist/routes/labels/index.d.ts.map +0 -1
- package/dist/routes/labels/index.js +0 -73
- package/dist/routes/labels/index.js.map +0 -1
- package/dist/routes/published-cache/contract.d.ts +0 -25
- package/dist/routes/published-cache/contract.d.ts.map +0 -1
- package/dist/routes/published-cache/contract.js +0 -35
- package/dist/routes/published-cache/contract.js.map +0 -1
- package/dist/routes/published-cache/index.d.ts +0 -8
- package/dist/routes/published-cache/index.d.ts.map +0 -1
- package/dist/routes/published-cache/index.js +0 -33
- package/dist/routes/published-cache/index.js.map +0 -1
- package/dist/routes/values/[labelId]/[version]/contract.d.ts +0 -29
- package/dist/routes/values/[labelId]/[version]/contract.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/[version]/contract.js +0 -33
- package/dist/routes/values/[labelId]/[version]/contract.js.map +0 -1
- package/dist/routes/values/[labelId]/[version]/index.d.ts +0 -8
- package/dist/routes/values/[labelId]/[version]/index.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/[version]/index.js +0 -45
- package/dist/routes/values/[labelId]/[version]/index.js.map +0 -1
- package/dist/routes/values/[labelId]/contract.d.ts +0 -38
- package/dist/routes/values/[labelId]/contract.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/contract.js +0 -59
- package/dist/routes/values/[labelId]/contract.js.map +0 -1
- package/dist/routes/values/[labelId]/index.d.ts +0 -8
- package/dist/routes/values/[labelId]/index.d.ts.map +0 -1
- package/dist/routes/values/[labelId]/index.js +0 -42
- package/dist/routes/values/[labelId]/index.js.map +0 -1
- package/dist/server.d.ts.map +0 -1
- package/dist/store.d.ts +0 -87
- package/dist/store.d.ts.map +0 -1
- package/dist/store.js +0 -205
- package/dist/store.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js +0 -7
- package/dist/types.js.map +0 -1
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* CMS Label Values Entity
|
|
3
5
|
*
|
|
@@ -7,11 +9,11 @@
|
|
|
7
9
|
* - 버전 관리 (version)
|
|
8
10
|
* - JSONB로 유연한 값 저장
|
|
9
11
|
*/
|
|
10
|
-
|
|
12
|
+
declare const cmsLabelValues: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
11
13
|
name: "label_values";
|
|
12
14
|
schema: string;
|
|
13
15
|
columns: {
|
|
14
|
-
id:
|
|
16
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
15
17
|
name: "id";
|
|
16
18
|
tableName: "label_values";
|
|
17
19
|
dataType: "number";
|
|
@@ -28,7 +30,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
28
30
|
identity: undefined;
|
|
29
31
|
generated: undefined;
|
|
30
32
|
}, {}, {}>;
|
|
31
|
-
labelId:
|
|
33
|
+
labelId: drizzle_orm_pg_core.PgColumn<{
|
|
32
34
|
name: "label_id";
|
|
33
35
|
tableName: "label_values";
|
|
34
36
|
dataType: "number";
|
|
@@ -45,15 +47,15 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
45
47
|
identity: undefined;
|
|
46
48
|
generated: undefined;
|
|
47
49
|
}, {}, {}>;
|
|
48
|
-
version:
|
|
50
|
+
version: drizzle_orm_pg_core.PgColumn<{
|
|
49
51
|
name: "version";
|
|
50
52
|
tableName: "label_values";
|
|
51
53
|
dataType: "number";
|
|
52
54
|
columnType: "PgInteger";
|
|
53
55
|
data: number;
|
|
54
56
|
driverParam: string | number;
|
|
55
|
-
notNull:
|
|
56
|
-
hasDefault:
|
|
57
|
+
notNull: false;
|
|
58
|
+
hasDefault: false;
|
|
57
59
|
isPrimaryKey: false;
|
|
58
60
|
isAutoincrement: false;
|
|
59
61
|
hasRuntimeDefault: false;
|
|
@@ -62,7 +64,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
62
64
|
identity: undefined;
|
|
63
65
|
generated: undefined;
|
|
64
66
|
}, {}, {}>;
|
|
65
|
-
locale:
|
|
67
|
+
locale: drizzle_orm_pg_core.PgColumn<{
|
|
66
68
|
name: "locale";
|
|
67
69
|
tableName: "label_values";
|
|
68
70
|
dataType: "string";
|
|
@@ -79,7 +81,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
79
81
|
identity: undefined;
|
|
80
82
|
generated: undefined;
|
|
81
83
|
}, {}, {}>;
|
|
82
|
-
breakpoint:
|
|
84
|
+
breakpoint: drizzle_orm_pg_core.PgColumn<{
|
|
83
85
|
name: "breakpoint";
|
|
84
86
|
tableName: "label_values";
|
|
85
87
|
dataType: "string";
|
|
@@ -96,7 +98,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
96
98
|
identity: undefined;
|
|
97
99
|
generated: undefined;
|
|
98
100
|
}, {}, {}>;
|
|
99
|
-
value:
|
|
101
|
+
value: drizzle_orm_pg_core.PgColumn<{
|
|
100
102
|
name: "value";
|
|
101
103
|
tableName: "label_values";
|
|
102
104
|
dataType: "json";
|
|
@@ -113,7 +115,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
113
115
|
identity: undefined;
|
|
114
116
|
generated: undefined;
|
|
115
117
|
}, {}, {}>;
|
|
116
|
-
createdAt:
|
|
118
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
117
119
|
name: "created_at";
|
|
118
120
|
tableName: "label_values";
|
|
119
121
|
dataType: "date";
|
|
@@ -133,60 +135,7 @@ export declare const cmsLabelValues: import("drizzle-orm/pg-core").PgTableWithCo
|
|
|
133
135
|
};
|
|
134
136
|
dialect: "pg";
|
|
135
137
|
}>;
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
*
|
|
141
|
-
* // 텍스트 값 저장
|
|
142
|
-
* await db.insert(cmsLabelValues).values({
|
|
143
|
-
* labelId: 1,
|
|
144
|
-
* version: 1,
|
|
145
|
-
* locale: 'ko',
|
|
146
|
-
* breakpoint: null,
|
|
147
|
-
* value: {
|
|
148
|
-
* type: 'text',
|
|
149
|
-
* content: '미래를 만드는 기업'
|
|
150
|
-
* }
|
|
151
|
-
* });
|
|
152
|
-
*
|
|
153
|
-
* // 반응형 이미지 저장 (모바일용)
|
|
154
|
-
* await db.insert(cmsLabelValues).values({
|
|
155
|
-
* labelId: 2,
|
|
156
|
-
* version: 1,
|
|
157
|
-
* locale: 'ko',
|
|
158
|
-
* breakpoint: 'sm',
|
|
159
|
-
* value: {
|
|
160
|
-
* type: 'image',
|
|
161
|
-
* url: '/uploads/hero-mobile.jpg',
|
|
162
|
-
* alt: 'Hero Image',
|
|
163
|
-
* width: 640,
|
|
164
|
-
* height: 480
|
|
165
|
-
* }
|
|
166
|
-
* });
|
|
167
|
-
*
|
|
168
|
-
* // 특정 버전의 한국어 값 조회
|
|
169
|
-
* const values = await db.select()
|
|
170
|
-
* .from(cmsLabelValues)
|
|
171
|
-
* .where(and(
|
|
172
|
-
* eq(cmsLabelValues.labelId, 1),
|
|
173
|
-
* eq(cmsLabelValues.version, 2),
|
|
174
|
-
* eq(cmsLabelValues.locale, 'ko')
|
|
175
|
-
* ));
|
|
176
|
-
*
|
|
177
|
-
* // Object 타입 값 저장 (재귀 구조)
|
|
178
|
-
* await db.insert(cmsLabelValues).values({
|
|
179
|
-
* labelId: 3,
|
|
180
|
-
* version: 1,
|
|
181
|
-
* locale: 'ko',
|
|
182
|
-
* value: {
|
|
183
|
-
* type: 'object',
|
|
184
|
-
* fields: {
|
|
185
|
-
* title: { type: 'text', content: '특징 1' },
|
|
186
|
-
* icon: { type: 'image', url: '/icons/feature1.svg', alt: 'Icon' },
|
|
187
|
-
* description: { type: 'text', content: '상세 설명...' }
|
|
188
|
-
* }
|
|
189
|
-
* }
|
|
190
|
-
* });
|
|
191
|
-
*/
|
|
192
|
-
//# sourceMappingURL=cms-label-values.d.ts.map
|
|
138
|
+
type CmsLabelValue = typeof cmsLabelValues.$inferSelect;
|
|
139
|
+
type NewCmsLabelValue = typeof cmsLabelValues.$inferInsert;
|
|
140
|
+
|
|
141
|
+
export { type CmsLabelValue, type NewCmsLabelValue, cmsLabelValues };
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// src/server/entities/cms-label-values.ts
|
|
2
|
+
import { serial as serial2, integer as integer2, text as text2, jsonb, timestamp as timestamp2, index as index2, unique } from "drizzle-orm/pg-core";
|
|
3
|
+
import { createFunctionSchema as createFunctionSchema2 } from "@spfn/core/db";
|
|
4
|
+
|
|
5
|
+
// src/server/entities/cms-labels.ts
|
|
6
|
+
import { index, integer, serial, text, timestamp } from "drizzle-orm/pg-core";
|
|
7
|
+
import { createFunctionSchema } from "@spfn/core/db";
|
|
8
|
+
var schema = createFunctionSchema("@spfn/cms");
|
|
9
|
+
var cmsLabels = schema.table("labels", {
|
|
10
|
+
// Primary Key
|
|
11
|
+
id: serial("id").primaryKey(),
|
|
12
|
+
// 라벨 식별자
|
|
13
|
+
key: text("key").notNull().unique(),
|
|
14
|
+
// 예: "home.hero.title", "why-futureplay.hero.subtitle"
|
|
15
|
+
// 구조: {section}.{component}.{property}
|
|
16
|
+
// 섹션 분류 (페이지 단위)
|
|
17
|
+
section: text("section").notNull(),
|
|
18
|
+
// 예: "home", "why-futureplay", "team"
|
|
19
|
+
// 값 타입
|
|
20
|
+
type: text("type").notNull(),
|
|
21
|
+
// "text" | "image" | "video" | "file" | "object"
|
|
22
|
+
// 기본값
|
|
23
|
+
defaultValue: text("default_value"),
|
|
24
|
+
// 라벨의 기본값 (sync 시 설정)
|
|
25
|
+
// 설명
|
|
26
|
+
description: text("description"),
|
|
27
|
+
// 라벨에 대한 설명 (optional)
|
|
28
|
+
// 현재 발행된 버전 번호
|
|
29
|
+
publishedVersion: integer("published_version"),
|
|
30
|
+
// null = 미발행 상태
|
|
31
|
+
// 1, 2, 3... = 발행된 버전 번호
|
|
32
|
+
// 생성자 추적
|
|
33
|
+
createdBy: text("created_by"),
|
|
34
|
+
// 타임스탬프
|
|
35
|
+
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
36
|
+
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow()
|
|
37
|
+
}, (table) => [
|
|
38
|
+
// 인덱스: 섹션별 조회 최적화
|
|
39
|
+
index("cms_labels_section_idx").on(table.section),
|
|
40
|
+
// 인덱스: key로 조회 최적화 (unique 제약으로 자동 생성되지만 명시)
|
|
41
|
+
index("cms_labels_key_idx").on(table.key)
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
// src/server/entities/cms-label-values.ts
|
|
45
|
+
var schema2 = createFunctionSchema2("@spfn/cms");
|
|
46
|
+
var cmsLabelValues = schema2.table("label_values", {
|
|
47
|
+
// Primary Key
|
|
48
|
+
id: serial2("id").primaryKey(),
|
|
49
|
+
// Foreign Key: cms_labels
|
|
50
|
+
labelId: integer2("label_id").notNull().references(() => cmsLabels.id, { onDelete: "cascade" }),
|
|
51
|
+
// 버전 번호 (null = draft, number = published version)
|
|
52
|
+
version: integer2("version"),
|
|
53
|
+
// 언어 코드
|
|
54
|
+
locale: text2("locale").notNull().default("ko"),
|
|
55
|
+
// "ko" | "en" | "ja"
|
|
56
|
+
// 반응형 브레이크포인트
|
|
57
|
+
breakpoint: text2("breakpoint"),
|
|
58
|
+
// null = 기본값 (모든 화면 크기)
|
|
59
|
+
// "sm" | "md" | "lg" | "xl" | "2xl"
|
|
60
|
+
// 실제 값 (JSONB)
|
|
61
|
+
value: jsonb("value").notNull(),
|
|
62
|
+
// LabelValue 타입:
|
|
63
|
+
// - TextValue: { type: "text", content: string }
|
|
64
|
+
// - ImageValue: { type: "image", url: string, alt?: string, width?: number, height?: number }
|
|
65
|
+
// - VideoValue: { type: "video", url: string, thumbnail?: string, duration?: number }
|
|
66
|
+
// - FileValue: { type: "file", url: string, filename: string, size?: number }
|
|
67
|
+
// - ObjectValue: { type: "object", fields: Record<string, LabelValue> }
|
|
68
|
+
// 생성 시각
|
|
69
|
+
createdAt: timestamp2("created_at", { withTimezone: true }).notNull().defaultNow()
|
|
70
|
+
}, (table) => [
|
|
71
|
+
// UNIQUE 제약: 같은 버전에서 locale + breakpoint 조합은 유일
|
|
72
|
+
unique("cms_label_values_locale_breakpoint_unique").on(table.labelId, table.version, table.locale, table.breakpoint),
|
|
73
|
+
// 인덱스: labelId + version 복합 조회 최적화
|
|
74
|
+
index2("cms_label_values_label_version_idx").on(table.labelId, table.version),
|
|
75
|
+
// 인덱스: locale 필터링 최적화
|
|
76
|
+
index2("cms_label_values_locale_idx").on(table.locale)
|
|
77
|
+
]);
|
|
78
|
+
export {
|
|
79
|
+
cmsLabelValues
|
|
80
|
+
};
|
|
81
|
+
//# sourceMappingURL=cms-label-values.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/server/entities/cms-label-values.ts","../../../src/server/entities/cms-labels.ts"],"sourcesContent":["/**\n * CMS Label Values Entity\n *\n * 라벨의 실제 값을 저장합니다.\n * - 다국어 지원 (locale)\n * - 반응형 지원 (breakpoint)\n * - 버전 관리 (version)\n * - JSONB로 유연한 값 저장\n */\n\nimport { serial, integer, text, jsonb, timestamp, index, unique } from 'drizzle-orm/pg-core';\nimport { createFunctionSchema } from '@spfn/core/db';\nimport { cmsLabels } from '@/server/entities/cms-labels';\n\n// Create isolated schema for @spfn/cms\nconst schema = createFunctionSchema('@spfn/cms');\n\nexport const cmsLabelValues = schema.table('label_values', {\n // Primary Key\n id: serial('id').primaryKey(),\n\n // Foreign Key: cms_labels\n labelId: integer('label_id')\n .notNull()\n .references(() => cmsLabels.id, { onDelete: 'cascade' }),\n\n // 버전 번호 (null = draft, number = published version)\n version: integer('version'),\n\n // 언어 코드\n locale: text('locale').notNull().default('ko'),\n // \"ko\" | \"en\" | \"ja\"\n\n // 반응형 브레이크포인트\n breakpoint: text('breakpoint'),\n // null = 기본값 (모든 화면 크기)\n // \"sm\" | \"md\" | \"lg\" | \"xl\" | \"2xl\"\n\n // 실제 값 (JSONB)\n value: jsonb('value').notNull(),\n // LabelValue 타입:\n // - TextValue: { type: \"text\", content: string }\n // - ImageValue: { type: \"image\", url: string, alt?: string, width?: number, height?: number }\n // - VideoValue: { type: \"video\", url: string, thumbnail?: string, duration?: number }\n // - FileValue: { type: \"file\", url: string, filename: string, size?: number }\n // - ObjectValue: { type: \"object\", fields: Record<string, LabelValue> }\n\n // 생성 시각\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n}, (table) => [\n // UNIQUE 제약: 같은 버전에서 locale + breakpoint 조합은 유일\n unique('cms_label_values_locale_breakpoint_unique')\n .on(table.labelId, table.version, table.locale, table.breakpoint),\n\n // 인덱스: labelId + version 복합 조회 최적화\n index('cms_label_values_label_version_idx')\n .on(table.labelId, table.version),\n\n // 인덱스: locale 필터링 최적화\n index('cms_label_values_locale_idx').on(table.locale),\n]);\n\n// 타입 추론\nexport type CmsLabelValue = typeof cmsLabelValues.$inferSelect;\nexport type NewCmsLabelValue = typeof cmsLabelValues.$inferInsert;\n\n/**\n * 사용 예시:\n *\n * // 텍스트 값 저장\n * await db.insert(cmsLabelValues).values({\n * labelId: 1,\n * version: 1,\n * locale: 'ko',\n * breakpoint: null,\n * value: {\n * type: 'text',\n * content: '미래를 만드는 기업'\n * }\n * });\n *\n * // 반응형 이미지 저장 (모바일용)\n * await db.insert(cmsLabelValues).values({\n * labelId: 2,\n * version: 1,\n * locale: 'ko',\n * breakpoint: 'sm',\n * value: {\n * type: 'image',\n * url: '/uploads/hero-mobile.jpg',\n * alt: 'Hero Image',\n * width: 640,\n * height: 480\n * }\n * });\n *\n * // 특정 버전의 한국어 값 조회\n * const values = await db.select()\n * .from(cmsLabelValues)\n * .where(and(\n * eq(cmsLabelValues.labelId, 1),\n * eq(cmsLabelValues.version, 2),\n * eq(cmsLabelValues.locale, 'ko')\n * ));\n *\n * // Object 타입 값 저장 (재귀 구조)\n * await db.insert(cmsLabelValues).values({\n * labelId: 3,\n * version: 1,\n * locale: 'ko',\n * value: {\n * type: 'object',\n * fields: {\n * title: { type: 'text', content: '특징 1' },\n * icon: { type: 'image', url: '/icons/feature1.svg', alt: 'Icon' },\n * description: { type: 'text', content: '상세 설명...' }\n * }\n * }\n * });\n */","/**\n * CMS Labels Entity\n *\n * 라벨의 메타데이터와 현재 발행 상태를 관리합니다.\n * - 라벨 식별 (id, key)\n * - 섹션 분류 (section)\n * - 타입 정의 (type)\n * - 발행 상태 (publishedVersion)\n */\n\nimport { index, integer, serial, text, timestamp } from 'drizzle-orm/pg-core';\nimport { createFunctionSchema } from '@spfn/core/db';\n\n// Create isolated schema for @spfn/cms\nconst schema = createFunctionSchema('@spfn/cms');\n\nexport const cmsLabels = schema.table('labels', {\n // Primary Key\n id: serial('id').primaryKey(),\n\n // 라벨 식별자\n key: text('key').notNull().unique(),\n // 예: \"home.hero.title\", \"why-futureplay.hero.subtitle\"\n // 구조: {section}.{component}.{property}\n\n // 섹션 분류 (페이지 단위)\n section: text('section').notNull(),\n // 예: \"home\", \"why-futureplay\", \"team\"\n\n // 값 타입\n type: text('type').notNull(),\n // \"text\" | \"image\" | \"video\" | \"file\" | \"object\"\n\n // 기본값\n defaultValue: text('default_value'),\n // 라벨의 기본값 (sync 시 설정)\n\n // 설명\n description: text('description'),\n // 라벨에 대한 설명 (optional)\n\n // 현재 발행된 버전 번호\n publishedVersion: integer('published_version'),\n // null = 미발행 상태\n // 1, 2, 3... = 발행된 버전 번호\n\n // 생성자 추적\n createdBy: text('created_by'),\n\n // 타임스탬프\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),\n}, (table) => [\n // 인덱스: 섹션별 조회 최적화\n index('cms_labels_section_idx').on(table.section),\n\n // 인덱스: key로 조회 최적화 (unique 제약으로 자동 생성되지만 명시)\n index('cms_labels_key_idx').on(table.key),\n]);\n\n// 타입 추론\nexport type CmsLabel = typeof cmsLabels.$inferSelect;\nexport type NewCmsLabel = typeof cmsLabels.$inferInsert;"],"mappings":";AAUA,SAAS,UAAAA,SAAQ,WAAAC,UAAS,QAAAC,OAAM,OAAO,aAAAC,YAAW,SAAAC,QAAO,cAAc;AACvE,SAAS,wBAAAC,6BAA4B;;;ACDrC,SAAS,OAAO,SAAS,QAAQ,MAAM,iBAAiB;AACxD,SAAS,4BAA4B;AAGrC,IAAM,SAAS,qBAAqB,WAAW;AAExC,IAAM,YAAY,OAAO,MAAM,UAAU;AAAA;AAAA,EAE5C,IAAI,OAAO,IAAI,EAAE,WAAW;AAAA;AAAA,EAG5B,KAAK,KAAK,KAAK,EAAE,QAAQ,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA,EAKlC,SAAS,KAAK,SAAS,EAAE,QAAQ;AAAA;AAAA;AAAA,EAIjC,MAAM,KAAK,MAAM,EAAE,QAAQ;AAAA;AAAA;AAAA,EAI3B,cAAc,KAAK,eAAe;AAAA;AAAA;AAAA,EAIlC,aAAa,KAAK,aAAa;AAAA;AAAA;AAAA,EAI/B,kBAAkB,QAAQ,mBAAmB;AAAA;AAAA;AAAA;AAAA,EAK7C,WAAW,KAAK,YAAY;AAAA;AAAA,EAG5B,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAAA,EAChF,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AACpF,GAAG,CAAC,UAAU;AAAA;AAAA,EAEV,MAAM,wBAAwB,EAAE,GAAG,MAAM,OAAO;AAAA;AAAA,EAGhD,MAAM,oBAAoB,EAAE,GAAG,MAAM,GAAG;AAC5C,CAAC;;;AD3CD,IAAMC,UAASC,sBAAqB,WAAW;AAExC,IAAM,iBAAiBD,QAAO,MAAM,gBAAgB;AAAA;AAAA,EAEvD,IAAIE,QAAO,IAAI,EAAE,WAAW;AAAA;AAAA,EAG5B,SAASC,SAAQ,UAAU,EACtB,QAAQ,EACR,WAAW,MAAM,UAAU,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA;AAAA,EAG3D,SAASA,SAAQ,SAAS;AAAA;AAAA,EAG1B,QAAQC,MAAK,QAAQ,EAAE,QAAQ,EAAE,QAAQ,IAAI;AAAA;AAAA;AAAA,EAI7C,YAAYA,MAAK,YAAY;AAAA;AAAA;AAAA;AAAA,EAK7B,OAAO,MAAM,OAAO,EAAE,QAAQ;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAS9B,WAAWC,WAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AACpF,GAAG,CAAC,UAAU;AAAA;AAAA,EAEV,OAAO,2CAA2C,EAC7C,GAAG,MAAM,SAAS,MAAM,SAAS,MAAM,QAAQ,MAAM,UAAU;AAAA;AAAA,EAGpEC,OAAM,oCAAoC,EACrC,GAAG,MAAM,SAAS,MAAM,OAAO;AAAA;AAAA,EAGpCA,OAAM,6BAA6B,EAAE,GAAG,MAAM,MAAM;AACxD,CAAC;","names":["serial","integer","text","timestamp","index","createFunctionSchema","schema","createFunctionSchema","serial","integer","text","timestamp","index"]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* CMS Label Versions Entity
|
|
3
5
|
*
|
|
@@ -6,11 +8,11 @@
|
|
|
6
8
|
* - 발행 정보 (publishedAt, publishedBy)
|
|
7
9
|
* - 버전 노트
|
|
8
10
|
*/
|
|
9
|
-
|
|
11
|
+
declare const cmsLabelVersions: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
10
12
|
name: "label_versions";
|
|
11
13
|
schema: string;
|
|
12
14
|
columns: {
|
|
13
|
-
id:
|
|
15
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
14
16
|
name: "id";
|
|
15
17
|
tableName: "label_versions";
|
|
16
18
|
dataType: "number";
|
|
@@ -27,7 +29,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
27
29
|
identity: undefined;
|
|
28
30
|
generated: undefined;
|
|
29
31
|
}, {}, {}>;
|
|
30
|
-
labelId:
|
|
32
|
+
labelId: drizzle_orm_pg_core.PgColumn<{
|
|
31
33
|
name: "label_id";
|
|
32
34
|
tableName: "label_versions";
|
|
33
35
|
dataType: "number";
|
|
@@ -44,7 +46,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
44
46
|
identity: undefined;
|
|
45
47
|
generated: undefined;
|
|
46
48
|
}, {}, {}>;
|
|
47
|
-
version:
|
|
49
|
+
version: drizzle_orm_pg_core.PgColumn<{
|
|
48
50
|
name: "version";
|
|
49
51
|
tableName: "label_versions";
|
|
50
52
|
dataType: "number";
|
|
@@ -61,7 +63,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
61
63
|
identity: undefined;
|
|
62
64
|
generated: undefined;
|
|
63
65
|
}, {}, {}>;
|
|
64
|
-
status:
|
|
66
|
+
status: drizzle_orm_pg_core.PgColumn<{
|
|
65
67
|
name: "status";
|
|
66
68
|
tableName: "label_versions";
|
|
67
69
|
dataType: "string";
|
|
@@ -78,7 +80,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
78
80
|
identity: undefined;
|
|
79
81
|
generated: undefined;
|
|
80
82
|
}, {}, {}>;
|
|
81
|
-
publishedAt:
|
|
83
|
+
publishedAt: drizzle_orm_pg_core.PgColumn<{
|
|
82
84
|
name: "published_at";
|
|
83
85
|
tableName: "label_versions";
|
|
84
86
|
dataType: "date";
|
|
@@ -95,7 +97,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
95
97
|
identity: undefined;
|
|
96
98
|
generated: undefined;
|
|
97
99
|
}, {}, {}>;
|
|
98
|
-
publishedBy:
|
|
100
|
+
publishedBy: drizzle_orm_pg_core.PgColumn<{
|
|
99
101
|
name: "published_by";
|
|
100
102
|
tableName: "label_versions";
|
|
101
103
|
dataType: "string";
|
|
@@ -112,7 +114,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
112
114
|
identity: undefined;
|
|
113
115
|
generated: undefined;
|
|
114
116
|
}, {}, {}>;
|
|
115
|
-
notes:
|
|
117
|
+
notes: drizzle_orm_pg_core.PgColumn<{
|
|
116
118
|
name: "notes";
|
|
117
119
|
tableName: "label_versions";
|
|
118
120
|
dataType: "string";
|
|
@@ -129,7 +131,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
129
131
|
identity: undefined;
|
|
130
132
|
generated: undefined;
|
|
131
133
|
}, {}, {}>;
|
|
132
|
-
createdBy:
|
|
134
|
+
createdBy: drizzle_orm_pg_core.PgColumn<{
|
|
133
135
|
name: "created_by";
|
|
134
136
|
tableName: "label_versions";
|
|
135
137
|
dataType: "string";
|
|
@@ -146,7 +148,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
146
148
|
identity: undefined;
|
|
147
149
|
generated: undefined;
|
|
148
150
|
}, {}, {}>;
|
|
149
|
-
createdAt:
|
|
151
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
150
152
|
name: "created_at";
|
|
151
153
|
tableName: "label_versions";
|
|
152
154
|
dataType: "date";
|
|
@@ -166,42 +168,7 @@ export declare const cmsLabelVersions: import("drizzle-orm/pg-core").PgTableWith
|
|
|
166
168
|
};
|
|
167
169
|
dialect: "pg";
|
|
168
170
|
}>;
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
173
|
-
*
|
|
174
|
-
* // 새 버전 생성 (draft)
|
|
175
|
-
* await db.insert(cmsLabelVersions).values({
|
|
176
|
-
* labelId: 1,
|
|
177
|
-
* version: 2,
|
|
178
|
-
* status: 'draft',
|
|
179
|
-
* notes: '문구 개선',
|
|
180
|
-
* createdBy: 'editor@futureplay.com'
|
|
181
|
-
* });
|
|
182
|
-
*
|
|
183
|
-
* // 버전 발행
|
|
184
|
-
* await db.update(cmsLabelVersions)
|
|
185
|
-
* .set({
|
|
186
|
-
* status: 'published',
|
|
187
|
-
* publishedAt: new Date(),
|
|
188
|
-
* publishedBy: 'admin@futureplay.com'
|
|
189
|
-
* })
|
|
190
|
-
* .where(and(
|
|
191
|
-
* eq(cmsLabelVersions.labelId, 1),
|
|
192
|
-
* eq(cmsLabelVersions.version, 2)
|
|
193
|
-
* ));
|
|
194
|
-
*
|
|
195
|
-
* // 라벨의 모든 버전 조회
|
|
196
|
-
* const versions = await db.select()
|
|
197
|
-
* .from(cmsLabelVersions)
|
|
198
|
-
* .where(eq(cmsLabelVersions.labelId, 1))
|
|
199
|
-
* .orderBy(desc(cmsLabelVersions.version));
|
|
200
|
-
*
|
|
201
|
-
* // 발행된 버전만 조회
|
|
202
|
-
* const published = await db.select()
|
|
203
|
-
* .from(cmsLabelVersions)
|
|
204
|
-
* .where(eq(cmsLabelVersions.status, 'published'))
|
|
205
|
-
* .orderBy(desc(cmsLabelVersions.publishedAt));
|
|
206
|
-
*/
|
|
207
|
-
//# sourceMappingURL=cms-label-versions.d.ts.map
|
|
171
|
+
type CmsLabelVersion = typeof cmsLabelVersions.$inferSelect;
|
|
172
|
+
type NewCmsLabelVersion = typeof cmsLabelVersions.$inferInsert;
|
|
173
|
+
|
|
174
|
+
export { type CmsLabelVersion, type NewCmsLabelVersion, cmsLabelVersions };
|
|
@@ -0,0 +1,76 @@
|
|
|
1
|
+
// src/server/entities/cms-label-versions.ts
|
|
2
|
+
import { serial as serial2, integer as integer2, text as text2, timestamp as timestamp2, index as index2, unique } from "drizzle-orm/pg-core";
|
|
3
|
+
import { createFunctionSchema as createFunctionSchema2 } from "@spfn/core/db";
|
|
4
|
+
|
|
5
|
+
// src/server/entities/cms-labels.ts
|
|
6
|
+
import { index, integer, serial, text, timestamp } from "drizzle-orm/pg-core";
|
|
7
|
+
import { createFunctionSchema } from "@spfn/core/db";
|
|
8
|
+
var schema = createFunctionSchema("@spfn/cms");
|
|
9
|
+
var cmsLabels = schema.table("labels", {
|
|
10
|
+
// Primary Key
|
|
11
|
+
id: serial("id").primaryKey(),
|
|
12
|
+
// 라벨 식별자
|
|
13
|
+
key: text("key").notNull().unique(),
|
|
14
|
+
// 예: "home.hero.title", "why-futureplay.hero.subtitle"
|
|
15
|
+
// 구조: {section}.{component}.{property}
|
|
16
|
+
// 섹션 분류 (페이지 단위)
|
|
17
|
+
section: text("section").notNull(),
|
|
18
|
+
// 예: "home", "why-futureplay", "team"
|
|
19
|
+
// 값 타입
|
|
20
|
+
type: text("type").notNull(),
|
|
21
|
+
// "text" | "image" | "video" | "file" | "object"
|
|
22
|
+
// 기본값
|
|
23
|
+
defaultValue: text("default_value"),
|
|
24
|
+
// 라벨의 기본값 (sync 시 설정)
|
|
25
|
+
// 설명
|
|
26
|
+
description: text("description"),
|
|
27
|
+
// 라벨에 대한 설명 (optional)
|
|
28
|
+
// 현재 발행된 버전 번호
|
|
29
|
+
publishedVersion: integer("published_version"),
|
|
30
|
+
// null = 미발행 상태
|
|
31
|
+
// 1, 2, 3... = 발행된 버전 번호
|
|
32
|
+
// 생성자 추적
|
|
33
|
+
createdBy: text("created_by"),
|
|
34
|
+
// 타임스탬프
|
|
35
|
+
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
36
|
+
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow()
|
|
37
|
+
}, (table) => [
|
|
38
|
+
// 인덱스: 섹션별 조회 최적화
|
|
39
|
+
index("cms_labels_section_idx").on(table.section),
|
|
40
|
+
// 인덱스: key로 조회 최적화 (unique 제약으로 자동 생성되지만 명시)
|
|
41
|
+
index("cms_labels_key_idx").on(table.key)
|
|
42
|
+
]);
|
|
43
|
+
|
|
44
|
+
// src/server/entities/cms-label-versions.ts
|
|
45
|
+
var schema2 = createFunctionSchema2("@spfn/cms");
|
|
46
|
+
var cmsLabelVersions = schema2.table("label_versions", {
|
|
47
|
+
// Primary Key
|
|
48
|
+
id: serial2("id").primaryKey(),
|
|
49
|
+
// Foreign Key: cms_labels
|
|
50
|
+
labelId: integer2("label_id").notNull().references(() => cmsLabels.id, { onDelete: "cascade" }),
|
|
51
|
+
// 버전 번호
|
|
52
|
+
version: integer2("version").notNull(),
|
|
53
|
+
// 버전 상태
|
|
54
|
+
status: text2("status").notNull(),
|
|
55
|
+
// "draft" | "published" | "archived"
|
|
56
|
+
// 발행 정보
|
|
57
|
+
publishedAt: timestamp2("published_at", { withTimezone: true }),
|
|
58
|
+
publishedBy: text2("published_by"),
|
|
59
|
+
// 버전 노트 (변경사항 설명)
|
|
60
|
+
notes: text2("notes"),
|
|
61
|
+
// 버전 생성자
|
|
62
|
+
createdBy: text2("created_by"),
|
|
63
|
+
// 생성 시각
|
|
64
|
+
createdAt: timestamp2("created_at", { withTimezone: true }).notNull().defaultNow()
|
|
65
|
+
}, (table) => [
|
|
66
|
+
// UNIQUE 제약: 각 라벨의 버전 번호는 고유
|
|
67
|
+
unique("cms_label_versions_label_version_unique").on(table.labelId, table.version),
|
|
68
|
+
// 인덱스: labelId로 버전 목록 조회 최적화
|
|
69
|
+
index2("cms_label_versions_label_id_idx").on(table.labelId),
|
|
70
|
+
// 인덱스: status 필터링 최적화
|
|
71
|
+
index2("cms_label_versions_status_idx").on(table.status)
|
|
72
|
+
]);
|
|
73
|
+
export {
|
|
74
|
+
cmsLabelVersions
|
|
75
|
+
};
|
|
76
|
+
//# sourceMappingURL=cms-label-versions.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/server/entities/cms-label-versions.ts","../../../src/server/entities/cms-labels.ts"],"sourcesContent":["/**\n * CMS Label Versions Entity\n *\n * 라벨의 버전 메타데이터를 관리합니다.\n * - 버전별 상태 (draft/published/archived)\n * - 발행 정보 (publishedAt, publishedBy)\n * - 버전 노트\n */\n\nimport { serial, integer, text, timestamp, index, unique } from 'drizzle-orm/pg-core';\nimport { createFunctionSchema } from '@spfn/core/db';\nimport { cmsLabels } from '@/server/entities/cms-labels';\n\n// Create isolated schema for @spfn/cms\nconst schema = createFunctionSchema('@spfn/cms');\n\nexport const cmsLabelVersions = schema.table('label_versions', {\n // Primary Key\n id: serial('id').primaryKey(),\n\n // Foreign Key: cms_labels\n labelId: integer('label_id')\n .notNull()\n .references(() => cmsLabels.id, { onDelete: 'cascade' }),\n\n // 버전 번호\n version: integer('version').notNull(),\n\n // 버전 상태\n status: text('status').notNull(),\n // \"draft\" | \"published\" | \"archived\"\n\n // 발행 정보\n publishedAt: timestamp('published_at', { withTimezone: true }),\n publishedBy: text('published_by'),\n\n // 버전 노트 (변경사항 설명)\n notes: text('notes'),\n\n // 버전 생성자\n createdBy: text('created_by'),\n\n // 생성 시각\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n}, (table) => [\n // UNIQUE 제약: 각 라벨의 버전 번호는 고유\n unique('cms_label_versions_label_version_unique')\n .on(table.labelId, table.version),\n\n // 인덱스: labelId로 버전 목록 조회 최적화\n index('cms_label_versions_label_id_idx').on(table.labelId),\n\n // 인덱스: status 필터링 최적화\n index('cms_label_versions_status_idx').on(table.status),\n]);\n\n// 타입 추론\nexport type CmsLabelVersion = typeof cmsLabelVersions.$inferSelect;\nexport type NewCmsLabelVersion = typeof cmsLabelVersions.$inferInsert;\n\n/**\n * 사용 예시:\n *\n * // 새 버전 생성 (draft)\n * await db.insert(cmsLabelVersions).values({\n * labelId: 1,\n * version: 2,\n * status: 'draft',\n * notes: '문구 개선',\n * createdBy: 'editor@futureplay.com'\n * });\n *\n * // 버전 발행\n * await db.update(cmsLabelVersions)\n * .set({\n * status: 'published',\n * publishedAt: new Date(),\n * publishedBy: 'admin@futureplay.com'\n * })\n * .where(and(\n * eq(cmsLabelVersions.labelId, 1),\n * eq(cmsLabelVersions.version, 2)\n * ));\n *\n * // 라벨의 모든 버전 조회\n * const versions = await db.select()\n * .from(cmsLabelVersions)\n * .where(eq(cmsLabelVersions.labelId, 1))\n * .orderBy(desc(cmsLabelVersions.version));\n *\n * // 발행된 버전만 조회\n * const published = await db.select()\n * .from(cmsLabelVersions)\n * .where(eq(cmsLabelVersions.status, 'published'))\n * .orderBy(desc(cmsLabelVersions.publishedAt));\n */","/**\n * CMS Labels Entity\n *\n * 라벨의 메타데이터와 현재 발행 상태를 관리합니다.\n * - 라벨 식별 (id, key)\n * - 섹션 분류 (section)\n * - 타입 정의 (type)\n * - 발행 상태 (publishedVersion)\n */\n\nimport { index, integer, serial, text, timestamp } from 'drizzle-orm/pg-core';\nimport { createFunctionSchema } from '@spfn/core/db';\n\n// Create isolated schema for @spfn/cms\nconst schema = createFunctionSchema('@spfn/cms');\n\nexport const cmsLabels = schema.table('labels', {\n // Primary Key\n id: serial('id').primaryKey(),\n\n // 라벨 식별자\n key: text('key').notNull().unique(),\n // 예: \"home.hero.title\", \"why-futureplay.hero.subtitle\"\n // 구조: {section}.{component}.{property}\n\n // 섹션 분류 (페이지 단위)\n section: text('section').notNull(),\n // 예: \"home\", \"why-futureplay\", \"team\"\n\n // 값 타입\n type: text('type').notNull(),\n // \"text\" | \"image\" | \"video\" | \"file\" | \"object\"\n\n // 기본값\n defaultValue: text('default_value'),\n // 라벨의 기본값 (sync 시 설정)\n\n // 설명\n description: text('description'),\n // 라벨에 대한 설명 (optional)\n\n // 현재 발행된 버전 번호\n publishedVersion: integer('published_version'),\n // null = 미발행 상태\n // 1, 2, 3... = 발행된 버전 번호\n\n // 생성자 추적\n createdBy: text('created_by'),\n\n // 타임스탬프\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),\n}, (table) => [\n // 인덱스: 섹션별 조회 최적화\n index('cms_labels_section_idx').on(table.section),\n\n // 인덱스: key로 조회 최적화 (unique 제약으로 자동 생성되지만 명시)\n index('cms_labels_key_idx').on(table.key),\n]);\n\n// 타입 추론\nexport type CmsLabel = typeof cmsLabels.$inferSelect;\nexport type NewCmsLabel = typeof cmsLabels.$inferInsert;"],"mappings":";AASA,SAAS,UAAAA,SAAQ,WAAAC,UAAS,QAAAC,OAAM,aAAAC,YAAW,SAAAC,QAAO,cAAc;AAChE,SAAS,wBAAAC,6BAA4B;;;ACArC,SAAS,OAAO,SAAS,QAAQ,MAAM,iBAAiB;AACxD,SAAS,4BAA4B;AAGrC,IAAM,SAAS,qBAAqB,WAAW;AAExC,IAAM,YAAY,OAAO,MAAM,UAAU;AAAA;AAAA,EAE5C,IAAI,OAAO,IAAI,EAAE,WAAW;AAAA;AAAA,EAG5B,KAAK,KAAK,KAAK,EAAE,QAAQ,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA,EAKlC,SAAS,KAAK,SAAS,EAAE,QAAQ;AAAA;AAAA;AAAA,EAIjC,MAAM,KAAK,MAAM,EAAE,QAAQ;AAAA;AAAA;AAAA,EAI3B,cAAc,KAAK,eAAe;AAAA;AAAA;AAAA,EAIlC,aAAa,KAAK,aAAa;AAAA;AAAA;AAAA,EAI/B,kBAAkB,QAAQ,mBAAmB;AAAA;AAAA;AAAA;AAAA,EAK7C,WAAW,KAAK,YAAY;AAAA;AAAA,EAG5B,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAAA,EAChF,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AACpF,GAAG,CAAC,UAAU;AAAA;AAAA,EAEV,MAAM,wBAAwB,EAAE,GAAG,MAAM,OAAO;AAAA;AAAA,EAGhD,MAAM,oBAAoB,EAAE,GAAG,MAAM,GAAG;AAC5C,CAAC;;;AD5CD,IAAMC,UAASC,sBAAqB,WAAW;AAExC,IAAM,mBAAmBD,QAAO,MAAM,kBAAkB;AAAA;AAAA,EAE3D,IAAIE,QAAO,IAAI,EAAE,WAAW;AAAA;AAAA,EAG5B,SAASC,SAAQ,UAAU,EAC1B,QAAQ,EACR,WAAW,MAAM,UAAU,IAAI,EAAE,UAAU,UAAU,CAAC;AAAA;AAAA,EAGvD,SAASA,SAAQ,SAAS,EAAE,QAAQ;AAAA;AAAA,EAGpC,QAAQC,MAAK,QAAQ,EAAE,QAAQ;AAAA;AAAA;AAAA,EAI/B,aAAaC,WAAU,gBAAgB,EAAE,cAAc,KAAK,CAAC;AAAA,EAC7D,aAAaD,MAAK,cAAc;AAAA;AAAA,EAGhC,OAAOA,MAAK,OAAO;AAAA;AAAA,EAGnB,WAAWA,MAAK,YAAY;AAAA;AAAA,EAG5B,WAAWC,WAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AACpF,GAAG,CAAC,UAAU;AAAA;AAAA,EAEV,OAAO,yCAAyC,EAC/C,GAAG,MAAM,SAAS,MAAM,OAAO;AAAA;AAAA,EAGhCC,OAAM,iCAAiC,EAAE,GAAG,MAAM,OAAO;AAAA;AAAA,EAGzDA,OAAM,+BAA+B,EAAE,GAAG,MAAM,MAAM;AAC1D,CAAC;","names":["serial","integer","text","timestamp","index","createFunctionSchema","schema","createFunctionSchema","serial","integer","text","timestamp","index"]}
|
|
@@ -1,3 +1,5 @@
|
|
|
1
|
+
import * as drizzle_orm_pg_core from 'drizzle-orm/pg-core';
|
|
2
|
+
|
|
1
3
|
/**
|
|
2
4
|
* CMS Labels Entity
|
|
3
5
|
*
|
|
@@ -7,11 +9,11 @@
|
|
|
7
9
|
* - 타입 정의 (type)
|
|
8
10
|
* - 발행 상태 (publishedVersion)
|
|
9
11
|
*/
|
|
10
|
-
|
|
12
|
+
declare const cmsLabels: drizzle_orm_pg_core.PgTableWithColumns<{
|
|
11
13
|
name: "labels";
|
|
12
14
|
schema: string;
|
|
13
15
|
columns: {
|
|
14
|
-
id:
|
|
16
|
+
id: drizzle_orm_pg_core.PgColumn<{
|
|
15
17
|
name: "id";
|
|
16
18
|
tableName: "labels";
|
|
17
19
|
dataType: "number";
|
|
@@ -28,7 +30,7 @@ export declare const cmsLabels: import("drizzle-orm/pg-core").PgTableWithColumns
|
|
|
28
30
|
identity: undefined;
|
|
29
31
|
generated: undefined;
|
|
30
32
|
}, {}, {}>;
|
|
31
|
-
key:
|
|
33
|
+
key: drizzle_orm_pg_core.PgColumn<{
|
|
32
34
|
name: "key";
|
|
33
35
|
tableName: "labels";
|
|
34
36
|
dataType: "string";
|
|
@@ -45,7 +47,7 @@ export declare const cmsLabels: import("drizzle-orm/pg-core").PgTableWithColumns
|
|
|
45
47
|
identity: undefined;
|
|
46
48
|
generated: undefined;
|
|
47
49
|
}, {}, {}>;
|
|
48
|
-
section:
|
|
50
|
+
section: drizzle_orm_pg_core.PgColumn<{
|
|
49
51
|
name: "section";
|
|
50
52
|
tableName: "labels";
|
|
51
53
|
dataType: "string";
|
|
@@ -62,7 +64,7 @@ export declare const cmsLabels: import("drizzle-orm/pg-core").PgTableWithColumns
|
|
|
62
64
|
identity: undefined;
|
|
63
65
|
generated: undefined;
|
|
64
66
|
}, {}, {}>;
|
|
65
|
-
type:
|
|
67
|
+
type: drizzle_orm_pg_core.PgColumn<{
|
|
66
68
|
name: "type";
|
|
67
69
|
tableName: "labels";
|
|
68
70
|
dataType: "string";
|
|
@@ -79,7 +81,7 @@ export declare const cmsLabels: import("drizzle-orm/pg-core").PgTableWithColumns
|
|
|
79
81
|
identity: undefined;
|
|
80
82
|
generated: undefined;
|
|
81
83
|
}, {}, {}>;
|
|
82
|
-
defaultValue:
|
|
84
|
+
defaultValue: drizzle_orm_pg_core.PgColumn<{
|
|
83
85
|
name: "default_value";
|
|
84
86
|
tableName: "labels";
|
|
85
87
|
dataType: "string";
|
|
@@ -96,7 +98,7 @@ export declare const cmsLabels: import("drizzle-orm/pg-core").PgTableWithColumns
|
|
|
96
98
|
identity: undefined;
|
|
97
99
|
generated: undefined;
|
|
98
100
|
}, {}, {}>;
|
|
99
|
-
description:
|
|
101
|
+
description: drizzle_orm_pg_core.PgColumn<{
|
|
100
102
|
name: "description";
|
|
101
103
|
tableName: "labels";
|
|
102
104
|
dataType: "string";
|
|
@@ -113,7 +115,7 @@ export declare const cmsLabels: import("drizzle-orm/pg-core").PgTableWithColumns
|
|
|
113
115
|
identity: undefined;
|
|
114
116
|
generated: undefined;
|
|
115
117
|
}, {}, {}>;
|
|
116
|
-
publishedVersion:
|
|
118
|
+
publishedVersion: drizzle_orm_pg_core.PgColumn<{
|
|
117
119
|
name: "published_version";
|
|
118
120
|
tableName: "labels";
|
|
119
121
|
dataType: "number";
|
|
@@ -130,7 +132,7 @@ export declare const cmsLabels: import("drizzle-orm/pg-core").PgTableWithColumns
|
|
|
130
132
|
identity: undefined;
|
|
131
133
|
generated: undefined;
|
|
132
134
|
}, {}, {}>;
|
|
133
|
-
createdBy:
|
|
135
|
+
createdBy: drizzle_orm_pg_core.PgColumn<{
|
|
134
136
|
name: "created_by";
|
|
135
137
|
tableName: "labels";
|
|
136
138
|
dataType: "string";
|
|
@@ -147,7 +149,7 @@ export declare const cmsLabels: import("drizzle-orm/pg-core").PgTableWithColumns
|
|
|
147
149
|
identity: undefined;
|
|
148
150
|
generated: undefined;
|
|
149
151
|
}, {}, {}>;
|
|
150
|
-
createdAt:
|
|
152
|
+
createdAt: drizzle_orm_pg_core.PgColumn<{
|
|
151
153
|
name: "created_at";
|
|
152
154
|
tableName: "labels";
|
|
153
155
|
dataType: "date";
|
|
@@ -164,7 +166,7 @@ export declare const cmsLabels: import("drizzle-orm/pg-core").PgTableWithColumns
|
|
|
164
166
|
identity: undefined;
|
|
165
167
|
generated: undefined;
|
|
166
168
|
}, {}, {}>;
|
|
167
|
-
updatedAt:
|
|
169
|
+
updatedAt: drizzle_orm_pg_core.PgColumn<{
|
|
168
170
|
name: "updated_at";
|
|
169
171
|
tableName: "labels";
|
|
170
172
|
dataType: "date";
|
|
@@ -184,6 +186,7 @@ export declare const cmsLabels: import("drizzle-orm/pg-core").PgTableWithColumns
|
|
|
184
186
|
};
|
|
185
187
|
dialect: "pg";
|
|
186
188
|
}>;
|
|
187
|
-
|
|
188
|
-
|
|
189
|
-
|
|
189
|
+
type CmsLabel = typeof cmsLabels.$inferSelect;
|
|
190
|
+
type NewCmsLabel = typeof cmsLabels.$inferInsert;
|
|
191
|
+
|
|
192
|
+
export { type CmsLabel, type NewCmsLabel, cmsLabels };
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
// src/server/entities/cms-labels.ts
|
|
2
|
+
import { index, integer, serial, text, timestamp } from "drizzle-orm/pg-core";
|
|
3
|
+
import { createFunctionSchema } from "@spfn/core/db";
|
|
4
|
+
var schema = createFunctionSchema("@spfn/cms");
|
|
5
|
+
var cmsLabels = schema.table("labels", {
|
|
6
|
+
// Primary Key
|
|
7
|
+
id: serial("id").primaryKey(),
|
|
8
|
+
// 라벨 식별자
|
|
9
|
+
key: text("key").notNull().unique(),
|
|
10
|
+
// 예: "home.hero.title", "why-futureplay.hero.subtitle"
|
|
11
|
+
// 구조: {section}.{component}.{property}
|
|
12
|
+
// 섹션 분류 (페이지 단위)
|
|
13
|
+
section: text("section").notNull(),
|
|
14
|
+
// 예: "home", "why-futureplay", "team"
|
|
15
|
+
// 값 타입
|
|
16
|
+
type: text("type").notNull(),
|
|
17
|
+
// "text" | "image" | "video" | "file" | "object"
|
|
18
|
+
// 기본값
|
|
19
|
+
defaultValue: text("default_value"),
|
|
20
|
+
// 라벨의 기본값 (sync 시 설정)
|
|
21
|
+
// 설명
|
|
22
|
+
description: text("description"),
|
|
23
|
+
// 라벨에 대한 설명 (optional)
|
|
24
|
+
// 현재 발행된 버전 번호
|
|
25
|
+
publishedVersion: integer("published_version"),
|
|
26
|
+
// null = 미발행 상태
|
|
27
|
+
// 1, 2, 3... = 발행된 버전 번호
|
|
28
|
+
// 생성자 추적
|
|
29
|
+
createdBy: text("created_by"),
|
|
30
|
+
// 타임스탬프
|
|
31
|
+
createdAt: timestamp("created_at", { withTimezone: true }).notNull().defaultNow(),
|
|
32
|
+
updatedAt: timestamp("updated_at", { withTimezone: true }).notNull().defaultNow()
|
|
33
|
+
}, (table) => [
|
|
34
|
+
// 인덱스: 섹션별 조회 최적화
|
|
35
|
+
index("cms_labels_section_idx").on(table.section),
|
|
36
|
+
// 인덱스: key로 조회 최적화 (unique 제약으로 자동 생성되지만 명시)
|
|
37
|
+
index("cms_labels_key_idx").on(table.key)
|
|
38
|
+
]);
|
|
39
|
+
export {
|
|
40
|
+
cmsLabels
|
|
41
|
+
};
|
|
42
|
+
//# sourceMappingURL=cms-labels.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/server/entities/cms-labels.ts"],"sourcesContent":["/**\n * CMS Labels Entity\n *\n * 라벨의 메타데이터와 현재 발행 상태를 관리합니다.\n * - 라벨 식별 (id, key)\n * - 섹션 분류 (section)\n * - 타입 정의 (type)\n * - 발행 상태 (publishedVersion)\n */\n\nimport { index, integer, serial, text, timestamp } from 'drizzle-orm/pg-core';\nimport { createFunctionSchema } from '@spfn/core/db';\n\n// Create isolated schema for @spfn/cms\nconst schema = createFunctionSchema('@spfn/cms');\n\nexport const cmsLabels = schema.table('labels', {\n // Primary Key\n id: serial('id').primaryKey(),\n\n // 라벨 식별자\n key: text('key').notNull().unique(),\n // 예: \"home.hero.title\", \"why-futureplay.hero.subtitle\"\n // 구조: {section}.{component}.{property}\n\n // 섹션 분류 (페이지 단위)\n section: text('section').notNull(),\n // 예: \"home\", \"why-futureplay\", \"team\"\n\n // 값 타입\n type: text('type').notNull(),\n // \"text\" | \"image\" | \"video\" | \"file\" | \"object\"\n\n // 기본값\n defaultValue: text('default_value'),\n // 라벨의 기본값 (sync 시 설정)\n\n // 설명\n description: text('description'),\n // 라벨에 대한 설명 (optional)\n\n // 현재 발행된 버전 번호\n publishedVersion: integer('published_version'),\n // null = 미발행 상태\n // 1, 2, 3... = 발행된 버전 번호\n\n // 생성자 추적\n createdBy: text('created_by'),\n\n // 타임스탬프\n createdAt: timestamp('created_at', { withTimezone: true }).notNull().defaultNow(),\n updatedAt: timestamp('updated_at', { withTimezone: true }).notNull().defaultNow(),\n}, (table) => [\n // 인덱스: 섹션별 조회 최적화\n index('cms_labels_section_idx').on(table.section),\n\n // 인덱스: key로 조회 최적화 (unique 제약으로 자동 생성되지만 명시)\n index('cms_labels_key_idx').on(table.key),\n]);\n\n// 타입 추론\nexport type CmsLabel = typeof cmsLabels.$inferSelect;\nexport type NewCmsLabel = typeof cmsLabels.$inferInsert;"],"mappings":";AAUA,SAAS,OAAO,SAAS,QAAQ,MAAM,iBAAiB;AACxD,SAAS,4BAA4B;AAGrC,IAAM,SAAS,qBAAqB,WAAW;AAExC,IAAM,YAAY,OAAO,MAAM,UAAU;AAAA;AAAA,EAE5C,IAAI,OAAO,IAAI,EAAE,WAAW;AAAA;AAAA,EAG5B,KAAK,KAAK,KAAK,EAAE,QAAQ,EAAE,OAAO;AAAA;AAAA;AAAA;AAAA,EAKlC,SAAS,KAAK,SAAS,EAAE,QAAQ;AAAA;AAAA;AAAA,EAIjC,MAAM,KAAK,MAAM,EAAE,QAAQ;AAAA;AAAA;AAAA,EAI3B,cAAc,KAAK,eAAe;AAAA;AAAA;AAAA,EAIlC,aAAa,KAAK,aAAa;AAAA;AAAA;AAAA,EAI/B,kBAAkB,QAAQ,mBAAmB;AAAA;AAAA;AAAA;AAAA,EAK7C,WAAW,KAAK,YAAY;AAAA;AAAA,EAG5B,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AAAA,EAChF,WAAW,UAAU,cAAc,EAAE,cAAc,KAAK,CAAC,EAAE,QAAQ,EAAE,WAAW;AACpF,GAAG,CAAC,UAAU;AAAA;AAAA,EAEV,MAAM,wBAAwB,EAAE,GAAG,MAAM,OAAO;AAAA;AAAA,EAGhD,MAAM,oBAAoB,EAAE,GAAG,MAAM,GAAG;AAC5C,CAAC;","names":[]}
|