@spfn/cms 0.1.0-alpha.7 → 0.1.0-alpha.70

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.
Files changed (224) hide show
  1. package/README.md +28 -416
  2. package/dist/{helpers/locale.actions.d.ts → actions-BpTAYuBA.d.ts} +70 -7
  3. package/dist/actions.d.ts +2 -9
  4. package/dist/actions.js +97 -10
  5. package/dist/actions.js.map +1 -1
  6. package/dist/api.d.ts +214 -0
  7. package/dist/api.js +353 -0
  8. package/dist/api.js.map +1 -0
  9. package/dist/client.d.ts +136 -127
  10. package/dist/client.js +1199 -59
  11. package/dist/client.js.map +1 -1
  12. package/dist/{types.d.ts → index-Dh5FjWzR.d.ts} +45 -7
  13. package/dist/index.d.ts +108 -16
  14. package/dist/index.js +610 -23
  15. package/dist/index.js.map +1 -1
  16. package/dist/label-sync-generator-B0EmvtWM.d.ts +32 -0
  17. package/dist/lib/contracts/labels.d.ts +151 -0
  18. package/dist/lib/contracts/labels.js +168 -0
  19. package/dist/lib/contracts/labels.js.map +1 -0
  20. package/dist/lib/contracts/published-cache.d.ts +48 -0
  21. package/dist/lib/contracts/published-cache.js +49 -0
  22. package/dist/lib/contracts/published-cache.js.map +1 -0
  23. package/dist/lib/contracts/values.d.ts +71 -0
  24. package/dist/lib/contracts/values.js +103 -0
  25. package/dist/lib/contracts/values.js.map +1 -0
  26. package/dist/locale.constants-BMBK70YM.d.ts +104 -0
  27. package/dist/{entities → server/entities}/cms-audit-logs.d.ts +15 -70
  28. package/dist/server/entities/cms-audit-logs.js +78 -0
  29. package/dist/server/entities/cms-audit-logs.js.map +1 -0
  30. package/dist/{entities → server/entities}/cms-draft-cache.d.ts +13 -73
  31. package/dist/server/entities/cms-draft-cache.js +38 -0
  32. package/dist/server/entities/cms-draft-cache.js.map +1 -0
  33. package/dist/{entities → server/entities}/cms-label-values.d.ts +16 -67
  34. package/dist/server/entities/cms-label-values.js +81 -0
  35. package/dist/server/entities/cms-label-values.js.map +1 -0
  36. package/dist/{entities → server/entities}/cms-label-versions.d.ts +16 -49
  37. package/dist/server/entities/cms-label-versions.js +76 -0
  38. package/dist/server/entities/cms-label-versions.js.map +1 -0
  39. package/dist/{entities → server/entities}/cms-labels.d.ts +17 -14
  40. package/dist/server/entities/cms-labels.js +42 -0
  41. package/dist/server/entities/cms-labels.js.map +1 -0
  42. package/dist/{entities → server/entities}/cms-published-cache.d.ts +14 -69
  43. package/dist/server/entities/cms-published-cache.js +36 -0
  44. package/dist/server/entities/cms-published-cache.js.map +1 -0
  45. package/dist/server/entities/index.d.ts +7 -0
  46. package/dist/server/entities/index.js +218 -0
  47. package/dist/server/entities/index.js.map +1 -0
  48. package/dist/server/generators/index.d.ts +19 -0
  49. package/dist/server/generators/index.js +753 -0
  50. package/dist/server/generators/index.js.map +1 -0
  51. package/dist/server/labels/index.d.ts +1 -0
  52. package/dist/server/labels/index.js +32 -0
  53. package/dist/server/labels/index.js.map +1 -0
  54. package/dist/server/repositories/index.d.ts +209 -0
  55. package/dist/server/repositories/index.js +441 -0
  56. package/dist/server/repositories/index.js.map +1 -0
  57. package/dist/server/routes/labels/[id]/index.js +508 -0
  58. package/dist/server/routes/labels/[id]/index.js.map +1 -0
  59. package/dist/{routes/labels/[id] → server/routes/labels/_id_}/index.d.ts +5 -3
  60. package/dist/server/routes/labels/by-key/[key]/index.js +458 -0
  61. package/dist/server/routes/labels/by-key/[key]/index.js.map +1 -0
  62. package/dist/server/routes/labels/by-key/_key_/index.d.ts +10 -0
  63. package/dist/server/routes/labels/index.d.ts +12 -0
  64. package/dist/server/routes/labels/index.js +617 -0
  65. package/dist/server/routes/labels/index.js.map +1 -0
  66. package/dist/server/routes/published-cache/index.d.ts +11 -0
  67. package/dist/server/routes/published-cache/index.js +369 -0
  68. package/dist/server/routes/published-cache/index.js.map +1 -0
  69. package/dist/server/routes/values/[labelId]/[version]/index.js +479 -0
  70. package/dist/server/routes/values/[labelId]/[version]/index.js.map +1 -0
  71. package/dist/server/routes/values/[labelId]/index.js +474 -0
  72. package/dist/server/routes/values/[labelId]/index.js.map +1 -0
  73. package/dist/server/routes/values/_labelId_/_version_/index.d.ts +10 -0
  74. package/dist/server/routes/values/_labelId_/index.d.ts +10 -0
  75. package/dist/server.d.ts +78 -7
  76. package/dist/server.js +1752 -247
  77. package/dist/server.js.map +1 -1
  78. package/migrations/0000_init.sql +3 -0
  79. package/migrations/0001_far_lady_vermin.sql +86 -0
  80. package/migrations/0002_heavy_the_enforcers.sql +2 -0
  81. package/migrations/meta/0000_snapshot.json +15 -0
  82. package/migrations/meta/0001_snapshot.json +687 -0
  83. package/migrations/meta/0002_snapshot.json +686 -0
  84. package/migrations/meta/_journal.json +27 -0
  85. package/package.json +55 -36
  86. package/dist/actions.d.ts.map +0 -1
  87. package/dist/client.d.ts.map +0 -1
  88. package/dist/cms.config.d.ts +0 -77
  89. package/dist/cms.config.d.ts.map +0 -1
  90. package/dist/cms.config.js +0 -111
  91. package/dist/cms.config.js.map +0 -1
  92. package/dist/entities/cms-audit-logs.d.ts.map +0 -1
  93. package/dist/entities/cms-audit-logs.js +0 -103
  94. package/dist/entities/cms-audit-logs.js.map +0 -1
  95. package/dist/entities/cms-draft-cache.d.ts.map +0 -1
  96. package/dist/entities/cms-draft-cache.js +0 -112
  97. package/dist/entities/cms-draft-cache.js.map +0 -1
  98. package/dist/entities/cms-label-values.d.ts.map +0 -1
  99. package/dist/entities/cms-label-values.js +0 -105
  100. package/dist/entities/cms-label-values.js.map +0 -1
  101. package/dist/entities/cms-label-versions.d.ts.map +0 -1
  102. package/dist/entities/cms-label-versions.js +0 -80
  103. package/dist/entities/cms-label-versions.js.map +0 -1
  104. package/dist/entities/cms-labels.d.ts.map +0 -1
  105. package/dist/entities/cms-labels.js +0 -48
  106. package/dist/entities/cms-labels.js.map +0 -1
  107. package/dist/entities/cms-published-cache.d.ts.map +0 -1
  108. package/dist/entities/cms-published-cache.js +0 -103
  109. package/dist/entities/cms-published-cache.js.map +0 -1
  110. package/dist/entities/index.d.ts +0 -10
  111. package/dist/entities/index.d.ts.map +0 -1
  112. package/dist/entities/index.js +0 -10
  113. package/dist/entities/index.js.map +0 -1
  114. package/dist/generators/index.d.ts +0 -19
  115. package/dist/generators/index.d.ts.map +0 -1
  116. package/dist/generators/index.js +0 -19
  117. package/dist/generators/index.js.map +0 -1
  118. package/dist/generators/label-sync-generator.d.ts +0 -33
  119. package/dist/generators/label-sync-generator.d.ts.map +0 -1
  120. package/dist/generators/label-sync-generator.js +0 -87
  121. package/dist/generators/label-sync-generator.js.map +0 -1
  122. package/dist/helpers/locale.actions.d.ts.map +0 -1
  123. package/dist/helpers/locale.actions.js +0 -210
  124. package/dist/helpers/locale.actions.js.map +0 -1
  125. package/dist/helpers/locale.constants.d.ts +0 -10
  126. package/dist/helpers/locale.constants.d.ts.map +0 -1
  127. package/dist/helpers/locale.constants.js +0 -10
  128. package/dist/helpers/locale.constants.js.map +0 -1
  129. package/dist/helpers/locale.d.ts +0 -17
  130. package/dist/helpers/locale.d.ts.map +0 -1
  131. package/dist/helpers/locale.js +0 -20
  132. package/dist/helpers/locale.js.map +0 -1
  133. package/dist/helpers/sync.d.ts +0 -41
  134. package/dist/helpers/sync.d.ts.map +0 -1
  135. package/dist/helpers/sync.js +0 -309
  136. package/dist/helpers/sync.js.map +0 -1
  137. package/dist/index.d.ts.map +0 -1
  138. package/dist/init.d.ts +0 -31
  139. package/dist/init.d.ts.map +0 -1
  140. package/dist/init.js +0 -36
  141. package/dist/init.js.map +0 -1
  142. package/dist/labels/helpers.d.ts +0 -31
  143. package/dist/labels/helpers.d.ts.map +0 -1
  144. package/dist/labels/helpers.js +0 -60
  145. package/dist/labels/helpers.js.map +0 -1
  146. package/dist/labels/index.d.ts +0 -7
  147. package/dist/labels/index.d.ts.map +0 -1
  148. package/dist/labels/index.js +0 -7
  149. package/dist/labels/index.js.map +0 -1
  150. package/dist/repositories/cms-draft-cache.repository.d.ts +0 -62
  151. package/dist/repositories/cms-draft-cache.repository.d.ts.map +0 -1
  152. package/dist/repositories/cms-draft-cache.repository.js +0 -56
  153. package/dist/repositories/cms-draft-cache.repository.js.map +0 -1
  154. package/dist/repositories/cms-label-values.repository.d.ts +0 -32
  155. package/dist/repositories/cms-label-values.repository.d.ts.map +0 -1
  156. package/dist/repositories/cms-label-values.repository.js +0 -72
  157. package/dist/repositories/cms-label-values.repository.js.map +0 -1
  158. package/dist/repositories/cms-labels.repository.d.ts +0 -53
  159. package/dist/repositories/cms-labels.repository.d.ts.map +0 -1
  160. package/dist/repositories/cms-labels.repository.js +0 -77
  161. package/dist/repositories/cms-labels.repository.js.map +0 -1
  162. package/dist/repositories/cms-published-cache.repository.d.ts +0 -53
  163. package/dist/repositories/cms-published-cache.repository.d.ts.map +0 -1
  164. package/dist/repositories/cms-published-cache.repository.js +0 -54
  165. package/dist/repositories/cms-published-cache.repository.js.map +0 -1
  166. package/dist/repositories/index.d.ts +0 -8
  167. package/dist/repositories/index.d.ts.map +0 -1
  168. package/dist/repositories/index.js +0 -9
  169. package/dist/repositories/index.js.map +0 -1
  170. package/dist/routes/labels/[id]/contract.d.ts +0 -68
  171. package/dist/routes/labels/[id]/contract.d.ts.map +0 -1
  172. package/dist/routes/labels/[id]/contract.js +0 -84
  173. package/dist/routes/labels/[id]/contract.js.map +0 -1
  174. package/dist/routes/labels/[id]/index.d.ts.map +0 -1
  175. package/dist/routes/labels/[id]/index.js +0 -96
  176. package/dist/routes/labels/[id]/index.js.map +0 -1
  177. package/dist/routes/labels/by-key/[key]/contract.d.ts +0 -24
  178. package/dist/routes/labels/by-key/[key]/contract.d.ts.map +0 -1
  179. package/dist/routes/labels/by-key/[key]/contract.js +0 -28
  180. package/dist/routes/labels/by-key/[key]/contract.js.map +0 -1
  181. package/dist/routes/labels/by-key/[key]/index.d.ts +0 -8
  182. package/dist/routes/labels/by-key/[key]/index.d.ts.map +0 -1
  183. package/dist/routes/labels/by-key/[key]/index.js +0 -32
  184. package/dist/routes/labels/by-key/[key]/index.js.map +0 -1
  185. package/dist/routes/labels/contract.d.ts +0 -59
  186. package/dist/routes/labels/contract.d.ts.map +0 -1
  187. package/dist/routes/labels/contract.js +0 -75
  188. package/dist/routes/labels/contract.js.map +0 -1
  189. package/dist/routes/labels/index.d.ts +0 -10
  190. package/dist/routes/labels/index.d.ts.map +0 -1
  191. package/dist/routes/labels/index.js +0 -73
  192. package/dist/routes/labels/index.js.map +0 -1
  193. package/dist/routes/published-cache/contract.d.ts +0 -25
  194. package/dist/routes/published-cache/contract.d.ts.map +0 -1
  195. package/dist/routes/published-cache/contract.js +0 -35
  196. package/dist/routes/published-cache/contract.js.map +0 -1
  197. package/dist/routes/published-cache/index.d.ts +0 -8
  198. package/dist/routes/published-cache/index.d.ts.map +0 -1
  199. package/dist/routes/published-cache/index.js +0 -33
  200. package/dist/routes/published-cache/index.js.map +0 -1
  201. package/dist/routes/values/[labelId]/[version]/contract.d.ts +0 -29
  202. package/dist/routes/values/[labelId]/[version]/contract.d.ts.map +0 -1
  203. package/dist/routes/values/[labelId]/[version]/contract.js +0 -33
  204. package/dist/routes/values/[labelId]/[version]/contract.js.map +0 -1
  205. package/dist/routes/values/[labelId]/[version]/index.d.ts +0 -8
  206. package/dist/routes/values/[labelId]/[version]/index.d.ts.map +0 -1
  207. package/dist/routes/values/[labelId]/[version]/index.js +0 -45
  208. package/dist/routes/values/[labelId]/[version]/index.js.map +0 -1
  209. package/dist/routes/values/[labelId]/contract.d.ts +0 -38
  210. package/dist/routes/values/[labelId]/contract.d.ts.map +0 -1
  211. package/dist/routes/values/[labelId]/contract.js +0 -59
  212. package/dist/routes/values/[labelId]/contract.js.map +0 -1
  213. package/dist/routes/values/[labelId]/index.d.ts +0 -8
  214. package/dist/routes/values/[labelId]/index.d.ts.map +0 -1
  215. package/dist/routes/values/[labelId]/index.js +0 -42
  216. package/dist/routes/values/[labelId]/index.js.map +0 -1
  217. package/dist/server.d.ts.map +0 -1
  218. package/dist/store.d.ts +0 -87
  219. package/dist/store.d.ts.map +0 -1
  220. package/dist/store.js +0 -205
  221. package/dist/store.js.map +0 -1
  222. package/dist/types.d.ts.map +0 -1
  223. package/dist/types.js +0 -7
  224. package/dist/types.js.map +0 -1
