@intlayer/backend 8.10.0-canary.1 → 8.10.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 (186) hide show
  1. package/dist/assets/utils/AI/askDocQuestion/embeddings/docs/en/dictionary/markdown.json +12966 -1
  2. package/dist/assets/utils/AI/askDocQuestion/embeddings/docs/en/interest_of_intlayer.json +1 -14957
  3. package/dist/esm/controllers/ai.controller.mjs +10 -9
  4. package/dist/esm/controllers/ai.controller.mjs.map +1 -1
  5. package/dist/esm/controllers/audit.controller.mjs +1 -1
  6. package/dist/esm/controllers/audit.controller.mjs.map +1 -1
  7. package/dist/esm/controllers/organization.controller.mjs +17 -5
  8. package/dist/esm/controllers/organization.controller.mjs.map +1 -1
  9. package/dist/esm/controllers/project.controller.mjs +12 -5
  10. package/dist/esm/controllers/project.controller.mjs.map +1 -1
  11. package/dist/esm/controllers/showcaseProject.controller.mjs +0 -2
  12. package/dist/esm/controllers/showcaseProject.controller.mjs.map +1 -1
  13. package/dist/esm/controllers/translation.controller.mjs +0 -1
  14. package/dist/esm/controllers/translation.controller.mjs.map +1 -1
  15. package/dist/esm/controllers/user.controller.mjs +0 -6
  16. package/dist/esm/controllers/user.controller.mjs.map +1 -1
  17. package/dist/esm/schemas/account.schema.mjs +3 -2
  18. package/dist/esm/schemas/account.schema.mjs.map +1 -1
  19. package/dist/esm/{models/audit.model.mjs → schemas/audit.schema.mjs} +3 -3
  20. package/dist/esm/schemas/audit.schema.mjs.map +1 -0
  21. package/dist/esm/{models/auditJob.model.mjs → schemas/auditJob.schema.mjs} +3 -3
  22. package/dist/esm/schemas/auditJob.schema.mjs.map +1 -0
  23. package/dist/esm/{models/auditPage.model.mjs → schemas/auditPage.schema.mjs} +3 -3
  24. package/dist/esm/schemas/auditPage.schema.mjs.map +1 -0
  25. package/dist/esm/schemas/cliSessionToken.schema.mjs +3 -2
  26. package/dist/esm/schemas/cliSessionToken.schema.mjs.map +1 -1
  27. package/dist/esm/schemas/dictionary.schema.mjs +3 -2
  28. package/dist/esm/schemas/dictionary.schema.mjs.map +1 -1
  29. package/dist/esm/schemas/discussion.schema.mjs +3 -2
  30. package/dist/esm/schemas/discussion.schema.mjs.map +1 -1
  31. package/dist/esm/schemas/oAuth2.schema.mjs +3 -2
  32. package/dist/esm/schemas/oAuth2.schema.mjs.map +1 -1
  33. package/dist/esm/schemas/organization.schema.mjs +3 -2
  34. package/dist/esm/schemas/organization.schema.mjs.map +1 -1
  35. package/dist/esm/schemas/project.schema.mjs +3 -2
  36. package/dist/esm/schemas/project.schema.mjs.map +1 -1
  37. package/dist/esm/schemas/session.schema.mjs +3 -2
  38. package/dist/esm/schemas/session.schema.mjs.map +1 -1
  39. package/dist/esm/schemas/showcaseProject.schema.mjs +3 -2
  40. package/dist/esm/schemas/showcaseProject.schema.mjs.map +1 -1
  41. package/dist/esm/schemas/tag.schema.mjs +3 -2
  42. package/dist/esm/schemas/tag.schema.mjs.map +1 -1
  43. package/dist/esm/schemas/user.schema.mjs +11 -2
  44. package/dist/esm/schemas/user.schema.mjs.map +1 -1
  45. package/dist/esm/services/audit/recursiveAudit.service.mjs +2 -2
  46. package/dist/esm/services/audit/recursiveAudit.service.mjs.map +1 -1
  47. package/dist/esm/services/bitbucket.service.mjs +1 -1
  48. package/dist/esm/services/bitbucket.service.mjs.map +1 -1
  49. package/dist/esm/services/cliSessionToken.service.mjs +1 -1
  50. package/dist/esm/services/cliSessionToken.service.mjs.map +1 -1
  51. package/dist/esm/services/dictionary.service.mjs +1 -1
  52. package/dist/esm/services/dictionary.service.mjs.map +1 -1
  53. package/dist/esm/services/github.service.mjs +1 -1
  54. package/dist/esm/services/github.service.mjs.map +1 -1
  55. package/dist/esm/services/gitlab.service.mjs +1 -1
  56. package/dist/esm/services/gitlab.service.mjs.map +1 -1
  57. package/dist/esm/services/oAuth2.service.mjs +2 -2
  58. package/dist/esm/services/oAuth2.service.mjs.map +1 -1
  59. package/dist/esm/services/organization.service.mjs +1 -1
  60. package/dist/esm/services/organization.service.mjs.map +1 -1
  61. package/dist/esm/services/project.service.mjs +1 -1
  62. package/dist/esm/services/project.service.mjs.map +1 -1
  63. package/dist/esm/services/projectAccessKey.service.mjs +1 -1
  64. package/dist/esm/services/projectAccessKey.service.mjs.map +1 -1
  65. package/dist/esm/services/showcase/showcaseProject.service.mjs +1 -1
  66. package/dist/esm/services/showcase/showcaseProject.service.mjs.map +1 -1
  67. package/dist/esm/services/tag.service.mjs +1 -1
  68. package/dist/esm/services/tag.service.mjs.map +1 -1
  69. package/dist/esm/services/user.service.mjs +1 -1
  70. package/dist/esm/services/user.service.mjs.map +1 -1
  71. package/dist/esm/types/user.types.mjs.map +1 -1
  72. package/dist/esm/utils/AI/askDocQuestion/embeddings/docs/en/dictionary/markdown.json +12966 -1
  73. package/dist/esm/utils/AI/askDocQuestion/embeddings/docs/en/interest_of_intlayer.json +1 -14957
  74. package/dist/esm/utils/AI/auditDictionaryField/index.mjs +9 -0
  75. package/dist/esm/utils/AI/auditDictionaryField/index.mjs.map +1 -1
  76. package/dist/esm/utils/AI/getProjectAIOptions.mjs +20 -0
  77. package/dist/esm/utils/AI/getProjectAIOptions.mjs.map +1 -0
  78. package/dist/esm/utils/auth/getAuth.mjs +34 -8
  79. package/dist/esm/utils/auth/getAuth.mjs.map +1 -1
  80. package/dist/esm/utils/errors/ErrorHandler.mjs +40 -8
  81. package/dist/esm/utils/errors/ErrorHandler.mjs.map +1 -1
  82. package/dist/esm/utils/mapper/project.mjs +7 -1
  83. package/dist/esm/utils/mapper/project.mjs.map +1 -1
  84. package/dist/esm/utils/mongoDB/connectDB.mjs +12 -12
  85. package/dist/esm/utils/mongoDB/connectDB.mjs.map +1 -1
  86. package/dist/types/controllers/ai.controller.d.ts.map +1 -1
  87. package/dist/types/controllers/organization.controller.d.ts.map +1 -1
  88. package/dist/types/controllers/project.controller.d.ts.map +1 -1
  89. package/dist/types/controllers/showcaseProject.controller.d.ts.map +1 -1
  90. package/dist/types/controllers/translation.controller.d.ts.map +1 -1
  91. package/dist/types/controllers/user.controller.d.ts.map +1 -1
  92. package/dist/types/schemas/account.schema.d.ts +3 -2
  93. package/dist/types/schemas/account.schema.d.ts.map +1 -1
  94. package/dist/types/schemas/audit.schema.d.ts +64 -0
  95. package/dist/types/schemas/audit.schema.d.ts.map +1 -0
  96. package/dist/types/schemas/auditJob.schema.d.ts +122 -0
  97. package/dist/types/schemas/auditJob.schema.d.ts.map +1 -0
  98. package/dist/types/schemas/auditPage.schema.d.ts +120 -0
  99. package/dist/types/schemas/auditPage.schema.d.ts.map +1 -0
  100. package/dist/types/schemas/cliSessionToken.schema.d.ts +10 -3
  101. package/dist/types/schemas/cliSessionToken.schema.d.ts.map +1 -1
  102. package/dist/types/schemas/dictionary.schema.d.ts +21 -12
  103. package/dist/types/schemas/dictionary.schema.d.ts.map +1 -1
  104. package/dist/types/schemas/discussion.schema.d.ts +16 -11
  105. package/dist/types/schemas/discussion.schema.d.ts.map +1 -1
  106. package/dist/types/schemas/oAuth2.schema.d.ts +13 -3
  107. package/dist/types/schemas/oAuth2.schema.d.ts.map +1 -1
  108. package/dist/types/schemas/organization.schema.d.ts +8 -7
  109. package/dist/types/schemas/organization.schema.d.ts.map +1 -1
  110. package/dist/types/schemas/plans.schema.d.ts +8 -8
  111. package/dist/types/schemas/project.schema.d.ts +11 -10
  112. package/dist/types/schemas/project.schema.d.ts.map +1 -1
  113. package/dist/types/schemas/session.schema.d.ts +11 -10
  114. package/dist/types/schemas/session.schema.d.ts.map +1 -1
  115. package/dist/types/schemas/showcaseProject.schema.d.ts +18 -17
  116. package/dist/types/schemas/showcaseProject.schema.d.ts.map +1 -1
  117. package/dist/types/schemas/tag.schema.d.ts +10 -9
  118. package/dist/types/schemas/tag.schema.d.ts.map +1 -1
  119. package/dist/types/schemas/user.schema.d.ts +32 -9
  120. package/dist/types/schemas/user.schema.d.ts.map +1 -1
  121. package/dist/types/services/audit/recursiveAudit.service.d.ts +2 -2
  122. package/dist/types/types/project.types.d.ts +2 -1
  123. package/dist/types/types/project.types.d.ts.map +1 -1
  124. package/dist/types/types/user.types.d.ts +2 -0
  125. package/dist/types/types/user.types.d.ts.map +1 -1
  126. package/dist/types/utils/AI/getProjectAIOptions.d.ts +15 -0
  127. package/dist/types/utils/AI/getProjectAIOptions.d.ts.map +1 -0
  128. package/dist/types/utils/auth/getAuth.d.ts.map +1 -1
  129. package/dist/types/utils/errors/ErrorHandler.d.ts +10 -6
  130. package/dist/types/utils/errors/ErrorHandler.d.ts.map +1 -1
  131. package/dist/types/utils/filtersAndPagination/getTagFiltersAndPagination.d.ts +3 -3
  132. package/dist/types/utils/mapper/project.d.ts.map +1 -1
  133. package/package.json +10 -10
  134. package/dist/esm/models/account.model.mjs +0 -9
  135. package/dist/esm/models/account.model.mjs.map +0 -1
  136. package/dist/esm/models/audit.model.mjs.map +0 -1
  137. package/dist/esm/models/auditJob.model.mjs.map +0 -1
  138. package/dist/esm/models/auditPage.model.mjs.map +0 -1
  139. package/dist/esm/models/cliSessionToken.model.mjs +0 -9
  140. package/dist/esm/models/cliSessionToken.model.mjs.map +0 -1
  141. package/dist/esm/models/dictionary.model.mjs +0 -9
  142. package/dist/esm/models/dictionary.model.mjs.map +0 -1
  143. package/dist/esm/models/discussion.model.mjs +0 -9
  144. package/dist/esm/models/discussion.model.mjs.map +0 -1
  145. package/dist/esm/models/oAuth2.model.mjs +0 -9
  146. package/dist/esm/models/oAuth2.model.mjs.map +0 -1
  147. package/dist/esm/models/organization.model.mjs +0 -9
  148. package/dist/esm/models/organization.model.mjs.map +0 -1
  149. package/dist/esm/models/project.model.mjs +0 -9
  150. package/dist/esm/models/project.model.mjs.map +0 -1
  151. package/dist/esm/models/session.model.mjs +0 -9
  152. package/dist/esm/models/session.model.mjs.map +0 -1
  153. package/dist/esm/models/showcaseProject.model.mjs +0 -9
  154. package/dist/esm/models/showcaseProject.model.mjs.map +0 -1
  155. package/dist/esm/models/tag.model.mjs +0 -9
  156. package/dist/esm/models/tag.model.mjs.map +0 -1
  157. package/dist/esm/models/user.model.mjs +0 -9
  158. package/dist/esm/models/user.model.mjs.map +0 -1
  159. package/dist/types/models/account.model.d.ts +0 -7
  160. package/dist/types/models/account.model.d.ts.map +0 -1
  161. package/dist/types/models/audit.model.d.ts +0 -18
  162. package/dist/types/models/audit.model.d.ts.map +0 -1
  163. package/dist/types/models/auditJob.model.d.ts +0 -31
  164. package/dist/types/models/auditJob.model.d.ts.map +0 -1
  165. package/dist/types/models/auditPage.model.d.ts +0 -29
  166. package/dist/types/models/auditPage.model.d.ts.map +0 -1
  167. package/dist/types/models/cliSessionToken.model.d.ts +0 -14
  168. package/dist/types/models/cliSessionToken.model.d.ts.map +0 -1
  169. package/dist/types/models/dictionary.model.d.ts +0 -16
  170. package/dist/types/models/dictionary.model.d.ts.map +0 -1
  171. package/dist/types/models/discussion.model.d.ts +0 -12
  172. package/dist/types/models/discussion.model.d.ts.map +0 -1
  173. package/dist/types/models/oAuth2.model.d.ts +0 -18
  174. package/dist/types/models/oAuth2.model.d.ts.map +0 -1
  175. package/dist/types/models/organization.model.d.ts +0 -7
  176. package/dist/types/models/organization.model.d.ts.map +0 -1
  177. package/dist/types/models/project.model.d.ts +0 -7
  178. package/dist/types/models/project.model.d.ts.map +0 -1
  179. package/dist/types/models/session.model.d.ts +0 -7
  180. package/dist/types/models/session.model.d.ts.map +0 -1
  181. package/dist/types/models/showcaseProject.model.d.ts +0 -7
  182. package/dist/types/models/showcaseProject.model.d.ts.map +0 -1
  183. package/dist/types/models/tag.model.d.ts +0 -7
  184. package/dist/types/models/tag.model.d.ts.map +0 -1
  185. package/dist/types/models/user.model.d.ts +0 -7
  186. package/dist/types/models/user.model.d.ts.map +0 -1
