@fivepixels-js/lite-api 0.2.1

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 (372) hide show
  1. package/LICENSE +93 -0
  2. package/README.md +537 -0
  3. package/dist/app.d.ts +10 -0
  4. package/dist/app.d.ts.map +1 -0
  5. package/dist/app.js +70 -0
  6. package/dist/app.js.map +1 -0
  7. package/dist/auth/identity.repository.d.ts +62 -0
  8. package/dist/auth/identity.repository.d.ts.map +1 -0
  9. package/dist/auth/identity.repository.js +202 -0
  10. package/dist/auth/identity.repository.js.map +1 -0
  11. package/dist/auth/identity.routes.d.ts +5 -0
  12. package/dist/auth/identity.routes.d.ts.map +1 -0
  13. package/dist/auth/identity.routes.js +56 -0
  14. package/dist/auth/identity.routes.js.map +1 -0
  15. package/dist/auth/identity.schemas.d.ts +2711 -0
  16. package/dist/auth/identity.schemas.d.ts.map +1 -0
  17. package/dist/auth/identity.schemas.js +117 -0
  18. package/dist/auth/identity.schemas.js.map +1 -0
  19. package/dist/auth/identity.service.d.ts +37 -0
  20. package/dist/auth/identity.service.d.ts.map +1 -0
  21. package/dist/auth/identity.service.js +131 -0
  22. package/dist/auth/identity.service.js.map +1 -0
  23. package/dist/auth/password.service.d.ts +15 -0
  24. package/dist/auth/password.service.d.ts.map +1 -0
  25. package/dist/auth/password.service.js +116 -0
  26. package/dist/auth/password.service.js.map +1 -0
  27. package/dist/auth/token.service.d.ts +38 -0
  28. package/dist/auth/token.service.d.ts.map +1 -0
  29. package/dist/auth/token.service.js +54 -0
  30. package/dist/auth/token.service.js.map +1 -0
  31. package/dist/cli/cli.d.ts +3 -0
  32. package/dist/cli/cli.d.ts.map +1 -0
  33. package/dist/cli/cli.js +132 -0
  34. package/dist/cli/cli.js.map +1 -0
  35. package/dist/cli/commands/backup.d.ts +4 -0
  36. package/dist/cli/commands/backup.d.ts.map +1 -0
  37. package/dist/cli/commands/backup.js +24 -0
  38. package/dist/cli/commands/backup.js.map +1 -0
  39. package/dist/cli/commands/init.d.ts +4 -0
  40. package/dist/cli/commands/init.d.ts.map +1 -0
  41. package/dist/cli/commands/init.js +23 -0
  42. package/dist/cli/commands/init.js.map +1 -0
  43. package/dist/cli/commands/migrate.d.ts +4 -0
  44. package/dist/cli/commands/migrate.d.ts.map +1 -0
  45. package/dist/cli/commands/migrate.js +20 -0
  46. package/dist/cli/commands/migrate.js.map +1 -0
  47. package/dist/cli/commands/start.d.ts +4 -0
  48. package/dist/cli/commands/start.d.ts.map +1 -0
  49. package/dist/cli/commands/start.js +13 -0
  50. package/dist/cli/commands/start.js.map +1 -0
  51. package/dist/cli/commands/status.d.ts +4 -0
  52. package/dist/cli/commands/status.d.ts.map +1 -0
  53. package/dist/cli/commands/status.js +48 -0
  54. package/dist/cli/commands/status.js.map +1 -0
  55. package/dist/cli/index.d.ts +3 -0
  56. package/dist/cli/index.d.ts.map +1 -0
  57. package/dist/cli/index.js +4 -0
  58. package/dist/cli/index.js.map +1 -0
  59. package/dist/cli/io.d.ts +6 -0
  60. package/dist/cli/io.d.ts.map +1 -0
  61. package/dist/cli/io.js +9 -0
  62. package/dist/cli/io.js.map +1 -0
  63. package/dist/community/contracts.d.ts +29 -0
  64. package/dist/community/contracts.d.ts.map +1 -0
  65. package/dist/community/contracts.js +41 -0
  66. package/dist/community/contracts.js.map +1 -0
  67. package/dist/community/error-handler.d.ts +3 -0
  68. package/dist/community/error-handler.d.ts.map +1 -0
  69. package/dist/community/error-handler.js +66 -0
  70. package/dist/community/error-handler.js.map +1 -0
  71. package/dist/community/errors.d.ts +10 -0
  72. package/dist/community/errors.d.ts.map +1 -0
  73. package/dist/community/errors.js +39 -0
  74. package/dist/community/errors.js.map +1 -0
  75. package/dist/community/etag.d.ts +5 -0
  76. package/dist/community/etag.d.ts.map +1 -0
  77. package/dist/community/etag.js +31 -0
  78. package/dist/community/etag.js.map +1 -0
  79. package/dist/community/input.d.ts +10 -0
  80. package/dist/community/input.d.ts.map +1 -0
  81. package/dist/community/input.js +48 -0
  82. package/dist/community/input.js.map +1 -0
  83. package/dist/community/mutation-route.d.ts +7 -0
  84. package/dist/community/mutation-route.d.ts.map +1 -0
  85. package/dist/community/mutation-route.js +47 -0
  86. package/dist/community/mutation-route.js.map +1 -0
  87. package/dist/community/schemas.d.ts +807 -0
  88. package/dist/community/schemas.d.ts.map +1 -0
  89. package/dist/community/schemas.js +100 -0
  90. package/dist/community/schemas.js.map +1 -0
  91. package/dist/community/system.schemas.d.ts +40 -0
  92. package/dist/community/system.schemas.d.ts.map +1 -0
  93. package/dist/community/system.schemas.js +30 -0
  94. package/dist/community/system.schemas.js.map +1 -0
  95. package/dist/config/config.d.ts +43 -0
  96. package/dist/config/config.d.ts.map +1 -0
  97. package/dist/config/config.js +208 -0
  98. package/dist/config/config.js.map +1 -0
  99. package/dist/config/data-path.d.ts +2 -0
  100. package/dist/config/data-path.d.ts.map +1 -0
  101. package/dist/config/data-path.js +16 -0
  102. package/dist/config/data-path.js.map +1 -0
  103. package/dist/config/jwt-secret.d.ts +3 -0
  104. package/dist/config/jwt-secret.d.ts.map +1 -0
  105. package/dist/config/jwt-secret.js +67 -0
  106. package/dist/config/jwt-secret.js.map +1 -0
  107. package/dist/db/backup.d.ts +10 -0
  108. package/dist/db/backup.d.ts.map +1 -0
  109. package/dist/db/backup.js +51 -0
  110. package/dist/db/backup.js.map +1 -0
  111. package/dist/db/connection.d.ts +15 -0
  112. package/dist/db/connection.d.ts.map +1 -0
  113. package/dist/db/connection.js +82 -0
  114. package/dist/db/connection.js.map +1 -0
  115. package/dist/db/guid-order.d.ts +2 -0
  116. package/dist/db/guid-order.d.ts.map +1 -0
  117. package/dist/db/guid-order.js +9 -0
  118. package/dist/db/guid-order.js.map +1 -0
  119. package/dist/db/migrate.d.ts +37 -0
  120. package/dist/db/migrate.d.ts.map +1 -0
  121. package/dist/db/migrate.js +145 -0
  122. package/dist/db/migrate.js.map +1 -0
  123. package/dist/db/migrations/001_schema_migrations.sql +6 -0
  124. package/dist/db/migrations/002_identity.sql +95 -0
  125. package/dist/db/migrations/003_projects.sql +62 -0
  126. package/dist/db/migrations/004_feedback_core.sql +236 -0
  127. package/dist/db/migrations/005_project_member_management.sql +55 -0
  128. package/dist/db/migrations/006_align_credentials.sql +33 -0
  129. package/dist/db/migrations/007_align_storage_values.sql +78 -0
  130. package/dist/db/storage-migration.d.ts +9 -0
  131. package/dist/db/storage-migration.d.ts.map +1 -0
  132. package/dist/db/storage-migration.js +79 -0
  133. package/dist/db/storage-migration.js.map +1 -0
  134. package/dist/db/transaction.d.ts +9 -0
  135. package/dist/db/transaction.d.ts.map +1 -0
  136. package/dist/db/transaction.js +14 -0
  137. package/dist/db/transaction.js.map +1 -0
  138. package/dist/errors/error-handler.d.ts +3 -0
  139. package/dist/errors/error-handler.d.ts.map +1 -0
  140. package/dist/errors/error-handler.js +50 -0
  141. package/dist/errors/error-handler.js.map +1 -0
  142. package/dist/feedbacks/feedback-workflow.service.d.ts +59 -0
  143. package/dist/feedbacks/feedback-workflow.service.d.ts.map +1 -0
  144. package/dist/feedbacks/feedback-workflow.service.js +89 -0
  145. package/dist/feedbacks/feedback-workflow.service.js.map +1 -0
  146. package/dist/feedbacks/feedback.input.d.ts +4 -0
  147. package/dist/feedbacks/feedback.input.d.ts.map +1 -0
  148. package/dist/feedbacks/feedback.input.js +25 -0
  149. package/dist/feedbacks/feedback.input.js.map +1 -0
  150. package/dist/feedbacks/feedback.repository.d.ts +48 -0
  151. package/dist/feedbacks/feedback.repository.d.ts.map +1 -0
  152. package/dist/feedbacks/feedback.repository.js +238 -0
  153. package/dist/feedbacks/feedback.repository.js.map +1 -0
  154. package/dist/feedbacks/feedback.routes.d.ts +4 -0
  155. package/dist/feedbacks/feedback.routes.d.ts.map +1 -0
  156. package/dist/feedbacks/feedback.routes.js +78 -0
  157. package/dist/feedbacks/feedback.routes.js.map +1 -0
  158. package/dist/feedbacks/feedback.schemas.d.ts +642 -0
  159. package/dist/feedbacks/feedback.schemas.d.ts.map +1 -0
  160. package/dist/feedbacks/feedback.schemas.js +131 -0
  161. package/dist/feedbacks/feedback.schemas.js.map +1 -0
  162. package/dist/feedbacks/feedback.service.d.ts +23 -0
  163. package/dist/feedbacks/feedback.service.d.ts.map +1 -0
  164. package/dist/feedbacks/feedback.service.js +74 -0
  165. package/dist/feedbacks/feedback.service.js.map +1 -0
  166. package/dist/feedbacks/feedback.types.d.ts +64 -0
  167. package/dist/feedbacks/feedback.types.d.ts.map +1 -0
  168. package/dist/feedbacks/feedback.types.js +2 -0
  169. package/dist/feedbacks/feedback.types.js.map +1 -0
  170. package/dist/page-elements/page-element.input.d.ts +7 -0
  171. package/dist/page-elements/page-element.input.d.ts.map +1 -0
  172. package/dist/page-elements/page-element.input.js +59 -0
  173. package/dist/page-elements/page-element.input.js.map +1 -0
  174. package/dist/page-elements/page-element.repository.d.ts +21 -0
  175. package/dist/page-elements/page-element.repository.d.ts.map +1 -0
  176. package/dist/page-elements/page-element.repository.js +123 -0
  177. package/dist/page-elements/page-element.repository.js.map +1 -0
  178. package/dist/page-elements/page-element.schemas.d.ts +97 -0
  179. package/dist/page-elements/page-element.schemas.d.ts.map +1 -0
  180. package/dist/page-elements/page-element.schemas.js +40 -0
  181. package/dist/page-elements/page-element.schemas.js.map +1 -0
  182. package/dist/page-elements/page-element.types.d.ts +24 -0
  183. package/dist/page-elements/page-element.types.d.ts.map +1 -0
  184. package/dist/page-elements/page-element.types.js +2 -0
  185. package/dist/page-elements/page-element.types.js.map +1 -0
  186. package/dist/plugins/auth.plugin.d.ts +3 -0
  187. package/dist/plugins/auth.plugin.d.ts.map +1 -0
  188. package/dist/plugins/auth.plugin.js +28 -0
  189. package/dist/plugins/auth.plugin.js.map +1 -0
  190. package/dist/plugins/community-api.plugin.d.ts +5 -0
  191. package/dist/plugins/community-api.plugin.d.ts.map +1 -0
  192. package/dist/plugins/community-api.plugin.js +25 -0
  193. package/dist/plugins/community-api.plugin.js.map +1 -0
  194. package/dist/plugins/cors.plugin.d.ts +3 -0
  195. package/dist/plugins/cors.plugin.d.ts.map +1 -0
  196. package/dist/plugins/cors.plugin.js +19 -0
  197. package/dist/plugins/cors.plugin.js.map +1 -0
  198. package/dist/plugins/swagger.plugin.d.ts +3 -0
  199. package/dist/plugins/swagger.plugin.d.ts.map +1 -0
  200. package/dist/plugins/swagger.plugin.js +59 -0
  201. package/dist/plugins/swagger.plugin.js.map +1 -0
  202. package/dist/plugins/user-auth.plugin.d.ts +33 -0
  203. package/dist/plugins/user-auth.plugin.d.ts.map +1 -0
  204. package/dist/plugins/user-auth.plugin.js +62 -0
  205. package/dist/plugins/user-auth.plugin.js.map +1 -0
  206. package/dist/projects/members/project-member.repository.d.ts +49 -0
  207. package/dist/projects/members/project-member.repository.d.ts.map +1 -0
  208. package/dist/projects/members/project-member.repository.js +215 -0
  209. package/dist/projects/members/project-member.repository.js.map +1 -0
  210. package/dist/projects/members/project-member.routes.d.ts +4 -0
  211. package/dist/projects/members/project-member.routes.d.ts.map +1 -0
  212. package/dist/projects/members/project-member.routes.js +82 -0
  213. package/dist/projects/members/project-member.routes.js.map +1 -0
  214. package/dist/projects/members/project-member.schemas.d.ts +2735 -0
  215. package/dist/projects/members/project-member.schemas.d.ts.map +1 -0
  216. package/dist/projects/members/project-member.schemas.js +138 -0
  217. package/dist/projects/members/project-member.schemas.js.map +1 -0
  218. package/dist/projects/members/project-member.service.d.ts +29 -0
  219. package/dist/projects/members/project-member.service.d.ts.map +1 -0
  220. package/dist/projects/members/project-member.service.js +92 -0
  221. package/dist/projects/members/project-member.service.js.map +1 -0
  222. package/dist/projects/project-access.policy.d.ts +11 -0
  223. package/dist/projects/project-access.policy.d.ts.map +1 -0
  224. package/dist/projects/project-access.policy.js +30 -0
  225. package/dist/projects/project-access.policy.js.map +1 -0
  226. package/dist/projects/project-access.repository.d.ts +12 -0
  227. package/dist/projects/project-access.repository.d.ts.map +1 -0
  228. package/dist/projects/project-access.repository.js +45 -0
  229. package/dist/projects/project-access.repository.js.map +1 -0
  230. package/dist/projects/project-access.types.d.ts +9 -0
  231. package/dist/projects/project-access.types.d.ts.map +1 -0
  232. package/dist/projects/project-access.types.js +2 -0
  233. package/dist/projects/project-access.types.js.map +1 -0
  234. package/dist/projects/project-mutation.service.d.ts +15 -0
  235. package/dist/projects/project-mutation.service.d.ts.map +1 -0
  236. package/dist/projects/project-mutation.service.js +39 -0
  237. package/dist/projects/project-mutation.service.js.map +1 -0
  238. package/dist/projects/project.repository.d.ts +49 -0
  239. package/dist/projects/project.repository.d.ts.map +1 -0
  240. package/dist/projects/project.repository.js +155 -0
  241. package/dist/projects/project.repository.js.map +1 -0
  242. package/dist/projects/project.routes.d.ts +4 -0
  243. package/dist/projects/project.routes.d.ts.map +1 -0
  244. package/dist/projects/project.routes.js +45 -0
  245. package/dist/projects/project.routes.js.map +1 -0
  246. package/dist/projects/project.schemas.d.ts +2044 -0
  247. package/dist/projects/project.schemas.d.ts.map +1 -0
  248. package/dist/projects/project.schemas.js +90 -0
  249. package/dist/projects/project.schemas.js.map +1 -0
  250. package/dist/projects/project.service.d.ts +40 -0
  251. package/dist/projects/project.service.d.ts.map +1 -0
  252. package/dist/projects/project.service.js +128 -0
  253. package/dist/projects/project.service.js.map +1 -0
  254. package/dist/replies/reply-mutation.service.d.ts +19 -0
  255. package/dist/replies/reply-mutation.service.d.ts.map +1 -0
  256. package/dist/replies/reply-mutation.service.js +51 -0
  257. package/dist/replies/reply-mutation.service.js.map +1 -0
  258. package/dist/replies/reply.input.d.ts +4 -0
  259. package/dist/replies/reply.input.d.ts.map +1 -0
  260. package/dist/replies/reply.input.js +33 -0
  261. package/dist/replies/reply.input.js.map +1 -0
  262. package/dist/replies/reply.repository.d.ts +40 -0
  263. package/dist/replies/reply.repository.d.ts.map +1 -0
  264. package/dist/replies/reply.repository.js +173 -0
  265. package/dist/replies/reply.repository.js.map +1 -0
  266. package/dist/replies/reply.routes.d.ts +4 -0
  267. package/dist/replies/reply.routes.d.ts.map +1 -0
  268. package/dist/replies/reply.routes.js +64 -0
  269. package/dist/replies/reply.routes.js.map +1 -0
  270. package/dist/replies/reply.schemas.d.ts +251 -0
  271. package/dist/replies/reply.schemas.d.ts.map +1 -0
  272. package/dist/replies/reply.schemas.js +51 -0
  273. package/dist/replies/reply.schemas.js.map +1 -0
  274. package/dist/replies/reply.service.d.ts +19 -0
  275. package/dist/replies/reply.service.d.ts.map +1 -0
  276. package/dist/replies/reply.service.js +50 -0
  277. package/dist/replies/reply.service.js.map +1 -0
  278. package/dist/replies/reply.types.d.ts +31 -0
  279. package/dist/replies/reply.types.d.ts.map +1 -0
  280. package/dist/replies/reply.types.js +2 -0
  281. package/dist/replies/reply.types.js.map +1 -0
  282. package/dist/report-cases/report-case-workflow.service.d.ts +39 -0
  283. package/dist/report-cases/report-case-workflow.service.d.ts.map +1 -0
  284. package/dist/report-cases/report-case-workflow.service.js +103 -0
  285. package/dist/report-cases/report-case-workflow.service.js.map +1 -0
  286. package/dist/report-cases/report-case.input.d.ts +4 -0
  287. package/dist/report-cases/report-case.input.d.ts.map +1 -0
  288. package/dist/report-cases/report-case.input.js +29 -0
  289. package/dist/report-cases/report-case.input.js.map +1 -0
  290. package/dist/report-cases/report-case.repository.d.ts +45 -0
  291. package/dist/report-cases/report-case.repository.d.ts.map +1 -0
  292. package/dist/report-cases/report-case.repository.js +185 -0
  293. package/dist/report-cases/report-case.repository.js.map +1 -0
  294. package/dist/report-cases/report-case.routes.d.ts +4 -0
  295. package/dist/report-cases/report-case.routes.d.ts.map +1 -0
  296. package/dist/report-cases/report-case.routes.js +94 -0
  297. package/dist/report-cases/report-case.routes.js.map +1 -0
  298. package/dist/report-cases/report-case.schemas.d.ts +294 -0
  299. package/dist/report-cases/report-case.schemas.d.ts.map +1 -0
  300. package/dist/report-cases/report-case.schemas.js +77 -0
  301. package/dist/report-cases/report-case.schemas.js.map +1 -0
  302. package/dist/report-cases/report-case.service.d.ts +21 -0
  303. package/dist/report-cases/report-case.service.d.ts.map +1 -0
  304. package/dist/report-cases/report-case.service.js +60 -0
  305. package/dist/report-cases/report-case.service.js.map +1 -0
  306. package/dist/report-cases/report-case.types.d.ts +39 -0
  307. package/dist/report-cases/report-case.types.d.ts.map +1 -0
  308. package/dist/report-cases/report-case.types.js +2 -0
  309. package/dist/report-cases/report-case.types.js.map +1 -0
  310. package/dist/routes/health.route.d.ts +4 -0
  311. package/dist/routes/health.route.d.ts.map +1 -0
  312. package/dist/routes/health.route.js +39 -0
  313. package/dist/routes/health.route.js.map +1 -0
  314. package/dist/routes/version.route.d.ts +3 -0
  315. package/dist/routes/version.route.d.ts.map +1 -0
  316. package/dist/routes/version.route.js +22 -0
  317. package/dist/routes/version.route.js.map +1 -0
  318. package/dist/runtime/index.d.ts +8 -0
  319. package/dist/runtime/index.d.ts.map +1 -0
  320. package/dist/runtime/index.js +11 -0
  321. package/dist/runtime/index.js.map +1 -0
  322. package/dist/server.d.ts +11 -0
  323. package/dist/server.d.ts.map +1 -0
  324. package/dist/server.js +66 -0
  325. package/dist/server.js.map +1 -0
  326. package/dist/storage/values.d.ts +3 -0
  327. package/dist/storage/values.d.ts.map +1 -0
  328. package/dist/storage/values.js +30 -0
  329. package/dist/storage/values.js.map +1 -0
  330. package/dist/users/current-user.routes.d.ts +3 -0
  331. package/dist/users/current-user.routes.d.ts.map +1 -0
  332. package/dist/users/current-user.routes.js +9 -0
  333. package/dist/users/current-user.routes.js.map +1 -0
  334. package/dist/users/current-user.schemas.d.ts +641 -0
  335. package/dist/users/current-user.schemas.d.ts.map +1 -0
  336. package/dist/users/current-user.schemas.js +21 -0
  337. package/dist/users/current-user.schemas.js.map +1 -0
  338. package/dist/users/user-search.repository.d.ts +19 -0
  339. package/dist/users/user-search.repository.d.ts.map +1 -0
  340. package/dist/users/user-search.repository.js +55 -0
  341. package/dist/users/user-search.repository.js.map +1 -0
  342. package/dist/users/user-search.routes.d.ts +4 -0
  343. package/dist/users/user-search.routes.d.ts.map +1 -0
  344. package/dist/users/user-search.routes.js +19 -0
  345. package/dist/users/user-search.routes.js.map +1 -0
  346. package/dist/users/user-search.schemas.d.ts +693 -0
  347. package/dist/users/user-search.schemas.d.ts.map +1 -0
  348. package/dist/users/user-search.schemas.js +41 -0
  349. package/dist/users/user-search.schemas.js.map +1 -0
  350. package/dist/users/user-search.service.d.ts +20 -0
  351. package/dist/users/user-search.service.d.ts.map +1 -0
  352. package/dist/users/user-search.service.js +41 -0
  353. package/dist/users/user-search.service.js.map +1 -0
  354. package/dist/users/user.schemas.d.ts +47 -0
  355. package/dist/users/user.schemas.d.ts.map +1 -0
  356. package/dist/users/user.schemas.js +13 -0
  357. package/dist/users/user.schemas.js.map +1 -0
  358. package/dist/users/user.types.d.ts +6 -0
  359. package/dist/users/user.types.d.ts.map +1 -0
  360. package/dist/users/user.types.js +2 -0
  361. package/dist/users/user.types.js.map +1 -0
  362. package/dist/version.d.ts +3 -0
  363. package/dist/version.d.ts.map +1 -0
  364. package/dist/version.js +5 -0
  365. package/dist/version.js.map +1 -0
  366. package/docs/guides/community-api-quickstart.md +171 -0
  367. package/docs/guides/feature-structure.md +138 -0
  368. package/docs/guides/independent-cli.md +73 -0
  369. package/docs/guides/non-attachment-api-contract.md +138 -0
  370. package/docs/plans/selfdev-schema-alignment.md +61 -0
  371. package/package.json +76 -0
  372. package/sql/fivepixels-lite-init.sql +518 -0