@@ -1,73 +0,0 @@
1
- /**
2
- * CMS Labels Routes
3
- *
4
- * 라벨 메타데이터 관리 API
5
- * - GET /cms/labels - 라벨 목록 조회
6
- * - POST /cms/labels - 새 라벨 생성
7
- */
8
- import { createApp } from '@spfn/core/route';
9
- import { Transactional } from '@spfn/core/db';
10
- import { cmsLabelsRepository } from '../../repositories/index.js';
11
- import { getLabelsContract, createLabelContract } from './contract.js';
12
- const app = createApp();
13
- /**
14
- * GET /cms/labels
15
- * 라벨 목록 조회 (페이지네이션, 섹션 필터)
16
- */
17
- app.bind(getLabelsContract, async (c) => {
18
- const { section, limit = 20, offset = 0 } = c.query;
19
- // 라벨 목록 조회
20
- const labels = await cmsLabelsRepository.findMany({
21
- section,
22
- limit,
23
- offset,
24
- });
25
- // 전체 개수 조회
26
- const total = await cmsLabelsRepository.count(section);
27
- return c.json({
28
- labels: labels.map((label) => ({
29
- id: label.id,
30
- key: label.key,
31
- section: label.section,
32
- type: label.type,
33
- publishedVersion: label.publishedVersion,
34
- createdBy: label.createdBy,
35
- createdAt: label.createdAt.toISOString(),
36
- updatedAt: label.updatedAt.toISOString(),
37
- })),
38
- total,
39
- limit,
40
- offset,
41
- });
42
- });
43
- /**
44
- * POST /cms/labels
45
- * 새 라벨 생성
46
- */
47
- app.bind(createLabelContract, [Transactional()], async (c) => {
48
- const body = await c.data();
49
- // 중복 key 체크
50
- const existing = await cmsLabelsRepository.findByKey(body.key);
51
- if (existing) {
52
- return c.json({ error: 'Label with this key already exists', key: body.key }, 409);
53
- }
54
- // 라벨 생성
55
- const label = await cmsLabelsRepository.create({
56
- key: body.key,
57
- section: body.section,
58
- type: body.type,
59
- createdBy: body.createdBy,
60
- });
61
- return c.json({
62
- id: label.id,
63
- key: label.key,
64
- section: label.section,
65
- type: label.type,
66
- publishedVersion: label.publishedVersion,
67
- createdBy: label.createdBy,
68
- createdAt: label.createdAt.toISOString(),
69
- updatedAt: label.updatedAt.toISOString(),
70
- }, 201);
71
- });
72
- export default app;
73
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/labels/index.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,MAAM,6BAA6B,CAAC;AAClE,OAAO,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,MAAM,eAAe,CAAC;AAEvE,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;AAExB;;;GAGG;AACH,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAEpC,MAAM,EAAE,OAAO,EAAE,KAAK,GAAG,EAAE,EAAE,MAAM,GAAG,CAAC,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;IAEpD,WAAW;IACX,MAAM,MAAM,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC;QAC9C,OAAO;QACP,KAAK;QACL,MAAM;KACT,CAAC,CAAC;IAEH,WAAW;IACX,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;IAEvD,OAAO,CAAC,CAAC,IAAI,CAAC;QACV,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC3B,EAAE,EAAE,KAAK,CAAC,EAAE;YACZ,GAAG,EAAE,KAAK,CAAC,GAAG;YACd,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;YACxC,SAAS,EAAE,KAAK,CAAC,SAAS;YAC1B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;YACxC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;SAC3C,CAAC,CAAC;QACH,KAAK;QACL,KAAK;QACL,MAAM;KACT,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH;;;GAGG;AACH,GAAG,CAAC,IAAI,CAAC,mBAAmB,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAEzD,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5B,YAAY;IACZ,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,SAAS,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAC/D,IAAI,QAAQ,EACZ,CAAC;QACG,OAAO,CAAC,CAAC,IAAI,CACT,EAAE,KAAK,EAAE,oCAAoC,EAAE,GAAG,EAAE,IAAI,CAAC,GAAG,EAAE,EAC9D,GAAG,CACN,CAAC;IACN,CAAC;IAED,QAAQ;IACR,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,MAAM,CAAC;QAC3C,GAAG,EAAE,IAAI,CAAC,GAAG;QACb,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,IAAI,EAAE,IAAI,CAAC,IAAI;QACf,SAAS,EAAE,IAAI,CAAC,SAAS;KAC5B,CAAC,CAAC;IAEH,OAAO,CAAC,CAAC,IAAI,CACT;QACI,EAAE,EAAE,KAAK,CAAC,EAAE;QACZ,GAAG,EAAE,KAAK,CAAC,GAAG;QACd,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,IAAI,EAAE,KAAK,CAAC,IAAI;QAChB,gBAAgB,EAAE,KAAK,CAAC,gBAAgB;QACxC,SAAS,EAAE,KAAK,CAAC,SAAS;QAC1B,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;QACxC,SAAS,EAAE,KAAK,CAAC,SAAS,CAAC,WAAW,EAAE;KAC3C,EACD,GAAG,CACN,CAAC;AACN,CAAC,CAAC,CAAC;AAEH,eAAe,GAAG,CAAC"}
@@ -1,25 +0,0 @@
1
- /**
2
- * CMS Published Cache API Contract
3
- */
4
- /**
5
- * GET /cms/published-cache
6
- * 발행된 콘텐츠 캐시 조회 (단일 또는 여러 섹션)
7
- */
8
- export declare const getPublishedCacheContract: {
9
- readonly method: "GET";
10
- readonly path: "/";
11
- readonly query: import("@sinclair/typebox").TObject<{
12
- sections: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TArray<import("@sinclair/typebox").TString>]>;
13
- locale: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
14
- }>;
15
- readonly response: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
16
- section: import("@sinclair/typebox").TString;
17
- locale: import("@sinclair/typebox").TString;
18
- content: import("@sinclair/typebox").TRecord<import("@sinclair/typebox").TString, import("@sinclair/typebox").TAny>;
19
- version: import("@sinclair/typebox").TNumber;
20
- publishedAt: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
21
- }>>, import("@sinclair/typebox").TObject<{
22
- error: import("@sinclair/typebox").TString;
23
- }>]>;
24
- };
25
- //# sourceMappingURL=contract.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../src/routes/published-cache/contract.ts"],"names":[],"mappings":"AAAA;;GAEG;AAaH;;;GAGG;AACH,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;CAkBJ,CAAC"}
@@ -1,35 +0,0 @@
1
- /**
2
- * CMS Published Cache API Contract
3
- */
4
- import { Type } from '@sinclair/typebox';
5
- const SectionData = Type.Object({
6
- section: Type.String(),
7
- locale: Type.String(),
8
- content: Type.Record(Type.String(), Type.Any()),
9
- version: Type.Number(),
10
- publishedAt: Type.Union([Type.String(), Type.Null()]),
11
- });
12
- /**
13
- * GET /cms/published-cache
14
- * 발행된 콘텐츠 캐시 조회 (단일 또는 여러 섹션)
15
- */
16
- export const getPublishedCacheContract = {
17
- method: 'GET',
18
- path: '/',
19
- query: Type.Object({
20
- sections: Type.Union([
21
- Type.String({ description: '단일 섹션 이름 (예: home)' }),
22
- Type.Array(Type.String(), { description: '여러 섹션 이름 (예: ["home", "footer"])' })
23
- ]),
24
- locale: Type.Optional(Type.String({ default: 'ko', description: '언어 코드' })),
25
- }),
26
- response: Type.Union([
27
- // 성공: 항상 배열로 반환
28
- Type.Array(SectionData),
29
- // 에러
30
- Type.Object({
31
- error: Type.String()
32
- })
33
- ])
34
- };
35
- //# sourceMappingURL=contract.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../src/routes/published-cache/contract.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5B,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;IACtB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;IACrB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,GAAG,EAAE,CAAC;IAC/C,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;IACtB,WAAW,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;CACxD,CAAC,CAAC;AAEH;;;GAGG;AACH,MAAM,CAAC,MAAM,yBAAyB,GAAG;IACrC,MAAM,EAAE,KAAc;IACtB,IAAI,EAAE,GAAG;IACT,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;QACf,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;YAClD,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,EAAE,WAAW,EAAE,kCAAkC,EAAE,CAAC;SACjF,CAAC;QACF,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC,CAAC;KAC9E,CAAC;IACF,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,gBAAgB;QAChB,IAAI,CAAC,KAAK,CAAC,WAAW,CAAC;QACvB,KAAK;QACL,IAAI,CAAC,MAAM,CAAC;YACR,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;SACvB,CAAC;KACL,CAAC;CAC4B,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * CMS Published Cache Routes
3
- *
4
- * - GET /cms/published-cache - 발행된 콘텐츠 캐시 조회 (단일 또는 배치)
5
- */
6
- declare const app: import("@spfn/core/route").SPFNApp;
7
- export default app;
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/routes/published-cache/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,QAAA,MAAM,GAAG,oCAAc,CAAC;AAgCxB,eAAe,GAAG,CAAC"}
@@ -1,33 +0,0 @@
1
- /**
2
- * CMS Published Cache Routes
3
- *
4
- * - GET /cms/published-cache - 발행된 콘텐츠 캐시 조회 (단일 또는 배치)
5
- */
6
- import { createApp } from '@spfn/core/route';
7
- import { cmsPublishedCacheRepository } from '../../repositories/index.js';
8
- import { getPublishedCacheContract } from './contract.js';
9
- const app = createApp();
10
- /**
11
- * GET /cms/published-cache
12
- * 발행된 섹션 콘텐츠 조회 (단일 또는 여러 섹션)
13
- */
14
- app.bind(getPublishedCacheContract, async (c) => {
15
- const { sections: sectionsParam, locale = 'ko' } = c.query;
16
- // Normalize to array
17
- const sections = Array.isArray(sectionsParam) ? sectionsParam : [sectionsParam];
18
- // Fetch all sections in parallel
19
- const results = await Promise.all(sections.map(section => cmsPublishedCacheRepository.findBySection(section, locale)));
20
- // Map to response format (only include found sections)
21
- const found = results
22
- .filter((cache) => cache !== null)
23
- .map(cache => ({
24
- section: cache.section,
25
- locale: cache.locale,
26
- content: cache.content,
27
- version: cache.version,
28
- publishedAt: cache.publishedAt?.toISOString() || null,
29
- }));
30
- return c.json(found);
31
- });
32
- export default app;
33
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/routes/published-cache/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,2BAA2B,EAAE,MAAM,6BAA6B,CAAC;AAC1E,OAAO,EAAE,yBAAyB,EAAE,MAAM,eAAe,CAAC;AAE1D,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;AAExB;;;GAGG;AACH,GAAG,CAAC,IAAI,CAAC,yBAAyB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAE5C,MAAM,EAAE,QAAQ,EAAE,aAAa,EAAE,MAAM,GAAG,IAAI,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;IAE3D,qBAAqB;IACrB,MAAM,QAAQ,GAAG,KAAK,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC;IAEhF,iCAAiC;IACjC,MAAM,OAAO,GAAG,MAAM,OAAO,CAAC,GAAG,CAC7B,QAAQ,CAAC,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,2BAA2B,CAAC,aAAa,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC,CACtF,CAAC;IAEF,uDAAuD;IACvD,MAAM,KAAK,GAAG,OAAO;SAChB,MAAM,CAAC,CAAC,KAAK,EAAsC,EAAE,CAAC,KAAK,KAAK,IAAI,CAAC;SACrE,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC,CAAC;QACX,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,MAAM,EAAE,KAAK,CAAC,MAAM;QACpB,OAAO,EAAE,KAAK,CAAC,OAA8B;QAC7C,OAAO,EAAE,KAAK,CAAC,OAAO;QACtB,WAAW,EAAE,KAAK,CAAC,WAAW,EAAE,WAAW,EAAE,IAAI,IAAI;KACxD,CAAC,CAAC,CAAC;IAER,OAAO,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACzB,CAAC,CAAC,CAAC;AAEH,eAAe,GAAG,CAAC"}
@@ -1,29 +0,0 @@
1
- /**
2
- * GET /cms/values/:labelId/:version - 특정 버전의 값 조회
3
- */
4
- export declare const getValuesContract: {
5
- readonly method: "GET";
6
- readonly path: "/:labelId/:version";
7
- readonly params: import("@sinclair/typebox").TObject<{
8
- labelId: import("@sinclair/typebox").TString;
9
- version: import("@sinclair/typebox").TString;
10
- }>;
11
- readonly query: import("@sinclair/typebox").TObject<{
12
- locale: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
13
- breakpoint: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
14
- }>;
15
- readonly response: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
16
- labelId: import("@sinclair/typebox").TNumber;
17
- version: import("@sinclair/typebox").TNumber;
18
- values: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
19
- id: import("@sinclair/typebox").TNumber;
20
- locale: import("@sinclair/typebox").TString;
21
- breakpoint: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TString, import("@sinclair/typebox").TNull]>;
22
- value: import("@sinclair/typebox").TAny;
23
- createdAt: import("@sinclair/typebox").TString;
24
- }>>;
25
- }>, import("@sinclair/typebox").TObject<{
26
- error: import("@sinclair/typebox").TString;
27
- }>]>;
28
- };
29
- //# sourceMappingURL=contract.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../../../src/routes/values/[labelId]/[version]/contract.ts"],"names":[],"mappings":"AAGA;;GAEG;AACH,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;CA6BI,CAAC"}
@@ -1,33 +0,0 @@
1
- import { Type } from '@sinclair/typebox';
2
- /**
3
- * GET /cms/values/:labelId/:version - 특정 버전의 값 조회
4
- */
5
- export const getValuesContract = {
6
- method: 'GET',
7
- path: '/:labelId/:version',
8
- params: Type.Object({
9
- labelId: Type.String({ description: '라벨 ID' }),
10
- version: Type.String({ description: '버전 번호' })
11
- }),
12
- query: Type.Object({
13
- locale: Type.Optional(Type.String({ description: '언어 코드 (ko, en, ja)' })),
14
- breakpoint: Type.Optional(Type.String({ description: '반응형 브레이크포인트' }))
15
- }),
16
- response: Type.Union([
17
- Type.Object({
18
- labelId: Type.Number(),
19
- version: Type.Number(),
20
- values: Type.Array(Type.Object({
21
- id: Type.Number(),
22
- locale: Type.String(),
23
- breakpoint: Type.Union([Type.String(), Type.Null()]),
24
- value: Type.Any(),
25
- createdAt: Type.String()
26
- }))
27
- }),
28
- Type.Object({
29
- error: Type.String()
30
- })
31
- ])
32
- };
33
- //# sourceMappingURL=contract.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../../../src/routes/values/[labelId]/[version]/contract.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,MAAM,mBAAmB,CAAC;AAGzC;;GAEG;AACH,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC7B,MAAM,EAAE,KAAc;IACtB,IAAI,EAAE,oBAAoB;IAC1B,MAAM,EAAE,IAAI,CAAC,MAAM,CAAC;QAChB,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;QAC9C,OAAO,EAAE,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,OAAO,EAAE,CAAC;KACjD,CAAC;IACF,KAAK,EAAE,IAAI,CAAC,MAAM,CAAC;QACf,MAAM,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC,CAAC;QACzE,UAAU,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,WAAW,EAAE,aAAa,EAAE,CAAC,CAAC;KACzE,CAAC;IACF,QAAQ,EAAE,IAAI,CAAC,KAAK,CAAC;QACjB,IAAI,CAAC,MAAM,CAAC;YACR,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;YACtB,OAAO,EAAE,IAAI,CAAC,MAAM,EAAE;YACtB,MAAM,EAAE,IAAI,CAAC,KAAK,CACd,IAAI,CAAC,MAAM,CAAC;gBACR,EAAE,EAAE,IAAI,CAAC,MAAM,EAAE;gBACjB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE;gBACrB,UAAU,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,IAAI,CAAC,MAAM,EAAE,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC;gBACpD,KAAK,EAAE,IAAI,CAAC,GAAG,EAAE;gBACjB,SAAS,EAAE,IAAI,CAAC,MAAM,EAAE;aAC3B,CAAC,CACL;SACJ,CAAC;QACF,IAAI,CAAC,MAAM,CAAC;YACR,KAAK,EAAE,IAAI,CAAC,MAAM,EAAE;SACvB,CAAC;KACL,CAAC;CAC4B,CAAC"}
@@ -1,8 +0,0 @@
1
- /**
2
- * CMS Label Values Detail Routes
3
- *
4
- * - GET /cms/values/:labelId/:version - 특정 버전의 값 조회
5
- */
6
- declare const app: import("@spfn/core/route").SPFNApp;
7
- export default app;
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../src/routes/values/[labelId]/[version]/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAMH,QAAA,MAAM,GAAG,oCAAc,CAAC;AAiDxB,eAAe,GAAG,CAAC"}
@@ -1,45 +0,0 @@
1
- /**
2
- * CMS Label Values Detail Routes
3
- *
4
- * - GET /cms/values/:labelId/:version - 특정 버전의 값 조회
5
- */
6
- import { createApp } from '@spfn/core/route';
7
- import { cmsLabelsRepository, cmsLabelValuesRepository } from '../../../../repositories/index.js';
8
- import { getValuesContract } from './contract.js';
9
- const app = createApp();
10
- /**
11
- * GET /cms/values/:labelId/:version
12
- * 특정 버전의 값 조회
13
- */
14
- app.bind(getValuesContract, async (c) => {
15
- const { labelId: labelIdStr, version: versionStr } = c.params;
16
- const labelId = parseInt(labelIdStr, 10);
17
- const version = parseInt(versionStr, 10);
18
- if (isNaN(labelId) || isNaN(version)) {
19
- return c.json({ error: 'Invalid label ID or version' }, 400);
20
- }
21
- const { locale, breakpoint } = c.query;
22
- // 라벨 존재 확인
23
- const label = await cmsLabelsRepository.findById(labelId);
24
- if (!label) {
25
- return c.json({ error: 'Label not found' }, 404);
26
- }
27
- // 값 조회
28
- const values = await cmsLabelValuesRepository.findByLabelIdAndVersion(labelId, version, {
29
- locale,
30
- breakpoint: breakpoint === 'null' ? null : breakpoint,
31
- });
32
- return c.json({
33
- labelId,
34
- version,
35
- values: values.map((v) => ({
36
- id: v.id,
37
- locale: v.locale,
38
- breakpoint: v.breakpoint,
39
- value: v.value,
40
- createdAt: v.createdAt.toISOString(),
41
- })),
42
- });
43
- });
44
- export default app;
45
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../src/routes/values/[labelId]/[version]/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,mCAAmC,CAAC;AAClG,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAElD,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;AAExB;;;GAGG;AACH,GAAG,CAAC,IAAI,CAAC,iBAAiB,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAEpC,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;IAC9D,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,EACpC,CAAC;QACG,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,6BAA6B,EAAE,EAAE,GAAG,CAAC,CAAC;IACjE,CAAC;IAED,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,KAAK,CAAC;IAEvC,WAAW;IACX,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,EACV,CAAC;QACG,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;IACP,MAAM,MAAM,GAAG,MAAM,wBAAwB,CAAC,uBAAuB,CACjE,OAAO,EACP,OAAO,EACP;QACI,MAAM;QACN,UAAU,EAAE,UAAU,KAAK,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,UAAU;KACxD,CACJ,CAAC;IAEF,OAAO,CAAC,CAAC,IAAI,CAAC;QACV,OAAO;QACP,OAAO;QACP,MAAM,EAAE,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;YACvB,EAAE,EAAE,CAAC,CAAC,EAAE;YACR,MAAM,EAAE,CAAC,CAAC,MAAM;YAChB,UAAU,EAAE,CAAC,CAAC,UAAU;YACxB,KAAK,EAAE,CAAC,CAAC,KAAK;YACd,SAAS,EAAE,CAAC,CAAC,SAAS,CAAC,WAAW,EAAE;SACvC,CAAC,CAAC;KACN,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,eAAe,GAAG,CAAC"}
@@ -1,38 +0,0 @@
1
- /**
2
- * POST /cms/values/:labelId - 라벨 값 저장
3
- */
4
- export declare const saveValuesContract: {
5
- readonly method: "POST";
6
- readonly path: "/:labelId";
7
- readonly params: import("@sinclair/typebox").TObject<{
8
- labelId: import("@sinclair/typebox").TString;
9
- }>;
10
- readonly body: import("@sinclair/typebox").TObject<{
11
- version: import("@sinclair/typebox").TNumber;
12
- values: import("@sinclair/typebox").TArray<import("@sinclair/typebox").TObject<{
13
- locale: import("@sinclair/typebox").TString;
14
- breakpoint: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"sm">, import("@sinclair/typebox").TLiteral<"md">, import("@sinclair/typebox").TLiteral<"lg">, import("@sinclair/typebox").TLiteral<"xl">, import("@sinclair/typebox").TLiteral<"2xl">, import("@sinclair/typebox").TNull]>>;
15
- value: import("@sinclair/typebox").TObject<{
16
- type: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TLiteral<"text">, import("@sinclair/typebox").TLiteral<"image">, import("@sinclair/typebox").TLiteral<"video">, import("@sinclair/typebox").TLiteral<"file">, import("@sinclair/typebox").TLiteral<"object">]>;
17
- content: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
18
- url: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
19
- alt: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
20
- width: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
21
- height: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
22
- thumbnail: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
23
- duration: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
24
- filename: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TString>;
25
- size: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TNumber>;
26
- fields: import("@sinclair/typebox").TOptional<import("@sinclair/typebox").TAny>;
27
- }>;
28
- }>>;
29
- }>;
30
- readonly response: import("@sinclair/typebox").TUnion<[import("@sinclair/typebox").TObject<{
31
- success: import("@sinclair/typebox").TBoolean;
32
- saved: import("@sinclair/typebox").TNumber;
33
- version: import("@sinclair/typebox").TNumber;
34
- }>, import("@sinclair/typebox").TObject<{
35
- error: import("@sinclair/typebox").TString;
36
- }>]>;
37
- };
38
- //# sourceMappingURL=contract.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../../../../src/routes/values/[labelId]/contract.ts"],"names":[],"mappings":"AA0BA;;GAEG;AACH,eAAO,MAAM,kBAAkB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAiCG,CAAC"}
@@ -1,59 +0,0 @@
1
- import { Type } from '@sinclair/typebox';
2
- /**
3
- * Label Value 타입 정의
4
- */
5
- const LabelValueSchema = Type.Object({
6
- type: Type.Union([
7
- Type.Literal('text'),
8
- Type.Literal('image'),
9
- Type.Literal('video'),
10
- Type.Literal('file'),
11
- Type.Literal('object')
12
- ]),
13
- content: Type.Optional(Type.String()), // text type
14
- url: Type.Optional(Type.String()), // image, video, file types
15
- alt: Type.Optional(Type.String()), // image type
16
- width: Type.Optional(Type.Number()), // image type
17
- height: Type.Optional(Type.Number()), // image type
18
- thumbnail: Type.Optional(Type.String()), // video type
19
- duration: Type.Optional(Type.Number()), // video type
20
- filename: Type.Optional(Type.String()), // file type
21
- size: Type.Optional(Type.Number()), // file type
22
- fields: Type.Optional(Type.Any()) // object type - recursive structure
23
- });
24
- /**
25
- * POST /cms/values/:labelId - 라벨 값 저장
26
- */
27
- export const saveValuesContract = {
28
- method: 'POST',
29
- path: '/:labelId',
30
- params: Type.Object({
31
- labelId: Type.String({ description: '라벨 ID' })
32
- }),
33
- body: Type.Object({
34
- version: Type.Number({ description: '버전 번호', minimum: 1 }),
35
- values: Type.Array(Type.Object({
36
- locale: Type.String({ description: '언어 코드 (ko, en, ja)', default: 'ko' }),
37
- breakpoint: Type.Optional(Type.Union([
38
- Type.Literal('sm'),
39
- Type.Literal('md'),
40
- Type.Literal('lg'),
41
- Type.Literal('xl'),
42
- Type.Literal('2xl'),
43
- Type.Null()
44
- ], { description: '반응형 브레이크포인트' })),
45
- value: LabelValueSchema
46
- }))
47
- }),
48
- response: Type.Union([
49
- Type.Object({
50
- success: Type.Boolean(),
51
- saved: Type.Number(),
52
- version: Type.Number()
53
- }),
54
- Type.Object({
55
- error: Type.String()
56
- })
57
- ])
58
- };
59
- //# sourceMappingURL=contract.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"contract.js","sourceRoot":"","sources":["../../../../src/routes/values/[labelId]/contract.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- /**
2
- * CMS Label Values Routes
3
- *
4
- * - POST /cms/values/:labelId - 라벨 값 저장
5
- */
6
- declare const app: import("@spfn/core/route").SPFNApp;
7
- export default app;
8
- //# sourceMappingURL=index.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/routes/values/[labelId]/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAOH,QAAA,MAAM,GAAG,oCAAc,CAAC;AA2CxB,eAAe,GAAG,CAAC"}
@@ -1,42 +0,0 @@
1
- /**
2
- * CMS Label Values Routes
3
- *
4
- * - POST /cms/values/:labelId - 라벨 값 저장
5
- */
6
- import { createApp } from '@spfn/core/route';
7
- import { Transactional } from '@spfn/core/db';
8
- import { cmsLabelsRepository, cmsLabelValuesRepository } from '../../../repositories/index.js';
9
- import { saveValuesContract } from './contract.js';
10
- const app = createApp();
11
- /**
12
- * POST /cms/values/:labelId
13
- * 라벨 값 저장 (upsert)
14
- */
15
- app.bind(saveValuesContract, [Transactional()], async (c) => {
16
- const { labelId: labelIdStr } = c.params;
17
- const labelId = parseInt(labelIdStr, 10);
18
- if (isNaN(labelId)) {
19
- return c.json({ error: 'Invalid label ID' }, 400);
20
- }
21
- const body = await c.data();
22
- // 라벨 존재 확인
23
- const label = await cmsLabelsRepository.findById(labelId);
24
- if (!label) {
25
- return c.json({ error: 'Label not found' }, 404);
26
- }
27
- // 값 저장
28
- const savedValues = await cmsLabelValuesRepository.upsertMany(body.values.map((v) => ({
29
- labelId,
30
- version: body.version,
31
- locale: v.locale,
32
- breakpoint: v.breakpoint ?? null,
33
- value: v.value,
34
- })));
35
- return c.json({
36
- success: true,
37
- saved: savedValues.length,
38
- version: body.version,
39
- });
40
- });
41
- export default app;
42
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/routes/values/[labelId]/index.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC;AAC9C,OAAO,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,gCAAgC,CAAC;AAC/F,OAAO,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AAEnD,MAAM,GAAG,GAAG,SAAS,EAAE,CAAC;AAExB;;;GAGG;AACH,GAAG,CAAC,IAAI,CAAC,kBAAkB,EAAE,CAAC,aAAa,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,EAAE;IAExD,MAAM,EAAE,OAAO,EAAE,UAAU,EAAE,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,MAAM,OAAO,GAAG,QAAQ,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC;IAEzC,IAAI,KAAK,CAAC,OAAO,CAAC,EAClB,CAAC;QACG,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,kBAAkB,EAAE,EAAE,GAAG,CAAC,CAAC;IACtD,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,CAAC,CAAC,IAAI,EAAE,CAAC;IAE5B,WAAW;IACX,MAAM,KAAK,GAAG,MAAM,mBAAmB,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC;IAC1D,IAAI,CAAC,KAAK,EACV,CAAC;QACG,OAAO,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,iBAAiB,EAAE,EAAE,GAAG,CAAC,CAAC;IACrD,CAAC;IAED,OAAO;IACP,MAAM,WAAW,GAAG,MAAM,wBAAwB,CAAC,UAAU,CACzD,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC;QACpB,OAAO;QACP,OAAO,EAAE,IAAI,CAAC,OAAO;QACrB,MAAM,EAAE,CAAC,CAAC,MAAM;QAChB,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,IAAI;QAChC,KAAK,EAAE,CAAC,CAAC,KAAK;KACjB,CAAC,CAAC,CACN,CAAC;IAEF,OAAO,CAAC,CAAC,IAAI,CAAC;QACV,OAAO,EAAE,IAAI;QACb,KAAK,EAAE,WAAW,CAAC,MAAM;QACzB,OAAO,EAAE,IAAI,CAAC,OAAO;KACxB,CAAC,CAAC;AACP,CAAC,CAAC,CAAC;AAEH,eAAe,GAAG,CAAC"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,aAAa,CAAC;AAiBrB;;GAEG;AACH,MAAM,MAAM,WAAW,GAAG;IACtB,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC7B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,GAAG,IAAI,CAAC;CAC9B,CAAC;AAEF;;GAEG;AACH,KAAK,yBAAyB,GAAG,CAC7B,GAAG,EAAE,MAAM,EACX,YAAY,CAAC,EAAE,GAAG,EAClB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,KACxC,GAAG,CAAC;AAET;;GAEG;AACH,MAAM,MAAM,UAAU,GAAG;IACrB;;;;;;;OAOG;IACH,CAAC,EAAE,yBAAyB,CAAC;IAE7B;;OAEG;IACH,IAAI,EAAE,WAAW,CAAC;CACrB,CAAC;AAkBF;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA+BG;AACH,eAAO,MAAM,UAAU,YACV,MAAM,WACN,MAAM,KAChB,OAAO,CAAC,UAAU,CA2GnB,CAAC;AAEH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA6BG;AACH,eAAO,MAAM,WAAW,aACV,MAAM,EAAE,WACT,MAAM,KAChB,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CA0HnC,CAAC"}
package/dist/store.d.ts DELETED
@@ -1,87 +0,0 @@
1
- /**
2
- * CMS Zustand Store
3
- *
4
- * 클라이언트 컴포넌트에서 CMS 사용을 위한 상태 관리
5
- * - 서버에서 초기화된 데이터를 클라이언트로 전달
6
- * - 클라이언트에서 비동기로 로드 가능
7
- * - 서버 API와 동일한 패턴 ({ t } 사용)
8
- */
9
- import type { SectionData } from './server';
10
- interface CmsState {
11
- /**
12
- * 섹션별 데이터
13
- * { 'home': { section: 'home', content: {...}, version: 1, ... }, ... }
14
- */
15
- sections: Record<string, SectionData>;
16
- /**
17
- * 로딩 상태
18
- */
19
- loading: Record<string, boolean>;
20
- /**
21
- * 섹션 데이터 설정 (서버에서 초기화용)
22
- */
23
- setSection: (section: string, data: SectionData) => void;
24
- /**
25
- * 여러 섹션 한번에 설정
26
- */
27
- setSections: (sections: Record<string, SectionData>) => void;
28
- /**
29
- * 섹션 비동기 로드
30
- */
31
- loadSection: (section: string, locale?: string) => Promise<void>;
32
- /**
33
- * 라벨 업데이트 (Draft Mode용)
34
- */
35
- updateLabel: (section: string, key: string, value: any) => void;
36
- /**
37
- * 초기화
38
- */
39
- reset: () => void;
40
- }
41
- export declare const useCmsStore: import("zustand").UseBoundStore<import("zustand").StoreApi<CmsState>>;
42
- /**
43
- * 섹션 Hook (서버 API와 동일한 패턴)
44
- *
45
- * @param section - 섹션 이름
46
- * @param options - 옵션 (autoLoad: 자동 로드 여부)
47
- * @returns { t, data, loading }
48
- *
49
- * @example
50
- * ```tsx
51
- * 'use client';
52
- * import { useSection } from '@/lib/cms';
53
- *
54
- * export function ClientComponent()
55
- * {
56
- * const { t } = useSection('home');
57
- * return <h1>{t('hero.title')}</h1>;
58
- * }
59
- * ```
60
- */
61
- export declare function useSection(section: string, options?: {
62
- autoLoad?: boolean;
63
- locale?: string;
64
- }): {
65
- t: (key: string, defaultValue?: any, replace?: Record<string, string | number>) => any;
66
- data: SectionData;
67
- loading: boolean;
68
- };
69
- /**
70
- * 여러 섹션 Hook
71
- *
72
- * @param sectionNames - 섹션 이름 배열
73
- * @returns { [section]: { t, data, loading }, ... }
74
- *
75
- * @example
76
- * ```tsx
77
- * const sections = useSections(['home', 'why-futureplay']);
78
- * sections.home.t('hero.title');
79
- * ```
80
- */
81
- export declare function useSections(sectionNames: string[]): Record<string, {
82
- t: (key: string, defaultValue?: any, replace?: Record<string, string | number>) => any;
83
- data: SectionData;
84
- loading: boolean;
85
- }>;
86
- export {};
87
- //# sourceMappingURL=store.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"store.d.ts","sourceRoot":"","sources":["../src/store.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAOH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAc5C,UAAU,QAAQ;IAEd;;;OAGG;IACH,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,CAAC;IAEtC;;OAEG;IACH,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAEjC;;OAEG;IACH,UAAU,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,WAAW,KAAK,IAAI,CAAC;IAEzD;;OAEG;IACH,WAAW,EAAE,CAAC,QAAQ,EAAE,MAAM,CAAC,MAAM,EAAE,WAAW,CAAC,KAAK,IAAI,CAAC;IAE7D;;OAEG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,MAAM,CAAC,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAEjE;;OAEG;IACH,WAAW,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,KAAK,IAAI,CAAC;IAEhE;;OAEG;IACH,KAAK,EAAE,MAAM,IAAI,CAAC;CACrB;AAED,eAAO,MAAM,WAAW,uEAkHrB,CAAC;AAEJ;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,UAAU,CACtB,OAAO,EAAE,MAAM,EACf,OAAO,GAAE;IAAE,QAAQ,CAAC,EAAE,OAAO,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAA;CAAO;aAoB3C,MAAM,iBAAiB,GAAG,YAAY,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;;;EA+BlF;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,WAAW,CAAC,YAAY,EAAE,MAAM,EAAE;aA7CpC,MAAM,iBAAiB,GAAG,YAAY,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC;;;GAwFlF"}