@@ -37,6 +37,15 @@ ${tags.map(({ key, description }) => `- ${key}: ${description}`).join("\n\n")}`;
37
37
  */
38
38
  const auditDictionaryField = async ({ fileContent, applicationContext, locales, keyPath, tags, aiConfig }) => {
39
39
  const prompt = CHAT_GPT_PROMPT.replace("{{otherLocales}}", `{${locales.map(formatLocaleWithName).join(", ")}}`).replace("{{keyPath}}", JSON.stringify(keyPath)).replace("{{applicationContext}}", applicationContext ?? "").replace("{{tagsInstructions}}", formatTagInstructions(tags));
40
+ console.log({
41
+ prompt,
42
+ fileContent,
43
+ applicationContext,
44
+ locales,
45
+ keyPath,
46
+ tags,
47
+ aiConfig
48
+ });
40
49
  if (!aiConfig) {
41
50
  logger.error("Failed to configure AI model");
42
51
  return;
@@ -1 +1 @@
1
- {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/utils/AI/auditDictionaryField/index.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { AIConfig, AIOptions } from '@intlayer/ai';\nimport { generateText } from '@intlayer/ai';\nimport { getLocaleName } from '@intlayer/core/localization';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport * as Locales from '@intlayer/types/locales';\nimport { logger } from '@logger';\nimport type { Tag } from '@/types/tag.types';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport type AuditDictionaryFieldOptions = {\n fileContent: string;\n locales: Locale[];\n keyPath: KeyPath[];\n tags: Tag[];\n aiConfig: AIConfig;\n applicationContext?: string;\n};\n\nexport type AuditDictionaryFieldResultData = {\n fileContent: string;\n tokenUsed: number;\n};\n\n// The prompt template to send to the AI model\nconst CHAT_GPT_PROMPT = readFileSync(join(__dirname, './PROMPT.md'), 'utf-8');\n\nexport const aiDefaultOptions: AIOptions = {\n // Keep default options\n};\n\n/**\n * Format a locale with its name.\n *\n * @param locale - The locale to format.\n * @returns A string in the format \"locale: name\", e.g. \"en: English\".\n */\nconst formatLocaleWithName = (locale: Locale): string => {\n return `${locale}: ${getLocaleName(locale, Locales.ENGLISH)}`;\n};\n\n/**\n * Formats tag instructions for the AI prompt.\n *\n * @param tags - Array of tags to format\n * @returns A formatted string with tag instructions\n */\nconst formatTagInstructions = (tags: Tag[]): string => {\n if (!tags || tags.length === 0) {\n return '';\n }\n\n return `Based on the dictionary content, identify specific tags from the list below that would be relevant:\n \n${tags.map(({ key, description }) => `- ${key}: ${description}`).join('\\n\\n')}`;\n};\n\n/**\n * Audits a content declaration file by constructing a prompt for AI models.\n * The prompt includes details about the project's locales, file paths of content declarations,\n * and requests for identifying issues or inconsistencies.\n */\nexport const auditDictionaryField = async ({\n fileContent,\n applicationContext,\n locales,\n keyPath,\n tags,\n aiConfig,\n}: AuditDictionaryFieldOptions): Promise<\n AuditDictionaryFieldResultData | undefined\n> => {\n // Prepare the prompt for AI by replacing placeholders with actual values.\n const prompt = CHAT_GPT_PROMPT.replace(\n '{{otherLocales}}',\n `{${locales.map(formatLocaleWithName).join(', ')}}`\n )\n .replace('{{keyPath}}', JSON.stringify(keyPath))\n .replace('{{applicationContext}}', applicationContext ?? '')\n .replace('{{tagsInstructions}}', formatTagInstructions(tags));\n\n if (!aiConfig) {\n logger.error('Failed to configure AI model');\n return undefined;\n }\n\n // Use the AI SDK to generate the completion\n const { text: newContent, usage } = await generateText({\n ...aiConfig,\n system: prompt,\n messages: [\n {\n role: 'user',\n content: ['**File to Audit:**', fileContent].join('\\n'),\n },\n ],\n });\n\n logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);\n\n return {\n fileContent: newContent,\n tokenUsed: usage?.totalTokens ?? 0,\n };\n};\n"],"mappings":";;;;;;;;;AA8BA,MAAM,kBAAkB,aAAa,KAjBnB,QADC,cAAc,OAAO,KAAK,GACV,CAiBe,GAAG,aAAa,GAAG,OAAO;AAE5E,MAAa,mBAA8B,CAE3C;;;;;;;AAQA,MAAM,wBAAwB,WAA2B;CACvD,OAAO,GAAG,OAAO,IAAI,cAAc,QAAQ,QAAQ,OAAO;AAC5D;;;;;;;AAQA,MAAM,yBAAyB,SAAwB;CACrD,IAAI,CAAC,QAAQ,KAAK,WAAW,GAC3B,OAAO;CAGT,OAAO;;EAEP,KAAK,KAAK,EAAE,KAAK,kBAAkB,KAAK,IAAI,IAAI,aAAa,EAAE,KAAK,MAAM;AAC5E;;;;;;AAOA,MAAa,uBAAuB,OAAO,EACzC,aACA,oBACA,SACA,SACA,MACA,eAGG;CAEH,MAAM,SAAS,gBAAgB,QAC7B,oBACA,IAAI,QAAQ,IAAI,oBAAoB,EAAE,KAAK,IAAI,EAAE,EACnD,EACG,QAAQ,eAAe,KAAK,UAAU,OAAO,CAAC,EAC9C,QAAQ,0BAA0B,sBAAsB,EAAE,EAC1D,QAAQ,wBAAwB,sBAAsB,IAAI,CAAC;CAE9D,IAAI,CAAC,UAAU;EACb,OAAO,MAAM,8BAA8B;EAC3C;CACF;CAGA,MAAM,EAAE,MAAM,YAAY,UAAU,MAAM,aAAa;EACrD,GAAG;EACH,QAAQ;EACR,UAAU,CACR;GACE,MAAM;GACN,SAAS,CAAC,sBAAsB,WAAW,EAAE,KAAK,IAAI;EACxD,CACF;CACF,CAAC;CAED,OAAO,KAAK,GAAG,OAAO,eAAe,EAAE,4BAA4B;CAEnE,OAAO;EACL,aAAa;EACb,WAAW,OAAO,eAAe;CACnC;AACF"}
1
+ {"version":3,"file":"index.mjs","names":[],"sources":["../../../../../src/utils/AI/auditDictionaryField/index.ts"],"sourcesContent":["import { readFileSync } from 'node:fs';\nimport { dirname, join } from 'node:path';\nimport { fileURLToPath } from 'node:url';\nimport type { AIConfig, AIOptions } from '@intlayer/ai';\nimport { generateText } from '@intlayer/ai';\nimport { getLocaleName } from '@intlayer/core/localization';\nimport type { Locale } from '@intlayer/types/allLocales';\nimport type { KeyPath } from '@intlayer/types/keyPath';\nimport * as Locales from '@intlayer/types/locales';\nimport { logger } from '@logger';\nimport type { Tag } from '@/types/tag.types';\n\nconst __filename = fileURLToPath(import.meta.url);\nconst __dirname = dirname(__filename);\n\nexport type AuditDictionaryFieldOptions = {\n fileContent: string;\n locales: Locale[];\n keyPath: KeyPath[];\n tags: Tag[];\n aiConfig: AIConfig;\n applicationContext?: string;\n};\n\nexport type AuditDictionaryFieldResultData = {\n fileContent: string;\n tokenUsed: number;\n};\n\n// The prompt template to send to the AI model\nconst CHAT_GPT_PROMPT = readFileSync(join(__dirname, './PROMPT.md'), 'utf-8');\n\nexport const aiDefaultOptions: AIOptions = {\n // Keep default options\n};\n\n/**\n * Format a locale with its name.\n *\n * @param locale - The locale to format.\n * @returns A string in the format \"locale: name\", e.g. \"en: English\".\n */\nconst formatLocaleWithName = (locale: Locale): string => {\n return `${locale}: ${getLocaleName(locale, Locales.ENGLISH)}`;\n};\n\n/**\n * Formats tag instructions for the AI prompt.\n *\n * @param tags - Array of tags to format\n * @returns A formatted string with tag instructions\n */\nconst formatTagInstructions = (tags: Tag[]): string => {\n if (!tags || tags.length === 0) {\n return '';\n }\n\n return `Based on the dictionary content, identify specific tags from the list below that would be relevant:\n \n${tags.map(({ key, description }) => `- ${key}: ${description}`).join('\\n\\n')}`;\n};\n\n/**\n * Audits a content declaration file by constructing a prompt for AI models.\n * The prompt includes details about the project's locales, file paths of content declarations,\n * and requests for identifying issues or inconsistencies.\n */\nexport const auditDictionaryField = async ({\n fileContent,\n applicationContext,\n locales,\n keyPath,\n tags,\n aiConfig,\n}: AuditDictionaryFieldOptions): Promise<\n AuditDictionaryFieldResultData | undefined\n> => {\n // Prepare the prompt for AI by replacing placeholders with actual values.\n const prompt = CHAT_GPT_PROMPT.replace(\n '{{otherLocales}}',\n `{${locales.map(formatLocaleWithName).join(', ')}}`\n )\n .replace('{{keyPath}}', JSON.stringify(keyPath))\n .replace('{{applicationContext}}', applicationContext ?? '')\n .replace('{{tagsInstructions}}', formatTagInstructions(tags));\n\n console.log({\n prompt,\n fileContent,\n applicationContext,\n locales,\n keyPath,\n tags,\n aiConfig,\n });\n\n if (!aiConfig) {\n logger.error('Failed to configure AI model');\n return undefined;\n }\n\n // Use the AI SDK to generate the completion\n const { text: newContent, usage } = await generateText({\n ...aiConfig,\n system: prompt,\n messages: [\n {\n role: 'user',\n content: ['**File to Audit:**', fileContent].join('\\n'),\n },\n ],\n });\n\n logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);\n\n return {\n fileContent: newContent,\n tokenUsed: usage?.totalTokens ?? 0,\n };\n};\n"],"mappings":";;;;;;;;;AA8BA,MAAM,kBAAkB,aAAa,KAjBnB,QADC,cAAc,OAAO,KAAK,GACV,CAiBe,GAAG,aAAa,GAAG,OAAO;AAE5E,MAAa,mBAA8B,CAE3C;;;;;;;AAQA,MAAM,wBAAwB,WAA2B;CACvD,OAAO,GAAG,OAAO,IAAI,cAAc,QAAQ,QAAQ,OAAO;AAC5D;;;;;;;AAQA,MAAM,yBAAyB,SAAwB;CACrD,IAAI,CAAC,QAAQ,KAAK,WAAW,GAC3B,OAAO;CAGT,OAAO;;EAEP,KAAK,KAAK,EAAE,KAAK,kBAAkB,KAAK,IAAI,IAAI,aAAa,EAAE,KAAK,MAAM;AAC5E;;;;;;AAOA,MAAa,uBAAuB,OAAO,EACzC,aACA,oBACA,SACA,SACA,MACA,eAGG;CAEH,MAAM,SAAS,gBAAgB,QAC7B,oBACA,IAAI,QAAQ,IAAI,oBAAoB,EAAE,KAAK,IAAI,EAAE,EACnD,EACG,QAAQ,eAAe,KAAK,UAAU,OAAO,CAAC,EAC9C,QAAQ,0BAA0B,sBAAsB,EAAE,EAC1D,QAAQ,wBAAwB,sBAAsB,IAAI,CAAC;CAE9D,QAAQ,IAAI;EACV;EACA;EACA;EACA;EACA;EACA;EACA;CACF,CAAC;CAED,IAAI,CAAC,UAAU;EACb,OAAO,MAAM,8BAA8B;EAC3C;CACF;CAGA,MAAM,EAAE,MAAM,YAAY,UAAU,MAAM,aAAa;EACrD,GAAG;EACH,QAAQ;EACR,UAAU,CACR;GACE,MAAM;GACN,SAAS,CAAC,sBAAsB,WAAW,EAAE,KAAK,IAAI;EACxD,CACF;CACF,CAAC;CAED,OAAO,KAAK,GAAG,OAAO,eAAe,EAAE,4BAA4B;CAEnE,OAAO;EACL,aAAa;EACb,WAAW,OAAO,eAAe;CACnC;AACF"}
@@ -0,0 +1,20 @@
1
+ import { getProjectById } from "../../services/project.service.mjs";
2
+
3
+ //#region src/utils/AI/getProjectAIOptions.ts
4
+ /**
5
+ * Returns the project's AI options with the real (unmasked) API key.
6
+ *
7
+ * The session project has its API key masked for security. This function
8
+ * detects a masked key and re-fetches the project from the DB to recover
9
+ * the real key for use in server-side AI calls.
10
+ */
11
+ const getProjectAIOptions = async (project) => {
12
+ if (!project?.configuration?.ai) return void 0;
13
+ const sessionOptions = project.configuration.ai;
14
+ if (!sessionOptions.apiKey?.includes("*")) return sessionOptions;
15
+ return (await getProjectById(String(project.id)))?.configuration?.ai ?? sessionOptions;
16
+ };
17
+
18
+ //#endregion
19
+ export { getProjectAIOptions };
20
+ //# sourceMappingURL=getProjectAIOptions.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"getProjectAIOptions.mjs","names":[],"sources":["../../../../src/utils/AI/getProjectAIOptions.ts"],"sourcesContent":["import type { AIOptions } from '@intlayer/ai';\nimport { getProjectById } from '@services/project.service';\nimport type { Project, ProjectAPI } from '@/types/project.types';\n\n/**\n * Returns the project's AI options with the real (unmasked) API key.\n *\n * The session project has its API key masked for security. This function\n * detects a masked key and re-fetches the project from the DB to recover\n * the real key for use in server-side AI calls.\n */\nexport const getProjectAIOptions = async (\n project: Project | ProjectAPI | null | undefined\n): Promise<AIOptions | undefined> => {\n if (!project?.configuration?.ai) return undefined;\n\n const sessionOptions = project.configuration.ai as AIOptions;\n\n if (!sessionOptions.apiKey?.includes('*')) {\n return sessionOptions;\n }\n\n const realProject = await getProjectById(String(project.id));\n return (\n (realProject?.configuration?.ai as AIOptions | undefined) ?? sessionOptions\n );\n};\n"],"mappings":";;;;;;;;;;AAWA,MAAa,sBAAsB,OACjC,YACmC;CACnC,IAAI,CAAC,SAAS,eAAe,IAAI,OAAO;CAExC,MAAM,iBAAiB,QAAQ,cAAc;CAE7C,IAAI,CAAC,eAAe,QAAQ,SAAS,GAAG,GACtC,OAAO;CAIT,QACG,MAFuB,eAAe,OAAO,QAAQ,EAAE,CAAC,IAE3C,eAAe,MAAgC;AAEjE"}
@@ -9,6 +9,7 @@ import { mapOrganizationToAPI } from "../mapper/organization.mjs";
9
9
  import { mapProjectToAPI } from "../mapper/project.mjs";
10
10
  import { sendVerificationUpdate } from "../../controllers/user.controller.mjs";
11
11
  import { mapSessionToAPI } from "../mapper/session.mjs";
12
+ import { Types } from "mongoose";
12
13
  import { passkey } from "@better-auth/passkey";
13
14
  import { sso } from "@better-auth/sso";
14
15
  import { betterAuth } from "better-auth";
@@ -120,13 +121,29 @@ const getAuth = (dbClient) => {
120
121
  customSession(async ({ session }) => {
121
122
  const typedSession = session;
122
123
  const normalizeId = (id) => typeof id === "string" ? id : id?.buffer instanceof Uint8Array ? Buffer.from(id.buffer).toString("hex") : null;
123
- const orgIdStr = typedSession.activeOrganizationId ? normalizeId(typedSession.activeOrganizationId) : null;
124
- const projectIdStr = typedSession.activeProjectId ? normalizeId(typedSession.activeProjectId) : null;
125
- const [userData, orgData, projectData] = await Promise.all([
126
- typedSession.userId ? getUserById(typedSession.userId) : null,
127
- orgIdStr ? getOrganizationById(orgIdStr) : null,
128
- projectIdStr ? getProjectById(projectIdStr) : null
129
- ]);
124
+ let orgIdStr = typedSession.activeOrganizationId ? normalizeId(typedSession.activeOrganizationId) : null;
125
+ let projectIdStr = typedSession.activeProjectId ? normalizeId(typedSession.activeProjectId) : null;
126
+ const userData = typedSession.userId ? await getUserById(typedSession.userId) : null;
127
+ let isSessionUpdated = false;
128
+ if (userData) {
129
+ if (!orgIdStr && userData.lastActiveOrganizationId) {
130
+ orgIdStr = userData.lastActiveOrganizationId;
131
+ isSessionUpdated = true;
132
+ }
133
+ if (!projectIdStr && userData.lastActiveProjectId) {
134
+ projectIdStr = userData.lastActiveProjectId;
135
+ isSessionUpdated = true;
136
+ }
137
+ if (isSessionUpdated) {
138
+ await dbClient.db().collection("sessions").updateOne({ id: typedSession.id }, { $set: {
139
+ activeOrganizationId: orgIdStr,
140
+ activeProjectId: projectIdStr
141
+ } });
142
+ typedSession.activeOrganizationId = orgIdStr ?? void 0;
143
+ typedSession.activeProjectId = projectIdStr ?? void 0;
144
+ }
145
+ }
146
+ const [orgData, projectData] = await Promise.all([orgIdStr ? getOrganizationById(orgIdStr) : null, projectIdStr ? getProjectById(projectIdStr) : null]);
130
147
  const userAPI = userData ? mapUserToAPI(userData) : null;
131
148
  let organizationAPI = orgData ? mapOrganizationToAPI(orgData) : null;
132
149
  let projectAPI = projectData ? mapProjectToAPI(projectData) : null;
@@ -134,19 +151,28 @@ const getAuth = (dbClient) => {
134
151
  const shouldClearProject = typedSession.activeProjectId && !projectData;
135
152
  if (shouldClearOrg || shouldClearProject) {
136
153
  const updateDoc = {};
154
+ const userUpdateDoc = {};
137
155
  if (shouldClearOrg) {
138
156
  updateDoc.activeOrganizationId = null;
139
157
  updateDoc.activeProjectId = null;
158
+ userUpdateDoc.lastActiveOrganizationId = null;
159
+ userUpdateDoc.lastActiveProjectId = null;
140
160
  typedSession.activeOrganizationId = void 0;
141
161
  typedSession.activeProjectId = void 0;
142
162
  organizationAPI = null;
143
163
  projectAPI = null;
144
164
  } else if (shouldClearProject) {
145
165
  updateDoc.activeProjectId = null;
166
+ userUpdateDoc.lastActiveProjectId = null;
146
167
  typedSession.activeProjectId = void 0;
147
168
  projectAPI = null;
148
169
  }
149
- await dbClient.db().collection("sessions").updateOne({ id: typedSession.id }, { $set: updateDoc });
170
+ const promises = [dbClient.db().collection("sessions").updateOne({ id: typedSession.id }, { $set: updateDoc })];
171
+ if (userData) {
172
+ const userIdObj = typeof userData.id === "string" ? new Types.ObjectId(userData.id) : userData.id;
173
+ promises.push(dbClient.db().collection("users").updateOne({ _id: userIdObj }, { $set: userUpdateDoc }));
174
+ }
175
+ await Promise.all(promises);
150
176
  }
151
177
  return mapSessionToAPI(formatSession({
152
178
  session: typedSession,
@@ -1 +1 @@
1
- {"version":3,"file":"getAuth.mjs","names":[],"sources":["../../../../src/utils/auth/getAuth.ts"],"sourcesContent":["import { passkey } from '@better-auth/passkey';\nimport { sso } from '@better-auth/sso';\nimport { sendVerificationUpdate } from '@controllers/user.controller';\nimport { logger } from '@logger';\nimport { sendEmail } from '@services/email.service';\nimport { getOrganizationById } from '@services/organization.service';\nimport { getProjectById } from '@services/project.service';\nimport { getUserById } from '@services/user.service';\nimport { mapOrganizationToAPI } from '@utils/mapper/organization';\nimport { mapProjectToAPI } from '@utils/mapper/project';\nimport { mapSessionToAPI } from '@utils/mapper/session';\nimport { mapUserToAPI } from '@utils/mapper/user';\nimport type { OmitId } from '@utils/mongoDB/types';\nimport {\n computeEffectivePermission,\n getSessionRoles,\n intersectPermissions,\n} from '@utils/permissions';\nimport { betterAuth } from 'better-auth';\nimport { mongodbAdapter } from 'better-auth/adapters/mongodb';\nimport { createAuthMiddleware } from 'better-auth/api';\nimport { customSession, lastLoginMethod, twoFactor } from 'better-auth/plugins';\nimport { magicLink } from 'better-auth/plugins/magic-link';\nimport type { MongoClient } from 'mongodb';\nimport type { OrganizationAPI } from '@/types/organization.types';\nimport type { ProjectAPI } from '@/types/project.types';\nimport type {\n Session,\n SessionContext,\n SessionDataApi,\n} from '@/types/session.types';\nimport type { UserAPI } from '@/types/user.types';\n\nexport type Auth = ReturnType<typeof betterAuth>;\n\n// Check if we are in production based on the domain or NODE_ENV\nconst isProd = process.env.DOMAIN !== 'localhost';\n\nexport const formatSession = (session: SessionContext): OmitId<Session> => {\n const roles = getSessionRoles(session);\n let permissions = computeEffectivePermission(roles);\n\n // Intersect in the case a Access Token try to override the permissions\n if (session.permissions) {\n permissions = intersectPermissions(permissions, session.permissions);\n }\n\n const resultSession = {\n session: session.session,\n user: session.user,\n organization: session.organization,\n project: session.project,\n authType: 'session',\n permissions,\n roles,\n } as OmitId<Session>;\n\n return resultSession;\n};\n\nexport const getAuth = (dbClient: MongoClient): Auth => {\n if (!dbClient) {\n throw new Error('MongoDB connection not established');\n }\n\n const auth = betterAuth({\n appName: 'Intlayer',\n\n baseURL: process.env.BACKEND_URL,\n\n database: mongodbAdapter(dbClient.db()),\n\n /**\n * User model\n */\n user: {\n modelName: 'users',\n },\n\n databaseHooks: {\n user: {\n create: {\n // Runs once, immediately after the INSERT\n after: async (user) => {\n if (!user?.emailVerified) return;\n\n await sendEmail({\n type: 'welcome',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n loginLink: `${process.env.APP_URL}/auth/login`,\n locale: (user as any).lang,\n });\n logger.info('Welcome e‑mail delivered', {\n email: user.email,\n });\n },\n },\n },\n },\n\n hooks: {\n after: createAuthMiddleware(async (ctx) => {\n const { path, context } = ctx;\n\n const newUser = context.newSession?.user;\n const existingUser = context.session?.user;\n const user = newUser ?? existingUser;\n\n if (!user) return;\n\n if (path.includes('/verify-email')) {\n // Fetch fresh user from DB so emailVerified is definitely up-to-date\n // (the hook context user may be a stale snapshot from before the DB write).\n const freshUser = await getUserById(user.id);\n\n if (freshUser) {\n sendVerificationUpdate(freshUser);\n }\n\n logger.info('SSE verification update sent', {\n email: user.email,\n userId: user.id,\n });\n\n await sendEmail({\n type: 'welcome',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n loginLink: `${process.env.APP_URL}/auth/login`,\n locale: (user as any).lang,\n });\n logger.info('Welcome e‑mail delivered', {\n email: user.email,\n });\n }\n }),\n },\n\n advanced: {\n crossSubDomainCookies: {\n enabled: isProd,\n domain: isProd ? process.env.DOMAIN : undefined,\n additionalCookies: ['session_token'],\n },\n cookiePrefix: 'intlayer',\n cookies: {\n session_token: {\n name: 'session_token',\n attributes: {\n httpOnly: true,\n secure: isProd,\n sameSite: 'lax',\n },\n },\n },\n },\n\n secret: process.env.BETTER_AUTH_SECRET as string,\n session: {\n modelName: 'sessions',\n id: 'id',\n\n // Session lives for 30 days; each access made more than 1 day after the\n // last refresh slides the expiry forward, so an active user effectively\n // stays signed in indefinitely.\n expiresIn: 60 * 60 * 24 * 30,\n updateAge: 60 * 60 * 24,\n\n // Cache the session in a signed cookie for 5 minutes to avoid hitting\n // Mongo on every request while still picking up updateAge refreshes.\n cookieCache: {\n enabled: false,\n maxAge: 5 * 60,\n },\n\n additionalFields: {\n activeOrganizationId: { type: 'string', nullable: true, input: false },\n activeProjectId: { type: 'string', nullable: true, input: false },\n },\n },\n\n plugins: [\n customSession(async ({ session }) => {\n const typedSession = session as unknown as SessionDataApi;\n\n const normalizeId = (id: any): string | null =>\n typeof id === 'string'\n ? id\n : id?.buffer instanceof Uint8Array\n ? Buffer.from(id.buffer).toString('hex')\n : null;\n\n const orgIdStr = typedSession.activeOrganizationId\n ? normalizeId(typedSession.activeOrganizationId)\n : null;\n const projectIdStr = typedSession.activeProjectId\n ? normalizeId(typedSession.activeProjectId)\n : null;\n\n const [userData, orgData, projectData] = await Promise.all([\n typedSession.userId ? getUserById(typedSession.userId) : null,\n orgIdStr ? getOrganizationById(orgIdStr) : null,\n projectIdStr ? getProjectById(projectIdStr) : null,\n ]);\n\n const userAPI: UserAPI | null = userData\n ? mapUserToAPI(userData)\n : null;\n let organizationAPI: OrganizationAPI | null = orgData\n ? mapOrganizationToAPI(orgData)\n : null;\n let projectAPI: ProjectAPI | null = projectData\n ? mapProjectToAPI(projectData)\n : null;\n\n // Cleanup if normalization failed or data not found (Zombie session)\n const shouldClearOrg = typedSession.activeOrganizationId && !orgData;\n const shouldClearProject = typedSession.activeProjectId && !projectData;\n\n if (shouldClearOrg || shouldClearProject) {\n const updateDoc: any = {};\n\n if (shouldClearOrg) {\n updateDoc.activeOrganizationId = null;\n updateDoc.activeProjectId = null;\n\n typedSession.activeOrganizationId = undefined;\n typedSession.activeProjectId = undefined;\n organizationAPI = null;\n projectAPI = null;\n } else if (shouldClearProject) {\n updateDoc.activeProjectId = null;\n\n typedSession.activeProjectId = undefined;\n projectAPI = null;\n }\n\n await dbClient\n .db()\n .collection('sessions')\n .updateOne({ id: typedSession.id }, { $set: updateDoc });\n }\n\n const sessionWithNoPermission: SessionContext = {\n session: typedSession,\n user: userAPI!,\n organization: organizationAPI ?? null,\n project: projectAPI ?? null,\n authType: 'session',\n };\n\n const formattedSession = formatSession(sessionWithNoPermission);\n\n return mapSessionToAPI(formattedSession);\n }),\n lastLoginMethod({\n storeInDatabase: true, // adds user.lastLoginMethod in DB and session\n schema: {\n user: {\n lastLoginMethod: 'lastLoginMethod', // Custom field name\n },\n },\n customResolveMethod: (context) => {\n // When user clicks the magic link\n if (context.path === '/magic-link/verify') {\n return 'magic-link';\n }\n\n // Fallback to default behavior for everything else\n return null;\n },\n }),\n passkey({\n rpID: process.env.DOMAIN,\n rpName: 'Intlayer',\n }),\n twoFactor(),\n magicLink({\n sendMagicLink: async ({ email, url }) => {\n logger.info('sending magic link', { email, url });\n await sendEmail({\n type: 'magicLink',\n to: email,\n username: email.split('@')[0],\n magicLink: url,\n });\n },\n }),\n sso({\n organizationProvisioning: {},\n }),\n ],\n\n emailAndPassword: {\n enabled: true,\n disableSignUp: false,\n requireEmailVerification: true,\n minPasswordLength: 8,\n maxPasswordLength: 128,\n autoSignIn: true,\n sendResetPassword: async ({ user, token }) => {\n logger.info('sending reset password email', { email: user.email });\n await sendEmail({\n type: 'resetPassword',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n resetLink: `${process.env.APP_URL}/auth/password/reset?token=${token}`,\n });\n },\n resetPasswordTokenExpiresIn: 3600,\n },\n\n emailVerification: {\n autoSignInAfterVerification: true,\n sendOnSignIn: true,\n sendVerificationEmail: async ({ user, url }) => {\n logger.info('sending verification email', { email: user.email });\n // Override callbackURL so the link redirects to the app after verification,\n // not to the backend root which just shows the raw API response.\n const verificationUrl = new URL(url);\n verificationUrl.searchParams.set(\n 'callbackURL',\n process.env.APP_URL ?? '/'\n );\n await sendEmail({\n type: 'validate',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n validationLink: verificationUrl.toString(),\n });\n },\n },\n\n trustedOrigins: [\n process.env.WEBSITE_URL,\n process.env.APP_URL,\n process.env.SHOWCASE_URL,\n ].filter(Boolean) as string[],\n\n accountLinking: {\n enabled: true, // allow linking in general\n trustedProviders: [\n 'google',\n 'github',\n 'linkedin',\n 'gitlab',\n 'atlassian',\n 'microsoft',\n 'email-password',\n 'magic-link',\n 'passkey',\n ],\n },\n socialProviders: {\n google: {\n clientId: process.env.GOOGLE_CLIENT_ID as string,\n clientSecret: process.env.GOOGLE_CLIENT_SECRET as string,\n },\n github: {\n clientId: process.env.GITHUB_CLIENT_ID as string,\n clientSecret: process.env.GITHUB_CLIENT_SECRET as string,\n },\n atlassian: {\n clientId: process.env.ATLASSIAN_CLIENT_ID as string,\n clientSecret: process.env.ATLASSIAN_CLIENT_SECRET as string,\n },\n gitlab: {\n clientId: process.env.GITLAB_CLIENT_ID as string,\n clientSecret: process.env.GITLAB_CLIENT_SECRET as string,\n },\n linkedin: {\n clientId: process.env.LINKEDIN_CLIENT_ID as string,\n clientSecret: process.env.LINKEDIN_CLIENT_SECRET as string,\n },\n microsoft: {\n clientId: process.env.MICROSOFT_CLIENT_ID as string,\n clientSecret: process.env.MICROSOFT_CLIENT_SECRET as string,\n },\n // socialProviders: {\n // apple: {\n // clientId: process.env.APPLE_CLIENT_ID as string,\n // clientSecret: process.env.APPLE_CLIENT_SECRET as string,\n // // Optional\n // appBundleIdentifier: process.env\n // .APPLE_APP_BUNDLE_IDENTIFIER as string,\n // },\n // },\n // // Add appleid.apple.com to trustedOrigins for Sign In with Apple flows\n // trustedOrigins: ['https://appleid.apple.com'],\n },\n\n logger: {\n log: (level, message, ...args) => logger[level](message, ...args),\n },\n });\n\n return auth;\n};\n"],"mappings":"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"}
1
+ {"version":3,"file":"getAuth.mjs","names":[],"sources":["../../../../src/utils/auth/getAuth.ts"],"sourcesContent":["import { passkey } from '@better-auth/passkey';\nimport { sso } from '@better-auth/sso';\nimport { sendVerificationUpdate } from '@controllers/user.controller';\nimport { logger } from '@logger';\nimport { sendEmail } from '@services/email.service';\nimport { getOrganizationById } from '@services/organization.service';\nimport { getProjectById } from '@services/project.service';\nimport { getUserById } from '@services/user.service';\nimport { mapOrganizationToAPI } from '@utils/mapper/organization';\nimport { mapProjectToAPI } from '@utils/mapper/project';\nimport { mapSessionToAPI } from '@utils/mapper/session';\nimport { mapUserToAPI } from '@utils/mapper/user';\nimport type { OmitId } from '@utils/mongoDB/types';\nimport {\n computeEffectivePermission,\n getSessionRoles,\n intersectPermissions,\n} from '@utils/permissions';\nimport { betterAuth } from 'better-auth';\nimport { mongodbAdapter } from 'better-auth/adapters/mongodb';\nimport { createAuthMiddleware } from 'better-auth/api';\nimport { customSession, lastLoginMethod, twoFactor } from 'better-auth/plugins';\nimport { magicLink } from 'better-auth/plugins/magic-link';\nimport type { MongoClient } from 'mongodb';\nimport { Types } from 'mongoose';\nimport type { OrganizationAPI } from '@/types/organization.types';\nimport type { ProjectAPI } from '@/types/project.types';\nimport type {\n Session,\n SessionContext,\n SessionDataApi,\n} from '@/types/session.types';\nimport type { UserAPI } from '@/types/user.types';\n\nexport type Auth = ReturnType<typeof betterAuth>;\n\n// Check if we are in production based on the domain or NODE_ENV\nconst isProd = process.env.DOMAIN !== 'localhost';\n\nexport const formatSession = (session: SessionContext): OmitId<Session> => {\n const roles = getSessionRoles(session);\n let permissions = computeEffectivePermission(roles);\n\n // Intersect in the case a Access Token try to override the permissions\n if (session.permissions) {\n permissions = intersectPermissions(permissions, session.permissions);\n }\n\n const resultSession = {\n session: session.session,\n user: session.user,\n organization: session.organization,\n project: session.project,\n authType: 'session',\n permissions,\n roles,\n } as OmitId<Session>;\n\n return resultSession;\n};\n\nexport const getAuth = (dbClient: MongoClient): Auth => {\n if (!dbClient) {\n throw new Error('MongoDB connection not established');\n }\n\n const auth = betterAuth({\n appName: 'Intlayer',\n\n baseURL: process.env.BACKEND_URL,\n\n database: mongodbAdapter(dbClient.db()),\n\n /**\n * User model\n */\n user: {\n modelName: 'users',\n },\n\n databaseHooks: {\n user: {\n create: {\n // Runs once, immediately after the INSERT\n after: async (user) => {\n if (!user?.emailVerified) return;\n\n await sendEmail({\n type: 'welcome',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n loginLink: `${process.env.APP_URL}/auth/login`,\n locale: (user as any).lang,\n });\n logger.info('Welcome e‑mail delivered', {\n email: user.email,\n });\n },\n },\n },\n },\n\n hooks: {\n after: createAuthMiddleware(async (ctx) => {\n const { path, context } = ctx;\n\n const newUser = context.newSession?.user;\n const existingUser = context.session?.user;\n const user = newUser ?? existingUser;\n\n if (!user) return;\n\n if (path.includes('/verify-email')) {\n // Fetch fresh user from DB so emailVerified is definitely up-to-date\n // (the hook context user may be a stale snapshot from before the DB write).\n const freshUser = await getUserById(user.id);\n\n if (freshUser) {\n sendVerificationUpdate(freshUser);\n }\n\n logger.info('SSE verification update sent', {\n email: user.email,\n userId: user.id,\n });\n\n await sendEmail({\n type: 'welcome',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n loginLink: `${process.env.APP_URL}/auth/login`,\n locale: (user as any).lang,\n });\n logger.info('Welcome e‑mail delivered', {\n email: user.email,\n });\n }\n }),\n },\n\n advanced: {\n crossSubDomainCookies: {\n enabled: isProd,\n domain: isProd ? process.env.DOMAIN : undefined,\n additionalCookies: ['session_token'],\n },\n cookiePrefix: 'intlayer',\n cookies: {\n session_token: {\n name: 'session_token',\n attributes: {\n httpOnly: true,\n secure: isProd,\n sameSite: 'lax',\n },\n },\n },\n },\n\n secret: process.env.BETTER_AUTH_SECRET as string,\n session: {\n modelName: 'sessions',\n id: 'id',\n\n // Session lives for 30 days; each access made more than 1 day after the\n // last refresh slides the expiry forward, so an active user effectively\n // stays signed in indefinitely.\n expiresIn: 60 * 60 * 24 * 30,\n updateAge: 60 * 60 * 24,\n\n // Cache the session in a signed cookie for 5 minutes to avoid hitting\n // Mongo on every request while still picking up updateAge refreshes.\n cookieCache: {\n enabled: false,\n maxAge: 5 * 60,\n },\n\n additionalFields: {\n activeOrganizationId: { type: 'string', nullable: true, input: false },\n activeProjectId: { type: 'string', nullable: true, input: false },\n },\n },\n\n plugins: [\n customSession(async ({ session }) => {\n const typedSession = session as unknown as SessionDataApi;\n\n const normalizeId = (id: any): string | null =>\n typeof id === 'string'\n ? id\n : id?.buffer instanceof Uint8Array\n ? Buffer.from(id.buffer).toString('hex')\n : null;\n\n let orgIdStr = typedSession.activeOrganizationId\n ? normalizeId(typedSession.activeOrganizationId)\n : null;\n let projectIdStr = typedSession.activeProjectId\n ? normalizeId(typedSession.activeProjectId)\n : null;\n\n const userData = typedSession.userId\n ? await getUserById(typedSession.userId)\n : null;\n\n // If the session does not have an active organization or project context, try to restore from the user's last active context\n let isSessionUpdated = false;\n if (userData) {\n if (!orgIdStr && userData.lastActiveOrganizationId) {\n orgIdStr = userData.lastActiveOrganizationId;\n isSessionUpdated = true;\n }\n if (!projectIdStr && userData.lastActiveProjectId) {\n projectIdStr = userData.lastActiveProjectId;\n isSessionUpdated = true;\n }\n\n if (isSessionUpdated) {\n await dbClient\n .db()\n .collection('sessions')\n .updateOne(\n { id: typedSession.id },\n {\n $set: {\n activeOrganizationId: orgIdStr,\n activeProjectId: projectIdStr,\n },\n }\n );\n typedSession.activeOrganizationId = orgIdStr ?? undefined;\n typedSession.activeProjectId = projectIdStr ?? undefined;\n }\n }\n\n const [orgData, projectData] = await Promise.all([\n orgIdStr ? getOrganizationById(orgIdStr) : null,\n projectIdStr ? getProjectById(projectIdStr) : null,\n ]);\n\n const userAPI: UserAPI | null = userData\n ? mapUserToAPI(userData)\n : null;\n let organizationAPI: OrganizationAPI | null = orgData\n ? mapOrganizationToAPI(orgData)\n : null;\n let projectAPI: ProjectAPI | null = projectData\n ? mapProjectToAPI(projectData)\n : null;\n\n // Cleanup if normalization failed or data not found (Zombie session)\n const shouldClearOrg = typedSession.activeOrganizationId && !orgData;\n const shouldClearProject = typedSession.activeProjectId && !projectData;\n\n if (shouldClearOrg || shouldClearProject) {\n const updateDoc: any = {};\n const userUpdateDoc: any = {};\n\n if (shouldClearOrg) {\n updateDoc.activeOrganizationId = null;\n updateDoc.activeProjectId = null;\n userUpdateDoc.lastActiveOrganizationId = null;\n userUpdateDoc.lastActiveProjectId = null;\n\n typedSession.activeOrganizationId = undefined;\n typedSession.activeProjectId = undefined;\n organizationAPI = null;\n projectAPI = null;\n } else if (shouldClearProject) {\n updateDoc.activeProjectId = null;\n userUpdateDoc.lastActiveProjectId = null;\n\n typedSession.activeProjectId = undefined;\n projectAPI = null;\n }\n\n const promises: Promise<any>[] = [\n dbClient\n .db()\n .collection('sessions')\n .updateOne({ id: typedSession.id }, { $set: updateDoc }),\n ];\n\n if (userData) {\n const userIdObj =\n typeof userData.id === 'string'\n ? new Types.ObjectId(userData.id)\n : userData.id;\n promises.push(\n dbClient\n .db()\n .collection('users')\n .updateOne({ _id: userIdObj }, { $set: userUpdateDoc })\n );\n }\n\n await Promise.all(promises);\n }\n\n const sessionWithNoPermission: SessionContext = {\n session: typedSession,\n user: userAPI!,\n organization: organizationAPI ?? null,\n project: projectAPI ?? null,\n authType: 'session',\n };\n\n const formattedSession = formatSession(sessionWithNoPermission);\n\n return mapSessionToAPI(formattedSession);\n }),\n lastLoginMethod({\n storeInDatabase: true, // adds user.lastLoginMethod in DB and session\n schema: {\n user: {\n lastLoginMethod: 'lastLoginMethod', // Custom field name\n },\n },\n customResolveMethod: (context) => {\n // When user clicks the magic link\n if (context.path === '/magic-link/verify') {\n return 'magic-link';\n }\n\n // Fallback to default behavior for everything else\n return null;\n },\n }),\n passkey({\n rpID: process.env.DOMAIN,\n rpName: 'Intlayer',\n }),\n twoFactor(),\n magicLink({\n sendMagicLink: async ({ email, url }) => {\n logger.info('sending magic link', { email, url });\n await sendEmail({\n type: 'magicLink',\n to: email,\n username: email.split('@')[0],\n magicLink: url,\n });\n },\n }),\n sso({\n organizationProvisioning: {},\n }),\n ],\n\n emailAndPassword: {\n enabled: true,\n disableSignUp: false,\n requireEmailVerification: true,\n minPasswordLength: 8,\n maxPasswordLength: 128,\n autoSignIn: true,\n sendResetPassword: async ({ user, token }) => {\n logger.info('sending reset password email', { email: user.email });\n await sendEmail({\n type: 'resetPassword',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n resetLink: `${process.env.APP_URL}/auth/password/reset?token=${token}`,\n });\n },\n resetPasswordTokenExpiresIn: 3600,\n },\n\n emailVerification: {\n autoSignInAfterVerification: true,\n sendOnSignIn: true,\n sendVerificationEmail: async ({ user, url }) => {\n logger.info('sending verification email', { email: user.email });\n // Override callbackURL so the link redirects to the app after verification,\n // not to the backend root which just shows the raw API response.\n const verificationUrl = new URL(url);\n verificationUrl.searchParams.set(\n 'callbackURL',\n process.env.APP_URL ?? '/'\n );\n await sendEmail({\n type: 'validate',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n validationLink: verificationUrl.toString(),\n });\n },\n },\n\n trustedOrigins: [\n process.env.WEBSITE_URL,\n process.env.APP_URL,\n process.env.SHOWCASE_URL,\n ].filter(Boolean) as string[],\n\n accountLinking: {\n enabled: true, // allow linking in general\n trustedProviders: [\n 'google',\n 'github',\n 'linkedin',\n 'gitlab',\n 'atlassian',\n 'microsoft',\n 'email-password',\n 'magic-link',\n 'passkey',\n ],\n },\n socialProviders: {\n google: {\n clientId: process.env.GOOGLE_CLIENT_ID as string,\n clientSecret: process.env.GOOGLE_CLIENT_SECRET as string,\n },\n github: {\n clientId: process.env.GITHUB_CLIENT_ID as string,\n clientSecret: process.env.GITHUB_CLIENT_SECRET as string,\n },\n atlassian: {\n clientId: process.env.ATLASSIAN_CLIENT_ID as string,\n clientSecret: process.env.ATLASSIAN_CLIENT_SECRET as string,\n },\n gitlab: {\n clientId: process.env.GITLAB_CLIENT_ID as string,\n clientSecret: process.env.GITLAB_CLIENT_SECRET as string,\n },\n linkedin: {\n clientId: process.env.LINKEDIN_CLIENT_ID as string,\n clientSecret: process.env.LINKEDIN_CLIENT_SECRET as string,\n },\n microsoft: {\n clientId: process.env.MICROSOFT_CLIENT_ID as string,\n clientSecret: process.env.MICROSOFT_CLIENT_SECRET as string,\n },\n // socialProviders: {\n // apple: {\n // clientId: process.env.APPLE_CLIENT_ID as string,\n // clientSecret: process.env.APPLE_CLIENT_SECRET as string,\n // // Optional\n // appBundleIdentifier: process.env\n // .APPLE_APP_BUNDLE_IDENTIFIER as string,\n // },\n // },\n // // Add appleid.apple.com to trustedOrigins for Sign In with Apple flows\n // trustedOrigins: ['https://appleid.apple.com'],\n },\n\n logger: {\n log: (level, message, ...args) => logger[level](message, ...args),\n },\n });\n\n return auth;\n};\n"],"mappings":"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"}
@@ -27,9 +27,14 @@ const handleGenericErrorResponse = (reply, errorKey, errorDetails, statusCode) =
27
27
  */
28
28
  const handleAppErrorResponse = (reply, error, messageDetails) => {
29
29
  if (!error.isAppError) {
30
- const errorKey = error.errorKey ?? error.error ?? error.code ?? error.name ?? "UNKNOWN_ERROR";
31
- const statusCode = error.httpStatusCode ?? error.statusCode ?? error.status ?? 500;
32
- handleCustomErrorResponse(reply, String(errorKey), "Error", error.message ?? JSON.stringify(error), void 0, statusCode);
30
+ const err = error;
31
+ const errorKey = err.errorKey ?? err.error ?? err.code ?? err.name ?? "UNKNOWN_ERROR";
32
+ const statusCode = err.httpStatusCode ?? err.statusCode ?? err.status ?? 500;
33
+ const logDetails = {};
34
+ if (err.url) logDetails.url = err.url;
35
+ if (err.responseBody) logDetails.responseBody = err.responseBody;
36
+ if (err.stack) logDetails.stack = err.stack;
37
+ handleCustomErrorResponse(reply, String(errorKey), "Error", err.message ?? JSON.stringify(err), void 0, statusCode, Object.keys(logDetails).length ? logDetails : void 0);
33
38
  return;
34
39
  }
35
40
  const isMultilingual = error.isMultilingual ?? false;
@@ -45,11 +50,34 @@ const handleAppErrorResponse = (reply, error, messageDetails) => {
45
50
  * @param statusCode - (Optional) HTTP status code, defaults to 500 if not specified.
46
51
  * @param isPaginatedResponse - Determines if the error should be part of a paginated response.
47
52
  */
48
- const handleCustomErrorResponse = (reply, errorKey, title, message, messageDetails, statusCode) => {
49
- const errorTitle = t(title, Locales.ENGLISH);
50
- const errorMessage = t(message, Locales.ENGLISH);
51
- logger.error(errorMessage, messageDetails);
53
+ const handleCustomErrorResponse = (reply, errorKey, title, message, messageDetails, statusCode, logDetails) => {
54
+ const errorTitle = typeof title === "string" ? title : t(title, Locales.ENGLISH);
55
+ const errorMessage = typeof message === "string" ? message : t(message, Locales.ENGLISH);
52
56
  const status = statusCode ?? 500;
57
+ const req = reply.request;
58
+ const session = req?.session;
59
+ const requestContext = {
60
+ method: req?.method,
61
+ url: req?.url,
62
+ params: req?.params,
63
+ query: req?.query,
64
+ body: req?.body,
65
+ session: session ? {
66
+ userId: String(session.user?.id ?? ""),
67
+ userEmail: session.user?.email,
68
+ organizationId: String(session.organization?.id ?? ""),
69
+ organizationName: session.organization?.name,
70
+ projectId: String(session.project?.id ?? ""),
71
+ projectName: session.project?.name
72
+ } : void 0
73
+ };
74
+ logger.error(errorKey, {
75
+ message: errorMessage,
76
+ status,
77
+ request: requestContext,
78
+ ...messageDetails,
79
+ ...logDetails
80
+ });
53
81
  const responseData = formatResponse({
54
82
  error: {
55
83
  code: errorKey,
@@ -73,7 +101,11 @@ const formatGenericErrorResponse = (errorKey, errorDetails, statusCode) => {
73
101
  const status = statusCode ?? error.statusCode;
74
102
  const errorTitle = t(error.title, Locales.ENGLISH);
75
103
  const errorMessage = t(error.message, Locales.ENGLISH);
76
- logger.error(errorMessage, errorDetails);
104
+ logger.error(errorKey, {
105
+ message: errorMessage,
106
+ status,
107
+ ...errorDetails
108
+ });
77
109
  return formatResponse({
78
110
  error: {
79
111
  code: errorKey,
@@ -1 +1 @@
1
- {"version":3,"file":"ErrorHandler.mjs","names":[],"sources":["../../../../src/utils/errors/ErrorHandler.ts"],"sourcesContent":["// Import required modules and types from their respective locations.\n\nimport * as Locales from '@intlayer/types/locales';\nimport type { StrictModeLocaleMap } from '@intlayer/types/module_augmentation';\nimport { logger } from '@logger';\nimport { formatResponse } from '@utils/responseData';\nimport type { FastifyReply } from 'fastify';\nimport { t } from 'fastify-intlayer';\nimport type { UserAPI } from '@/types/user.types';\nimport { HttpStatusCodes } from '@/utils/httpStatusCodes';\nimport type { AppError } from './ErrorsClass';\nimport { type ErrorCodes, errorData } from './errorCodes';\n\n/**\n * Handles generic error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param errorKey - A key representing the specific error.\n * @param statusCode - (Optional) A specific HTTP status code to use for the response.\n * @param isPaginatedResponse - Flag to determine if the response should be paginated.\n */\nexport const handleGenericErrorResponse = (\n reply: FastifyReply,\n errorKey: ErrorCodes,\n errorDetails?: object,\n statusCode?: HttpStatusCodes\n) => {\n const error = errorData[errorKey];\n const status = statusCode ?? error.statusCode; // Use the provided status code or default to the one in errorData.\n\n // Delegate to a more customizable error response handler.\n handleCustomErrorResponse(\n reply,\n errorKey,\n error.title,\n error.message,\n errorDetails,\n status\n );\n};\n\n/**\n * Handles application-specific error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param error - The error object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param isPaginatedResponse - (Optional) Flag to determine if the response should be paginated.\n */\nexport const handleAppErrorResponse = (\n reply: FastifyReply,\n error: AppError,\n messageDetails?: object\n) => {\n if (!error.isAppError) {\n const errorKey =\n error.errorKey ??\n (error as any).error ??\n (error as any).code ??\n (error as any).name ??\n 'UNKNOWN_ERROR';\n\n const statusCode =\n error.httpStatusCode ??\n (error as any).statusCode ??\n (error as any).status ??\n HttpStatusCodes.INTERNAL_SERVER_ERROR_500;\n\n handleCustomErrorResponse(\n reply,\n String(errorKey),\n 'Error',\n error.message ?? JSON.stringify(error),\n undefined,\n statusCode\n );\n return;\n }\n\n const isMultilingual = error.isMultilingual ?? false;\n // Delegate to a more customizable error response handler.\n handleCustomErrorResponse(\n reply,\n error.errorKey,\n isMultilingual ? error.multilingualTitle : error.title,\n isMultilingual ? error.multilingualMessage : error.message,\n error.messageDetails ?? messageDetails,\n error.httpStatusCode\n );\n};\n\n/**\n * Handles more customizable error responses with detailed error messages and codes.\n * @param res - The response object.\n * @param errorKey - Error code key used to fetch the corresponding message and default status.\n * @param title - The localized error message object.\n * @param message - The localized error message object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param statusCode - (Optional) HTTP status code, defaults to 500 if not specified.\n * @param isPaginatedResponse - Determines if the error should be part of a paginated response.\n */\nexport const handleCustomErrorResponse = (\n reply: FastifyReply,\n errorKey: ErrorCodes | string,\n title: StrictModeLocaleMap<string> | string,\n message: StrictModeLocaleMap<string> | string,\n messageDetails?: object,\n statusCode?: HttpStatusCodes\n) => {\n const errorTitle = t(title as StrictModeLocaleMap<string>, Locales.ENGLISH);\n const errorMessage = t(\n message as StrictModeLocaleMap<string>,\n Locales.ENGLISH\n );\n logger.error(errorMessage, messageDetails); // Log the English version of the error message.\n const status = statusCode ?? HttpStatusCodes.INTERNAL_SERVER_ERROR_500; // Default to 500 if no status code is provided.\n\n // Format the response as a standard non-paginated error response.\n const responseData = formatResponse<UserAPI>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n ...messageDetails,\n },\n status,\n });\n\n return reply.code(status).send(responseData);\n};\n\n/**\n * Formats a generic error response without sending it (useful for Fastify plugins).\n * @param errorKey - A key representing the specific error.\n * @param errorDetails - Optional error details to include.\n * @param statusCode - Optional HTTP status code.\n * @returns Formatted error response object.\n */\nexport const formatGenericErrorResponse = (\n errorKey: ErrorCodes,\n errorDetails?: object,\n statusCode?: HttpStatusCodes\n) => {\n const error = errorData[errorKey];\n const status = statusCode ?? error.statusCode;\n const errorTitle = t(error.title, Locales.ENGLISH);\n const errorMessage = t(error.message, Locales.ENGLISH);\n logger.error(errorMessage, errorDetails);\n\n return formatResponse<UserAPI>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n ...errorDetails,\n },\n status,\n });\n};\n\n// Define an object to encapsulate error handling logic for backward compatibility.\nexport const ErrorHandler = {\n handleGenericErrorResponse,\n handleAppErrorResponse,\n handleCustomErrorResponse,\n formatGenericErrorResponse,\n};\n"],"mappings":";;;;;;;;;;;;;;;AAoBA,MAAa,8BACX,OACA,UACA,cACA,eACG;CACH,MAAM,QAAQ,UAAU;CACxB,MAAM,SAAS,cAAc,MAAM;CAGnC,0BACE,OACA,UACA,MAAM,OACN,MAAM,SACN,cACA,MACF;AACF;;;;;;;;AASA,MAAa,0BACX,OACA,OACA,mBACG;CACH,IAAI,CAAC,MAAM,YAAY;EACrB,MAAM,WACJ,MAAM,YACL,MAAc,SACd,MAAc,QACd,MAAc,QACf;EAEF,MAAM,aACJ,MAAM,kBACL,MAAc,cACd,MAAc;EAGjB,0BACE,OACA,OAAO,QAAQ,GACf,SACA,MAAM,WAAW,KAAK,UAAU,KAAK,GACrC,QACA,UACF;EACA;CACF;CAEA,MAAM,iBAAiB,MAAM,kBAAkB;CAE/C,0BACE,OACA,MAAM,UACN,iBAAiB,MAAM,oBAAoB,MAAM,OACjD,iBAAiB,MAAM,sBAAsB,MAAM,SACnD,MAAM,kBAAkB,gBACxB,MAAM,cACR;AACF;;;;;;;;;;;AAYA,MAAa,6BACX,OACA,UACA,OACA,SACA,gBACA,eACG;CACH,MAAM,aAAa,EAAE,OAAsC,QAAQ,OAAO;CAC1E,MAAM,eAAe,EACnB,SACA,QAAQ,OACV;CACA,OAAO,MAAM,cAAc,cAAc;CACzC,MAAM,SAAS;CAGf,MAAM,eAAe,eAAwB;EAC3C,OAAO;GACL,MAAM;GACN,OAAO;GACP,SAAS;GACT,GAAG;EACL;EACA;CACF,CAAC;CAED,OAAO,MAAM,KAAK,MAAM,EAAE,KAAK,YAAY;AAC7C;;;;;;;;AASA,MAAa,8BACX,UACA,cACA,eACG;CACH,MAAM,QAAQ,UAAU;CACxB,MAAM,SAAS,cAAc,MAAM;CACnC,MAAM,aAAa,EAAE,MAAM,OAAO,QAAQ,OAAO;CACjD,MAAM,eAAe,EAAE,MAAM,SAAS,QAAQ,OAAO;CACrD,OAAO,MAAM,cAAc,YAAY;CAEvC,OAAO,eAAwB;EAC7B,OAAO;GACL,MAAM;GACN,OAAO;GACP,SAAS;GACT,GAAG;EACL;EACA;CACF,CAAC;AACH;AAGA,MAAa,eAAe;CAC1B;CACA;CACA;CACA;AACF"}
1
+ {"version":3,"file":"ErrorHandler.mjs","names":[],"sources":["../../../../src/utils/errors/ErrorHandler.ts"],"sourcesContent":["// Import required modules and types from their respective locations.\n\nimport * as Locales from '@intlayer/types/locales';\nimport type { StrictModeLocaleMap } from '@intlayer/types/module_augmentation';\nimport { logger } from '@logger';\nimport { formatResponse } from '@utils/responseData';\nimport type { FastifyReply } from 'fastify';\nimport { t } from 'fastify-intlayer';\nimport type { UserAPI } from '@/types/user.types';\nimport { HttpStatusCodes } from '@/utils/httpStatusCodes';\nimport type { AppError } from './ErrorsClass';\nimport { type ErrorCodes, errorData } from './errorCodes';\n\n/**\n * Handles generic error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param errorKey - A key representing the specific error.\n * @param statusCode - (Optional) A specific HTTP status code to use for the response.\n * @param isPaginatedResponse - Flag to determine if the response should be paginated.\n */\nexport const handleGenericErrorResponse = (\n reply: FastifyReply,\n errorKey: ErrorCodes,\n errorDetails?: object,\n statusCode?: HttpStatusCodes\n) => {\n const error = errorData[errorKey];\n const status = statusCode ?? error.statusCode; // Use the provided status code or default to the one in errorData.\n\n // Delegate to a more customizable error response handler.\n handleCustomErrorResponse(\n reply,\n errorKey,\n error.title,\n error.message,\n errorDetails,\n status\n );\n};\n\n/**\n * Handles application-specific error responses by formatting and sending a JSON response.\n * @param res - The response object provided by Express.js.\n * @param error - The error object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param isPaginatedResponse - (Optional) Flag to determine if the response should be paginated.\n */\nexport const handleAppErrorResponse = (\n reply: FastifyReply,\n error: AppError,\n messageDetails?: object\n) => {\n if (!error.isAppError) {\n const err = error as any;\n const errorKey =\n err.errorKey ?? err.error ?? err.code ?? err.name ?? 'UNKNOWN_ERROR';\n\n const statusCode =\n err.httpStatusCode ??\n err.statusCode ??\n err.status ??\n HttpStatusCodes.INTERNAL_SERVER_ERROR_500;\n\n const logDetails: Record<string, unknown> = {};\n if (err.url) logDetails.url = err.url;\n if (err.responseBody) logDetails.responseBody = err.responseBody;\n if (err.stack) logDetails.stack = err.stack;\n\n handleCustomErrorResponse(\n reply,\n String(errorKey),\n 'Error',\n err.message ?? JSON.stringify(err),\n undefined,\n statusCode,\n Object.keys(logDetails).length ? logDetails : undefined\n );\n return;\n }\n\n const isMultilingual = error.isMultilingual ?? false;\n handleCustomErrorResponse(\n reply,\n error.errorKey,\n isMultilingual ? error.multilingualTitle : error.title,\n isMultilingual ? error.multilingualMessage : error.message,\n error.messageDetails ?? messageDetails,\n error.httpStatusCode\n );\n};\n\n/**\n * Handles more customizable error responses with detailed error messages and codes.\n * @param res - The response object.\n * @param errorKey - Error code key used to fetch the corresponding message and default status.\n * @param title - The localized error message object.\n * @param message - The localized error message object.\n * @param messageDetails - (Optional) Additional message details to include in the response.\n * @param statusCode - (Optional) HTTP status code, defaults to 500 if not specified.\n * @param isPaginatedResponse - Determines if the error should be part of a paginated response.\n */\nexport const handleCustomErrorResponse = (\n reply: FastifyReply,\n errorKey: ErrorCodes | string,\n title: StrictModeLocaleMap<string> | string,\n message: StrictModeLocaleMap<string> | string,\n messageDetails?: object,\n statusCode?: HttpStatusCodes,\n logDetails?: object\n) => {\n const errorTitle =\n typeof title === 'string'\n ? title\n : t(title as StrictModeLocaleMap<string>, Locales.ENGLISH);\n const errorMessage =\n typeof message === 'string'\n ? message\n : t(message as StrictModeLocaleMap<string>, Locales.ENGLISH);\n const status = statusCode ?? HttpStatusCodes.INTERNAL_SERVER_ERROR_500;\n\n const req = reply.request;\n const session = req?.session;\n const requestContext = {\n method: req?.method,\n url: req?.url,\n params: req?.params,\n query: req?.query,\n body: req?.body,\n session: session\n ? {\n userId: String(session.user?.id ?? ''),\n userEmail: session.user?.email,\n organizationId: String(session.organization?.id ?? ''),\n organizationName: session.organization?.name,\n projectId: String(session.project?.id ?? ''),\n projectName: session.project?.name,\n }\n : undefined,\n };\n\n logger.error(errorKey, {\n message: errorMessage,\n status,\n request: requestContext,\n ...messageDetails,\n ...logDetails,\n });\n\n // Format the response as a standard non-paginated error response.\n const responseData = formatResponse<UserAPI>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n ...messageDetails,\n },\n status,\n });\n\n return reply.code(status).send(responseData);\n};\n\n/**\n * Formats a generic error response without sending it (useful for Fastify plugins).\n * @param errorKey - A key representing the specific error.\n * @param errorDetails - Optional error details to include.\n * @param statusCode - Optional HTTP status code.\n * @returns Formatted error response object.\n */\nexport const formatGenericErrorResponse = (\n errorKey: ErrorCodes,\n errorDetails?: object,\n statusCode?: HttpStatusCodes\n) => {\n const error = errorData[errorKey];\n const status = statusCode ?? error.statusCode;\n const errorTitle = t(error.title, Locales.ENGLISH);\n const errorMessage = t(error.message, Locales.ENGLISH);\n logger.error(errorKey, { message: errorMessage, status, ...errorDetails });\n\n return formatResponse<UserAPI>({\n error: {\n code: errorKey,\n title: errorTitle,\n message: errorMessage,\n ...errorDetails,\n },\n status,\n });\n};\n\n// Define an object to encapsulate error handling logic for backward compatibility.\nexport const ErrorHandler = {\n handleGenericErrorResponse,\n handleAppErrorResponse,\n handleCustomErrorResponse,\n formatGenericErrorResponse,\n};\n"],"mappings":";;;;;;;;;;;;;;;AAoBA,MAAa,8BACX,OACA,UACA,cACA,eACG;CACH,MAAM,QAAQ,UAAU;CACxB,MAAM,SAAS,cAAc,MAAM;CAGnC,0BACE,OACA,UACA,MAAM,OACN,MAAM,SACN,cACA,MACF;AACF;;;;;;;;AASA,MAAa,0BACX,OACA,OACA,mBACG;CACH,IAAI,CAAC,MAAM,YAAY;EACrB,MAAM,MAAM;EACZ,MAAM,WACJ,IAAI,YAAY,IAAI,SAAS,IAAI,QAAQ,IAAI,QAAQ;EAEvD,MAAM,aACJ,IAAI,kBACJ,IAAI,cACJ,IAAI;EAGN,MAAM,aAAsC,CAAC;EAC7C,IAAI,IAAI,KAAK,WAAW,MAAM,IAAI;EAClC,IAAI,IAAI,cAAc,WAAW,eAAe,IAAI;EACpD,IAAI,IAAI,OAAO,WAAW,QAAQ,IAAI;EAEtC,0BACE,OACA,OAAO,QAAQ,GACf,SACA,IAAI,WAAW,KAAK,UAAU,GAAG,GACjC,QACA,YACA,OAAO,KAAK,UAAU,EAAE,SAAS,aAAa,MAChD;EACA;CACF;CAEA,MAAM,iBAAiB,MAAM,kBAAkB;CAC/C,0BACE,OACA,MAAM,UACN,iBAAiB,MAAM,oBAAoB,MAAM,OACjD,iBAAiB,MAAM,sBAAsB,MAAM,SACnD,MAAM,kBAAkB,gBACxB,MAAM,cACR;AACF;;;;;;;;;;;AAYA,MAAa,6BACX,OACA,UACA,OACA,SACA,gBACA,YACA,eACG;CACH,MAAM,aACJ,OAAO,UAAU,WACb,QACA,EAAE,OAAsC,QAAQ,OAAO;CAC7D,MAAM,eACJ,OAAO,YAAY,WACf,UACA,EAAE,SAAwC,QAAQ,OAAO;CAC/D,MAAM,SAAS;CAEf,MAAM,MAAM,MAAM;CAClB,MAAM,UAAU,KAAK;CACrB,MAAM,iBAAiB;EACrB,QAAQ,KAAK;EACb,KAAK,KAAK;EACV,QAAQ,KAAK;EACb,OAAO,KAAK;EACZ,MAAM,KAAK;EACX,SAAS,UACL;GACE,QAAQ,OAAO,QAAQ,MAAM,MAAM,EAAE;GACrC,WAAW,QAAQ,MAAM;GACzB,gBAAgB,OAAO,QAAQ,cAAc,MAAM,EAAE;GACrD,kBAAkB,QAAQ,cAAc;GACxC,WAAW,OAAO,QAAQ,SAAS,MAAM,EAAE;GAC3C,aAAa,QAAQ,SAAS;EAChC,IACA;CACN;CAEA,OAAO,MAAM,UAAU;EACrB,SAAS;EACT;EACA,SAAS;EACT,GAAG;EACH,GAAG;CACL,CAAC;CAGD,MAAM,eAAe,eAAwB;EAC3C,OAAO;GACL,MAAM;GACN,OAAO;GACP,SAAS;GACT,GAAG;EACL;EACA;CACF,CAAC;CAED,OAAO,MAAM,KAAK,MAAM,EAAE,KAAK,YAAY;AAC7C;;;;;;;;AASA,MAAa,8BACX,UACA,cACA,eACG;CACH,MAAM,QAAQ,UAAU;CACxB,MAAM,SAAS,cAAc,MAAM;CACnC,MAAM,aAAa,EAAE,MAAM,OAAO,QAAQ,OAAO;CACjD,MAAM,eAAe,EAAE,MAAM,SAAS,QAAQ,OAAO;CACrD,OAAO,MAAM,UAAU;EAAE,SAAS;EAAc;EAAQ,GAAG;CAAa,CAAC;CAEzE,OAAO,eAAwB;EAC7B,OAAO;GACL,MAAM;GACN,OAAO;GACP,SAAS;GACT,GAAG;EACL;EACA;CACF,CAAC;AACH;AAGA,MAAa,eAAe;CAC1B;CACA;CACA;CACA;AACF"}
@@ -6,12 +6,18 @@ import { ensureMongoDocumentToObject } from "../ensureMongoDocumentToObject.mjs"
6
6
  * @param aiConfig - The AI configuration to sanitize.
7
7
  * @returns The sanitized AI configuration.
8
8
  */
9
+ const maskApiKey = (apiKey) => {
10
+ if (apiKey.length <= 8) return "*".repeat(apiKey.length);
11
+ const prefix = apiKey.slice(0, 8);
12
+ const suffix = apiKey.slice(-4);
13
+ return `${prefix}${"*".repeat(Math.max(apiKey.length - 12, 8))}${suffix}`;
14
+ };
9
15
  const sanitizeAIConfig = (aiConfig) => {
10
16
  if (!aiConfig) return aiConfig;
11
17
  const { apiKey, ...rest } = aiConfig;
12
18
  return {
13
19
  ...rest,
14
- apiKeyConfigured: !!apiKey
20
+ apiKey: apiKey ? maskApiKey(apiKey) : void 0
15
21
  };
16
22
  };
17
23
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"project.mjs","names":[],"sources":["../../../../src/utils/mapper/project.ts"],"sourcesContent":["import { ensureMongoDocumentToObject } from '@utils/ensureMongoDocumentToObject';\nimport type { Project, ProjectAPI } from '@/types/project.types';\n\n/**\n * Sanitizes the AI configuration by removing the API key and adding a flag.\n * @param aiConfig - The AI configuration to sanitize.\n * @returns The sanitized AI configuration.\n */\nconst sanitizeAIConfig = (aiConfig?: any) => {\n if (!aiConfig) {\n return aiConfig;\n }\n\n const { apiKey, ...rest } = aiConfig;\n return {\n ...rest,\n apiKeyConfigured: !!apiKey,\n };\n};\n\n/**\n * Sanitizes the project configuration by removing sensitive data.\n * @param configuration - The project configuration to sanitize.\n * @returns The sanitized project configuration.\n */\nconst sanitizeProjectConfiguration = (\n configuration?: Project['configuration']\n) => {\n if (!configuration) {\n return configuration;\n }\n\n return {\n ...configuration,\n ai: sanitizeAIConfig(configuration.ai),\n };\n};\n\n/**\n * Maps a project to an API response.\n * @param project - The project to map.\n * @param - Whether the user is an admin of the project.\n * @returns The project mapped to an API response.\n */\nexport const mapProjectToAPI = <T extends Project | ProjectAPI | null>(\n project?: T\n): T extends null ? null : ProjectAPI => {\n if (!project) {\n return null as any;\n }\n\n const projectObject = ensureMongoDocumentToObject(project);\n\n // Sanitize configuration to remove sensitive API key\n if (projectObject.configuration) {\n projectObject.configuration = sanitizeProjectConfiguration(\n projectObject.configuration\n ) as any;\n }\n\n return projectObject as any;\n};\n\n/**\n * Formats an array of projects for API response. Removes sensitive information.\n * @param projects - The array of project objects to format.\n * @param user - The user object.\n * @param - Whether the user is an admin of the project.\n * @returns The formatted array of user objects.\n */\nexport const mapProjectsToAPI = (\n projects: (Project | ProjectAPI)[]\n): ProjectAPI[] =>\n projects.map(mapProjectToAPI).filter(Boolean) as ProjectAPI[];\n"],"mappings":";;;;;;;;AAQA,MAAM,oBAAoB,aAAmB;CAC3C,IAAI,CAAC,UACH,OAAO;CAGT,MAAM,EAAE,QAAQ,GAAG,SAAS;CAC5B,OAAO;EACL,GAAG;EACH,kBAAkB,CAAC,CAAC;CACtB;AACF;;;;;;AAOA,MAAM,gCACJ,kBACG;CACH,IAAI,CAAC,eACH,OAAO;CAGT,OAAO;EACL,GAAG;EACH,IAAI,iBAAiB,cAAc,EAAE;CACvC;AACF;;;;;;;AAQA,MAAa,mBACX,YACuC;CACvC,IAAI,CAAC,SACH,OAAO;CAGT,MAAM,gBAAgB,4BAA4B,OAAO;CAGzD,IAAI,cAAc,eAChB,cAAc,gBAAgB,6BAC5B,cAAc,aAChB;CAGF,OAAO;AACT;;;;;;;;AASA,MAAa,oBACX,aAEA,SAAS,IAAI,eAAe,EAAE,OAAO,OAAO"}
1
+ {"version":3,"file":"project.mjs","names":[],"sources":["../../../../src/utils/mapper/project.ts"],"sourcesContent":["import { ensureMongoDocumentToObject } from '@utils/ensureMongoDocumentToObject';\nimport type { Project, ProjectAPI } from '@/types/project.types';\n\n/**\n * Sanitizes the AI configuration by removing the API key and adding a flag.\n * @param aiConfig - The AI configuration to sanitize.\n * @returns The sanitized AI configuration.\n */\nconst maskApiKey = (apiKey: string): string => {\n if (apiKey.length <= 8) return '*'.repeat(apiKey.length);\n const prefix = apiKey.slice(0, 8);\n const suffix = apiKey.slice(-4);\n const masked = '*'.repeat(Math.max(apiKey.length - 12, 8));\n return `${prefix}${masked}${suffix}`;\n};\n\nconst sanitizeAIConfig = (aiConfig?: any) => {\n if (!aiConfig) {\n return aiConfig;\n }\n\n const { apiKey, ...rest } = aiConfig;\n return {\n ...rest,\n apiKey: apiKey ? maskApiKey(apiKey) : undefined,\n };\n};\n\n/**\n * Sanitizes the project configuration by removing sensitive data.\n * @param configuration - The project configuration to sanitize.\n * @returns The sanitized project configuration.\n */\nconst sanitizeProjectConfiguration = (\n configuration?: Project['configuration']\n) => {\n if (!configuration) {\n return configuration;\n }\n\n return {\n ...configuration,\n ai: sanitizeAIConfig(configuration.ai),\n };\n};\n\n/**\n * Maps a project to an API response.\n * @param project - The project to map.\n * @param - Whether the user is an admin of the project.\n * @returns The project mapped to an API response.\n */\nexport const mapProjectToAPI = <T extends Project | ProjectAPI | null>(\n project?: T\n): T extends null ? null : ProjectAPI => {\n if (!project) {\n return null as any;\n }\n\n const projectObject = ensureMongoDocumentToObject(project);\n\n // Sanitize configuration to remove sensitive API key\n if (projectObject.configuration) {\n projectObject.configuration = sanitizeProjectConfiguration(\n projectObject.configuration\n );\n }\n\n return projectObject as any;\n};\n\n/**\n * Formats an array of projects for API response. Removes sensitive information.\n * @param projects - The array of project objects to format.\n * @param user - The user object.\n * @param - Whether the user is an admin of the project.\n * @returns The formatted array of user objects.\n */\nexport const mapProjectsToAPI = (\n projects: (Project | ProjectAPI)[]\n): ProjectAPI[] =>\n projects.map(mapProjectToAPI).filter(Boolean) as ProjectAPI[];\n"],"mappings":";;;;;;;;AAQA,MAAM,cAAc,WAA2B;CAC7C,IAAI,OAAO,UAAU,GAAG,OAAO,IAAI,OAAO,OAAO,MAAM;CACvD,MAAM,SAAS,OAAO,MAAM,GAAG,CAAC;CAChC,MAAM,SAAS,OAAO,MAAM,EAAE;CAE9B,OAAO,GAAG,SADK,IAAI,OAAO,KAAK,IAAI,OAAO,SAAS,IAAI,CAAC,CAChC,IAAI;AAC9B;AAEA,MAAM,oBAAoB,aAAmB;CAC3C,IAAI,CAAC,UACH,OAAO;CAGT,MAAM,EAAE,QAAQ,GAAG,SAAS;CAC5B,OAAO;EACL,GAAG;EACH,QAAQ,SAAS,WAAW,MAAM,IAAI;CACxC;AACF;;;;;;AAOA,MAAM,gCACJ,kBACG;CACH,IAAI,CAAC,eACH,OAAO;CAGT,OAAO;EACL,GAAG;EACH,IAAI,iBAAiB,cAAc,EAAE;CACvC;AACF;;;;;;;AAQA,MAAa,mBACX,YACuC;CACvC,IAAI,CAAC,SACH,OAAO;CAGT,MAAM,gBAAgB,4BAA4B,OAAO;CAGzD,IAAI,cAAc,eAChB,cAAc,gBAAgB,6BAC5B,cAAc,aAChB;CAGF,OAAO;AACT;;;;;;;;AASA,MAAa,oBACX,aAEA,SAAS,IAAI,eAAe,EAAE,OAAO,OAAO"}
@@ -1,16 +1,16 @@
1
1
  import { logger } from "../../logger/index.mjs";
2
- import { DictionaryModel } from "../../models/dictionary.model.mjs";
3
- import { OrganizationModel } from "../../models/organization.model.mjs";
4
- import { ProjectModel } from "../../models/project.model.mjs";
5
- import { TagModel } from "../../models/tag.model.mjs";
6
- import { UserModel } from "../../models/user.model.mjs";
7
- import { DiscussionModel } from "../../models/discussion.model.mjs";
8
- import { AuditModel } from "../../models/audit.model.mjs";
9
- import { AuditJobModel } from "../../models/auditJob.model.mjs";
10
- import { AuditPageModel } from "../../models/auditPage.model.mjs";
11
- import { AccountModel } from "../../models/account.model.mjs";
12
- import { ShowcaseProjectModel } from "../../models/showcaseProject.model.mjs";
13
- import { OAuth2AccessTokenModel } from "../../models/oAuth2.model.mjs";
2
+ import { DiscussionModel } from "../../schemas/discussion.schema.mjs";
3
+ import { DictionaryModel } from "../../schemas/dictionary.schema.mjs";
4
+ import { OrganizationModel } from "../../schemas/organization.schema.mjs";
5
+ import { ProjectModel } from "../../schemas/project.schema.mjs";
6
+ import { TagModel } from "../../schemas/tag.schema.mjs";
7
+ import { UserModel } from "../../schemas/user.schema.mjs";
8
+ import { AuditModel } from "../../schemas/audit.schema.mjs";
9
+ import { AuditJobModel } from "../../schemas/auditJob.schema.mjs";
10
+ import { AuditPageModel } from "../../schemas/auditPage.schema.mjs";
11
+ import { AccountModel } from "../../schemas/account.schema.mjs";
12
+ import { ShowcaseProjectModel } from "../../schemas/showcaseProject.schema.mjs";
13
+ import { OAuth2AccessTokenModel } from "../../schemas/oAuth2.schema.mjs";
14
14
  import { connect } from "mongoose";
15
15
 
16
16
  //#region src/utils/mongoDB/connectDB.ts
@@ -1 +1 @@
1
- {"version":3,"file":"connectDB.mjs","names":[],"sources":["../../../../src/utils/mongoDB/connectDB.ts"],"sourcesContent":["import { logger } from '@logger';\nimport { AccountModel } from '@models/account.model';\nimport { AuditModel } from '@models/audit.model';\nimport { AuditJobModel } from '@models/auditJob.model';\nimport { AuditPageModel } from '@models/auditPage.model';\nimport { DictionaryModel } from '@models/dictionary.model';\nimport { DiscussionModel } from '@models/discussion.model';\nimport { OAuth2AccessTokenModel } from '@models/oAuth2.model';\nimport { OrganizationModel } from '@models/organization.model';\nimport { ProjectModel } from '@models/project.model';\nimport { ShowcaseProjectModel } from '@models/showcaseProject.model';\nimport { TagModel } from '@models/tag.model';\nimport { UserModel } from '@models/user.model';\nimport { connect, type mongo } from 'mongoose';\n\n// Store the DB client singleton\nlet dbClientInstance: mongo.MongoClient | null = null;\n\nexport const connectDB = async (): Promise<mongo.MongoClient> => {\n try {\n const client = await connect(\n `mongodb+srv://${process.env.DB_ID}:${process.env.DB_MDP}@${process.env.DB_CLUSTER}/?retryWrites=true&w=majority&appName=Cluster0`\n );\n\n logger.info('MongoDB connected');\n\n // 2. Drop the old indexes directly\n const db = client.connection.db;\n if (db) {\n const collections = await db.collections();\n for (const col of collections) {\n await col.dropIndex('createdAt_1').catch(() => {});\n }\n }\n\n // Recreate indexes for models\n await ProjectModel.syncIndexes();\n await DiscussionModel.syncIndexes();\n await UserModel.createIndexes();\n await OAuth2AccessTokenModel.createIndexes();\n await TagModel.createIndexes();\n await DictionaryModel.createIndexes();\n await OrganizationModel.createIndexes();\n await AccountModel.createIndexes();\n await ShowcaseProjectModel.syncIndexes();\n await AuditModel.syncIndexes();\n await AuditJobModel.syncIndexes();\n await AuditPageModel.syncIndexes();\n\n dbClientInstance = client.connection.getClient();\n\n return dbClientInstance;\n } catch (error) {\n const errorMessage = `MongoDB connection error - ${(error as Error).message}`;\n\n logger.error(errorMessage);\n throw new Error(errorMessage);\n }\n};\n\n/**\n * Get the MongoDB client instance.\n * Must be called after connectDB() has been executed.\n */\nexport const getDBClient = (): mongo.MongoClient => {\n if (!dbClientInstance) {\n throw new Error('Database not connected. Call connectDB() first.');\n }\n return dbClientInstance;\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,IAAI,mBAA6C;AAEjD,MAAa,YAAY,YAAwC;CAC/D,IAAI;EACF,MAAM,SAAS,MAAM,QACnB,iBAAiB,QAAQ,IAAI,MAAM,GAAG,QAAQ,IAAI,OAAO,GAAG,QAAQ,IAAI,WAAW,+CACrF;EAEA,OAAO,KAAK,mBAAmB;EAG/B,MAAM,KAAK,OAAO,WAAW;EAC7B,IAAI,IAAI;GACN,MAAM,cAAc,MAAM,GAAG,YAAY;GACzC,KAAK,MAAM,OAAO,aAChB,MAAM,IAAI,UAAU,aAAa,EAAE,YAAY,CAAC,CAAC;EAErD;EAGA,MAAM,aAAa,YAAY;EAC/B,MAAM,gBAAgB,YAAY;EAClC,MAAM,UAAU,cAAc;EAC9B,MAAM,uBAAuB,cAAc;EAC3C,MAAM,SAAS,cAAc;EAC7B,MAAM,gBAAgB,cAAc;EACpC,MAAM,kBAAkB,cAAc;EACtC,MAAM,aAAa,cAAc;EACjC,MAAM,qBAAqB,YAAY;EACvC,MAAM,WAAW,YAAY;EAC7B,MAAM,cAAc,YAAY;EAChC,MAAM,eAAe,YAAY;EAEjC,mBAAmB,OAAO,WAAW,UAAU;EAE/C,OAAO;CACT,SAAS,OAAO;EACd,MAAM,eAAe,8BAA+B,MAAgB;EAEpE,OAAO,MAAM,YAAY;EACzB,MAAM,IAAI,MAAM,YAAY;CAC9B;AACF;;;;;AAMA,MAAa,oBAAuC;CAClD,IAAI,CAAC,kBACH,MAAM,IAAI,MAAM,iDAAiD;CAEnE,OAAO;AACT"}
1
+ {"version":3,"file":"connectDB.mjs","names":[],"sources":["../../../../src/utils/mongoDB/connectDB.ts"],"sourcesContent":["import { logger } from '@logger';\nimport { AccountModel } from '@schemas/account.schema';\nimport { AuditModel } from '@schemas/audit.schema';\nimport { AuditJobModel } from '@schemas/auditJob.schema';\nimport { AuditPageModel } from '@schemas/auditPage.schema';\nimport { DictionaryModel } from '@schemas/dictionary.schema';\nimport { DiscussionModel } from '@schemas/discussion.schema';\nimport { OAuth2AccessTokenModel } from '@schemas/oAuth2.schema';\nimport { OrganizationModel } from '@schemas/organization.schema';\nimport { ProjectModel } from '@schemas/project.schema';\nimport { ShowcaseProjectModel } from '@schemas/showcaseProject.schema';\nimport { TagModel } from '@schemas/tag.schema';\nimport { UserModel } from '@schemas/user.schema';\nimport { connect, type mongo } from 'mongoose';\n\n// Store the DB client singleton\nlet dbClientInstance: mongo.MongoClient | null = null;\n\nexport const connectDB = async (): Promise<mongo.MongoClient> => {\n try {\n const client = await connect(\n `mongodb+srv://${process.env.DB_ID}:${process.env.DB_MDP}@${process.env.DB_CLUSTER}/?retryWrites=true&w=majority&appName=Cluster0`\n );\n\n logger.info('MongoDB connected');\n\n // 2. Drop the old indexes directly\n const db = client.connection.db;\n if (db) {\n const collections = await db.collections();\n for (const col of collections) {\n await col.dropIndex('createdAt_1').catch(() => {});\n }\n }\n\n // Recreate indexes for models\n await ProjectModel.syncIndexes();\n await DiscussionModel.syncIndexes();\n await UserModel.createIndexes();\n await OAuth2AccessTokenModel.createIndexes();\n await TagModel.createIndexes();\n await DictionaryModel.createIndexes();\n await OrganizationModel.createIndexes();\n await AccountModel.createIndexes();\n await ShowcaseProjectModel.syncIndexes();\n await AuditModel.syncIndexes();\n await AuditJobModel.syncIndexes();\n await AuditPageModel.syncIndexes();\n\n dbClientInstance = client.connection.getClient();\n\n return dbClientInstance;\n } catch (error) {\n const errorMessage = `MongoDB connection error - ${(error as Error).message}`;\n\n logger.error(errorMessage);\n throw new Error(errorMessage);\n }\n};\n\n/**\n * Get the MongoDB client instance.\n * Must be called after connectDB() has been executed.\n */\nexport const getDBClient = (): mongo.MongoClient => {\n if (!dbClientInstance) {\n throw new Error('Database not connected. Call connectDB() first.');\n }\n return dbClientInstance;\n};\n"],"mappings":";;;;;;;;;;;;;;;;AAgBA,IAAI,mBAA6C;AAEjD,MAAa,YAAY,YAAwC;CAC/D,IAAI;EACF,MAAM,SAAS,MAAM,QACnB,iBAAiB,QAAQ,IAAI,MAAM,GAAG,QAAQ,IAAI,OAAO,GAAG,QAAQ,IAAI,WAAW,+CACrF;EAEA,OAAO,KAAK,mBAAmB;EAG/B,MAAM,KAAK,OAAO,WAAW;EAC7B,IAAI,IAAI;GACN,MAAM,cAAc,MAAM,GAAG,YAAY;GACzC,KAAK,MAAM,OAAO,aAChB,MAAM,IAAI,UAAU,aAAa,EAAE,YAAY,CAAC,CAAC;EAErD;EAGA,MAAM,aAAa,YAAY;EAC/B,MAAM,gBAAgB,YAAY;EAClC,MAAM,UAAU,cAAc;EAC9B,MAAM,uBAAuB,cAAc;EAC3C,MAAM,SAAS,cAAc;EAC7B,MAAM,gBAAgB,cAAc;EACpC,MAAM,kBAAkB,cAAc;EACtC,MAAM,aAAa,cAAc;EACjC,MAAM,qBAAqB,YAAY;EACvC,MAAM,WAAW,YAAY;EAC7B,MAAM,cAAc,YAAY;EAChC,MAAM,eAAe,YAAY;EAEjC,mBAAmB,OAAO,WAAW,UAAU;EAE/C,OAAO;CACT,SAAS,OAAO;EACd,MAAM,eAAe,8BAA+B,MAAgB;EAEpE,OAAO,MAAM,YAAY;EACzB,MAAM,IAAI,MAAM,YAAY;CAC9B;AACF;;;;;AAMA,MAAa,oBAAuC;CAClD,IAAI,CAAC,kBACH,MAAM,IAAI,MAAM,iDAAiD;CAEnE,OAAO;AACT"}
@@ -1 +1 @@
1
- {"version":3,"file":"ai.controller.d.ts","names":[],"sources":["../../../src/controllers/ai.controller.ts"],"mappings":"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"}
1
+ {"version":3,"file":"ai.controller.d.ts","names":[],"sources":["../../../src/controllers/ai.controller.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"organization.controller.d.ts","names":[],"sources":["../../../src/controllers/organization.controller.ts"],"mappings":";;;;;;;;;KAmCY,sBAAA,GACV,oBAAoB,CAAC,yBAAA;AAAA,KACX,sBAAA,GAAyB,iBAAiB,CAAC,eAAA;AAFvD;;;AAAA,cAOa,gBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,WAAA,EAAa,sBAAA;AAAA,IACvC,KAAA,EAAO,YAAA,KAAY,OAAA;AAAA,KAiDT,oBAAA;EAAyB,cAAc;AAAA;AAAA,KACvC,qBAAA,GAAwB,YAAY,CAAC,eAAA;AApDjD;;;AAAA,cAyDa,eAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,oBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAwCS,mBAAA,GAAsB,wBAAwB;AAAA,KAC9C,qBAAA,GAAwB,YAAY,CAAC,eAAA;;;;cAKpC,eAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,mBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAuES,sBAAA,GAAyB,OAAO,CAAC,YAAA;AAAA,KACjC,wBAAA,GAA2B,YAAY,CAAC,eAAA;;AAnL/B;AAiDrB;cAuIa,kBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,sBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAuFS,yBAAA;EACV,SAAS;AAAA;AAAA,KAEC,2BAAA,GAA8B,YAAY,CAAC,eAAA;;AAnOS;AAKhE;cAmOa,qBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,yBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAiIS,6BAAA,GAAgC,OAAA;EAC1C,UAAA,GAAa,IAAA,GAAO,OAAA;EACpB,SAAA,GAAY,IAAA,GAAO,OAAA;AAAA;AAAA,KAET,+BAAA,GAAkC,YAAY,CAAC,eAAA;;;;cAK9C,yBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,6BAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAiHS,mCAAA;EAAwC,cAAc;AAAA;AAAA,KACtD,iCAAA,GAAoC,OAAA;EAC9C,UAAA,GAAa,IAAA,GAAO,OAAA;EACpB,SAAA,GAAY,IAAA,GAAO,OAAA;AAAA;AAAA,KAET,mCAAA,GAAsC,YAAY,CAAC,eAAA;AA7b/D;;;AAAA,cAkca,6BAAA,GACX,OAAA,EAAS,cAAA;EACP,MAAA,EAAQ,mCAAA;EACR,IAAA,EAAM,iCAAA;AAAA,IAER,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAmHS,wBAAA,GAA2B,YAAY,CAAC,eAAA;;;;cAKvC,kBAAA,GACX,QAAA,EAAU,cAAA,EACV,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA2HS,iCAAA;EAAsC,cAAc;AAAA;AAAA,KACpD,iCAAA,GAAoC,YAAY,CAAC,eAAA;;;;cAKhD,2BAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,iCAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA8DS,uBAAA;EACV,cAAA,WAAyB,KAAA,CAAM,QAAQ;AAAA;AAAA,KAE7B,wBAAA,GAA2B,YAAY,CAAC,eAAA;;AAzrBK;AACzD;cA6rBa,kBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,uBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAmGS,0BAAA,GAA6B,YAAY;AA9xBrD;;;AAAA,cAmyBa,oBAAA,GACX,QAAA,EAAU,cAAA,EACV,KAAA,EAAO,YAAA,KACN,OAAA"}
1
+ {"version":3,"file":"organization.controller.d.ts","names":[],"sources":["../../../src/controllers/organization.controller.ts"],"mappings":";;;;;;;;;KAmCY,sBAAA,GACV,oBAAoB,CAAC,yBAAA;AAAA,KACX,sBAAA,GAAyB,iBAAiB,CAAC,eAAA;AAFvD;;;AAAA,cAOa,gBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,WAAA,EAAa,sBAAA;AAAA,IACvC,KAAA,EAAO,YAAA,KAAY,OAAA;AAAA,KAiDT,oBAAA;EAAyB,cAAc;AAAA;AAAA,KACvC,qBAAA,GAAwB,YAAY,CAAC,eAAA;AApDjD;;;AAAA,cAyDa,eAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,oBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAwCS,mBAAA,GAAsB,wBAAwB;AAAA,KAC9C,qBAAA,GAAwB,YAAY,CAAC,eAAA;;;;cAKpC,eAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,mBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAuES,sBAAA,GAAyB,OAAO,CAAC,YAAA;AAAA,KACjC,wBAAA,GAA2B,YAAY,CAAC,eAAA;;AAnL/B;AAiDrB;cAuIa,kBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,sBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAuFS,yBAAA;EACV,SAAS;AAAA;AAAA,KAEC,2BAAA,GAA8B,YAAY,CAAC,eAAA;;AAnOS;AAKhE;cAmOa,qBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,yBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAiIS,6BAAA,GAAgC,OAAA;EAC1C,UAAA,GAAa,IAAA,GAAO,OAAA;EACpB,SAAA,GAAY,IAAA,GAAO,OAAA;AAAA;AAAA,KAET,+BAAA,GAAkC,YAAY,CAAC,eAAA;;;;cAK9C,yBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,6BAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAiHS,mCAAA;EAAwC,cAAc;AAAA;AAAA,KACtD,iCAAA,GAAoC,OAAA;EAC9C,UAAA,GAAa,IAAA,GAAO,OAAA;EACpB,SAAA,GAAY,IAAA,GAAO,OAAA;AAAA;AAAA,KAET,mCAAA,GAAsC,YAAY,CAAC,eAAA;AA7b/D;;;AAAA,cAkca,6BAAA,GACX,OAAA,EAAS,cAAA;EACP,MAAA,EAAQ,mCAAA;EACR,IAAA,EAAM,iCAAA;AAAA,IAER,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAmHS,wBAAA,GAA2B,YAAY,CAAC,eAAA;;;;cAKvC,kBAAA,GACX,QAAA,EAAU,cAAA,EACV,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAkIS,iCAAA;EAAsC,cAAc;AAAA;AAAA,KACpD,iCAAA,GAAoC,YAAY,CAAC,eAAA;;;;cAKhD,2BAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,iCAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA8DS,uBAAA;EACV,cAAA,WAAyB,KAAA,CAAM,QAAQ;AAAA;AAAA,KAE7B,wBAAA,GAA2B,YAAY,CAAC,eAAA;;AAhsBK;AACzD;cAosBa,kBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,uBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA0GS,0BAAA,GAA6B,YAAY;AA5yBrD;;;AAAA,cAizBa,oBAAA,GACX,QAAA,EAAU,cAAA,EACV,KAAA,EAAO,YAAA,KACN,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"project.controller.d.ts","names":[],"sources":["../../../src/controllers/project.controller.ts"],"mappings":"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"}
1
+ {"version":3,"file":"project.controller.d.ts","names":[],"sources":["../../../src/controllers/project.controller.ts"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"showcaseProject.controller.d.ts","names":[],"sources":["../../../src/controllers/showcaseProject.controller.ts"],"mappings":";;;;;;cAoCM,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;;;KAUb,yBAAA,GAA4B,CAAA,CAAE,KAAK,QAAQ,mBAAA;AAAA,KAC3C,2BAAA,GAA8B,YAAY,CAAC,kBAAA;;;;;cAM1C,qBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,yBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA2GS,wBAAA;EACV,IAAA;EACA,QAAA;EACA,MAAA;EACA,gBAAA;EACA,YAAA;AAAA;AAAA,KAEU,yBAAA,GAA4B,iBAAiB,CAAC,kBAAA;;;;cAK7C,mBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,WAAA,EAAa,wBAAA;AAAA,IACvC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA+CS,4BAAA;EAAiC,SAAS;AAAA;AAAA,KAC1C,4BAAA,GAA+B,YAAY,CAAC,kBAAA;;;;cAK3C,sBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,4BAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAqBS,6BAAA;EACV,SAAA;EACA,KAAK;AAAA;AAAA,KAEK,8BAAA,GAAiC,YAAY,CAAC,kBAAA;;;;cAK7C,wBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,WAAA,EAAa,6BAAA;AAAA,IACvC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAgCS,wBAAA;EAA6B,SAAS;AAAA;AAAA,KACtC,0BAAA,GAA6B,YAAY;EACnD,OAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA;AAAA;;;AAlQwE;AAC1E;cAwQa,oBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,wBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAkCS,0BAAA;EAA+B,SAAS;AAAA;AAAA,KACxC,4BAAA,GAA+B,YAAY;EACrD,OAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA;AAAA;;;;;cAOW,sBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,0BAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAgCG,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;;;;;KAsBb,yBAAA,GAA4B,CAAA,CAAE,KAAK,QAAQ,mBAAA;AAAA,KAC3C,2BAAA;EAAgC,SAAS;AAAA;AAAA,KACzC,2BAAA,GAA8B,YAAY,CAAC,kBAAA;AA3PzC;AAEd;;;AAFc,cAiQD,4BAAA,GACX,OAAA,EAAS,cAAA;EACP,MAAA,EAAQ,2BAAA;EACR,IAAA,EAAM,yBAAA;AAAA,IAER,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAkFS,2BAAA;EAAgC,SAAS;AAAA;;;;;cAMxC,4BAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,2BAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAmCS,yBAAA;EAA8B,SAAS;AAAA;;;AA3XzC;AA+CV;;cAmVa,mBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,yBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA"}
1
+ {"version":3,"file":"showcaseProject.controller.d.ts","names":[],"sources":["../../../src/controllers/showcaseProject.controller.ts"],"mappings":";;;;;;cAoCM,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;;;KAUb,yBAAA,GAA4B,CAAA,CAAE,KAAK,QAAQ,mBAAA;AAAA,KAC3C,2BAAA,GAA8B,YAAY,CAAC,kBAAA;;;;;cAM1C,qBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,yBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA0GS,wBAAA;EACV,IAAA;EACA,QAAA;EACA,MAAA;EACA,gBAAA;EACA,YAAA;AAAA;AAAA,KAEU,yBAAA,GAA4B,iBAAiB,CAAC,kBAAA;;;;cAK7C,mBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,WAAA,EAAa,wBAAA;AAAA,IACvC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA+CS,4BAAA;EAAiC,SAAS;AAAA;AAAA,KAC1C,4BAAA,GAA+B,YAAY,CAAC,kBAAA;;;;cAK3C,sBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,4BAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAqBS,6BAAA;EACV,SAAA;EACA,KAAK;AAAA;AAAA,KAEK,8BAAA,GAAiC,YAAY,CAAC,kBAAA;;;;cAK7C,wBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,WAAA,EAAa,6BAAA;AAAA,IACvC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAgCS,wBAAA;EAA6B,SAAS;AAAA;AAAA,KACtC,0BAAA,GAA6B,YAAY;EACnD,OAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA;AAAA;;;AAjQwE;AAC1E;cAuQa,oBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,wBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAkCS,0BAAA;EAA+B,SAAS;AAAA;AAAA,KACxC,4BAAA,GAA+B,YAAY;EACrD,OAAA;EACA,SAAA;EACA,SAAA;EACA,WAAA;AAAA;;;;;cAOW,sBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,0BAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAgCG,mBAAA,EAAmB,CAAA,CAAA,SAAA;;;;;;;;KAsBb,yBAAA,GAA4B,CAAA,CAAE,KAAK,QAAQ,mBAAA;AAAA,KAC3C,2BAAA;EAAgC,SAAS;AAAA;AAAA,KACzC,2BAAA,GAA8B,YAAY,CAAC,kBAAA;AA3PzC;AAEd;;;AAFc,cAiQD,4BAAA,GACX,OAAA,EAAS,cAAA;EACP,MAAA,EAAQ,2BAAA;EACR,IAAA,EAAM,yBAAA;AAAA,IAER,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAiFS,2BAAA;EAAgC,SAAS;AAAA;;;;;cAMxC,4BAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,2BAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAmCS,yBAAA;EAA8B,SAAS;AAAA;;;AA1XzC;AA+CV;;cAkVa,mBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,yBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"translation.controller.d.ts","names":[],"sources":["../../../src/controllers/translation.controller.ts"],"mappings":";;;;;KAiBY,yBAAA;EACV,aAAA;EACA,aAAA,EAAe,MAAM;EACrB,IAAA;AAAA;AAAA,KAEU,2BAAA,GAA8B,YAAY;EAAG,KAAK;AAAA;AAAA,cAEjD,qBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,yBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAmGU,mBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA;IAAU,KAAA;EAAA;AAAA,IACpC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAWU,oBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA;IAAU,KAAA;EAAA;AAAA,IACpC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAWU,kBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA;IAAU,KAAA;EAAA;AAAA,IACpC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAqBU,mBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA;IAAU,KAAA;EAAA;AAAA,IACpC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAgBU,qBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA;IAAU,KAAA;EAAA;AAAA,IACpC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAeU,oBAAA,GACX,OAAA,EAAS,cAAA,EACT,KAAA,EAAO,YAAA,KACN,OAAA"}
1
+ {"version":3,"file":"translation.controller.d.ts","names":[],"sources":["../../../src/controllers/translation.controller.ts"],"mappings":";;;;;KAiBY,yBAAA;EACV,aAAA;EACA,aAAA,EAAe,MAAM;EACrB,IAAA;AAAA;AAAA,KAEU,2BAAA,GAA8B,YAAY;EAAG,KAAK;AAAA;AAAA,cAEjD,qBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,yBAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAkGU,mBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA;IAAU,KAAA;EAAA;AAAA,IACpC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAWU,oBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA;IAAU,KAAA;EAAA;AAAA,IACpC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAWU,kBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA;IAAU,KAAA;EAAA;AAAA,IACpC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAqBU,mBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA;IAAU,KAAA;EAAA;AAAA,IACpC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAgBU,qBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA;IAAU,KAAA;EAAA;AAAA,IACpC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAeU,oBAAA,GACX,OAAA,EAAS,cAAA,EACT,KAAA,EAAO,YAAA,KACN,OAAA"}
@@ -1 +1 @@
1
- {"version":3,"file":"user.controller.d.ts","names":[],"sources":["../../../src/controllers/user.controller.ts"],"mappings":";;;;;;;KA0BY,cAAA;EAAmB,KAAA;EAAe,QAAQ;AAAA;AAAA,KAC1C,gBAAA,GAAmB,YAAY,CAAC,OAAA;;AADU;AACtD;cAKa,UAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,IAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAqES,cAAA,GAAiB,oBAAoB,CAAC,gBAAA;AAAA,KACtC,cAAA,GAAiB,iBAAiB,CAAC,OAAA;;;;cAKlC,QAAA,GACX,OAAA,EAAS,cAAA;EAAiB,WAAA,EAAa,cAAA;AAAA,IACvC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAsDS,iBAAA;EAAsB,MAAA,EAAQ,OAAO;AAAA;AAAA,KACrC,iBAAA,GAAoB,YAAY,CAAC,OAAA;AAAA,cAEhC,WAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,iBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA+BS,oBAAA;EAAyB,KAAK;AAAA;AAAA,KAC9B,oBAAA,GAAuB,YAAY,CAAC,OAAA;AAAA,cAEnC,cAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,oBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAuCS,cAAA,GAAiB,OAAO,CAAC,OAAA;AAAA,KACzB,gBAAA,GAAmB,YAAY,CAAC,OAAA;AAjJ5C;;;AAAA,cAsJa,UAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,cAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAkGS,gBAAA;EAAqB,MAAM;AAAA;AAAA,KAC3B,gBAAA,GAAmB,YAAY,CAAC,OAAA;;;;cAK/B,UAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,gBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA+ES,sBAAA,GAAyB,YAAY,CAAC,OAAA;;;;;;cAOrC,YAAA,GACX,OAAA,EAAS,cAAA,EACT,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cAiHU,sBAAA,GAA0B,IAAU,EAAJ,IAAI;AAAA,KAcrC,0BAAA;EAA+B,MAAM;AAAA;AA9ZA;AACjD;;AADiD,cAmapC,oBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,0BAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KAAY,OAAA"}
1
+ {"version":3,"file":"user.controller.d.ts","names":[],"sources":["../../../src/controllers/user.controller.ts"],"mappings":";;;;;;;KA0BY,cAAA;EAAmB,KAAA;EAAe,QAAQ;AAAA;AAAA,KAC1C,gBAAA,GAAmB,YAAY,CAAC,OAAA;;AADU;AACtD;cAKa,UAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,IAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAqES,cAAA,GAAiB,oBAAoB,CAAC,gBAAA;AAAA,KACtC,cAAA,GAAiB,iBAAiB,CAAC,OAAA;;;;cAKlC,QAAA,GACX,OAAA,EAAS,cAAA;EAAiB,WAAA,EAAa,cAAA;AAAA,IACvC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAsDS,iBAAA;EAAsB,MAAA,EAAQ,OAAO;AAAA;AAAA,KACrC,iBAAA,GAAoB,YAAY,CAAC,OAAA;AAAA,cAEhC,WAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,iBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA+BS,oBAAA;EAAyB,KAAK;AAAA;AAAA,KAC9B,oBAAA,GAAuB,YAAY,CAAC,OAAA;AAAA,cAEnC,cAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,oBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAuCS,cAAA,GAAiB,OAAO,CAAC,OAAA;AAAA,KACzB,gBAAA,GAAmB,YAAY,CAAC,OAAA;AAjJ5C;;;AAAA,cAsJa,UAAA,GACX,OAAA,EAAS,cAAA;EAAiB,IAAA,EAAM,cAAA;AAAA,IAChC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KAkGS,gBAAA;EAAqB,MAAM;AAAA;AAAA,KAC3B,gBAAA,GAAmB,YAAY,CAAC,OAAA;;;;cAK/B,UAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,gBAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,KA+ES,sBAAA,GAAyB,YAAY,CAAC,OAAA;;;;;;cAOrC,YAAA,GACX,OAAA,EAAS,cAAA,EACT,KAAA,EAAO,YAAA,KACN,OAAA;AAAA,cA2GU,sBAAA,GAA0B,IAAU,EAAJ,IAAI;AAAA,KAcrC,0BAAA;EAA+B,MAAM;AAAA;AAxZA;AACjD;;AADiD,cA6ZpC,oBAAA,GACX,OAAA,EAAS,cAAA;EAAiB,MAAA,EAAQ,0BAAA;AAAA,IAClC,KAAA,EAAO,YAAA,KAAY,OAAA"}
@@ -1,4 +1,4 @@
1
- import { Account } from "../types/account.types.js";
1
+ import { Account, AccountModelType } from "../types/account.types.js";
2
2
  import { Schema } from "mongoose";
3
3
 
4
4
  //#region src/schemas/account.schema.d.ts
@@ -513,6 +513,7 @@ declare const accountSchema: Schema<Account, import("mongoose").Model<Account, a
513
513
  __v: number;
514
514
  }>;
515
515
  }, Account>;
516
+ declare const AccountModel: AccountModelType;
516
517
  //#endregion
517
- export { accountSchema };
518
+ export { AccountModel, accountSchema };
518
519
  //# sourceMappingURL=account.schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"account.schema.d.ts","names":[],"sources":["../../../src/schemas/account.schema.ts"],"mappings":";;;;cAGa,aAAA,EAAa,MAAA,CA0EzB,OAAA,qBA1EyB,KAAA,CAAA,OAAA,2BAAA,OAAA,sCAAA,oBAAA,EAAA,OAAA,qBAAA,QAAA,cAAA,OAAA,yBAAA,oBAAA"}
1
+ {"version":3,"file":"account.schema.d.ts","names":[],"sources":["../../../src/schemas/account.schema.ts"],"mappings":";;;;cAGa,aAAA,EAAa,MAAA,CA0EzB,OAAA,qBA1EyB,KAAA,CAAA,OAAA,2BAAA,OAAA,sCAAA,oBAAA,EAAA,OAAA,qBAAA,QAAA,cAAA,OAAA,yBAAA,oBAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;cA4Eb,YAAA,EAAY,gBAGxB"}
@@ -0,0 +1,64 @@
1
+ import mongoose, { Document } from "mongoose";
2
+
3
+ //#region src/schemas/audit.schema.d.ts
4
+ interface IAudit extends Document {
5
+ domain: string;
6
+ score: number;
7
+ createdAt: Date;
8
+ }
9
+ declare const auditSchema: mongoose.Schema<IAudit, mongoose.Model<IAudit, any, any, any, any, any, IAudit>, {}, {}, {}, {}, mongoose.DefaultSchemaOptions, IAudit, mongoose.Document<unknown, {}, IAudit, {
10
+ id: string;
11
+ }, mongoose.DefaultSchemaOptions> & Omit<IAudit & Required<{
12
+ _id: mongoose.Types.ObjectId;
13
+ }> & {
14
+ __v: number;
15
+ }, "id"> & {
16
+ id: string;
17
+ }, {
18
+ _id?: mongoose.SchemaDefinitionProperty<mongoose.Types.ObjectId, IAudit, mongoose.Document<unknown, {}, IAudit, {
19
+ id: string;
20
+ }, mongoose.DefaultSchemaOptions> & Omit<IAudit & Required<{
21
+ _id: mongoose.Types.ObjectId;
22
+ }> & {
23
+ __v: number;
24
+ }, "id"> & {
25
+ id: string;
26
+ }>;
27
+ createdAt?: mongoose.SchemaDefinitionProperty<Date, IAudit, mongoose.Document<unknown, {}, IAudit, {
28
+ id: string;
29
+ }, mongoose.DefaultSchemaOptions> & Omit<IAudit & Required<{
30
+ _id: mongoose.Types.ObjectId;
31
+ }> & {
32
+ __v: number;
33
+ }, "id"> & {
34
+ id: string;
35
+ }>;
36
+ domain?: mongoose.SchemaDefinitionProperty<string, IAudit, mongoose.Document<unknown, {}, IAudit, {
37
+ id: string;
38
+ }, mongoose.DefaultSchemaOptions> & Omit<IAudit & Required<{
39
+ _id: mongoose.Types.ObjectId;
40
+ }> & {
41
+ __v: number;
42
+ }, "id"> & {
43
+ id: string;
44
+ }>;
45
+ score?: mongoose.SchemaDefinitionProperty<number, IAudit, mongoose.Document<unknown, {}, IAudit, {
46
+ id: string;
47
+ }, mongoose.DefaultSchemaOptions> & Omit<IAudit & Required<{
48
+ _id: mongoose.Types.ObjectId;
49
+ }> & {
50
+ __v: number;
51
+ }, "id"> & {
52
+ id: string;
53
+ }>;
54
+ }, IAudit>;
55
+ declare const AuditModel: mongoose.Model<IAudit, {}, {}, {}, mongoose.Document<unknown, {}, IAudit, {}, mongoose.DefaultSchemaOptions> & IAudit & Required<{
56
+ _id: mongoose.Types.ObjectId;
57
+ }> & {
58
+ __v: number;
59
+ } & {
60
+ id: string;
61
+ }, any, IAudit>;
62
+ //#endregion
63
+ export { AuditModel, IAudit, auditSchema };
64
+ //# sourceMappingURL=audit.schema.d.ts.map