@@ -0,0 +1,138 @@
1
+ # 비첨부 API 호환 계약
2
+
3
+ 현재 Lite 구현은 34개 업무 operation입니다. selfdev(.NET Fivepixels)의 41개 중 이미지 첨부 7개를 제외한 경로를 제공합니다. 이번 변경은 기존 21개에 수정·상태·담당자·통합 조회 13개를 추가합니다. 패키지 버전은 0.2.1로 유지했으며 공개 배포는 수행하지 않았습니다.
4
+
5
+ ## SDK 연결 기준
6
+
7
+ SDK의 상대 경로는 `/projects/...`로 유지하고 서버별 `baseUrl`만 설정합니다.
8
+
9
+ - Lite: `http://localhost:3000/api/v1`
10
+ - 현재 selfdev: `https://<selfdev-host>/api/v1/fivepixels`
11
+
12
+ Lite에는 `/api/v1/fivepixels` 별칭이 없습니다. SDK를 새로 구현하거나 배포한 작업은 아니며, 아래 검증은 API 계약과 Lite의 HTTP/SQLite 동작에 대한 검증입니다. 동일 SDK 패키지를 두 서버에 실제 연결하는 E2E 검증은 별도로 필요합니다.
13
+
14
+ 이미지 업로드·예약·완료·연결·삭제·접근 URL 기능은 구현하지 않습니다. 기존 생성 요청의 `attachmentIds`가 비어 있지 않으면 `503 attachments-disabled`이고 응답의 `attachments`는 빈 배열입니다. SDK/UI는 Lite에서 이미지 기능을 호출하지 않아야 합니다.
15
+
16
+ ## 추가 엔드포인트와 DTO
17
+
18
+ 아래 경로는 baseUrl 기준입니다. 축약 표기:
19
+
20
+ - P = `/projects/{projectId}`
21
+ - F = `P/feedbacks/{feedbackId}`
22
+ - C = `F/report-cases/{caseId}`
23
+ - R = `F/report-cases/{reportCaseId}/replies/{replyId}`
24
+
25
+ | Method | 경로 | 요청 본문 또는 query | 성공 result DTO |
26
+ |---|---|---|---|
27
+ | PATCH | P | `{projectName}` | ProjectResponse |
28
+ | PUT | P/status | `{status: ACTIVE 또는 ARCHIVED}` | ProjectResponse |
29
+ | PATCH | F | `{fieldValues, position, integrations, targetSelector?}` | FeedbackDetailResponse |
30
+ | PUT | F/status | `{status: OPEN 또는 RESOLVED}` | FeedbackDetailResponse |
31
+ | PUT | F/assignee | `{assigneeId?}` | FeedbackDetailResponse |
32
+ | PATCH | C | `{content, pageElements?}` | ReportCaseResponse |
33
+ | PUT | C/status | `{status: OPEN 또는 RESOLVED}` | ReportCaseResponse |
34
+ | PUT | C/assignee | `{assigneeId?}` | ReportCaseResponse |
35
+ | PATCH | R | `{content, pageElements?}` | ReplyResponse |
36
+ | DELETE | R | 본문 없음 | 204, 빈 본문 |
37
+ | GET | P/report-cases | 필수 environment, pathname; 선택 status, page, pageSize | ReportCaseResponse[] |
38
+ | GET | C/timeline | page, pageSize | `{reportCase, replies}` |
39
+ | GET | F/overview | casePageSize, replyPageSize | `{feedback, cases, selectedCase}` |
40
+
41
+ DELETE 이외의 성공 상태는 200입니다. 모든 요청은 사용자 JWT가 필요하고 모든 PATCH/PUT/DELETE는 현재 리소스의 `If-Match`가 필수입니다. 성공한 수정 응답에는 새 `ETag`가 있습니다. 타임라인·overview에는 selfdev와 동일하게 ETag 헤더가 없으므로 내부 객체의 version 또는 개별 상세 조회 ETag를 사용합니다.
42
+
43
+ `fieldValues`와 `position`은 JSON object, `integrations`는 JSON array이며 PATCH에서 모두 필수입니다. `targetSelector`의 생략/null은 null로 설정합니다. 프로젝트 이름은 trim 후 1~100자, 케이스 내용은 비어 있지 않아야 하며, 답글은 trim 후 1~10,000자입니다.
44
+
45
+ `pageElements`는 기존 생성 DTO와 동일한 `{mentionId, label, selector, dataReportId?}[]`입니다. 생략/null은 보존, []는 연결 해제, 배열은 교체입니다. 동일 mentionId에 다른 요소 정보를 지정하면 409이며 내용·버전·태그 변경 전체가 롤백됩니다. 이미지 첨부와 별개인 화면 요소 태그 기능은 유지합니다.
46
+
47
+ ## 권한과 상태 규칙
48
+
49
+ - 프로젝트 이름·상태, 피드백 담당자는 OWNER만 변경할 수 있습니다.
50
+ - 피드백 내용은 작성자 또는 OWNER, 피드백 상태는 현재 담당자 또는 OWNER가 변경합니다.
51
+ - 케이스 내용·상태·담당자는 케이스 작성자 또는 OWNER가 변경합니다. 담당자라는 이유만으로 케이스 수정 권한을 얻지는 않습니다.
52
+ - 답글 수정·삭제는 답글 작성자 또는 OWNER만 수행합니다. 해결된 케이스의 기존 답글은 수정·삭제 가능하지만 신규 답글 생성은 계속 금지합니다.
53
+ - ARCHIVED 프로젝트는 조회와 OWNER의 프로젝트 상태 복구만 허용합니다.
54
+ - 비멤버에게 프로젝트 존재를 노출하지 않으며 404를 반환합니다. 담당자는 해당 프로젝트의 멤버여야 합니다. assigneeId 생략/null은 담당자 해제입니다.
55
+ - 프로젝트 이름·상태, 내용 수정은 동일 값이어도 버전이 증가합니다. 피드백/케이스 상태와 담당자가 동일하면 버전은 유지합니다.
56
+ - 열린 케이스가 남아 있으면 피드백을 수동으로 해결할 수 없습니다.
57
+ - 마지막 열린 케이스 해결 시 피드백을 RESOLVED로 바꾸고 RESOLVED 시스템 답글을 생성합니다. 해결된 피드백의 케이스를 다시 열면 피드백도 OPEN이 되며 REOPENED 시스템 답글을 생성합니다.
58
+ - 실제 케이스 상태 변경마다 피드백 버전도 증가합니다. 케이스 내용·담당자 및 답글 수정·삭제는 피드백 버전을 변경하지 않습니다.
59
+ - 케이스 담당자 변경 시 ASSIGNEE_ASSIGNED / ASSIGNEE_TRANSFERRED / ASSIGNEE_UNASSIGNED 시스템 답글에 이전·새 담당자를 남깁니다. 피드백 담당자 변경은 시스템 답글을 생성하지 않습니다.
60
+ - 시스템 답글은 수정·삭제 불가입니다. 사용자 답글 삭제는 soft delete이며 목록에 DELETED 상태, 빈 content, 빈 pageElements/attachments와 증가한 version을 반환합니다. DB 원문은 보존됩니다.
61
+
62
+ ## 조회 및 페이지 구조
63
+
64
+ 기본 페이지 크기는 20, 최대 100입니다. 프로젝트 케이스 목록은 environment(소문자 정규화)와 pathname(해시 및 원문)을 모두 비교합니다. 케이스는 createdAt DESC, id DESC이고 답글은 createdAt ASC, id ASC입니다. 동일 시각의 항목 순서는 id가 결정하며 요청 도착 순서를 의미하지 않습니다.
65
+
66
+ 타임라인의 최상위 pagination은 replies에만 적용됩니다. overview는 최상위 빈 pagination과 다음 내부 페이지들을 반환합니다.
67
+
68
+ ```text
69
+ result
70
+ ├─ feedback: 기존 상세 DTO에서 projectId와 cases를 제외한 필드
71
+ ├─ cases
72
+ │ ├─ items: {id, type, content, createdAt, pageElements, attachments}[]
73
+ │ └─ pagination: 케이스 첫 페이지
74
+ └─ selectedCase: 최신 케이스가 없으면 null
75
+ ├─ id: cases.items[0].id
76
+ └─ replies
77
+ ├─ items: ReplyResponse[]
78
+ └─ pagination: 선택한 케이스 답글 첫 페이지
79
+ ```
80
+
81
+ 프로젝트 목록/overview/타임라인은 SQLite 읽기 트랜잭션으로 일관된 스냅샷을 조회합니다. overview는 전체 케이스를 먼저 적재하지 않으며, 페이지에 포함된 사용자와 태그는 일괄 조회합니다.
82
+
83
+ 사용자 검색 `GET /users`도 selfdev처럼 query 생략·공백·한 글자를 허용합니다. 결과는 활성 사용자만 포함하고 기존 페이지 제한, 분당 30회 제한 및 개인정보 비노출을 유지합니다.
84
+
85
+ ## 요청·응답 예제
86
+
87
+ 아래는 최신 케이스 version이 0인 경우의 상태 변경 요청입니다. 실제 서버 주소·프로젝트/피드백/케이스 ID와 사용자 토큰을 사용하십시오.
88
+
89
+ ```http
90
+ PUT <baseUrl>/projects/<projectId>/feedbacks/<feedbackId>/report-cases/<caseId>/status
91
+ Authorization: Bearer <ACCESS_TOKEN>
92
+ If-Match: "0"
93
+ Content-Type: application/json
94
+
95
+ {"status":"RESOLVED"}
96
+ ```
97
+
98
+ 성공은 HTTP 200, ETag `"1"`이고 result는 version 1인 ReportCaseResponse입니다. result에는 id, feedbackId, type, status, content, creator, assignee, version, resolvedAt, createdAt, updatedAt, pageElements, attachments가 포함됩니다. 같은 If-Match로 다시 변경하면 다음과 같이 412를 반환합니다.
99
+
100
+ ```json
101
+ {
102
+ "resultCode": "version-conflict",
103
+ "resultMessage": "다른 요청에서 변경되었습니다. 최신 데이터를 다시 조회해 주세요.",
104
+ "result": null,
105
+ "pagination": {
106
+ "page": 0, "pageSize": 0, "totalCount": 0,
107
+ "totalPages": 0, "hasNext": false, "hasPrevious": false
108
+ }
109
+ }
110
+ ```
111
+
112
+ SDK는 412 발생 시 최신 상태를 조회하고 사용자 변경 의도를 재확인해야 합니다. 버전만 바꿔 무조건 재시도하면 다른 사용자의 수정을 덮어쓸 수 있습니다.
113
+
114
+ ## 실패와 운영 확인
115
+
116
+ | 상태 | 대표 resultCode / 원인 |
117
+ |---|---|
118
+ | 400 | 잘못된 DTO·상태·페이지·UUID, invalid-if-match |
119
+ | 401 | JWT 없음·만료·유효하지 않음 |
120
+ | 403 | project-owner-required, feedback-edit-forbidden, feedback-status-forbidden, report-case-edit-forbidden, reply-edit-forbidden |
121
+ | 404 | project-not-found, feedback-not-found, report-case-not-found, reply-not-found, project-member-not-found |
122
+ | 409 | project-archived, feedback-has-open-report-cases, page-element-mention-conflict, reply-deleted, system-reply-immutable |
123
+ | 412 | version-conflict |
124
+ | 428 | precondition-required |
125
+ | 413 / 429 | 1 MiB 본문 제한 / 요청 횟수 제한 |
126
+ | 500 / 503 | 내부 DB 오류 / DB busy 등 가용성 오류; 내부 정보는 응답에서 제외 |
127
+
128
+ 브라우저 SDK용 CORS에는 GET/HEAD/POST/PUT/PATCH/DELETE/OPTIONS를 허용하고 ETag, Location, Retry-After를 노출합니다. CORS 자체는 기본 비활성화이며 명시적으로 허용한 origin에만 적용합니다. 운영 SDK origin을 정확히 설정하십시오.
129
+
130
+ 변경 로그는 actorId, target 리소스 ID, HTTP operation, 응답 version과 기본 요청 ID/응답 시간으로 추적합니다. 본문·토큰은 기록하지 않습니다. 412 증가 시 동시 편집, 409 시 업무 상태, 503 시 SQLite 잠금 시간을 확인합니다.
131
+
132
+ 이번 변경은 기존 테이블/컬럼을 사용하며 신규 migration이나 DB 삭제는 없습니다. 쓰기 작업은 BEGIN IMMEDIATE 안에서 권한·버전 확인, 상태·태그 변경과 시스템 답글 생성을 완료합니다. SQLite 단일 writer 특성상 대용량 필드/케이스가 많은 상세 응답은 쓰기 잠금 시간을 늘릴 수 있으므로 운영 부하를 별도로 점검하십시오. 롤백은 배포 전 백업 및 이전 애플리케이션 아티팩트로 수행하며 신규 API에 의존한 클라이언트도 함께 조정해야 합니다. 운영 배포·서비스 재시작·DB 복원은 별도 승인 대상입니다.
133
+
134
+ ## 검증 범위와 남은 차이
135
+
136
+ `test/fixtures/community-api-0.2.1.json`은 34개 메서드·경로·요청/응답 필드·ETag 계약을 고정하고 `test/lifecycle.test.ts`는 Fastify HTTP 주입과 임시 SQLite로 상태·권한·버전·롤백·페이징·CORS를 검증합니다. 이는 실브라우저 또는 selfdev SQL Server에 대한 운영 검증은 아닙니다.
137
+
138
+ 현재 selfdev의 알 수 없는 refresh token 로그아웃 오류, 비활성 사용자 멤버 추가 정책 등 기존 구현 차이는 이번 Lite 기능 추가로 변경하지 않았습니다. 따라서 “34개 비첨부 operation 제공”과 “모든 오류 경로까지 두 서버가 완전히 동일함”은 구분해야 합니다. 검색 정렬/대소문자 비교도 실제 SQL Server collation과 SQLite에서 추가 비교가 필요합니다.
@@ -0,0 +1,61 @@
1
+ # selfdev 코드 기준 Lite 저장 규칙 정렬
2
+
3
+ ## 구현 범위
4
+
5
+ 미배포 개발 브랜치 `feat/selfdev-storage-alignment`의 변경이다. selfdev의 현재 엔티티·EF 매핑·실행 코드를 기준으로 Lite만 변경했다. 자동 export/import 도구, selfdev 수정, 이미지 첨부, workspace_id 추가는 포함하지 않는다. 기존 SQL Server 전체 DDL 스냅샷을 Lite의 업무 모델로 복제하지 않는다.
6
+
7
+ 공통 11개 테이블의 컬럼은 `test/fixtures/selfdev-runtime-schema.json`으로 고정했고 실제 SQLite 마이그레이션 결과와 비교한다. 기준 DbContext SHA-256은 `b9afcb4946c46be85075ade39865687e5c92f9edad4263eda1eceb98cfba6b8e`이다.
8
+
9
+ ## 저장 계약
10
+
11
+ | 항목 | 적용 규칙 |
12
+ |---|---|
13
+ | 인증 키 | normalized_login_id/email 제거. login_id는 ASCII NOCASE UNIQUE, email은 소문자 저장 및 원본 UNIQUE |
14
+ | 비밀번호 | 신규 Identity V3 / PBKDF2-HMAC-SHA256 600,000회 / salt 16바이트 / subkey 32바이트 |
15
+ | 기존 비밀번호 | scrypt 및 Identity V2/V3 읽기 지원. 성공 로그인에서만 필요한 재해시를 로그인·토큰 저장과 같은 트랜잭션으로 처리 |
16
+ | 날짜 | 업무 날짜 저장/비교를 UTC, 소수초 7자리로 통일. 100ns 단위 값의 마지막 4자리를 Date 변환으로 잃지 않음 |
17
+ | 경로 해시 | BOM 없는 UTF-16LE SHA-256. Lite는 64자리 소문자 HEX, SQL Server는 같은 바이트의 BINARY(32) 표현 |
18
+ | UUID/정렬 | 기존 UUID 값 보존. SQL에서 동일 시각 tie-breaker를 SqlGuid 순서로 정렬하고 대응 표현식 인덱스 사용 |
19
+ | 업무 값 | 상태·역할·유형·본문·JSON 원문·NULL·태그 관계·lock_version 보존 |
20
+ | FK/CHECK | 기존 무결성 제약 유지. CASCADE 일괄 변경 없음 |
21
+
22
+ Identity V3의 형식은 [ASP.NET Core 6 PasswordHasher](https://github.com/dotnet/aspnetcore/blob/v6.0.36/src/Identity/Extensions.Core/src/PasswordHasher.cs)를 기준으로 한다. 해시는 PBKDF2 비용 최대 1,000,000회, salt/subkey 16~64바이트로 제한하고 scrypt는 기존 고정 파라미터만 허용한다. 연산 동시 처리 1개, 대기 최대 16개를 유지한다. 과도한 비용이나 손상된 해시는 실패 처리하며 해시·비밀번호를 로그에 남기지 않는다.
23
+
24
+ 기존 scrypt 계정이 모두 즉시 같은 형식으로 바뀌는 것은 아니다. 미접속 계정의 해시는 보존되며 selfdev로 그대로 복사하면 로그인할 수 없다. 이번 작업은 계정 이전 도구나 세션 공유를 제공하지 않는다.
25
+
26
+ SQLite의 기본 문자열 비교와 SQL Server의 실제 collation은 모든 Unicode에 대해 같다고 보장하지 않는다. 특히 사용자 이름 검색·정렬과 이메일 중복의 Unicode 경계는 실제 selfdev DB 비교가 필요하다.
27
+
28
+ ## 마이그레이션과 보존
29
+
30
+ - 001~005의 SQL/checksum은 변경하지 않았다. 원본 체크섬을 회귀 테스트로 고정했다.
31
+ - 006_align_credentials: local_credentials 한 테이블만 재구성한다. 기존 인증정보를 복사하고 원본 컬럼의 고유 인덱스를 생성한다.
32
+ - 007_align_storage_values: 기존 날짜를 표현만 정렬하고 원본 pathname에서 파생 해시를 재계산한다. 페이지 정렬용 인덱스 8개를 교체하고 필터 없는 정렬용 인덱스 2개를 추가한다.
33
+ - 버전 고정 함수 fp_storage_timestamp_v1/fp_pathname_hash_v1의 의미를 나중에 변경하지 않는다. 새 변환 규칙은 새 migration으로 추가한다.
34
+ - 모든 단계에서 foreign_keys=ON을 유지한다. 각 migration은 IMMEDIATE 트랜잭션 안에서 스키마 사전 검사, 변환, 행 수 및 integrity_check/foreign_key_check 검증을 수행한다.
35
+ - 기존 DB는 적용 전에 SQLite backup API로 자동 백업한다. 성공 후 자동 백업 최근 3개만 보존하고 수동 백업은 건드리지 않는다.
36
+ - 사용자 정의 스키마가 있으면 unsupported-custom-schema, 인증 정규화 키가 다르면 inconsistent-credential-keys, 유효하지 않은 날짜면 invalid-storage-timestamp로 중단한다. 데이터와 구조를 자동으로 삭제/수정해 통과시키지 않는다.
37
+ - 007 실패 시 006은 커밋된 상태일 수 있다. 새 앱은 마이그레이션 실패 후 수신을 시작하지 않는다. 롤백은 서비스를 중지한 후 업그레이드 전 백업·해당 앱 버전·동일 시점 JWT 키를 함께 복원한다. 원본 DB/WAL/SHM을 보존하며 백업 위에 덮어쓰지 않는다.
38
+ - 전체 테이블 재구성 및 FK 해제를 포함했던 006_selfdev_runtime_alignment.sql.draft는 폐기된 비실행 초안이다. 자동 migration 디렉터리에 넣거나 실행하지 않는다.
39
+
40
+ 007은 기존 행 전체를 읽고 날짜를 갱신하므로 데이터 크기에 비례하는 시간·임시 디스크/WAL 공간이 필요하다. 추가 인덱스 2개의 저장 공간과 쓰기 비용이 있다. 운영 적용 전에 복사본에서 소요 시간과 여유 공간을 확인하고 백업을 별도 보관한다.
41
+
42
+ ## 검증
43
+
44
+ ```bash
45
+ npm ci --offline
46
+ npm run typecheck
47
+ npm run lint
48
+ npm test
49
+ npm run build
50
+ npm run test:storage-interop
51
+ npm pack --dry-run
52
+ ```
53
+
54
+ 순서대로 잠금 파일 의존성 재설치, 타입 검사, 린트, 회귀 테스트, 빌드, .NET 교차 검증, 공개 패키지 포함 파일 점검이다. 오프라인 설치에는 기존 npm 캐시가 필요하며 교차 검증에는 .NET 6 SDK/runtime이 필요하다. 명령은 실제 업무 DB를 사용하지 않는다.
55
+
56
+ - 기본 테스트: API 34개 계약, 인증/권한/ETag/상태 변경/CORS 및 SQLite 동작.
57
+ - 추가 테스트: 기존 v5의 계정·토큰·JSON/NULL·삭제 답글 원문·태그 관계 보존, v5 백업 무결성, v6/v7 재실행, custom schema/키 불일치/잘못된 날짜 차단, v7 부분 변경 실패 롤백, 정밀도·SqlGuid 정렬/대표 인덱스 사용.
58
+ - 인증 테스트: 기존 scrypt 유지/전환, 오류 비밀번호, 비활성 계정, 동시 암호 변경, 토큰 저장 실패 시 해시 전환 롤백.
59
+ - .NET 교차 검증: .NET 6이 만든 Identity V2/V3 해시를 Lite가 검증하고 Lite 신규 해시를 .NET 6 PasswordHasher가 검증한다. Encoding.Unicode SHA256 및 SqlGuid 순서도 비교한다. `test/interop`은 합성 데이터만 사용하는 테스트 보조 도구다.
60
+
61
+ 실제 SQL Server/배포 selfdev HTTP/CORS/동일 SDK E2E는 검증하지 않았다. 교차 런타임 검증은 실제 DB 검증을 대체하지 않는다. npm/GHCR 공개, 운영 적용, 서비스 재시작, commit/push는 실행하지 않는다.
package/package.json ADDED
@@ -0,0 +1,76 @@
1
+ {
2
+ "name": "@fivepixels-js/lite-api",
3
+ "version": "0.2.1",
4
+ "description": "Fivepixels Lite API, a lightweight self-hosted Fastify and SQLite server.",
5
+ "license": "Elastic-2.0",
6
+ "repository": {
7
+ "type": "git",
8
+ "url": "git+https://github.com/siwan315/fivepixels-lite-api.git"
9
+ },
10
+ "homepage": "https://github.com/siwan315/fivepixels-lite-api#readme",
11
+ "bugs": {
12
+ "url": "https://github.com/siwan315/fivepixels-lite-api/issues"
13
+ },
14
+ "type": "module",
15
+ "exports": {
16
+ "./runtime": {
17
+ "types": "./dist/runtime/index.d.ts",
18
+ "import": "./dist/runtime/index.js"
19
+ },
20
+ "./package.json": "./package.json"
21
+ },
22
+ "engines": {
23
+ "node": "^22.0.0 || ^24.0.0"
24
+ },
25
+ "bin": {
26
+ "fivepixels-lite-api": "./dist/cli/index.js"
27
+ },
28
+ "files": [
29
+ "dist",
30
+ "sql/fivepixels-lite-init.sql",
31
+ "docs/guides/community-api-quickstart.md",
32
+ "docs/guides/non-attachment-api-contract.md",
33
+ "docs/guides/feature-structure.md",
34
+ "docs/guides/independent-cli.md",
35
+ "docs/plans/selfdev-schema-alignment.md",
36
+ "README.md",
37
+ "LICENSE"
38
+ ],
39
+ "publishConfig": {
40
+ "access": "public"
41
+ },
42
+ "allowScripts": {
43
+ "esbuild@0.28.2": true
44
+ },
45
+ "scripts": {
46
+ "build": "node scripts/clean-dist.mjs && tsc -p tsconfig.build.json && node scripts/copy-assets.mjs",
47
+ "dev": "tsx src/cli/index.ts start",
48
+ "typecheck": "tsc -p tsconfig.json --noEmit",
49
+ "lint": "eslint .",
50
+ "test": "vitest run",
51
+ "test:storage-interop": "npm run build && node scripts/check-storage-interop.mjs",
52
+ "test:coverage": "vitest run --coverage",
53
+ "pack:dry-run": "npm pack --dry-run",
54
+ "prepack": "npm run build"
55
+ },
56
+ "dependencies": {
57
+ "@fastify/cors": "^11.3.0",
58
+ "@fastify/jwt": "10.2.2",
59
+ "@fastify/rate-limit": "11.2.0",
60
+ "@fastify/swagger": "^9.8.1",
61
+ "@fastify/swagger-ui": "^6.1.1",
62
+ "better-sqlite3": "13.0.3",
63
+ "fastify": "^5.12.1"
64
+ },
65
+ "devDependencies": {
66
+ "@eslint/js": "^10.0.1",
67
+ "@types/better-sqlite3": "^9.6.0",
68
+ "@types/node": "^24.0.0",
69
+ "@vitest/coverage-v8": "^4.1.11",
70
+ "eslint": "^10.9.1",
71
+ "tsx": "^4.23.13",
72
+ "typescript": "6.0.3",
73
+ "typescript-eslint": "^8.69.0",
74
+ "vitest": "^4.1.11"
75
+ }
76
+ }