dialog-survey 1.1.0

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 (233) hide show
  1. package/CHANGELOG.md +95 -0
  2. package/README.md +242 -0
  3. package/VERSION +1 -0
  4. package/dist/api/admin-templates.d.ts +15 -0
  5. package/dist/api/admin-templates.d.ts.map +1 -0
  6. package/dist/api/admin-templates.js +611 -0
  7. package/dist/api/admin-templates.js.map +1 -0
  8. package/dist/api/analysis.d.ts +8 -0
  9. package/dist/api/analysis.d.ts.map +1 -0
  10. package/dist/api/analysis.js +106 -0
  11. package/dist/api/analysis.js.map +1 -0
  12. package/dist/api/health.d.ts +6 -0
  13. package/dist/api/health.d.ts.map +1 -0
  14. package/dist/api/health.js +116 -0
  15. package/dist/api/health.js.map +1 -0
  16. package/dist/api/plans.d.ts +3 -0
  17. package/dist/api/plans.d.ts.map +1 -0
  18. package/dist/api/plans.js +184 -0
  19. package/dist/api/plans.js.map +1 -0
  20. package/dist/api/templates.d.ts +9 -0
  21. package/dist/api/templates.d.ts.map +1 -0
  22. package/dist/api/templates.js +211 -0
  23. package/dist/api/templates.js.map +1 -0
  24. package/dist/core/graph.d.ts +7 -0
  25. package/dist/core/graph.d.ts.map +1 -0
  26. package/dist/core/graph.js +31 -0
  27. package/dist/core/graph.js.map +1 -0
  28. package/dist/core/nodes/analyzing.d.ts +3 -0
  29. package/dist/core/nodes/analyzing.d.ts.map +1 -0
  30. package/dist/core/nodes/analyzing.js +38 -0
  31. package/dist/core/nodes/analyzing.js.map +1 -0
  32. package/dist/core/nodes/completed.d.ts +3 -0
  33. package/dist/core/nodes/completed.d.ts.map +1 -0
  34. package/dist/core/nodes/completed.js +8 -0
  35. package/dist/core/nodes/completed.js.map +1 -0
  36. package/dist/core/nodes/interviewing.d.ts +13 -0
  37. package/dist/core/nodes/interviewing.d.ts.map +1 -0
  38. package/dist/core/nodes/interviewing.js +130 -0
  39. package/dist/core/nodes/interviewing.js.map +1 -0
  40. package/dist/core/nodes/planning.d.ts +15 -0
  41. package/dist/core/nodes/planning.d.ts.map +1 -0
  42. package/dist/core/nodes/planning.js +40 -0
  43. package/dist/core/nodes/planning.js.map +1 -0
  44. package/dist/core/types/index.d.ts +69 -0
  45. package/dist/core/types/index.d.ts.map +1 -0
  46. package/dist/core/types/index.js +49 -0
  47. package/dist/core/types/index.js.map +1 -0
  48. package/dist/domains/interview/entities/interview.entity.d.ts +21 -0
  49. package/dist/domains/interview/entities/interview.entity.d.ts.map +1 -0
  50. package/dist/domains/interview/entities/interview.entity.js +20 -0
  51. package/dist/domains/interview/entities/interview.entity.js.map +1 -0
  52. package/dist/domains/interview/entities/message.entity.d.ts +15 -0
  53. package/dist/domains/interview/entities/message.entity.d.ts.map +1 -0
  54. package/dist/domains/interview/entities/message.entity.js +11 -0
  55. package/dist/domains/interview/entities/message.entity.js.map +1 -0
  56. package/dist/domains/interview/entities/response.entity.d.ts +17 -0
  57. package/dist/domains/interview/entities/response.entity.d.ts.map +1 -0
  58. package/dist/domains/interview/entities/response.entity.js +12 -0
  59. package/dist/domains/interview/entities/response.entity.js.map +1 -0
  60. package/dist/domains/interview/services/interview.domain.d.ts +8 -0
  61. package/dist/domains/interview/services/interview.domain.d.ts.map +1 -0
  62. package/dist/domains/interview/services/interview.domain.js +30 -0
  63. package/dist/domains/interview/services/interview.domain.js.map +1 -0
  64. package/dist/integrations/dingtalk/client.d.ts +32 -0
  65. package/dist/integrations/dingtalk/client.d.ts.map +1 -0
  66. package/dist/integrations/dingtalk/client.js +89 -0
  67. package/dist/integrations/dingtalk/client.js.map +1 -0
  68. package/dist/integrations/dingtalk/message-sender.d.ts +24 -0
  69. package/dist/integrations/dingtalk/message-sender.d.ts.map +1 -0
  70. package/dist/integrations/dingtalk/message-sender.js +81 -0
  71. package/dist/integrations/dingtalk/message-sender.js.map +1 -0
  72. package/dist/integrations/dingtalk/middleware.d.ts +4 -0
  73. package/dist/integrations/dingtalk/middleware.d.ts.map +1 -0
  74. package/dist/integrations/dingtalk/middleware.js +29 -0
  75. package/dist/integrations/dingtalk/middleware.js.map +1 -0
  76. package/dist/integrations/dingtalk/stream-client.d.ts +112 -0
  77. package/dist/integrations/dingtalk/stream-client.d.ts.map +1 -0
  78. package/dist/integrations/dingtalk/stream-client.js +305 -0
  79. package/dist/integrations/dingtalk/stream-client.js.map +1 -0
  80. package/dist/integrations/dingtalk/token-manager.d.ts +22 -0
  81. package/dist/integrations/dingtalk/token-manager.d.ts.map +1 -0
  82. package/dist/integrations/dingtalk/token-manager.js +109 -0
  83. package/dist/integrations/dingtalk/token-manager.js.map +1 -0
  84. package/dist/integrations/llm/alibaba.d.ts +10 -0
  85. package/dist/integrations/llm/alibaba.d.ts.map +1 -0
  86. package/dist/integrations/llm/alibaba.js +60 -0
  87. package/dist/integrations/llm/alibaba.js.map +1 -0
  88. package/dist/integrations/llm/base.d.ts +28 -0
  89. package/dist/integrations/llm/base.d.ts.map +1 -0
  90. package/dist/integrations/llm/base.js +2 -0
  91. package/dist/integrations/llm/base.js.map +1 -0
  92. package/dist/integrations/llm/volcengine.d.ts +12 -0
  93. package/dist/integrations/llm/volcengine.d.ts.map +1 -0
  94. package/dist/integrations/llm/volcengine.js +80 -0
  95. package/dist/integrations/llm/volcengine.js.map +1 -0
  96. package/dist/middleware/admin-auth.d.ts +3 -0
  97. package/dist/middleware/admin-auth.d.ts.map +1 -0
  98. package/dist/middleware/admin-auth.js +37 -0
  99. package/dist/middleware/admin-auth.js.map +1 -0
  100. package/dist/middleware/api-auth.d.ts +10 -0
  101. package/dist/middleware/api-auth.d.ts.map +1 -0
  102. package/dist/middleware/api-auth.js +30 -0
  103. package/dist/middleware/api-auth.js.map +1 -0
  104. package/dist/repositories/interview-state-mapper.d.ts +28 -0
  105. package/dist/repositories/interview-state-mapper.d.ts.map +1 -0
  106. package/dist/repositories/interview-state-mapper.js +32 -0
  107. package/dist/repositories/interview-state-mapper.js.map +1 -0
  108. package/dist/repositories/interview-state.repository.d.ts +34 -0
  109. package/dist/repositories/interview-state.repository.d.ts.map +1 -0
  110. package/dist/repositories/interview-state.repository.js +220 -0
  111. package/dist/repositories/interview-state.repository.js.map +1 -0
  112. package/dist/repositories/interview.repository.d.ts +29 -0
  113. package/dist/repositories/interview.repository.d.ts.map +1 -0
  114. package/dist/repositories/interview.repository.js +36 -0
  115. package/dist/repositories/interview.repository.js.map +1 -0
  116. package/dist/repositories/message.repository.d.ts +17 -0
  117. package/dist/repositories/message.repository.d.ts.map +1 -0
  118. package/dist/repositories/message.repository.js +37 -0
  119. package/dist/repositories/message.repository.js.map +1 -0
  120. package/dist/repositories/template.repository.d.ts +117 -0
  121. package/dist/repositories/template.repository.d.ts.map +1 -0
  122. package/dist/repositories/template.repository.js +280 -0
  123. package/dist/repositories/template.repository.js.map +1 -0
  124. package/dist/schemas/dimensions.d.ts +61 -0
  125. package/dist/schemas/dimensions.d.ts.map +1 -0
  126. package/dist/schemas/dimensions.js +44 -0
  127. package/dist/schemas/dimensions.js.map +1 -0
  128. package/dist/server.d.ts +10 -0
  129. package/dist/server.d.ts.map +1 -0
  130. package/dist/server.js +217 -0
  131. package/dist/server.js.map +1 -0
  132. package/dist/services/analysis.service.d.ts +81 -0
  133. package/dist/services/analysis.service.d.ts.map +1 -0
  134. package/dist/services/analysis.service.js +229 -0
  135. package/dist/services/analysis.service.js.map +1 -0
  136. package/dist/services/analytics.service.d.ts +44 -0
  137. package/dist/services/analytics.service.d.ts.map +1 -0
  138. package/dist/services/analytics.service.js +222 -0
  139. package/dist/services/analytics.service.js.map +1 -0
  140. package/dist/services/asr.service.d.ts +9 -0
  141. package/dist/services/asr.service.d.ts.map +1 -0
  142. package/dist/services/asr.service.js +41 -0
  143. package/dist/services/asr.service.js.map +1 -0
  144. package/dist/services/audit-cleanup.service.d.ts +9 -0
  145. package/dist/services/audit-cleanup.service.d.ts.map +1 -0
  146. package/dist/services/audit-cleanup.service.js +27 -0
  147. package/dist/services/audit-cleanup.service.js.map +1 -0
  148. package/dist/services/batch-aggregation.service.d.ts +34 -0
  149. package/dist/services/batch-aggregation.service.d.ts.map +1 -0
  150. package/dist/services/batch-aggregation.service.js +91 -0
  151. package/dist/services/batch-aggregation.service.js.map +1 -0
  152. package/dist/services/conversation-engine.d.ts +16 -0
  153. package/dist/services/conversation-engine.d.ts.map +1 -0
  154. package/dist/services/conversation-engine.js +49 -0
  155. package/dist/services/conversation-engine.js.map +1 -0
  156. package/dist/services/dead-letter.service.d.ts +12 -0
  157. package/dist/services/dead-letter.service.d.ts.map +1 -0
  158. package/dist/services/dead-letter.service.js +24 -0
  159. package/dist/services/dead-letter.service.js.map +1 -0
  160. package/dist/services/followup.service.d.ts +18 -0
  161. package/dist/services/followup.service.d.ts.map +1 -0
  162. package/dist/services/followup.service.js +146 -0
  163. package/dist/services/followup.service.js.map +1 -0
  164. package/dist/services/interview-plan-base.service.d.ts +226 -0
  165. package/dist/services/interview-plan-base.service.d.ts.map +1 -0
  166. package/dist/services/interview-plan-base.service.js +217 -0
  167. package/dist/services/interview-plan-base.service.js.map +1 -0
  168. package/dist/services/interview-plan-members.service.d.ts +45 -0
  169. package/dist/services/interview-plan-members.service.d.ts.map +1 -0
  170. package/dist/services/interview-plan-members.service.js +237 -0
  171. package/dist/services/interview-plan-members.service.js.map +1 -0
  172. package/dist/services/interview-plan-send.service.d.ts +27 -0
  173. package/dist/services/interview-plan-send.service.d.ts.map +1 -0
  174. package/dist/services/interview-plan-send.service.js +250 -0
  175. package/dist/services/interview-plan-send.service.js.map +1 -0
  176. package/dist/services/interview-plan.service.d.ts +8 -0
  177. package/dist/services/interview-plan.service.d.ts.map +1 -0
  178. package/dist/services/interview-plan.service.js +8 -0
  179. package/dist/services/interview-plan.service.js.map +1 -0
  180. package/dist/services/llm-clustering.d.ts +16 -0
  181. package/dist/services/llm-clustering.d.ts.map +1 -0
  182. package/dist/services/llm-clustering.js +91 -0
  183. package/dist/services/llm-clustering.js.map +1 -0
  184. package/dist/services/prompt.service.d.ts +13 -0
  185. package/dist/services/prompt.service.d.ts.map +1 -0
  186. package/dist/services/prompt.service.js +151 -0
  187. package/dist/services/prompt.service.js.map +1 -0
  188. package/dist/services/report.service.d.ts +28 -0
  189. package/dist/services/report.service.d.ts.map +1 -0
  190. package/dist/services/report.service.js +169 -0
  191. package/dist/services/report.service.js.map +1 -0
  192. package/dist/services/stream-message-utils.d.ts +31 -0
  193. package/dist/services/stream-message-utils.d.ts.map +1 -0
  194. package/dist/services/stream-message-utils.js +80 -0
  195. package/dist/services/stream-message-utils.js.map +1 -0
  196. package/dist/services/stream-message.service.d.ts +29 -0
  197. package/dist/services/stream-message.service.d.ts.map +1 -0
  198. package/dist/services/stream-message.service.js +184 -0
  199. package/dist/services/stream-message.service.js.map +1 -0
  200. package/dist/services/template-dimension.service.d.ts +21 -0
  201. package/dist/services/template-dimension.service.d.ts.map +1 -0
  202. package/dist/services/template-dimension.service.js +9 -0
  203. package/dist/services/template-dimension.service.js.map +1 -0
  204. package/dist/utils/db.d.ts +10 -0
  205. package/dist/utils/db.d.ts.map +1 -0
  206. package/dist/utils/db.js +21 -0
  207. package/dist/utils/db.js.map +1 -0
  208. package/dist/utils/logger.d.ts +8 -0
  209. package/dist/utils/logger.d.ts.map +1 -0
  210. package/dist/utils/logger.js +21 -0
  211. package/dist/utils/logger.js.map +1 -0
  212. package/dist/utils/markdown.d.ts +2 -0
  213. package/dist/utils/markdown.d.ts.map +1 -0
  214. package/dist/utils/markdown.js +39 -0
  215. package/dist/utils/markdown.js.map +1 -0
  216. package/dist/utils/pii-anonymizer.d.ts +2 -0
  217. package/dist/utils/pii-anonymizer.d.ts.map +1 -0
  218. package/dist/utils/pii-anonymizer.js +13 -0
  219. package/dist/utils/pii-anonymizer.js.map +1 -0
  220. package/dist/utils/retry.d.ts +8 -0
  221. package/dist/utils/retry.d.ts.map +1 -0
  222. package/dist/utils/retry.js +28 -0
  223. package/dist/utils/retry.js.map +1 -0
  224. package/dist/utils/security.d.ts +26 -0
  225. package/dist/utils/security.d.ts.map +1 -0
  226. package/dist/utils/security.js +99 -0
  227. package/dist/utils/security.js.map +1 -0
  228. package/package.json +80 -0
  229. package/prisma/schema.prisma +228 -0
  230. package/public/css/admin.css +73 -0
  231. package/public/js/alpine.min.js +2670 -0
  232. package/public/js/htmx.min.js +3422 -0
  233. package/scripts/cli.mjs +794 -0
