@intlayer/backend 7.2.1-canary.0 → 7.2.2

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 (290) hide show
  1. package/dist/esm/utils/AI/aiSdk.mjs +7 -1
  2. package/dist/esm/utils/AI/aiSdk.mjs.map +1 -1
  3. package/dist/types/controllers/dictionary.controller.d.ts.map +1 -1
  4. package/dist/types/controllers/projectAccessKey.controller.d.ts.map +1 -1
  5. package/dist/types/controllers/tag.controller.d.ts.map +1 -1
  6. package/dist/types/emails/InviteUserEmail.d.ts +4 -4
  7. package/dist/types/emails/InviteUserEmail.d.ts.map +1 -1
  8. package/dist/types/emails/MagicLinkEmail.d.ts +4 -4
  9. package/dist/types/emails/OAuthTokenCreatedEmail.d.ts +4 -4
  10. package/dist/types/emails/PasswordChangeConfirmation.d.ts +4 -4
  11. package/dist/types/emails/PasswordChangeConfirmation.d.ts.map +1 -1
  12. package/dist/types/emails/ResetUserPassword.d.ts +4 -4
  13. package/dist/types/emails/ResetUserPassword.d.ts.map +1 -1
  14. package/dist/types/emails/SubscriptionPaymentCancellation.d.ts +4 -4
  15. package/dist/types/emails/SubscriptionPaymentError.d.ts +4 -4
  16. package/dist/types/emails/SubscriptionPaymentSuccess.d.ts +4 -4
  17. package/dist/types/emails/SubscriptionPaymentSuccess.d.ts.map +1 -1
  18. package/dist/types/emails/ValidateUserEmail.d.ts +4 -4
  19. package/dist/types/emails/Welcome.d.ts +4 -4
  20. package/dist/types/models/dictionary.model.d.ts +4 -4
  21. package/dist/types/models/dictionary.model.d.ts.map +1 -1
  22. package/dist/types/models/discussion.model.d.ts +2 -2
  23. package/dist/types/models/discussion.model.d.ts.map +1 -1
  24. package/dist/types/models/oAuth2.model.d.ts +3 -3
  25. package/dist/types/models/oAuth2.model.d.ts.map +1 -1
  26. package/dist/types/routes/ai.routes.d.ts.map +1 -1
  27. package/dist/types/routes/project.routes.d.ts.map +1 -1
  28. package/dist/types/schemas/dictionary.schema.d.ts +6 -6
  29. package/dist/types/schemas/dictionary.schema.d.ts.map +1 -1
  30. package/dist/types/schemas/discussion.schema.d.ts +6 -6
  31. package/dist/types/schemas/oAuth2.schema.d.ts +5 -5
  32. package/dist/types/schemas/organization.schema.d.ts +6 -6
  33. package/dist/types/schemas/plans.schema.d.ts +6 -6
  34. package/dist/types/schemas/project.schema.d.ts +6 -6
  35. package/dist/types/schemas/project.schema.d.ts.map +1 -1
  36. package/dist/types/schemas/session.schema.d.ts +6 -6
  37. package/dist/types/schemas/tag.schema.d.ts +6 -6
  38. package/dist/types/schemas/user.schema.d.ts +6 -6
  39. package/dist/types/services/email.service.d.ts +11 -11
  40. package/dist/types/utils/filtersAndPagination/getDictionaryFiltersAndPagination.d.ts +2 -2
  41. package/dist/types/utils/filtersAndPagination/getDiscussionFiltersAndPagination.d.ts +2 -2
  42. package/dist/types/utils/filtersAndPagination/getOrganizationFiltersAndPagination.d.ts +2 -2
  43. package/dist/types/utils/filtersAndPagination/getProjectFiltersAndPagination.d.ts +2 -2
  44. package/dist/types/utils/filtersAndPagination/getTagFiltersAndPagination.d.ts +2 -2
  45. package/package.json +17 -18
  46. package/dist/cjs/_virtual/_utils_asset.cjs +0 -98
  47. package/dist/cjs/_virtual/rolldown_runtime.cjs +0 -25
  48. package/dist/cjs/controllers/ai.controller.cjs +0 -381
  49. package/dist/cjs/controllers/ai.controller.cjs.map +0 -1
  50. package/dist/cjs/controllers/dictionary.controller.cjs +0 -463
  51. package/dist/cjs/controllers/dictionary.controller.cjs.map +0 -1
  52. package/dist/cjs/controllers/eventListener.controller.cjs +0 -53
  53. package/dist/cjs/controllers/eventListener.controller.cjs.map +0 -1
  54. package/dist/cjs/controllers/newsletter.controller.cjs +0 -164
  55. package/dist/cjs/controllers/newsletter.controller.cjs.map +0 -1
  56. package/dist/cjs/controllers/oAuth2.controller.cjs +0 -22
  57. package/dist/cjs/controllers/oAuth2.controller.cjs.map +0 -1
  58. package/dist/cjs/controllers/organization.controller.cjs +0 -492
  59. package/dist/cjs/controllers/organization.controller.cjs.map +0 -1
  60. package/dist/cjs/controllers/project.controller.cjs +0 -430
  61. package/dist/cjs/controllers/project.controller.cjs.map +0 -1
  62. package/dist/cjs/controllers/projectAccessKey.controller.cjs +0 -161
  63. package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +0 -1
  64. package/dist/cjs/controllers/search.controller.cjs +0 -14
  65. package/dist/cjs/controllers/search.controller.cjs.map +0 -1
  66. package/dist/cjs/controllers/stripe.controller.cjs +0 -149
  67. package/dist/cjs/controllers/stripe.controller.cjs.map +0 -1
  68. package/dist/cjs/controllers/tag.controller.cjs +0 -226
  69. package/dist/cjs/controllers/tag.controller.cjs.map +0 -1
  70. package/dist/cjs/controllers/user.controller.cjs +0 -269
  71. package/dist/cjs/controllers/user.controller.cjs.map +0 -1
  72. package/dist/cjs/emails/InviteUserEmail.cjs +0 -325
  73. package/dist/cjs/emails/InviteUserEmail.cjs.map +0 -1
  74. package/dist/cjs/emails/MagicLinkEmail.cjs +0 -242
  75. package/dist/cjs/emails/MagicLinkEmail.cjs.map +0 -1
  76. package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs +0 -301
  77. package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs.map +0 -1
  78. package/dist/cjs/emails/PasswordChangeConfirmation.cjs +0 -177
  79. package/dist/cjs/emails/PasswordChangeConfirmation.cjs.map +0 -1
  80. package/dist/cjs/emails/ResetUserPassword.cjs +0 -240
  81. package/dist/cjs/emails/ResetUserPassword.cjs.map +0 -1
  82. package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs +0 -202
  83. package/dist/cjs/emails/SubscriptionPaymentCancellation.cjs.map +0 -1
  84. package/dist/cjs/emails/SubscriptionPaymentError.cjs +0 -202
  85. package/dist/cjs/emails/SubscriptionPaymentError.cjs.map +0 -1
  86. package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs +0 -208
  87. package/dist/cjs/emails/SubscriptionPaymentSuccess.cjs.map +0 -1
  88. package/dist/cjs/emails/ValidateUserEmail.cjs +0 -240
  89. package/dist/cjs/emails/ValidateUserEmail.cjs.map +0 -1
  90. package/dist/cjs/emails/Welcome.cjs +0 -216
  91. package/dist/cjs/emails/Welcome.cjs.map +0 -1
  92. package/dist/cjs/emails/index.cjs +0 -25
  93. package/dist/cjs/export.cjs +0 -24
  94. package/dist/cjs/index.cjs +0 -91
  95. package/dist/cjs/index.cjs.map +0 -1
  96. package/dist/cjs/logger/index.cjs +0 -13
  97. package/dist/cjs/logger/index.cjs.map +0 -1
  98. package/dist/cjs/middlewares/oAuth2.middleware.cjs +0 -42
  99. package/dist/cjs/middlewares/oAuth2.middleware.cjs.map +0 -1
  100. package/dist/cjs/middlewares/request.middleware.cjs +0 -17
  101. package/dist/cjs/middlewares/request.middleware.cjs.map +0 -1
  102. package/dist/cjs/middlewares/sessionAuth.middleware.cjs +0 -22
  103. package/dist/cjs/middlewares/sessionAuth.middleware.cjs.map +0 -1
  104. package/dist/cjs/models/dictionary.model.cjs +0 -10
  105. package/dist/cjs/models/dictionary.model.cjs.map +0 -1
  106. package/dist/cjs/models/discussion.model.cjs +0 -10
  107. package/dist/cjs/models/discussion.model.cjs.map +0 -1
  108. package/dist/cjs/models/oAuth2.model.cjs +0 -10
  109. package/dist/cjs/models/oAuth2.model.cjs.map +0 -1
  110. package/dist/cjs/models/organization.model.cjs +0 -10
  111. package/dist/cjs/models/organization.model.cjs.map +0 -1
  112. package/dist/cjs/models/project.model.cjs +0 -10
  113. package/dist/cjs/models/project.model.cjs.map +0 -1
  114. package/dist/cjs/models/session.model.cjs +0 -10
  115. package/dist/cjs/models/session.model.cjs.map +0 -1
  116. package/dist/cjs/models/tag.model.cjs +0 -10
  117. package/dist/cjs/models/tag.model.cjs.map +0 -1
  118. package/dist/cjs/models/user.model.cjs +0 -10
  119. package/dist/cjs/models/user.model.cjs.map +0 -1
  120. package/dist/cjs/routes/ai.routes.cjs +0 -75
  121. package/dist/cjs/routes/ai.routes.cjs.map +0 -1
  122. package/dist/cjs/routes/dictionary.routes.cjs +0 -64
  123. package/dist/cjs/routes/dictionary.routes.cjs.map +0 -1
  124. package/dist/cjs/routes/eventListener.routes.cjs +0 -20
  125. package/dist/cjs/routes/eventListener.routes.cjs.map +0 -1
  126. package/dist/cjs/routes/newsletter.routes.cjs +0 -34
  127. package/dist/cjs/routes/newsletter.routes.cjs.map +0 -1
  128. package/dist/cjs/routes/organization.routes.cjs +0 -70
  129. package/dist/cjs/routes/organization.routes.cjs.map +0 -1
  130. package/dist/cjs/routes/project.routes.cjs +0 -83
  131. package/dist/cjs/routes/project.routes.cjs.map +0 -1
  132. package/dist/cjs/routes/search.routes.cjs +0 -20
  133. package/dist/cjs/routes/search.routes.cjs.map +0 -1
  134. package/dist/cjs/routes/stripe.routes.cjs +0 -34
  135. package/dist/cjs/routes/stripe.routes.cjs.map +0 -1
  136. package/dist/cjs/routes/tags.routes.cjs +0 -40
  137. package/dist/cjs/routes/tags.routes.cjs.map +0 -1
  138. package/dist/cjs/routes/user.routes.cjs +0 -58
  139. package/dist/cjs/routes/user.routes.cjs.map +0 -1
  140. package/dist/cjs/schemas/dictionary.schema.cjs +0 -73
  141. package/dist/cjs/schemas/dictionary.schema.cjs.map +0 -1
  142. package/dist/cjs/schemas/discussion.schema.cjs +0 -81
  143. package/dist/cjs/schemas/discussion.schema.cjs.map +0 -1
  144. package/dist/cjs/schemas/oAuth2.schema.cjs +0 -49
  145. package/dist/cjs/schemas/oAuth2.schema.cjs.map +0 -1
  146. package/dist/cjs/schemas/organization.schema.cjs +0 -62
  147. package/dist/cjs/schemas/organization.schema.cjs.map +0 -1
  148. package/dist/cjs/schemas/plans.schema.cjs +0 -75
  149. package/dist/cjs/schemas/plans.schema.cjs.map +0 -1
  150. package/dist/cjs/schemas/project.schema.cjs +0 -112
  151. package/dist/cjs/schemas/project.schema.cjs.map +0 -1
  152. package/dist/cjs/schemas/session.schema.cjs +0 -43
  153. package/dist/cjs/schemas/session.schema.cjs.map +0 -1
  154. package/dist/cjs/schemas/tag.schema.cjs +0 -62
  155. package/dist/cjs/schemas/tag.schema.cjs.map +0 -1
  156. package/dist/cjs/schemas/user.schema.cjs +0 -87
  157. package/dist/cjs/schemas/user.schema.cjs.map +0 -1
  158. package/dist/cjs/services/dictionary.service.cjs +0 -176
  159. package/dist/cjs/services/dictionary.service.cjs.map +0 -1
  160. package/dist/cjs/services/email.service.cjs +0 -155
  161. package/dist/cjs/services/email.service.cjs.map +0 -1
  162. package/dist/cjs/services/oAuth2.service.cjs +0 -211
  163. package/dist/cjs/services/oAuth2.service.cjs.map +0 -1
  164. package/dist/cjs/services/organization.service.cjs +0 -106
  165. package/dist/cjs/services/organization.service.cjs.map +0 -1
  166. package/dist/cjs/services/project.service.cjs +0 -89
  167. package/dist/cjs/services/project.service.cjs.map +0 -1
  168. package/dist/cjs/services/projectAccessKey.service.cjs +0 -111
  169. package/dist/cjs/services/projectAccessKey.service.cjs.map +0 -1
  170. package/dist/cjs/services/subscription.service.cjs +0 -184
  171. package/dist/cjs/services/subscription.service.cjs.map +0 -1
  172. package/dist/cjs/services/tag.service.cjs +0 -88
  173. package/dist/cjs/services/tag.service.cjs.map +0 -1
  174. package/dist/cjs/services/user.service.cjs +0 -120
  175. package/dist/cjs/services/user.service.cjs.map +0 -1
  176. package/dist/cjs/types/Routes.cjs +0 -0
  177. package/dist/cjs/types/dictionary.types.cjs +0 -0
  178. package/dist/cjs/types/discussion.types.cjs +0 -0
  179. package/dist/cjs/types/oAuth2.types.cjs +0 -0
  180. package/dist/cjs/types/organization.types.cjs +0 -0
  181. package/dist/cjs/types/plan.types.cjs +0 -0
  182. package/dist/cjs/types/project.types.cjs +0 -0
  183. package/dist/cjs/types/session.types.cjs +0 -0
  184. package/dist/cjs/types/tag.types.cjs +0 -0
  185. package/dist/cjs/types/user.types.cjs +0 -10
  186. package/dist/cjs/types/user.types.cjs.map +0 -1
  187. package/dist/cjs/utils/AI/aiSdk.cjs +0 -94
  188. package/dist/cjs/utils/AI/aiSdk.cjs.map +0 -1
  189. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs +0 -201
  190. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs.map +0 -1
  191. package/dist/cjs/utils/AI/askDocQuestion/indexMarkdownFiles.cjs +0 -150
  192. package/dist/cjs/utils/AI/askDocQuestion/indexMarkdownFiles.cjs.map +0 -1
  193. package/dist/cjs/utils/AI/auditDictionary/index.cjs +0 -60
  194. package/dist/cjs/utils/AI/auditDictionary/index.cjs.map +0 -1
  195. package/dist/cjs/utils/AI/auditDictionaryField/index.cjs +0 -63
  196. package/dist/cjs/utils/AI/auditDictionaryField/index.cjs.map +0 -1
  197. package/dist/cjs/utils/AI/auditDictionaryMetadata/index.cjs +0 -45
  198. package/dist/cjs/utils/AI/auditDictionaryMetadata/index.cjs.map +0 -1
  199. package/dist/cjs/utils/AI/auditTag/index.cjs +0 -40
  200. package/dist/cjs/utils/AI/auditTag/index.cjs.map +0 -1
  201. package/dist/cjs/utils/AI/autocomplete/index.cjs +0 -41
  202. package/dist/cjs/utils/AI/autocomplete/index.cjs.map +0 -1
  203. package/dist/cjs/utils/AI/customQuery/index.cjs +0 -27
  204. package/dist/cjs/utils/AI/customQuery/index.cjs.map +0 -1
  205. package/dist/cjs/utils/AI/translateJSON/index.cjs +0 -71
  206. package/dist/cjs/utils/AI/translateJSON/index.cjs.map +0 -1
  207. package/dist/cjs/utils/access.cjs +0 -0
  208. package/dist/cjs/utils/accessControl.cjs +0 -133
  209. package/dist/cjs/utils/accessControl.cjs.map +0 -1
  210. package/dist/cjs/utils/auth/getAuth.cjs +0 -218
  211. package/dist/cjs/utils/auth/getAuth.cjs.map +0 -1
  212. package/dist/cjs/utils/cors.cjs +0 -33
  213. package/dist/cjs/utils/cors.cjs.map +0 -1
  214. package/dist/cjs/utils/ensureArrayQueryFilter.cjs +0 -13
  215. package/dist/cjs/utils/ensureArrayQueryFilter.cjs.map +0 -1
  216. package/dist/cjs/utils/ensureMongoDocumentToObject.cjs +0 -16
  217. package/dist/cjs/utils/ensureMongoDocumentToObject.cjs.map +0 -1
  218. package/dist/cjs/utils/errors/ErrorHandler.cjs +0 -76
  219. package/dist/cjs/utils/errors/ErrorHandler.cjs.map +0 -1
  220. package/dist/cjs/utils/errors/ErrorsClass.cjs +0 -54
  221. package/dist/cjs/utils/errors/ErrorsClass.cjs.map +0 -1
  222. package/dist/cjs/utils/errors/errorCodes.cjs +0 -1387
  223. package/dist/cjs/utils/errors/errorCodes.cjs.map +0 -1
  224. package/dist/cjs/utils/errors/index.cjs +0 -8
  225. package/dist/cjs/utils/extractJSON.cjs +0 -61
  226. package/dist/cjs/utils/extractJSON.cjs.map +0 -1
  227. package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs +0 -94
  228. package/dist/cjs/utils/filtersAndPagination/getDictionaryFiltersAndPagination.cjs.map +0 -1
  229. package/dist/cjs/utils/filtersAndPagination/getDiscussionFiltersAndPagination.cjs +0 -65
  230. package/dist/cjs/utils/filtersAndPagination/getDiscussionFiltersAndPagination.cjs.map +0 -1
  231. package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs +0 -36
  232. package/dist/cjs/utils/filtersAndPagination/getFiltersAndPaginationFromBody.cjs.map +0 -1
  233. package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs +0 -49
  234. package/dist/cjs/utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs.map +0 -1
  235. package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs +0 -53
  236. package/dist/cjs/utils/filtersAndPagination/getProjectFiltersAndPagination.cjs.map +0 -1
  237. package/dist/cjs/utils/filtersAndPagination/getTagFiltersAndPagination.cjs +0 -57
  238. package/dist/cjs/utils/filtersAndPagination/getTagFiltersAndPagination.cjs.map +0 -1
  239. package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs +0 -74
  240. package/dist/cjs/utils/filtersAndPagination/getUserFiltersAndPagination.cjs.map +0 -1
  241. package/dist/cjs/utils/httpStatusCodes.cjs +0 -401
  242. package/dist/cjs/utils/httpStatusCodes.cjs.map +0 -1
  243. package/dist/cjs/utils/mapper/dictionary.cjs +0 -29
  244. package/dist/cjs/utils/mapper/dictionary.cjs.map +0 -1
  245. package/dist/cjs/utils/mapper/organization.cjs +0 -19
  246. package/dist/cjs/utils/mapper/organization.cjs.map +0 -1
  247. package/dist/cjs/utils/mapper/project.cjs +0 -26
  248. package/dist/cjs/utils/mapper/project.cjs.map +0 -1
  249. package/dist/cjs/utils/mapper/session.cjs +0 -15
  250. package/dist/cjs/utils/mapper/session.cjs.map +0 -1
  251. package/dist/cjs/utils/mapper/tag.cjs +0 -25
  252. package/dist/cjs/utils/mapper/tag.cjs.map +0 -1
  253. package/dist/cjs/utils/mapper/user.cjs +0 -24
  254. package/dist/cjs/utils/mapper/user.cjs.map +0 -1
  255. package/dist/cjs/utils/mergeFunctionTypes.cjs +0 -0
  256. package/dist/cjs/utils/mongoDB/connectDB.cjs +0 -32
  257. package/dist/cjs/utils/mongoDB/connectDB.cjs.map +0 -1
  258. package/dist/cjs/utils/mongoDB/types.cjs +0 -0
  259. package/dist/cjs/utils/oAuth2.cjs +0 -25
  260. package/dist/cjs/utils/oAuth2.cjs.map +0 -1
  261. package/dist/cjs/utils/permissions.cjs +0 -103
  262. package/dist/cjs/utils/permissions.cjs.map +0 -1
  263. package/dist/cjs/utils/plan.cjs +0 -63
  264. package/dist/cjs/utils/plan.cjs.map +0 -1
  265. package/dist/cjs/utils/rateLimiter.cjs +0 -48
  266. package/dist/cjs/utils/rateLimiter.cjs.map +0 -1
  267. package/dist/cjs/utils/removeObjectKeys.cjs +0 -11
  268. package/dist/cjs/utils/removeObjectKeys.cjs.map +0 -1
  269. package/dist/cjs/utils/responseData.cjs +0 -33
  270. package/dist/cjs/utils/responseData.cjs.map +0 -1
  271. package/dist/cjs/utils/validation/validateArray.cjs +0 -31
  272. package/dist/cjs/utils/validation/validateArray.cjs.map +0 -1
  273. package/dist/cjs/utils/validation/validateDictionary.cjs +0 -35
  274. package/dist/cjs/utils/validation/validateDictionary.cjs.map +0 -1
  275. package/dist/cjs/utils/validation/validateEmail.cjs +0 -20
  276. package/dist/cjs/utils/validation/validateEmail.cjs.map +0 -1
  277. package/dist/cjs/utils/validation/validateOrganization.cjs +0 -43
  278. package/dist/cjs/utils/validation/validateOrganization.cjs.map +0 -1
  279. package/dist/cjs/utils/validation/validatePhone.cjs +0 -20
  280. package/dist/cjs/utils/validation/validatePhone.cjs.map +0 -1
  281. package/dist/cjs/utils/validation/validateProject.cjs +0 -55
  282. package/dist/cjs/utils/validation/validateProject.cjs.map +0 -1
  283. package/dist/cjs/utils/validation/validateString.cjs +0 -21
  284. package/dist/cjs/utils/validation/validateString.cjs.map +0 -1
  285. package/dist/cjs/utils/validation/validateTag.cjs +0 -47
  286. package/dist/cjs/utils/validation/validateTag.cjs.map +0 -1
  287. package/dist/cjs/utils/validation/validateUser.cjs +0 -47
  288. package/dist/cjs/utils/validation/validateUser.cjs.map +0 -1
  289. package/dist/cjs/webhooks/stripe.webhook.cjs +0 -116
  290. package/dist/cjs/webhooks/stripe.webhook.cjs.map +0 -1