@@ -0,0 +1,37 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+ export class MessageRepository {
3
+ prisma;
4
+ constructor(prisma) {
5
+ this.prisma = prisma || new PrismaClient();
6
+ }
7
+ async create(data) {
8
+ return this.prisma.message.create({
9
+ data: {
10
+ interviewId: data.interviewId,
11
+ role: data.role,
12
+ content: data.content,
13
+ messageId: data.messageId,
14
+ isVoice: data.isVoice || false,
15
+ voiceText: data.voiceText,
16
+ },
17
+ });
18
+ }
19
+ async findByInterview(interviewId) {
20
+ return this.prisma.message.findMany({
21
+ where: { interviewId },
22
+ orderBy: { createdAt: 'asc' },
23
+ });
24
+ }
25
+ async findById(id) {
26
+ return this.prisma.message.findUnique({
27
+ where: { id },
28
+ });
29
+ }
30
+ async deleteByInterview(interviewId) {
31
+ const result = await this.prisma.message.deleteMany({
32
+ where: { interviewId },
33
+ });
34
+ return result.count;
35
+ }
36
+ }
37
+ //# sourceMappingURL=message.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"message.repository.js","sourceRoot":"","sources":["../../src/repositories/message.repository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAEvD,MAAM,OAAO,iBAAiB;IACpB,MAAM,CAAe;IAE7B,YAAY,MAAqB;QAC/B,IAAI,CAAC,MAAM,GAAG,MAAM,IAAI,IAAI,YAAY,EAAE,CAAC;IAC7C,CAAC;IAED,KAAK,CAAC,MAAM,CAAC,IAOZ;QACC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC;YAChC,IAAI,EAAE;gBACJ,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,OAAO,EAAE,IAAI,CAAC,OAAO;gBACrB,SAAS,EAAE,IAAI,CAAC,SAAS;gBACzB,OAAO,EAAE,IAAI,CAAC,OAAO,IAAI,KAAK;gBAC9B,SAAS,EAAE,IAAI,CAAC,SAAS;aAC1B;SACF,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,eAAe,CAAC,WAAmB;QACvC,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,QAAQ,CAAC;YAClC,KAAK,EAAE,EAAE,WAAW,EAAE;YACtB,OAAO,EAAE,EAAE,SAAS,EAAE,KAAK,EAAE;SAC9B,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,QAAQ,CAAC,EAAU;QACvB,OAAO,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;YACpC,KAAK,EAAE,EAAE,EAAE,EAAE;SACd,CAAC,CAAC;IACL,CAAC;IAED,KAAK,CAAC,iBAAiB,CAAC,WAAmB;QACzC,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,CAAC,UAAU,CAAC;YAClD,KAAK,EAAE,EAAE,WAAW,EAAE;SACvB,CAAC,CAAC;QACH,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;CACF"}
@@ -0,0 +1,117 @@
1
+ import { PrismaClient, Template, TemplateStatus } from '@prisma/client';
2
+ export declare class TemplateRepository {
3
+ private readonly prisma;
4
+ constructor(prisma?: PrismaClient);
5
+ /** Build Prisma update data object from partial template data (DRY) */
6
+ private _buildUpdateData;
7
+ create(data: {
8
+ name: string;
9
+ content: Record<string, unknown>;
10
+ description?: string;
11
+ }): Promise<Template>;
12
+ findAll(): Promise<Template[]>;
13
+ findById(id: string): Promise<Template | null>;
14
+ update(id: string, data: Partial<{
15
+ name: string;
16
+ content: Record<string, unknown>;
17
+ description: string;
18
+ status: TemplateStatus;
19
+ }>): Promise<Template>;
20
+ delete(id: string): Promise<boolean>;
21
+ findByStatus(status: TemplateStatus): Promise<Template[]>;
22
+ incrementVersion(id: string): Promise<Template>;
23
+ getVersion(id: string): Promise<{
24
+ id: string;
25
+ version: number;
26
+ } | null>;
27
+ getVersionHistory(id: string): Promise<Array<{
28
+ id: string;
29
+ version: number;
30
+ createdAt: Date;
31
+ }>>;
32
+ updateWithVersion(id: string, expectedVersion: number, data: Partial<{
33
+ name: string;
34
+ content: Record<string, unknown>;
35
+ description: string;
36
+ status?: string;
37
+ }>): Promise<Template>;
38
+ findAllForAdminTree(): Promise<{
39
+ _count: {
40
+ interviews: number;
41
+ interviewPlans: number;
42
+ };
43
+ id: string;
44
+ status: import(".prisma/client").$Enums.TemplateStatus;
45
+ version: number;
46
+ createdAt: Date;
47
+ name: string;
48
+ description: string | null;
49
+ interviewPlans: {
50
+ _count: {
51
+ interviews: number;
52
+ };
53
+ id: string;
54
+ status: import(".prisma/client").$Enums.PlanStatus;
55
+ createdAt: Date;
56
+ name: string;
57
+ description: string | null;
58
+ interviews: {
59
+ id: string;
60
+ userId: string;
61
+ status: import(".prisma/client").$Enums.InterviewStatus;
62
+ completedAt: Date | null;
63
+ }[];
64
+ sentCount: number;
65
+ completedCount: number;
66
+ }[];
67
+ }[]>;
68
+ findAllForSelect(): Promise<Array<{
69
+ id: string;
70
+ name: string;
71
+ }>>;
72
+ findByIdWithCounts(id: string): Promise<{
73
+ _count: {
74
+ interviews: number;
75
+ interviewPlans: number;
76
+ };
77
+ id: string;
78
+ status: import(".prisma/client").$Enums.TemplateStatus;
79
+ version: number;
80
+ createdAt: Date;
81
+ updatedAt: Date;
82
+ name: string;
83
+ description: string | null;
84
+ content: string;
85
+ } | null>;
86
+ publish(id: string): Promise<Template>;
87
+ deleteAndVerify(id: string): Promise<boolean>;
88
+ findAllPaginated(page: number, limit: number): Promise<{
89
+ items: Template[];
90
+ total: number;
91
+ page: number;
92
+ limit: number;
93
+ }>;
94
+ getUsageStats(templateId: string): Promise<{
95
+ templateId: string;
96
+ templateName: string;
97
+ interviews: {
98
+ active: number;
99
+ pending: number;
100
+ waiting: number;
101
+ completed: number;
102
+ cancelled: number;
103
+ total: number;
104
+ };
105
+ plans: {
106
+ running: number;
107
+ pending: number;
108
+ ready: number;
109
+ paused: number;
110
+ completed: number;
111
+ total: number;
112
+ };
113
+ reportCount: number;
114
+ safeToDelete: boolean;
115
+ }>;
116
+ }
117
+ //# sourceMappingURL=template.repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.repository.d.ts","sourceRoot":"","sources":["../../src/repositories/template.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,280 @@
1
+ import { PrismaClient, TemplateStatus } from '@prisma/client';
2
+ export class TemplateRepository {
3
+ prisma;
4
+ constructor(prisma) {
5
+ this.prisma = prisma || new PrismaClient();
6
+ }
7
+ /** Build Prisma update data object from partial template data (DRY) */
8
+ _buildUpdateData(data, options) {
9
+ const updateData = {};
10
+ if (data.name)
11
+ updateData.name = data.name;
12
+ if (data.description)
13
+ updateData.description = data.description;
14
+ if (data.content)
15
+ updateData.content = JSON.stringify(data.content);
16
+ if (data.status)
17
+ updateData.status = data.status;
18
+ if (options?.incrementVersion) {
19
+ updateData.version = { increment: 1 };
20
+ }
21
+ updateData.updatedBy = 'admin';
22
+ return updateData;
23
+ }
24
+ async create(data) {
25
+ return this.prisma.template.create({
26
+ data: {
27
+ name: data.name,
28
+ description: data.description,
29
+ content: JSON.stringify(data.content),
30
+ version: 1,
31
+ status: TemplateStatus.DRAFT,
32
+ createdBy: 'admin',
33
+ updatedBy: 'admin',
34
+ },
35
+ });
36
+ }
37
+ async findAll() {
38
+ return this.prisma.template.findMany({
39
+ orderBy: { createdAt: 'desc' },
40
+ });
41
+ }
42
+ async findById(id) {
43
+ return this.prisma.template.findUnique({
44
+ where: { id },
45
+ });
46
+ }
47
+ async update(id, data) {
48
+ const updateData = this._buildUpdateData(data);
49
+ return this.prisma.template.update({
50
+ where: { id },
51
+ data: updateData,
52
+ });
53
+ }
54
+ async delete(id) {
55
+ await this.prisma.template.delete({
56
+ where: { id },
57
+ });
58
+ return true;
59
+ }
60
+ async findByStatus(status) {
61
+ return this.prisma.template.findMany({
62
+ where: { status },
63
+ orderBy: { createdAt: 'desc' },
64
+ });
65
+ }
66
+ async incrementVersion(id) {
67
+ const template = await this.findById(id);
68
+ if (!template)
69
+ throw new Error('Template not found');
70
+ return this.prisma.template.update({
71
+ where: { id },
72
+ data: { version: { increment: 1 } },
73
+ });
74
+ }
75
+ async getVersion(id) {
76
+ const template = await this.findById(id);
77
+ if (!template)
78
+ return null;
79
+ return { id: template.id, version: template.version };
80
+ }
81
+ async getVersionHistory(id) {
82
+ const template = await this.findById(id);
83
+ if (!template)
84
+ throw new Error('Template not found');
85
+ return [
86
+ {
87
+ id: template.id,
88
+ version: template.version,
89
+ createdAt: template.createdAt,
90
+ },
91
+ ];
92
+ }
93
+ async updateWithVersion(id, expectedVersion, data) {
94
+ const updateData = this._buildUpdateData(data, {
95
+ incrementVersion: true,
96
+ });
97
+ return this.prisma.template.update({
98
+ where: { id, version: expectedVersion },
99
+ data: updateData,
100
+ });
101
+ }
102
+ async findAllForAdminTree() {
103
+ return this.prisma.template.findMany({
104
+ orderBy: { name: 'asc' },
105
+ select: {
106
+ id: true,
107
+ name: true,
108
+ description: true,
109
+ status: true,
110
+ version: true,
111
+ createdAt: true,
112
+ _count: { select: { interviewPlans: true, interviews: true } },
113
+ interviewPlans: {
114
+ orderBy: { createdAt: 'desc' },
115
+ take: 20,
116
+ select: {
117
+ id: true,
118
+ name: true,
119
+ description: true,
120
+ status: true,
121
+ completedCount: true,
122
+ sentCount: true,
123
+ createdAt: true,
124
+ _count: { select: { interviews: true } },
125
+ interviews: {
126
+ orderBy: { createdAt: 'desc' },
127
+ take: 15,
128
+ select: { id: true, userId: true, status: true, completedAt: true },
129
+ },
130
+ },
131
+ },
132
+ },
133
+ });
134
+ }
135
+ async findAllForSelect() {
136
+ return this.prisma.template.findMany({
137
+ orderBy: { name: 'asc' },
138
+ select: { id: true, name: true },
139
+ });
140
+ }
141
+ async findByIdWithCounts(id) {
142
+ return this.prisma.template.findUnique({
143
+ where: { id },
144
+ select: {
145
+ id: true,
146
+ name: true,
147
+ description: true,
148
+ status: true,
149
+ version: true,
150
+ createdAt: true,
151
+ updatedAt: true,
152
+ content: true,
153
+ _count: { select: { interviewPlans: true, interviews: true } },
154
+ },
155
+ });
156
+ }
157
+ async publish(id) {
158
+ return this.prisma.template.update({
159
+ where: { id },
160
+ data: { status: TemplateStatus.PUBLISHED, updatedAt: new Date() },
161
+ });
162
+ }
163
+ async deleteAndVerify(id) {
164
+ await this.prisma.template.delete({ where: { id } });
165
+ const verify = await this.prisma.template.findUnique({ where: { id } });
166
+ return verify === null;
167
+ }
168
+ async findAllPaginated(page, limit) {
169
+ const [items, total] = await Promise.all([
170
+ this.prisma.template.findMany({
171
+ orderBy: { updatedAt: 'desc' },
172
+ skip: (page - 1) * limit,
173
+ take: limit,
174
+ }),
175
+ this.prisma.template.count(),
176
+ ]);
177
+ return { items, total, page, limit };
178
+ }
179
+ async getUsageStats(templateId) {
180
+ const [template, interviewGroups, planGroups, reportCount] = await Promise.all([
181
+ this.prisma.template.findUnique({
182
+ where: { id: templateId },
183
+ select: { name: true },
184
+ }),
185
+ this.prisma.interview.groupBy({
186
+ by: ['status'],
187
+ where: { templateId },
188
+ _count: true,
189
+ }),
190
+ this.prisma.interviewPlan.groupBy({
191
+ by: ['status'],
192
+ where: { templateId },
193
+ _count: true,
194
+ }),
195
+ this.prisma.batchAnalysisReport.count({ where: { templateId } }),
196
+ ]);
197
+ if (!template) {
198
+ throw new Error('Template not found');
199
+ }
200
+ const interviews = {
201
+ active: 0,
202
+ pending: 0,
203
+ waiting: 0,
204
+ completed: 0,
205
+ cancelled: 0,
206
+ total: 0,
207
+ };
208
+ for (const group of interviewGroups) {
209
+ const count = group._count;
210
+ switch (group.status) {
211
+ case 'ACTIVE':
212
+ interviews.active = count;
213
+ break;
214
+ case 'PENDING':
215
+ interviews.pending = count;
216
+ break;
217
+ case 'WAITING':
218
+ interviews.waiting = count;
219
+ break;
220
+ case 'COMPLETED':
221
+ interviews.completed = count;
222
+ break;
223
+ case 'CANCELLED':
224
+ interviews.cancelled = count;
225
+ break;
226
+ }
227
+ }
228
+ interviews.total =
229
+ interviews.active +
230
+ interviews.pending +
231
+ interviews.waiting +
232
+ interviews.completed +
233
+ interviews.cancelled;
234
+ const plans = {
235
+ running: 0,
236
+ pending: 0,
237
+ ready: 0,
238
+ paused: 0,
239
+ completed: 0,
240
+ total: 0,
241
+ };
242
+ for (const group of planGroups) {
243
+ const count = group._count;
244
+ switch (group.status) {
245
+ case 'RUNNING':
246
+ plans.running = count;
247
+ break;
248
+ case 'PENDING':
249
+ plans.pending = count;
250
+ break;
251
+ case 'READY':
252
+ plans.ready = count;
253
+ break;
254
+ case 'PAUSED':
255
+ plans.paused = count;
256
+ break;
257
+ case 'COMPLETED':
258
+ plans.completed = count;
259
+ break;
260
+ }
261
+ }
262
+ plans.total = plans.running + plans.pending + plans.ready + plans.paused + plans.completed;
263
+ const safeToDelete = interviews.active === 0 &&
264
+ interviews.pending === 0 &&
265
+ interviews.waiting === 0 &&
266
+ plans.running === 0 &&
267
+ plans.pending === 0 &&
268
+ plans.ready === 0 &&
269
+ plans.paused === 0;
270
+ return {
271
+ templateId,
272
+ templateName: template.name,
273
+ interviews,
274
+ plans,
275
+ reportCount,
276
+ safeToDelete,
277
+ };
278
+ }
279
+ }
280
+ //# sourceMappingURL=template.repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"template.repository.js","sourceRoot":"","sources":["../../src/repositories/template.repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,61 @@
1
+ import { z } from 'zod';
2
+ export declare const dimensionSchema: z.ZodObject<{
3
+ id: z.ZodString;
4
+ label: z.ZodString;
5
+ description: z.ZodOptional<z.ZodString>;
6
+ keywords: z.ZodDefault<z.ZodArray<z.ZodString>>;
7
+ }, z.core.$strip>;
8
+ export declare const dimensionsArraySchema: z.ZodArray<z.ZodObject<{
9
+ id: z.ZodString;
10
+ label: z.ZodString;
11
+ description: z.ZodOptional<z.ZodString>;
12
+ keywords: z.ZodDefault<z.ZodArray<z.ZodString>>;
13
+ }, z.core.$strip>>;
14
+ export declare const analysisConfigSchema: z.ZodObject<{
15
+ emergentThreshold: z.ZodOptional<z.ZodNumber>;
16
+ customSentimentWords: z.ZodOptional<z.ZodObject<{
17
+ positive: z.ZodDefault<z.ZodArray<z.ZodString>>;
18
+ negative: z.ZodDefault<z.ZodArray<z.ZodString>>;
19
+ }, z.core.$strip>>;
20
+ }, z.core.$strip>;
21
+ export declare const dimensionTagSchema: z.ZodObject<{
22
+ dimensionId: z.ZodString;
23
+ label: z.ZodString;
24
+ sentiment: z.ZodEnum<{
25
+ positive: "positive";
26
+ negative: "negative";
27
+ neutral: "neutral";
28
+ }>;
29
+ quotes: z.ZodDefault<z.ZodArray<z.ZodString>>;
30
+ }, z.core.$strip>;
31
+ export declare const dimensionTagsArraySchema: z.ZodArray<z.ZodObject<{
32
+ dimensionId: z.ZodString;
33
+ label: z.ZodString;
34
+ sentiment: z.ZodEnum<{
35
+ positive: "positive";
36
+ negative: "negative";
37
+ neutral: "neutral";
38
+ }>;
39
+ quotes: z.ZodDefault<z.ZodArray<z.ZodString>>;
40
+ }, z.core.$strip>>;
41
+ export declare function validateDimensions(input: string | null): z.ZodSafeParseSuccess<{
42
+ id: string;
43
+ label: string;
44
+ keywords: string[];
45
+ description?: string | undefined;
46
+ }[]> | {
47
+ success: false;
48
+ error: z.ZodError<unknown>;
49
+ };
50
+ export declare function validateDimensionTags(input: string | {
51
+ dimensionId: string;
52
+ label: string;
53
+ sentiment: string;
54
+ quotes: string[];
55
+ }[] | null): z.ZodSafeParseResult<{
56
+ dimensionId: string;
57
+ label: string;
58
+ sentiment: "positive" | "negative" | "neutral";
59
+ quotes: string[];
60
+ }[]>;
61
+ //# sourceMappingURL=dimensions.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimensions.d.ts","sourceRoot":"","sources":["../../src/schemas/dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,eAAO,MAAM,eAAe;;;;;iBAK1B,CAAC;AAEH,eAAO,MAAM,qBAAqB;;;;;kBAA2B,CAAC;AAE9D,eAAO,MAAM,oBAAoB;;;;;;iBAQ/B,CAAC;AAEH,eAAO,MAAM,kBAAkB;;;;;;;;;iBAK7B,CAAC;AAEH,eAAO,MAAM,wBAAwB;;;;;;;;;kBAA8B,CAAC;AAEpE,wBAAgB,kBAAkB,CAAC,KAAK,EAAE,MAAM,GAAG,IAAI;;;;;;;;EAUtD;AAED,wBAAgB,qBAAqB,CACnC,KAAK,EACD,MAAM,GACN;IACE,WAAW,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,EAAE,MAAM,CAAC;IAClB,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,EAAE,GACH,IAAI;;;;;KAOT"}
@@ -0,0 +1,44 @@
1
+ import { z } from 'zod';
2
+ export const dimensionSchema = z.object({
3
+ id: z.string().min(1),
4
+ label: z.string().min(1),
5
+ description: z.string().optional(),
6
+ keywords: z.array(z.string()).default([]),
7
+ });
8
+ export const dimensionsArraySchema = z.array(dimensionSchema);
9
+ export const analysisConfigSchema = z.object({
10
+ emergentThreshold: z.number().int().min(1).optional(),
11
+ customSentimentWords: z
12
+ .object({
13
+ positive: z.array(z.string()).default([]),
14
+ negative: z.array(z.string()).default([]),
15
+ })
16
+ .optional(),
17
+ });
18
+ export const dimensionTagSchema = z.object({
19
+ dimensionId: z.string().min(1),
20
+ label: z.string().min(1),
21
+ sentiment: z.enum(['positive', 'negative', 'neutral']),
22
+ quotes: z.array(z.string()).default([]),
23
+ });
24
+ export const dimensionTagsArraySchema = z.array(dimensionTagSchema);
25
+ export function validateDimensions(input) {
26
+ if (input === null || input === '') {
27
+ return { success: true, data: [] };
28
+ }
29
+ try {
30
+ const parsed = JSON.parse(input);
31
+ return dimensionsArraySchema.safeParse(parsed);
32
+ }
33
+ catch {
34
+ return { success: false, error: new z.ZodError([]) };
35
+ }
36
+ }
37
+ export function validateDimensionTags(input) {
38
+ if (input === null) {
39
+ return { success: true, data: [] };
40
+ }
41
+ const raw = typeof input === 'string' ? JSON.parse(input) : input;
42
+ return dimensionTagsArraySchema.safeParse(raw);
43
+ }
44
+ //# sourceMappingURL=dimensions.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dimensions.js","sourceRoot":"","sources":["../../src/schemas/dimensions.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,MAAM,CAAC,MAAM,eAAe,GAAG,CAAC,CAAC,MAAM,CAAC;IACtC,EAAE,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACrB,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;IAClC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CAC1C,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAAC,eAAe,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,oBAAoB,GAAG,CAAC,CAAC,MAAM,CAAC;IAC3C,iBAAiB,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,QAAQ,EAAE;IACrD,oBAAoB,EAAE,CAAC;SACpB,MAAM,CAAC;QACN,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;QACzC,QAAQ,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;KAC1C,CAAC;SACD,QAAQ,EAAE;CACd,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,kBAAkB,GAAG,CAAC,CAAC,MAAM,CAAC;IACzC,WAAW,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC9B,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IACxB,SAAS,EAAE,CAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,UAAU,EAAE,SAAS,CAAC,CAAC;IACtD,MAAM,EAAE,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,MAAM,EAAE,CAAC,CAAC,OAAO,CAAC,EAAE,CAAC;CACxC,CAAC,CAAC;AAEH,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,CAAC,KAAK,CAAC,kBAAkB,CAAC,CAAC;AAEpE,MAAM,UAAU,kBAAkB,CAAC,KAAoB;IACrD,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,KAAK,EAAE,EAAE,CAAC;QACnC,OAAO,EAAE,OAAO,EAAE,IAAa,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IACD,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;QACjC,OAAO,qBAAqB,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IACjD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,OAAO,EAAE,KAAc,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,EAAE,CAAC;IAChE,CAAC;AACH,CAAC;AAED,MAAM,UAAU,qBAAqB,CACnC,KAQQ;IAER,IAAI,KAAK,KAAK,IAAI,EAAE,CAAC;QACnB,OAAO,EAAE,OAAO,EAAE,IAAa,EAAE,IAAI,EAAE,EAAE,EAAE,CAAC;IAC9C,CAAC;IACD,MAAM,GAAG,GAAG,OAAO,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC;IAClE,OAAO,wBAAwB,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;AACjD,CAAC"}
@@ -0,0 +1,10 @@
1
+ import { PrismaClient } from '@prisma/client';
2
+ export declare function checkDatabaseConnection(): Promise<boolean>;
3
+ export declare function buildApp(): Promise<{
4
+ fastify: import("fastify").FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault> & PromiseLike<import("fastify").FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>> & {
5
+ __linterBrands: "SafePromiseLike";
6
+ };
7
+ prisma: PrismaClient<import(".prisma/client").Prisma.PrismaClientOptions, never, import("@prisma/client/runtime/library").DefaultArgs>;
8
+ }>;
9
+ export declare function startServer(): Promise<import("fastify").FastifyInstance<import("http").Server<typeof import("http").IncomingMessage, typeof import("http").ServerResponse>, import("http").IncomingMessage, import("http").ServerResponse<import("http").IncomingMessage>, import("fastify").FastifyBaseLogger, import("fastify").FastifyTypeProviderDefault>>;
10
+ //# sourceMappingURL=server.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,gBAAgB,CAAC;AAiC9C,wBAAsB,uBAAuB,IAAI,OAAO,CAAC,OAAO,CAAC,CAqBhE;AAED,wBAAsB,QAAQ;;;;;GAkH7B;AAED,wBAAsB,WAAW,qUAoEhC"}