@@ -1,381 +0,0 @@
1
- const require_utils_responseData = require('../utils/responseData.cjs');
2
- const require_utils_errors_ErrorHandler = require('../utils/errors/ErrorHandler.cjs');
3
- const require_services_dictionary_service = require('../services/dictionary.service.cjs');
4
- const require_services_tag_service = require('../services/tag.service.cjs');
5
- const require_utils_AI_aiSdk = require('../utils/AI/aiSdk.cjs');
6
- const require_utils_AI_askDocQuestion_askDocQuestion = require('../utils/AI/askDocQuestion/askDocQuestion.cjs');
7
- const require_utils_AI_auditDictionary_index = require('../utils/AI/auditDictionary/index.cjs');
8
- const require_utils_AI_auditDictionaryField_index = require('../utils/AI/auditDictionaryField/index.cjs');
9
- const require_utils_AI_auditDictionaryMetadata_index = require('../utils/AI/auditDictionaryMetadata/index.cjs');
10
- const require_utils_AI_auditTag_index = require('../utils/AI/auditTag/index.cjs');
11
- const require_utils_AI_autocomplete_index = require('../utils/AI/autocomplete/index.cjs');
12
- const require_utils_AI_customQuery_index = require('../utils/AI/customQuery/index.cjs');
13
- const require_utils_AI_translateJSON_index = require('../utils/AI/translateJSON/index.cjs');
14
- const require_utils_filtersAndPagination_getDiscussionFiltersAndPagination = require('../utils/filtersAndPagination/getDiscussionFiltersAndPagination.cjs');
15
- const require_models_discussion_model = require('../models/discussion.model.cjs');
16
-
17
- //#region src/controllers/ai.controller.ts
18
- const customQuery = async (req, res, _next) => {
19
- const { aiOptions, tagsKeys, ...rest } = req.body;
20
- let aiConfig;
21
- try {
22
- aiConfig = await require_utils_AI_aiSdk.getAIConfig(res, {
23
- userOptions: aiOptions,
24
- defaultOptions: require_utils_AI_customQuery_index.aiDefaultOptions,
25
- accessType: ["registered_user", "apiKey"]
26
- });
27
- } catch (_error) {
28
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AI_ACCESS_DENIED");
29
- return;
30
- }
31
- try {
32
- const auditResponse = await require_utils_AI_customQuery_index.customQuery({
33
- ...rest,
34
- aiConfig,
35
- applicationContext: aiOptions?.applicationContext
36
- });
37
- if (!auditResponse) {
38
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "QUERY_FAILED");
39
- return;
40
- }
41
- const responseData = require_utils_responseData.formatResponse({ data: auditResponse });
42
- res.json(responseData);
43
- return;
44
- } catch (error) {
45
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
46
- return;
47
- }
48
- };
49
- const translateJSON = async (req, res, _next) => {
50
- const { project } = res.locals;
51
- const { aiOptions, tagsKeys, ...rest } = req.body;
52
- let aiConfig;
53
- try {
54
- aiConfig = await require_utils_AI_aiSdk.getAIConfig(res, {
55
- userOptions: aiOptions,
56
- defaultOptions: require_utils_AI_translateJSON_index.aiDefaultOptions,
57
- accessType: ["registered_user", "apiKey"]
58
- });
59
- } catch (_error) {
60
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AI_ACCESS_DENIED");
61
- return;
62
- }
63
- try {
64
- let tags = [];
65
- if (project?.organizationId && tagsKeys) tags = await require_services_tag_service.getTagsByKeys(tagsKeys, project.organizationId);
66
- const auditResponse = await require_utils_AI_translateJSON_index.translateJSON({
67
- ...rest,
68
- aiConfig,
69
- applicationContext: aiOptions?.applicationContext,
70
- tags
71
- });
72
- if (!auditResponse) {
73
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AUDIT_FAILED");
74
- return;
75
- }
76
- const responseData = require_utils_responseData.formatResponse({ data: auditResponse });
77
- res.json(responseData);
78
- return;
79
- } catch (error) {
80
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
81
- return;
82
- }
83
- };
84
- /**
85
- * Retrieves a list of dictionaries based on filters and pagination.
86
- */
87
- const auditContentDeclaration = async (req, res, _next) => {
88
- const { project } = res.locals;
89
- const { fileContent, filePath, aiOptions, locales, defaultLocale, tagsKeys } = req.body;
90
- let aiConfig;
91
- try {
92
- aiConfig = await require_utils_AI_aiSdk.getAIConfig(res, {
93
- userOptions: aiOptions,
94
- defaultOptions: require_utils_AI_auditDictionary_index.aiDefaultOptions,
95
- accessType: ["registered_user", "apiKey"]
96
- });
97
- } catch (_error) {
98
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AI_ACCESS_DENIED");
99
- return;
100
- }
101
- try {
102
- let tags = [];
103
- if (project?.organizationId) tags = await require_services_tag_service.getTagsByKeys(tagsKeys, project.organizationId);
104
- const auditResponse = await require_utils_AI_auditDictionary_index.auditDictionary({
105
- fileContent,
106
- filePath,
107
- aiConfig,
108
- applicationContext: aiOptions?.applicationContext,
109
- locales,
110
- defaultLocale,
111
- tags
112
- });
113
- if (!auditResponse) {
114
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AUDIT_FAILED");
115
- return;
116
- }
117
- const responseData = require_utils_responseData.formatResponse({ data: auditResponse });
118
- res.json(responseData);
119
- return;
120
- } catch (error) {
121
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
122
- return;
123
- }
124
- };
125
- /**
126
- * Retrieves a list of dictionaries based on filters and pagination.
127
- */
128
- const auditContentDeclarationField = async (req, res, _next) => {
129
- const { project } = res.locals;
130
- const { fileContent, aiOptions, locales, tagsKeys, keyPath } = req.body;
131
- let aiConfig;
132
- try {
133
- aiConfig = await require_utils_AI_aiSdk.getAIConfig(res, {
134
- userOptions: aiOptions,
135
- defaultOptions: require_utils_AI_auditDictionaryField_index.aiDefaultOptions,
136
- accessType: ["registered_user", "apiKey"]
137
- });
138
- } catch (_error) {
139
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AI_ACCESS_DENIED");
140
- return;
141
- }
142
- try {
143
- let tags = [];
144
- if (project?.organizationId) tags = await require_services_tag_service.getTagsByKeys(tagsKeys, project.organizationId);
145
- const auditResponse = await require_utils_AI_auditDictionaryField_index.auditDictionaryField({
146
- fileContent,
147
- aiConfig,
148
- applicationContext: aiOptions?.applicationContext,
149
- locales,
150
- tags,
151
- keyPath
152
- });
153
- if (!auditResponse) {
154
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AUDIT_FAILED");
155
- return;
156
- }
157
- const responseData = require_utils_responseData.formatResponse({ data: auditResponse });
158
- res.json(responseData);
159
- return;
160
- } catch (error) {
161
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
162
- return;
163
- }
164
- };
165
- /**
166
- * Retrieves a list of dictionaries based on filters and pagination.
167
- */
168
- const auditContentDeclarationMetadata = async (req, res, _next) => {
169
- const { organization } = res.locals;
170
- const { fileContent, aiOptions } = req.body;
171
- let aiConfig;
172
- try {
173
- aiConfig = await require_utils_AI_aiSdk.getAIConfig(res, {
174
- userOptions: aiOptions,
175
- defaultOptions: require_utils_AI_auditDictionaryMetadata_index.aiDefaultOptions,
176
- accessType: ["registered_user", "apiKey"]
177
- });
178
- } catch (_error) {
179
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AI_ACCESS_DENIED");
180
- return;
181
- }
182
- try {
183
- const tags = await require_services_tag_service.findTags({ organizationId: organization?.id }, 0, 1e3);
184
- const auditResponse = await require_utils_AI_auditDictionaryMetadata_index.auditDictionaryMetadata({
185
- fileContent,
186
- aiConfig,
187
- applicationContext: aiOptions?.applicationContext,
188
- tags
189
- });
190
- if (!auditResponse) {
191
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AUDIT_FAILED");
192
- return;
193
- }
194
- const responseData = require_utils_responseData.formatResponse({ data: auditResponse });
195
- res.json(responseData);
196
- return;
197
- } catch (error) {
198
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
199
- return;
200
- }
201
- };
202
- /**
203
- * Retrieves a list of dictionaries based on filters and pagination.
204
- */
205
- const auditTag = async (req, res, _next) => {
206
- const { project } = res.locals;
207
- const { aiOptions, tag } = req.body;
208
- let aiConfig;
209
- try {
210
- aiConfig = await require_utils_AI_aiSdk.getAIConfig(res, {
211
- userOptions: aiOptions,
212
- defaultOptions: require_utils_AI_auditTag_index.aiDefaultOptions,
213
- accessType: ["registered_user", "apiKey"]
214
- });
215
- } catch (_error) {
216
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AI_ACCESS_DENIED");
217
- return;
218
- }
219
- try {
220
- let dictionaries = [];
221
- if (project?.organizationId) dictionaries = await require_services_dictionary_service.getDictionariesByTags([tag.key], project.id);
222
- const auditResponse = await require_utils_AI_auditTag_index.auditTag({
223
- aiConfig,
224
- dictionaries,
225
- tag,
226
- applicationContext: aiOptions?.applicationContext
227
- });
228
- if (!auditResponse) {
229
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AUDIT_FAILED");
230
- return;
231
- }
232
- const responseData = require_utils_responseData.formatResponse({ data: auditResponse });
233
- res.json(responseData);
234
- return;
235
- } catch (error) {
236
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
237
- return;
238
- }
239
- };
240
- const askDocQuestion = async (req, res, _next) => {
241
- const { messages = [], discussionId } = req.body;
242
- const { user, project, organization } = res.locals;
243
- let aiConfig;
244
- try {
245
- aiConfig = await require_utils_AI_aiSdk.getAIConfig(res, {
246
- userOptions: {},
247
- accessType: ["public"]
248
- });
249
- } catch (_error) {
250
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AI_ACCESS_DENIED");
251
- return;
252
- }
253
- res.setHeader("Content-Type", "text/event-stream; charset=utf-8");
254
- res.setHeader("Cache-Control", "no-cache, no-transform");
255
- res.setHeader("Connection", "keep-alive");
256
- res.setHeader("X-Accel-Buffering", "no");
257
- res.flushHeaders?.();
258
- res.write(": connected\n\n");
259
- res.flush?.();
260
- require_utils_AI_askDocQuestion_askDocQuestion.askDocQuestion(messages, aiConfig, { onMessage: (chunk) => {
261
- res.write(`data: ${JSON.stringify({ chunk })}\n\n`);
262
- res.flush?.();
263
- } }).then(async (fullResponse) => {
264
- const lastUserMessageContent = messages.findLast((message) => message.role === "user")?.content;
265
- if ((lastUserMessageContent ? lastUserMessageContent.split(" ").length : 0) > 2) await require_models_discussion_model.DiscussionModel.findOneAndUpdate({ discussionId }, { $set: {
266
- discussionId,
267
- userId: user?.id,
268
- projectId: project?.id,
269
- organizationId: organization?.id,
270
- messages: [...messages.map((msg) => ({
271
- role: msg.role,
272
- content: msg.content,
273
- timestamp: msg.timestamp
274
- })), {
275
- role: "assistant",
276
- content: fullResponse.response,
277
- relatedFiles: fullResponse.relatedFiles,
278
- timestamp: /* @__PURE__ */ new Date()
279
- }]
280
- } }, {
281
- upsert: true,
282
- new: true
283
- });
284
- res.write(`data: ${JSON.stringify({
285
- done: true,
286
- response: fullResponse
287
- })}\n\n`);
288
- res.end();
289
- }).catch((err) => {
290
- res.write(`event: error\ndata: ${JSON.stringify({ message: err.message })}\n\n`);
291
- res.end();
292
- });
293
- };
294
- const autocomplete = async (req, res, _next) => {
295
- try {
296
- const { text, aiOptions, contextBefore, currentLine, contextAfter } = req.body;
297
- let aiConfig;
298
- try {
299
- aiConfig = await require_utils_AI_aiSdk.getAIConfig(res, {
300
- userOptions: aiOptions,
301
- defaultOptions: require_utils_AI_autocomplete_index.aiDefaultOptions,
302
- accessType: ["public"]
303
- });
304
- } catch (_error) {
305
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "AI_ACCESS_DENIED");
306
- return;
307
- }
308
- const responseData = require_utils_responseData.formatResponse({ data: await require_utils_AI_autocomplete_index.autocomplete({
309
- text,
310
- aiConfig,
311
- applicationContext: aiOptions?.applicationContext,
312
- contextBefore,
313
- currentLine,
314
- contextAfter
315
- }) ?? {
316
- autocompletion: "",
317
- tokenUsed: 0
318
- } });
319
- res.json(responseData);
320
- } catch (error) {
321
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
322
- return;
323
- }
324
- };
325
- /**
326
- * Retrieves a list of discussions with filters and pagination.
327
- * Only the owner or admins can access. By default, users only see their own.
328
- */
329
- const getDiscussions = async (req, res, _next) => {
330
- const { user, roles } = res.locals;
331
- const { filters, sortOptions, pageSize, skip, page, getNumberOfPages } = require_utils_filtersAndPagination_getDiscussionFiltersAndPagination.getDiscussionFiltersAndPagination(req, res);
332
- const includeMessages = req.query?.includeMessages !== "false";
333
- if (!user) {
334
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
335
- return;
336
- }
337
- try {
338
- const projection = includeMessages ? {} : { messages: 0 };
339
- const discussions = await require_models_discussion_model.DiscussionModel.find(filters, projection).sort(sortOptions).skip(skip).limit(pageSize).lean();
340
- const numberOfMessagesById = {};
341
- if (!includeMessages && discussions.length > 0) {
342
- const ids = discussions.map((d) => d._id);
343
- const counts = await require_models_discussion_model.DiscussionModel.aggregate([{ $match: { _id: { $in: ids } } }, { $project: { numberOfMessages: { $size: { $ifNull: ["$messages", []] } } } }]);
344
- for (const c of counts) numberOfMessagesById[String(c._id)] = c.numberOfMessages ?? 0;
345
- }
346
- const allOwnedByUser = discussions.every((d) => String(d.userId) === String(user.id));
347
- if (!(roles.includes("admin") || allOwnedByUser)) {
348
- require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
349
- return;
350
- }
351
- const totalItems = await require_models_discussion_model.DiscussionModel.countDocuments(filters);
352
- const responseData = require_utils_responseData.formatPaginatedResponse({
353
- data: discussions.map((d) => ({
354
- ...d,
355
- id: String(d._id ?? d.id),
356
- numberOfMessages: includeMessages ? Array.isArray(d.messages) ? d.messages.length : 0 : numberOfMessagesById[String(d._id ?? d.id)] ?? 0
357
- })),
358
- page,
359
- pageSize,
360
- totalPages: getNumberOfPages(totalItems),
361
- totalItems
362
- });
363
- res.json(responseData);
364
- return;
365
- } catch (error) {
366
- require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
367
- return;
368
- }
369
- };
370
-
371
- //#endregion
372
- exports.askDocQuestion = askDocQuestion;
373
- exports.auditContentDeclaration = auditContentDeclaration;
374
- exports.auditContentDeclarationField = auditContentDeclarationField;
375
- exports.auditContentDeclarationMetadata = auditContentDeclarationMetadata;
376
- exports.auditTag = auditTag;
377
- exports.autocomplete = autocomplete;
378
- exports.customQuery = customQuery;
379
- exports.getDiscussions = getDiscussions;
380
- exports.translateJSON = translateJSON;
381
- //# sourceMappingURL=ai.controller.cjs.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"ai.controller.cjs","names":["aiConfig: AIConfig","getAIConfig","formatResponse","tags: Tag[]","getTagsByKeys","dictionaries: Dictionary[]","getDictionariesByTags","DiscussionModel","getDiscussionFiltersAndPagination","numberOfMessagesById: Record<string, number>","formatPaginatedResponse"],"sources":["../../../src/controllers/ai.controller.ts"],"sourcesContent":["import type { KeyPath, Locale } from '@intlayer/types';\nimport type { ResponseWithSession } from '@middlewares/sessionAuth.middleware';\nimport { getDictionariesByTags } from '@services/dictionary.service';\nimport * as tagService from '@services/tag.service';\nimport { getTagsByKeys } from '@services/tag.service';\nimport {\n type AIConfig,\n type AIOptions,\n type ChatCompletionRequestMessage,\n getAIConfig,\n} from '@utils/AI/aiSdk';\nimport * as askDocQuestionUtil from '@utils/AI/askDocQuestion/askDocQuestion';\nimport * as auditContentDeclarationUtil from '@utils/AI/auditDictionary';\nimport * as auditContentDeclarationFieldUtil from '@utils/AI/auditDictionaryField';\nimport * as auditContentDeclarationMetadataUtil from '@utils/AI/auditDictionaryMetadata';\nimport * as auditTagUtil from '@utils/AI/auditTag';\nimport * as autocompleteUtil from '@utils/AI/autocomplete';\nimport * as customQueryUtil from '@utils/AI/customQuery';\nimport * as translateJSONUtil from '@utils/AI/translateJSON';\nimport { type AppError, ErrorHandler } from '@utils/errors';\nimport {\n type DiscussionFiltersParams,\n getDiscussionFiltersAndPagination,\n} from '@utils/filtersAndPagination/getDiscussionFiltersAndPagination';\nimport {\n formatPaginatedResponse,\n formatResponse,\n type PaginatedResponse,\n type ResponseData,\n} from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport { DiscussionModel } from '@/models/discussion.model';\nimport type { Dictionary } from '@/types/dictionary.types';\nimport type { DiscussionAPI } from '@/types/discussion.types';\nimport type { Tag, TagAPI } from '@/types/tag.types';\n\ntype ReplaceAIConfigByOptions<T> = Omit<T, 'aiConfig'> & {\n aiOptions?: AIOptions;\n};\n\nexport type CustomQueryBody =\n ReplaceAIConfigByOptions<customQueryUtil.CustomQueryOptions> & {\n tagsKeys?: string[];\n applicationContext?: string;\n };\nexport type CustomQueryResult =\n ResponseData<customQueryUtil.CustomQueryResultData>;\n\nexport const customQuery = async (\n req: Request<CustomQueryBody>,\n res: ResponseWithSession<CustomQueryResult>,\n _next: NextFunction\n): Promise<void> => {\n // biome-ignore lint/correctness/noUnusedVariables: Just filter out tagsKeys\n const { aiOptions, tagsKeys, ...rest } = req.body;\n\n let aiConfig: AIConfig;\n try {\n aiConfig = await getAIConfig(res, {\n userOptions: aiOptions,\n defaultOptions: customQueryUtil.aiDefaultOptions,\n accessType: ['registered_user', 'apiKey'],\n });\n } catch (_error) {\n ErrorHandler.handleGenericErrorResponse(res, 'AI_ACCESS_DENIED');\n return;\n }\n\n try {\n const auditResponse = await customQueryUtil.customQuery({\n ...rest,\n aiConfig,\n applicationContext: aiOptions?.applicationContext,\n });\n\n if (!auditResponse) {\n ErrorHandler.handleGenericErrorResponse(res, 'QUERY_FAILED');\n return;\n }\n\n const responseData = formatResponse<customQueryUtil.CustomQueryResultData>({\n data: auditResponse,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type TranslateJSONBody = Omit<\n ReplaceAIConfigByOptions<translateJSONUtil.TranslateJSONOptions>,\n 'tags'\n> & {\n tagsKeys?: string[];\n};\nexport type TranslateJSONResult =\n ResponseData<translateJSONUtil.TranslateJSONResultData>;\n\nexport const translateJSON = async (\n req: Request<TranslateJSONBody>,\n res: ResponseWithSession<TranslateJSONResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project } = res.locals;\n const { aiOptions, tagsKeys, ...rest } = req.body;\n\n let aiConfig: AIConfig;\n try {\n aiConfig = await getAIConfig(res, {\n userOptions: aiOptions,\n defaultOptions: translateJSONUtil.aiDefaultOptions,\n accessType: ['registered_user', 'apiKey'],\n });\n } catch (_error) {\n ErrorHandler.handleGenericErrorResponse(res, 'AI_ACCESS_DENIED');\n return;\n }\n\n try {\n let tags: Tag[] = [];\n\n if (project?.organizationId && tagsKeys) {\n tags = await getTagsByKeys(tagsKeys, project.organizationId);\n }\n\n const auditResponse = await translateJSONUtil.translateJSON({\n ...rest,\n aiConfig,\n applicationContext: aiOptions?.applicationContext,\n tags,\n });\n\n if (!auditResponse) {\n ErrorHandler.handleGenericErrorResponse(res, 'AUDIT_FAILED');\n return;\n }\n\n const responseData =\n formatResponse<translateJSONUtil.TranslateJSONResultData>({\n data: auditResponse,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type AuditContentDeclarationBody = {\n aiOptions?: AIOptions;\n locales: Locale[];\n defaultLocale: Locale;\n fileContent: string;\n filePath?: string;\n tagsKeys?: string[];\n};\nexport type AuditContentDeclarationResult =\n ResponseData<auditContentDeclarationUtil.AuditFileResultData>;\n\n/**\n * Retrieves a list of dictionaries based on filters and pagination.\n */\nexport const auditContentDeclaration = async (\n req: Request<AuditContentDeclarationBody>,\n res: ResponseWithSession<AuditContentDeclarationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project } = res.locals;\n const { fileContent, filePath, aiOptions, locales, defaultLocale, tagsKeys } =\n req.body;\n\n let aiConfig: AIConfig;\n try {\n aiConfig = await getAIConfig(res, {\n userOptions: aiOptions,\n defaultOptions: auditContentDeclarationUtil.aiDefaultOptions,\n accessType: ['registered_user', 'apiKey'],\n });\n } catch (_error) {\n ErrorHandler.handleGenericErrorResponse(res, 'AI_ACCESS_DENIED');\n return;\n }\n\n try {\n let tags: Tag[] = [];\n\n if (project?.organizationId) {\n tags = await getTagsByKeys(tagsKeys, project.organizationId);\n }\n\n const auditResponse = await auditContentDeclarationUtil.auditDictionary({\n fileContent,\n filePath,\n aiConfig,\n applicationContext: aiOptions?.applicationContext,\n locales,\n defaultLocale,\n tags,\n });\n\n if (!auditResponse) {\n ErrorHandler.handleGenericErrorResponse(res, 'AUDIT_FAILED');\n return;\n }\n\n const responseData =\n formatResponse<auditContentDeclarationUtil.AuditFileResultData>({\n data: auditResponse,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type AuditContentDeclarationFieldBody = {\n aiOptions?: AIOptions;\n locales: Locale[];\n fileContent: string;\n filePath?: string;\n tagsKeys?: string[];\n keyPath: KeyPath[];\n};\nexport type AuditContentDeclarationFieldResult =\n ResponseData<auditContentDeclarationFieldUtil.AuditDictionaryFieldResultData>;\n\n/**\n * Retrieves a list of dictionaries based on filters and pagination.\n */\nexport const auditContentDeclarationField = async (\n req: Request<AuditContentDeclarationFieldBody>,\n res: ResponseWithSession<AuditContentDeclarationFieldResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project } = res.locals;\n const { fileContent, aiOptions, locales, tagsKeys, keyPath } = req.body;\n\n let aiConfig: AIConfig;\n try {\n aiConfig = await getAIConfig(res, {\n userOptions: aiOptions,\n defaultOptions: auditContentDeclarationFieldUtil.aiDefaultOptions,\n accessType: ['registered_user', 'apiKey'],\n });\n } catch (_error) {\n ErrorHandler.handleGenericErrorResponse(res, 'AI_ACCESS_DENIED');\n return;\n }\n\n try {\n let tags: Tag[] = [];\n\n if (project?.organizationId) {\n tags = await getTagsByKeys(tagsKeys, project.organizationId);\n }\n\n const auditResponse =\n await auditContentDeclarationFieldUtil.auditDictionaryField({\n fileContent,\n aiConfig,\n applicationContext: aiOptions?.applicationContext,\n locales,\n tags,\n keyPath,\n });\n\n if (!auditResponse) {\n ErrorHandler.handleGenericErrorResponse(res, 'AUDIT_FAILED');\n return;\n }\n\n const responseData =\n formatResponse<auditContentDeclarationFieldUtil.AuditDictionaryFieldResultData>(\n {\n data: auditResponse,\n }\n );\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type AuditContentDeclarationMetadataBody = {\n aiOptions?: AIOptions;\n fileContent: string;\n};\n\nexport type AuditContentDeclarationMetadataResult =\n ResponseData<auditContentDeclarationMetadataUtil.AuditFileResultData>;\n\n/**\n * Retrieves a list of dictionaries based on filters and pagination.\n */\nexport const auditContentDeclarationMetadata = async (\n req: Request<AuditContentDeclarationMetadataBody>,\n res: ResponseWithSession<AuditContentDeclarationMetadataResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization } = res.locals;\n const { fileContent, aiOptions } = req.body;\n\n let aiConfig: AIConfig;\n try {\n aiConfig = await getAIConfig(res, {\n userOptions: aiOptions,\n defaultOptions: auditContentDeclarationMetadataUtil.aiDefaultOptions,\n accessType: ['registered_user', 'apiKey'],\n });\n } catch (_error) {\n ErrorHandler.handleGenericErrorResponse(res, 'AI_ACCESS_DENIED');\n return;\n }\n\n try {\n const tags: Tag[] = await tagService.findTags(\n {\n organizationId: organization?.id,\n },\n 0,\n 1000\n );\n\n const auditResponse =\n await auditContentDeclarationMetadataUtil.auditDictionaryMetadata({\n fileContent,\n aiConfig,\n applicationContext: aiOptions?.applicationContext,\n tags,\n });\n\n if (!auditResponse) {\n ErrorHandler.handleGenericErrorResponse(res, 'AUDIT_FAILED');\n return;\n }\n\n const responseData =\n formatResponse<auditContentDeclarationMetadataUtil.AuditFileResultData>({\n data: auditResponse,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type AuditTagBody = {\n aiOptions?: AIOptions;\n tag: TagAPI;\n};\nexport type AuditTagResult = ResponseData<auditTagUtil.TranslateJSONResultData>;\n\n/**\n * Retrieves a list of dictionaries based on filters and pagination.\n */\nexport const auditTag = async (\n req: Request<undefined, undefined, AuditTagBody>,\n res: ResponseWithSession<AuditTagResult>,\n _next: NextFunction\n): Promise<void> => {\n const { project } = res.locals;\n const { aiOptions, tag } = req.body;\n\n let aiConfig: AIConfig;\n try {\n aiConfig = await getAIConfig(res, {\n userOptions: aiOptions,\n defaultOptions: auditTagUtil.aiDefaultOptions,\n accessType: ['registered_user', 'apiKey'],\n });\n } catch (_error) {\n ErrorHandler.handleGenericErrorResponse(res, 'AI_ACCESS_DENIED');\n return;\n }\n\n try {\n let dictionaries: Dictionary[] = [];\n if (project?.organizationId) {\n dictionaries = await getDictionariesByTags([tag.key], project.id);\n }\n\n const auditResponse = await auditTagUtil.auditTag({\n aiConfig,\n dictionaries,\n tag,\n applicationContext: aiOptions?.applicationContext,\n });\n\n if (!auditResponse) {\n ErrorHandler.handleGenericErrorResponse(res, 'AUDIT_FAILED');\n return;\n }\n\n const responseData = formatResponse<auditTagUtil.TranslateJSONResultData>({\n data: auditResponse,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type AskDocQuestionBody = {\n messages: ChatCompletionRequestMessage[];\n discussionId: string;\n};\nexport type AskDocQuestionResult =\n ResponseData<askDocQuestionUtil.AskDocQuestionResult>;\n\nexport const askDocQuestion = async (\n req: Request<undefined, undefined, AskDocQuestionBody>,\n res: ResponseWithSession<AskDocQuestionResult>,\n _next: NextFunction\n): Promise<void> => {\n const { messages = [], discussionId } = req.body;\n const { user, project, organization } = res.locals;\n\n let aiConfig: AIConfig;\n try {\n aiConfig = await getAIConfig(res, {\n userOptions: {},\n accessType: ['public'],\n });\n } catch (_error) {\n ErrorHandler.handleGenericErrorResponse(res, 'AI_ACCESS_DENIED');\n return;\n }\n\n // 1. Prepare SSE headers and flush them NOW\n res.setHeader('Content-Type', 'text/event-stream; charset=utf-8');\n res.setHeader('Cache-Control', 'no-cache, no-transform');\n res.setHeader('Connection', 'keep-alive');\n res.setHeader('X-Accel-Buffering', 'no'); // disable nginx buffering\n res.flushHeaders?.();\n res.write(': connected\\n\\n'); // initial comment keeps some browsers happy\n res.flush?.();\n\n // 2. Kick off the upstream stream WITHOUT awaiting it\n askDocQuestionUtil\n .askDocQuestion(messages, aiConfig, {\n onMessage: (chunk) => {\n res.write(`data: ${JSON.stringify({ chunk })}\\n\\n`);\n res.flush?.();\n },\n })\n .then(async (fullResponse) => {\n const lastUserMessageContent = messages.findLast(\n (message) => message.role === 'user'\n )?.content;\n const lastUserMessageNbWords = lastUserMessageContent\n ? lastUserMessageContent.split(' ').length\n : 0;\n if (lastUserMessageNbWords > 2) {\n // If the last user message is less than 3 words, don't persist the discussion\n // Example: \"Hello\", \"Hi\", \"Hey\", \"test\", etc.\n\n // 3. Persist discussion while the client already has all chunks\n await DiscussionModel.findOneAndUpdate(\n { discussionId },\n {\n $set: {\n discussionId,\n userId: user?.id,\n projectId: project?.id,\n organizationId: organization?.id,\n messages: [\n ...messages.map((msg) => ({\n role: msg.role,\n content: msg.content,\n timestamp: msg.timestamp,\n })),\n {\n role: 'assistant',\n content: fullResponse.response,\n relatedFiles: fullResponse.relatedFiles,\n timestamp: new Date(),\n },\n ],\n },\n },\n { upsert: true, new: true }\n );\n }\n\n // 4. Tell the client we're done and close the stream\n res.write(\n `data: ${JSON.stringify({ done: true, response: fullResponse })}\\n\\n`\n );\n res.end();\n })\n .catch((err) => {\n // propagate error as an SSE event so the client knows why it closed\n res.write(\n `event: error\\ndata: ${JSON.stringify({ message: err.message })}\\n\\n`\n );\n res.end();\n });\n};\n\nexport type AutocompleteBody = {\n text: string;\n aiOptions?: AIOptions;\n contextBefore?: string;\n currentLine?: string;\n contextAfter?: string;\n};\n\nexport type AutocompleteResponse = ResponseData<{\n autocompletion: string;\n}>;\n\nexport const autocomplete = async (\n req: Request<AutocompleteBody>,\n res: ResponseWithSession<AutocompleteResponse>,\n _next: NextFunction\n): Promise<void> => {\n try {\n const { text, aiOptions, contextBefore, currentLine, contextAfter } =\n req.body;\n\n let aiConfig: AIConfig;\n try {\n aiConfig = await getAIConfig(res, {\n userOptions: aiOptions,\n defaultOptions: autocompleteUtil.aiDefaultOptions,\n accessType: ['public'],\n });\n } catch (_error) {\n ErrorHandler.handleGenericErrorResponse(res, 'AI_ACCESS_DENIED');\n return;\n }\n\n const response = (await autocompleteUtil.autocomplete({\n text,\n aiConfig,\n applicationContext: aiOptions?.applicationContext,\n contextBefore,\n currentLine,\n contextAfter,\n })) ?? {\n autocompletion: '',\n tokenUsed: 0,\n };\n\n const responseData =\n formatResponse<autocompleteUtil.AutocompleteFileResultData>({\n data: response,\n });\n\n res.json(responseData);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type GetDiscussionsParams =\n | ({\n page?: string | number;\n pageSize?: string | number;\n includeMessages?: 'true' | 'false';\n } & DiscussionFiltersParams)\n | undefined;\n\nexport type GetDiscussionsResult = PaginatedResponse<DiscussionAPI>;\n\n/**\n * Retrieves a list of discussions with filters and pagination.\n * Only the owner or admins can access. By default, users only see their own.\n */\nexport const getDiscussions = async (\n req: Request<GetDiscussionsParams>,\n res: ResponseWithSession<GetDiscussionsResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, roles } = res.locals;\n const { filters, sortOptions, pageSize, skip, page, getNumberOfPages } =\n getDiscussionFiltersAndPagination(req, res);\n const includeMessagesParam = (req.query as any)?.includeMessages as\n | 'true'\n | 'false'\n | undefined;\n const includeMessages = includeMessagesParam !== 'false';\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n try {\n const projection = includeMessages ? {} : { messages: 0 };\n const discussions = await DiscussionModel.find(filters, projection)\n .sort(sortOptions)\n .skip(skip)\n .limit(pageSize)\n .lean();\n\n // Compute number of messages for each discussion\n const numberOfMessagesById: Record<string, number> = {};\n if (!includeMessages && discussions.length > 0) {\n const ids = discussions.map((d: any) => d._id);\n const counts = await DiscussionModel.aggregate([\n { $match: { _id: { $in: ids } } },\n {\n $project: {\n numberOfMessages: { $size: { $ifNull: ['$messages', []] } },\n },\n },\n ]);\n for (const c of counts as any[]) {\n numberOfMessagesById[String(c._id)] = c.numberOfMessages ?? 0;\n }\n }\n\n // Permission: allow admin, or the owner for all returned entries\n const allOwnedByUser = discussions.every(\n (d) => String(d.userId) === String(user.id)\n );\n const isAllowed = roles.includes('admin') || allOwnedByUser;\n\n if (!isAllowed) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n const totalItems = await DiscussionModel.countDocuments(filters);\n\n const responseData = formatPaginatedResponse({\n data: discussions.map((d: any) => ({\n ...d,\n id: String(d._id ?? d.id),\n numberOfMessages: includeMessages\n ? Array.isArray(d.messages)\n ? d.messages.length\n : 0\n : (numberOfMessagesById[String(d._id ?? d.id)] ?? 0),\n })),\n page,\n pageSize,\n totalPages: getNumberOfPages(totalItems),\n totalItems,\n });\n\n res.json(responseData as any);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":"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"}