@intlayer/backend 5.7.3 → 5.7.5

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 (127) hide show
  1. package/dist/cjs/controllers/dictionary.controller.cjs.map +1 -1
  2. package/dist/cjs/controllers/newsletter.controller.cjs +12 -13
  3. package/dist/cjs/controllers/newsletter.controller.cjs.map +1 -1
  4. package/dist/cjs/controllers/organization.controller.cjs +28 -41
  5. package/dist/cjs/controllers/organization.controller.cjs.map +1 -1
  6. package/dist/cjs/controllers/project.controller.cjs +7 -1
  7. package/dist/cjs/controllers/project.controller.cjs.map +1 -1
  8. package/dist/cjs/controllers/projectAccessKey.controller.cjs +9 -3
  9. package/dist/cjs/controllers/projectAccessKey.controller.cjs.map +1 -1
  10. package/dist/cjs/controllers/stripe.controller.cjs +15 -3
  11. package/dist/cjs/controllers/stripe.controller.cjs.map +1 -1
  12. package/dist/cjs/controllers/tag.controller.cjs +4 -6
  13. package/dist/cjs/controllers/tag.controller.cjs.map +1 -1
  14. package/dist/cjs/controllers/user.controller.cjs +19 -14
  15. package/dist/cjs/controllers/user.controller.cjs.map +1 -1
  16. package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs +5 -7
  17. package/dist/cjs/emails/OAuthTokenCreatedEmail.cjs.map +1 -1
  18. package/dist/cjs/schemas/dictionary.schema.cjs +1 -1
  19. package/dist/cjs/schemas/dictionary.schema.cjs.map +1 -1
  20. package/dist/cjs/schemas/discussion.schema.cjs +1 -1
  21. package/dist/cjs/schemas/discussion.schema.cjs.map +1 -1
  22. package/dist/cjs/schemas/oAuth2.schema.cjs +1 -1
  23. package/dist/cjs/schemas/oAuth2.schema.cjs.map +1 -1
  24. package/dist/cjs/schemas/organization.schema.cjs +1 -1
  25. package/dist/cjs/schemas/organization.schema.cjs.map +1 -1
  26. package/dist/cjs/schemas/plans.schema.cjs +1 -1
  27. package/dist/cjs/schemas/plans.schema.cjs.map +1 -1
  28. package/dist/cjs/schemas/project.schema.cjs +1 -1
  29. package/dist/cjs/schemas/project.schema.cjs.map +1 -1
  30. package/dist/cjs/schemas/session.schema.cjs +1 -1
  31. package/dist/cjs/schemas/session.schema.cjs.map +1 -1
  32. package/dist/cjs/schemas/tag.schema.cjs +1 -1
  33. package/dist/cjs/schemas/tag.schema.cjs.map +1 -1
  34. package/dist/cjs/schemas/user.schema.cjs +1 -1
  35. package/dist/cjs/schemas/user.schema.cjs.map +1 -1
  36. package/dist/cjs/types/organization.types.cjs.map +1 -1
  37. package/dist/cjs/types/project.types.cjs.map +1 -1
  38. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs +3 -0
  39. package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs.map +1 -1
  40. package/dist/cjs/utils/auth/getAuth.cjs +8 -5
  41. package/dist/cjs/utils/auth/getAuth.cjs.map +1 -1
  42. package/dist/cjs/utils/errors/errorCodes.cjs +13 -0
  43. package/dist/cjs/utils/errors/errorCodes.cjs.map +1 -1
  44. package/dist/cjs/utils/mapper/project.cjs +1 -2
  45. package/dist/cjs/utils/mapper/project.cjs.map +1 -1
  46. package/dist/cjs/utils/mapper/session.cjs +37 -0
  47. package/dist/cjs/utils/mapper/session.cjs.map +1 -0
  48. package/dist/cjs/utils/permissions.cjs +51 -34
  49. package/dist/cjs/utils/permissions.cjs.map +1 -1
  50. package/dist/cjs/utils/validation/validateArray.cjs +5 -1
  51. package/dist/cjs/utils/validation/validateArray.cjs.map +1 -1
  52. package/dist/esm/controllers/dictionary.controller.mjs.map +1 -1
  53. package/dist/esm/controllers/newsletter.controller.mjs +12 -13
  54. package/dist/esm/controllers/newsletter.controller.mjs.map +1 -1
  55. package/dist/esm/controllers/organization.controller.mjs +28 -41
  56. package/dist/esm/controllers/organization.controller.mjs.map +1 -1
  57. package/dist/esm/controllers/project.controller.mjs +7 -1
  58. package/dist/esm/controllers/project.controller.mjs.map +1 -1
  59. package/dist/esm/controllers/projectAccessKey.controller.mjs +10 -4
  60. package/dist/esm/controllers/projectAccessKey.controller.mjs.map +1 -1
  61. package/dist/esm/controllers/stripe.controller.mjs +15 -3
  62. package/dist/esm/controllers/stripe.controller.mjs.map +1 -1
  63. package/dist/esm/controllers/tag.controller.mjs +4 -6
  64. package/dist/esm/controllers/tag.controller.mjs.map +1 -1
  65. package/dist/esm/controllers/user.controller.mjs +19 -14
  66. package/dist/esm/controllers/user.controller.mjs.map +1 -1
  67. package/dist/esm/emails/OAuthTokenCreatedEmail.mjs +5 -7
  68. package/dist/esm/emails/OAuthTokenCreatedEmail.mjs.map +1 -1
  69. package/dist/esm/schemas/dictionary.schema.mjs +1 -1
  70. package/dist/esm/schemas/dictionary.schema.mjs.map +1 -1
  71. package/dist/esm/schemas/discussion.schema.mjs +1 -1
  72. package/dist/esm/schemas/discussion.schema.mjs.map +1 -1
  73. package/dist/esm/schemas/oAuth2.schema.mjs +1 -1
  74. package/dist/esm/schemas/oAuth2.schema.mjs.map +1 -1
  75. package/dist/esm/schemas/organization.schema.mjs +1 -1
  76. package/dist/esm/schemas/organization.schema.mjs.map +1 -1
  77. package/dist/esm/schemas/plans.schema.mjs +1 -1
  78. package/dist/esm/schemas/plans.schema.mjs.map +1 -1
  79. package/dist/esm/schemas/project.schema.mjs +1 -1
  80. package/dist/esm/schemas/project.schema.mjs.map +1 -1
  81. package/dist/esm/schemas/session.schema.mjs +1 -1
  82. package/dist/esm/schemas/session.schema.mjs.map +1 -1
  83. package/dist/esm/schemas/tag.schema.mjs +1 -1
  84. package/dist/esm/schemas/tag.schema.mjs.map +1 -1
  85. package/dist/esm/schemas/user.schema.mjs +1 -1
  86. package/dist/esm/schemas/user.schema.mjs.map +1 -1
  87. package/dist/esm/utils/AI/askDocQuestion/askDocQuestion.mjs +3 -0
  88. package/dist/esm/utils/AI/askDocQuestion/askDocQuestion.mjs.map +1 -1
  89. package/dist/esm/utils/auth/getAuth.mjs +8 -5
  90. package/dist/esm/utils/auth/getAuth.mjs.map +1 -1
  91. package/dist/esm/utils/errors/errorCodes.mjs +13 -0
  92. package/dist/esm/utils/errors/errorCodes.mjs.map +1 -1
  93. package/dist/esm/utils/mapper/project.mjs +1 -2
  94. package/dist/esm/utils/mapper/project.mjs.map +1 -1
  95. package/dist/esm/utils/mapper/session.mjs +13 -0
  96. package/dist/esm/utils/mapper/session.mjs.map +1 -0
  97. package/dist/esm/utils/permissions.mjs +51 -34
  98. package/dist/esm/utils/permissions.mjs.map +1 -1
  99. package/dist/esm/utils/validation/validateArray.mjs +5 -1
  100. package/dist/esm/utils/validation/validateArray.mjs.map +1 -1
  101. package/dist/types/controllers/dictionary.controller.d.ts.map +1 -1
  102. package/dist/types/controllers/newsletter.controller.d.ts.map +1 -1
  103. package/dist/types/controllers/organization.controller.d.ts +3 -5
  104. package/dist/types/controllers/organization.controller.d.ts.map +1 -1
  105. package/dist/types/controllers/project.controller.d.ts.map +1 -1
  106. package/dist/types/controllers/projectAccessKey.controller.d.ts.map +1 -1
  107. package/dist/types/controllers/stripe.controller.d.ts +4 -1
  108. package/dist/types/controllers/stripe.controller.d.ts.map +1 -1
  109. package/dist/types/controllers/tag.controller.d.ts.map +1 -1
  110. package/dist/types/controllers/user.controller.d.ts.map +1 -1
  111. package/dist/types/emails/OAuthTokenCreatedEmail.d.ts.map +1 -1
  112. package/dist/types/types/organization.types.d.ts +1 -3
  113. package/dist/types/types/organization.types.d.ts.map +1 -1
  114. package/dist/types/types/project.types.d.ts +1 -3
  115. package/dist/types/types/project.types.d.ts.map +1 -1
  116. package/dist/types/utils/AI/askDocQuestion/askDocQuestion.d.ts.map +1 -1
  117. package/dist/types/utils/auth/getAuth.d.ts +2 -2
  118. package/dist/types/utils/auth/getAuth.d.ts.map +1 -1
  119. package/dist/types/utils/errors/errorCodes.d.ts +13 -0
  120. package/dist/types/utils/errors/errorCodes.d.ts.map +1 -1
  121. package/dist/types/utils/mapper/project.d.ts.map +1 -1
  122. package/dist/types/utils/mapper/session.d.ts +4 -0
  123. package/dist/types/utils/mapper/session.d.ts.map +1 -0
  124. package/dist/types/utils/permissions.d.ts +32 -28
  125. package/dist/types/utils/permissions.d.ts.map +1 -1
  126. package/dist/types/utils/validation/validateArray.d.ts.map +1 -1
  127. package/package.json +8 -8
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../src/utils/AI/askDocQuestion/askDocQuestion.ts"],"sourcesContent":["import { getBlogs, getDocs, getFrequentQuestions } from '@intlayer/docs';\nimport { streamText } from 'ai';\nimport dotenv from 'dotenv';\nimport { readFileSync, writeFileSync } from 'fs';\nimport { getMarkdownMetadata } from 'intlayer';\nimport { OpenAI } from 'openai';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport {\n AIConfig,\n AIOptions,\n AIProvider,\n ChatCompletionRequestMessage,\n} from '../aiSdk';\nimport embeddingsList from './embeddings.json' with { type: 'json' };\n\ntype VectorStoreEl = {\n fileKey: string;\n chunkNumber: number;\n content: string;\n embedding: number[];\n docUrl: string;\n docName: string;\n};\n\n/**\n * Simple in-memory vector store to hold document embeddings and their content.\n * Each entry contains:\n * - fileKey: A unique key identifying the file\n * - chunkNumber: The number of the chunk within the document\n * - content: The chunk content\n * - embedding: The numerical embedding vector for the chunk\n */\nconst vectorStore: VectorStoreEl[] = [];\n\n/*\n * Ask question AI configuration\n */\nconst MODEL: AIOptions['model'] = 'chatgpt-4o-latest'; // Model to use for chat completions\nconst MODEL_TEMPERATURE: AIOptions['temperature'] = 0.1; // Temperature to use for chat completions\nconst MAX_RELEVANT_CHUNKS_NB: number = 20; // Maximum number of relevant chunks to attach to chatGPT context\nconst MIN_RELEVANT_CHUNKS_SIMILARITY: number = 0.42; // Minimum similarity required for a chunk to be considered relevant\n\nexport const aiDefaultOptions: AIOptions = {\n provider: AIProvider.OPENAI,\n model: MODEL,\n temperature: MODEL_TEMPERATURE,\n};\n\n/*\n * Embedding model configuration\n */\nconst EMBEDDING_MODEL: OpenAI.EmbeddingModel = 'text-embedding-3-large'; // Model to use for embedding generation\nconst OVERLAP_TOKENS: number = 200; // Number of tokens to overlap between chunks\nconst MAX_CHUNK_TOKENS: number = 800; // Maximum number of tokens per chunk\nconst CHAR_BY_TOKEN: number = 4.15; // Approximate pessimistically the number of characters per token // Can use `tiktoken` or other tokenizers to calculate it more precisely\nconst MAX_CHARS: number = MAX_CHUNK_TOKENS * CHAR_BY_TOKEN;\nconst OVERLAP_CHARS: number = OVERLAP_TOKENS * CHAR_BY_TOKEN;\n\n/**\n * Splits a given text into chunks ensuring each chunk does not exceed MAX_CHARS.\n * @param text - The input text to split.\n * @returns - Array of text chunks.\n */\nconst chunkText = (text: string): string[] => {\n const chunks: string[] = [];\n let start = 0;\n\n while (start < text.length) {\n let end = Math.min(start + MAX_CHARS, text.length);\n\n // Ensure we don't cut words in the middle (find nearest space)\n if (end < text.length) {\n const lastSpace = text.lastIndexOf(' ', end);\n if (lastSpace > start) {\n end = lastSpace;\n }\n }\n\n chunks.push(text.substring(start, end));\n\n // Move start forward correctly\n const nextStart = end - OVERLAP_CHARS;\n if (nextStart <= start) {\n // Prevent infinite loop if overlap is too large\n start = end;\n } else {\n start = nextStart;\n }\n }\n\n return chunks;\n};\n\n/**\n * Generates an embedding for a given text using OpenAI's embedding API.\n * Trims the text if it exceeds the maximum allowed characters.\n *\n * @param text - The input text to generate an embedding for\n * @returns The embedding vector as a number array\n */\nconst generateEmbedding = async (text: string): Promise<number[]> => {\n try {\n const openaiClient = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });\n\n const response = await openaiClient.embeddings.create({\n model: EMBEDDING_MODEL,\n input: text,\n });\n\n return response.data[0].embedding;\n } catch (error) {\n console.error('Error generating embedding:', error);\n return [];\n }\n};\n\n/**\n * Calculates the cosine similarity between two vectors.\n * Cosine similarity measures the cosine of the angle between two vectors in an inner product space.\n * Used to determine the similarity between chunks of text.\n *\n * @param vecA - The first vector\n * @param vecB - The second vector\n * @returns The cosine similarity score\n */\nconst cosineSimilarity = (vecA: number[], vecB: number[]): number => {\n // Calculate the dot product of the two vectors\n const dotProduct = vecA.reduce((sum, a, idx) => sum + a * vecB[idx], 0);\n\n // Calculate the magnitude (Euclidean norm) of each vector\n const magnitudeA = Math.sqrt(vecA.reduce((sum, a) => sum + a * a, 0));\n const magnitudeB = Math.sqrt(vecB.reduce((sum, b) => sum + b * b, 0));\n\n // Compute and return the cosine similarity\n return dotProduct / (magnitudeA * magnitudeB);\n};\n\n/**\n * Indexes all Markdown documents by generating embeddings for each chunk and storing them in memory.\n * Also updates the embeddings.json file if new embeddings are generated.\n * Handles cases where files have been updated and chunk counts have changed.\n */\nexport const indexMarkdownFiles = async (): Promise<void> => {\n const env = process.env.NODE_ENV;\n dotenv.config({\n path: [`.env.${env}.local`, `.env.${env}`, '.env.local', '.env'],\n });\n\n // Retrieve documentation and blog posts in English locale\n const frequentQuestions = await getFrequentQuestions();\n const docs = await getDocs();\n const blogs = await getBlogs();\n\n let result: Record<string, number[]> = {}; // Object to hold updated embeddings\n const currentChunkKeys = new Set<string>(); // Track which chunks should exist\n\n const files = { ...docs, ...blogs, ...frequentQuestions }; // Combine docs and blogs into a single object\n\n // Iterate over each file key (identifier) in the combined files\n for await (const fileKey of Object.keys(files)) {\n // Get the metadata of the file\n const fileMetadata = getMarkdownMetadata(\n files[fileKey as keyof typeof files] as string\n );\n\n // Split the document into chunks based on headings\n const fileChunks = chunkText(\n files[fileKey as keyof typeof files] as string\n );\n\n // Check if the number of chunks has changed for this file\n const existingChunksForFile = Object.keys(embeddingsList).filter((key) =>\n key.startsWith(`${fileKey}/chunk_`)\n );\n const currentChunkCount = fileChunks.length;\n const previousChunkCount = existingChunksForFile.length;\n\n let shouldRegenerateFileEmbeddings = false;\n\n // If chunk count differs, we need to regenerate embeddings for this file\n if (currentChunkCount !== previousChunkCount) {\n console.info(\n `File \"${fileKey}\" chunk count changed: ${previousChunkCount} -> ${currentChunkCount}. Regenerating embeddings.`\n );\n shouldRegenerateFileEmbeddings = true;\n }\n\n // Iterate over each chunk within the current file\n for await (const chunkIndex of Object.keys(fileChunks)) {\n const chunkNumber = Number(chunkIndex) + 1; // Chunk number starts at 1\n const chunksNumber = fileChunks.length;\n\n const fileChunk = fileChunks[\n chunkIndex as keyof typeof fileChunks\n ] as string;\n\n const embeddingKeyName = `${fileKey}/chunk_${chunkNumber}`; // Unique key for the chunk\n currentChunkKeys.add(embeddingKeyName); // Track this chunk as current\n\n // Retrieve precomputed embedding if available and file hasn't changed\n const docEmbedding = !shouldRegenerateFileEmbeddings\n ? (embeddingsList[embeddingKeyName as keyof typeof embeddingsList] as\n | number[]\n | undefined)\n : undefined;\n\n let embedding = docEmbedding; // Use existing embedding if available and valid\n\n if (!embedding) {\n embedding = await generateEmbedding(fileChunk); // Generate embedding if not present or file changed\n console.info(`- Generated new embedding: ${embeddingKeyName}`);\n }\n\n // Update the result object with the embedding\n result = { ...result, [embeddingKeyName]: embedding };\n\n // Store the embedding and content in the in-memory vector store\n vectorStore.push({\n fileKey,\n chunkNumber,\n embedding,\n content: fileChunk,\n docUrl: fileMetadata.url,\n docName: fileMetadata.title,\n });\n\n console.info(`- Indexed: ${embeddingKeyName}/${chunksNumber}`);\n }\n }\n\n // Remove outdated embeddings that no longer exist in current files\n const filteredEmbeddings: Record<string, number[]> = {};\n for (const [key, embedding] of Object.entries(embeddingsList)) {\n if (currentChunkKeys.has(key)) {\n // Only keep embeddings for chunks that still exist\n if (!result[key]) {\n filteredEmbeddings[key] = embedding as number[];\n }\n }\n }\n\n // Merge filtered existing embeddings with new ones\n result = { ...filteredEmbeddings, ...result };\n\n if (process.env.NODE_ENV === 'development') {\n try {\n // Compare the newly generated embeddings with existing ones\n if (JSON.stringify(result) !== JSON.stringify(embeddingsList)) {\n // If there are new embeddings or changes, save them to embeddings.json\n writeFileSync(\n 'src/utils/AI/askDocQuestion/embeddings.json',\n JSON.stringify(result, null, 2)\n );\n console.info('Updated embeddings.json with new/changed embeddings.');\n }\n } catch (error) {\n console.error(error); // Log any errors during the file write process\n }\n }\n};\n\n// Automatically index Markdown files\nindexMarkdownFiles();\n\n/**\n * Searches the indexed documents for the most relevant chunks based on a query.\n * Utilizes cosine similarity to find the closest matching embeddings.\n *\n * @param query - The search query provided by the user\n * @returns An array of the top matching document chunks' content\n */\nexport const searchChunkReference = async (\n query: string,\n maxResults: number = MAX_RELEVANT_CHUNKS_NB,\n minSimilarity: number = MIN_RELEVANT_CHUNKS_SIMILARITY\n): Promise<VectorStoreEl[]> => {\n // Generate an embedding for the user's query\n const queryEmbedding = await generateEmbedding(query);\n\n // Calculate similarity scores between the query embedding and each document's embedding\n const selection = vectorStore\n .map((chunk) => ({\n ...chunk,\n similarity: cosineSimilarity(queryEmbedding, chunk.embedding), // Add similarity score to each doc\n }))\n .filter((chunk) => chunk.similarity > minSimilarity) // Filter out documents with low similarity scores\n .sort((a, b) => b.similarity - a.similarity) // Sort documents by highest similarity first\n .slice(0, maxResults); // Select the top 6 most similar documents\n\n const orderedDocKeys = new Set(selection.map((chunk) => chunk.fileKey));\n\n const orderedVectorStore = vectorStore.sort((a, b) =>\n orderedDocKeys.has(a.fileKey) ? -1 : 1\n );\n\n const results = orderedVectorStore.filter((chunk) =>\n selection.some(\n (v) => v.fileKey === chunk.fileKey && v.chunkNumber === chunk.chunkNumber\n )\n );\n\n console.log({ orderedDocKeys });\n\n // Return the content of the top matching documents\n return results;\n};\n\n/**\n * Reads the content of a file synchronously.\n *\n * @function\n * @param relativeFilePath - The relative or absolute path to the target file.\n * @returns The entire contents of the specified file as a UTF-8 encoded string.\n */\nconst getFileContent = (relativeFilePath: string): string => {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const absolutePath = join(__dirname, relativeFilePath);\n const fileContent = readFileSync(absolutePath, 'utf-8');\n return fileContent;\n};\n\nconst CHAT_GPT_PROMPT = getFileContent('./PROMPT.md');\n\n// Initial prompt configuration for the chatbot\nexport const initPrompt: ChatCompletionRequestMessage = {\n role: 'system',\n content: CHAT_GPT_PROMPT,\n};\n\nexport type AskDocQuestionResult = {\n response: string;\n relatedFiles: string[];\n};\n\nexport type AskDocQuestionOptions = {\n onMessage?: (chunk: string) => void;\n};\n\n/**\n * Handles the \"Ask a question\" endpoint in an Express.js route.\n * Processes user messages, retrieves relevant documents, and interacts with AI models to generate responses.\n *\n * @param messages - An array of chat messages from the user and assistant\n * @returns The assistant's response as a string\n */\nexport const askDocQuestion = async (\n messages: ChatCompletionRequestMessage[],\n aiConfig: AIConfig,\n options?: AskDocQuestionOptions\n): Promise<AskDocQuestionResult> => {\n // Format the user's question to keep only the relevant keywords\n const query = messages\n .filter((message) => message.role === 'user')\n .map((message) => `- ${message.content}`)\n .join('\\n');\n\n // 1) Find relevant documents based on the user's question\n const relevantFilesReferences = await searchChunkReference(query);\n\n // 2) Integrate the relevant documents into the initial system prompt\n const systemPrompt = initPrompt.content.replace(\n '{{relevantFilesReferences}}',\n relevantFilesReferences.length === 0\n ? 'Not relevant file found related to the question.'\n : relevantFilesReferences\n .map((doc, idx) =>\n [\n '-----',\n '---',\n `chunkId: ${idx}`,\n `docChunk: \"${doc.chunkNumber}/${doc.fileKey.length}\"`,\n `docName: \"${doc.docName}\"`,\n `docUrl: \"${doc.docUrl}\"`,\n `---`,\n doc.content,\n `-----`,\n ].join('\\n')\n )\n .join('\\n\\n') // Insert relevant docs into the prompt\n );\n\n // Format messages for AI SDK\n const aiMessages = [\n {\n role: 'system' as const,\n content: systemPrompt,\n },\n ...messages.slice(-8),\n ];\n\n if (!aiConfig) {\n throw new Error('Failed to initialize AI configuration');\n }\n\n // 3) Use the AI SDK to stream the response\n let fullResponse = '';\n const stream = streamText({\n ...aiConfig,\n messages: aiMessages,\n });\n\n // Process the stream\n for await (const chunk of stream.textStream) {\n fullResponse += chunk;\n options?.onMessage?.(chunk);\n }\n\n // 4) Extract unique related files\n const relatedFiles = [\n ...new Set(relevantFilesReferences.map((doc) => doc.fileKey)),\n ];\n\n // 5) Return the assistant's response to the user\n return {\n response: fullResponse ?? 'Error: No result found',\n relatedFiles,\n };\n};\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../../src/utils/AI/askDocQuestion/askDocQuestion.ts"],"sourcesContent":["import { getBlogs, getDocs, getFrequentQuestions } from '@intlayer/docs';\nimport { streamText } from 'ai';\nimport dotenv from 'dotenv';\nimport { readFileSync, writeFileSync } from 'fs';\nimport { getMarkdownMetadata } from 'intlayer';\nimport { OpenAI } from 'openai';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport {\n AIConfig,\n AIOptions,\n AIProvider,\n ChatCompletionRequestMessage,\n} from '../aiSdk';\nimport embeddingsList from './embeddings.json' with { type: 'json' };\n\ntype VectorStoreEl = {\n fileKey: string;\n chunkNumber: number;\n content: string;\n embedding: number[];\n docUrl: string;\n docName: string;\n};\n\n/**\n * Simple in-memory vector store to hold document embeddings and their content.\n * Each entry contains:\n * - fileKey: A unique key identifying the file\n * - chunkNumber: The number of the chunk within the document\n * - content: The chunk content\n * - embedding: The numerical embedding vector for the chunk\n */\nconst vectorStore: VectorStoreEl[] = [];\n\n/*\n * Ask question AI configuration\n */\nconst MODEL: AIOptions['model'] = 'chatgpt-4o-latest'; // Model to use for chat completions\nconst MODEL_TEMPERATURE: AIOptions['temperature'] = 0.1; // Temperature to use for chat completions\nconst MAX_RELEVANT_CHUNKS_NB: number = 20; // Maximum number of relevant chunks to attach to chatGPT context\nconst MIN_RELEVANT_CHUNKS_SIMILARITY: number = 0.42; // Minimum similarity required for a chunk to be considered relevant\n\nexport const aiDefaultOptions: AIOptions = {\n provider: AIProvider.OPENAI,\n model: MODEL,\n temperature: MODEL_TEMPERATURE,\n};\n\n/*\n * Embedding model configuration\n */\nconst EMBEDDING_MODEL: OpenAI.EmbeddingModel = 'text-embedding-3-large'; // Model to use for embedding generation\nconst OVERLAP_TOKENS: number = 200; // Number of tokens to overlap between chunks\nconst MAX_CHUNK_TOKENS: number = 800; // Maximum number of tokens per chunk\nconst CHAR_BY_TOKEN: number = 4.15; // Approximate pessimistically the number of characters per token // Can use `tiktoken` or other tokenizers to calculate it more precisely\nconst MAX_CHARS: number = MAX_CHUNK_TOKENS * CHAR_BY_TOKEN;\nconst OVERLAP_CHARS: number = OVERLAP_TOKENS * CHAR_BY_TOKEN;\n\n/**\n * Splits a given text into chunks ensuring each chunk does not exceed MAX_CHARS.\n * @param text - The input text to split.\n * @returns - Array of text chunks.\n */\nconst chunkText = (text: string): string[] => {\n const chunks: string[] = [];\n let start = 0;\n\n while (start < text.length) {\n let end = Math.min(start + MAX_CHARS, text.length);\n\n // Ensure we don't cut words in the middle (find nearest space)\n if (end < text.length) {\n const lastSpace = text.lastIndexOf(' ', end);\n if (lastSpace > start) {\n end = lastSpace;\n }\n }\n\n chunks.push(text.substring(start, end));\n\n // Move start forward correctly\n const nextStart = end - OVERLAP_CHARS;\n if (nextStart <= start) {\n // Prevent infinite loop if overlap is too large\n start = end;\n } else {\n start = nextStart;\n }\n }\n\n return chunks;\n};\n\n/**\n * Generates an embedding for a given text using OpenAI's embedding API.\n * Trims the text if it exceeds the maximum allowed characters.\n *\n * @param text - The input text to generate an embedding for\n * @returns The embedding vector as a number array\n */\nconst generateEmbedding = async (text: string): Promise<number[]> => {\n try {\n const openaiClient = new OpenAI({ apiKey: process.env.OPENAI_API_KEY });\n\n const response = await openaiClient.embeddings.create({\n model: EMBEDDING_MODEL,\n input: text,\n });\n\n return response.data[0].embedding;\n } catch (error) {\n console.error('Error generating embedding:', error);\n return [];\n }\n};\n\n/**\n * Calculates the cosine similarity between two vectors.\n * Cosine similarity measures the cosine of the angle between two vectors in an inner product space.\n * Used to determine the similarity between chunks of text.\n *\n * @param vecA - The first vector\n * @param vecB - The second vector\n * @returns The cosine similarity score\n */\nconst cosineSimilarity = (vecA: number[], vecB: number[]): number => {\n // Calculate the dot product of the two vectors\n const dotProduct = vecA.reduce((sum, a, idx) => sum + a * vecB[idx], 0);\n\n // Calculate the magnitude (Euclidean norm) of each vector\n const magnitudeA = Math.sqrt(vecA.reduce((sum, a) => sum + a * a, 0));\n const magnitudeB = Math.sqrt(vecB.reduce((sum, b) => sum + b * b, 0));\n\n // Compute and return the cosine similarity\n return dotProduct / (magnitudeA * magnitudeB);\n};\n\n/**\n * Indexes all Markdown documents by generating embeddings for each chunk and storing them in memory.\n * Also updates the embeddings.json file if new embeddings are generated.\n * Handles cases where files have been updated and chunk counts have changed.\n */\nexport const indexMarkdownFiles = async (): Promise<void> => {\n const env = process.env.NODE_ENV;\n dotenv.config({\n path: [`.env.${env}.local`, `.env.${env}`, '.env.local', '.env'],\n });\n\n if (process.env.SKIP_DOC_EMBEDDINGS_INDEX === 'true') {\n return;\n }\n\n // Retrieve documentation and blog posts in English locale\n const frequentQuestions = await getFrequentQuestions();\n const docs = await getDocs();\n const blogs = await getBlogs();\n\n let result: Record<string, number[]> = {}; // Object to hold updated embeddings\n const currentChunkKeys = new Set<string>(); // Track which chunks should exist\n\n const files = { ...docs, ...blogs, ...frequentQuestions }; // Combine docs and blogs into a single object\n\n // Iterate over each file key (identifier) in the combined files\n for await (const fileKey of Object.keys(files)) {\n // Get the metadata of the file\n const fileMetadata = getMarkdownMetadata(\n files[fileKey as keyof typeof files] as string\n );\n\n // Split the document into chunks based on headings\n const fileChunks = chunkText(\n files[fileKey as keyof typeof files] as string\n );\n\n // Check if the number of chunks has changed for this file\n const existingChunksForFile = Object.keys(embeddingsList).filter((key) =>\n key.startsWith(`${fileKey}/chunk_`)\n );\n const currentChunkCount = fileChunks.length;\n const previousChunkCount = existingChunksForFile.length;\n\n let shouldRegenerateFileEmbeddings = false;\n\n // If chunk count differs, we need to regenerate embeddings for this file\n if (currentChunkCount !== previousChunkCount) {\n console.info(\n `File \"${fileKey}\" chunk count changed: ${previousChunkCount} -> ${currentChunkCount}. Regenerating embeddings.`\n );\n shouldRegenerateFileEmbeddings = true;\n }\n\n // Iterate over each chunk within the current file\n for await (const chunkIndex of Object.keys(fileChunks)) {\n const chunkNumber = Number(chunkIndex) + 1; // Chunk number starts at 1\n const chunksNumber = fileChunks.length;\n\n const fileChunk = fileChunks[\n chunkIndex as keyof typeof fileChunks\n ] as string;\n\n const embeddingKeyName = `${fileKey}/chunk_${chunkNumber}`; // Unique key for the chunk\n currentChunkKeys.add(embeddingKeyName); // Track this chunk as current\n\n // Retrieve precomputed embedding if available and file hasn't changed\n const docEmbedding = !shouldRegenerateFileEmbeddings\n ? (embeddingsList[embeddingKeyName as keyof typeof embeddingsList] as\n | number[]\n | undefined)\n : undefined;\n\n let embedding = docEmbedding; // Use existing embedding if available and valid\n\n if (!embedding) {\n embedding = await generateEmbedding(fileChunk); // Generate embedding if not present or file changed\n console.info(`- Generated new embedding: ${embeddingKeyName}`);\n }\n\n // Update the result object with the embedding\n result = { ...result, [embeddingKeyName]: embedding };\n\n // Store the embedding and content in the in-memory vector store\n vectorStore.push({\n fileKey,\n chunkNumber,\n embedding,\n content: fileChunk,\n docUrl: fileMetadata.url,\n docName: fileMetadata.title,\n });\n\n console.info(`- Indexed: ${embeddingKeyName}/${chunksNumber}`);\n }\n }\n\n // Remove outdated embeddings that no longer exist in current files\n const filteredEmbeddings: Record<string, number[]> = {};\n for (const [key, embedding] of Object.entries(embeddingsList)) {\n if (currentChunkKeys.has(key)) {\n // Only keep embeddings for chunks that still exist\n if (!result[key]) {\n filteredEmbeddings[key] = embedding as number[];\n }\n }\n }\n\n // Merge filtered existing embeddings with new ones\n result = { ...filteredEmbeddings, ...result };\n\n if (process.env.NODE_ENV === 'development') {\n try {\n // Compare the newly generated embeddings with existing ones\n if (JSON.stringify(result) !== JSON.stringify(embeddingsList)) {\n // If there are new embeddings or changes, save them to embeddings.json\n writeFileSync(\n 'src/utils/AI/askDocQuestion/embeddings.json',\n JSON.stringify(result, null, 2)\n );\n console.info('Updated embeddings.json with new/changed embeddings.');\n }\n } catch (error) {\n console.error(error); // Log any errors during the file write process\n }\n }\n};\n\n// Automatically index Markdown files\nindexMarkdownFiles();\n\n/**\n * Searches the indexed documents for the most relevant chunks based on a query.\n * Utilizes cosine similarity to find the closest matching embeddings.\n *\n * @param query - The search query provided by the user\n * @returns An array of the top matching document chunks' content\n */\nexport const searchChunkReference = async (\n query: string,\n maxResults: number = MAX_RELEVANT_CHUNKS_NB,\n minSimilarity: number = MIN_RELEVANT_CHUNKS_SIMILARITY\n): Promise<VectorStoreEl[]> => {\n // Generate an embedding for the user's query\n const queryEmbedding = await generateEmbedding(query);\n\n // Calculate similarity scores between the query embedding and each document's embedding\n const selection = vectorStore\n .map((chunk) => ({\n ...chunk,\n similarity: cosineSimilarity(queryEmbedding, chunk.embedding), // Add similarity score to each doc\n }))\n .filter((chunk) => chunk.similarity > minSimilarity) // Filter out documents with low similarity scores\n .sort((a, b) => b.similarity - a.similarity) // Sort documents by highest similarity first\n .slice(0, maxResults); // Select the top 6 most similar documents\n\n const orderedDocKeys = new Set(selection.map((chunk) => chunk.fileKey));\n\n const orderedVectorStore = vectorStore.sort((a, b) =>\n orderedDocKeys.has(a.fileKey) ? -1 : 1\n );\n\n const results = orderedVectorStore.filter((chunk) =>\n selection.some(\n (v) => v.fileKey === chunk.fileKey && v.chunkNumber === chunk.chunkNumber\n )\n );\n\n console.log({ orderedDocKeys });\n\n // Return the content of the top matching documents\n return results;\n};\n\n/**\n * Reads the content of a file synchronously.\n *\n * @function\n * @param relativeFilePath - The relative or absolute path to the target file.\n * @returns The entire contents of the specified file as a UTF-8 encoded string.\n */\nconst getFileContent = (relativeFilePath: string): string => {\n const __dirname = dirname(fileURLToPath(import.meta.url));\n const absolutePath = join(__dirname, relativeFilePath);\n const fileContent = readFileSync(absolutePath, 'utf-8');\n return fileContent;\n};\n\nconst CHAT_GPT_PROMPT = getFileContent('./PROMPT.md');\n\n// Initial prompt configuration for the chatbot\nexport const initPrompt: ChatCompletionRequestMessage = {\n role: 'system',\n content: CHAT_GPT_PROMPT,\n};\n\nexport type AskDocQuestionResult = {\n response: string;\n relatedFiles: string[];\n};\n\nexport type AskDocQuestionOptions = {\n onMessage?: (chunk: string) => void;\n};\n\n/**\n * Handles the \"Ask a question\" endpoint in an Express.js route.\n * Processes user messages, retrieves relevant documents, and interacts with AI models to generate responses.\n *\n * @param messages - An array of chat messages from the user and assistant\n * @returns The assistant's response as a string\n */\nexport const askDocQuestion = async (\n messages: ChatCompletionRequestMessage[],\n aiConfig: AIConfig,\n options?: AskDocQuestionOptions\n): Promise<AskDocQuestionResult> => {\n // Format the user's question to keep only the relevant keywords\n const query = messages\n .filter((message) => message.role === 'user')\n .map((message) => `- ${message.content}`)\n .join('\\n');\n\n // 1) Find relevant documents based on the user's question\n const relevantFilesReferences = await searchChunkReference(query);\n\n // 2) Integrate the relevant documents into the initial system prompt\n const systemPrompt = initPrompt.content.replace(\n '{{relevantFilesReferences}}',\n relevantFilesReferences.length === 0\n ? 'Not relevant file found related to the question.'\n : relevantFilesReferences\n .map((doc, idx) =>\n [\n '-----',\n '---',\n `chunkId: ${idx}`,\n `docChunk: \"${doc.chunkNumber}/${doc.fileKey.length}\"`,\n `docName: \"${doc.docName}\"`,\n `docUrl: \"${doc.docUrl}\"`,\n `---`,\n doc.content,\n `-----`,\n ].join('\\n')\n )\n .join('\\n\\n') // Insert relevant docs into the prompt\n );\n\n // Format messages for AI SDK\n const aiMessages = [\n {\n role: 'system' as const,\n content: systemPrompt,\n },\n ...messages.slice(-8),\n ];\n\n if (!aiConfig) {\n throw new Error('Failed to initialize AI configuration');\n }\n\n // 3) Use the AI SDK to stream the response\n let fullResponse = '';\n const stream = streamText({\n ...aiConfig,\n messages: aiMessages,\n });\n\n // Process the stream\n for await (const chunk of stream.textStream) {\n fullResponse += chunk;\n options?.onMessage?.(chunk);\n }\n\n // 4) Extract unique related files\n const relatedFiles = [\n ...new Set(relevantFilesReferences.map((doc) => doc.fileKey)),\n ];\n\n // 5) Return the assistant's response to the user\n return {\n response: fullResponse ?? 'Error: No result found',\n relatedFiles,\n };\n};\n"],"mappings":"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","names":[]}
@@ -6,6 +6,7 @@ import { getProjectById } from "./../../services/project.service.mjs";
6
6
  import { getUserById } from "./../../services/user.service.mjs";
7
7
  import { mapOrganizationToAPI } from "./../../utils/mapper/organization.mjs";
8
8
  import { mapProjectToAPI } from "./../../utils/mapper/project.mjs";
9
+ import { mapSessionToAPI } from "./../../utils/mapper/session.mjs";
9
10
  import { mapUserToAPI } from "./../../utils/mapper/user.mjs";
10
11
  import {
11
12
  computeEffectivePermission,
@@ -24,9 +25,9 @@ const formatSession = (session) => {
24
25
  }
25
26
  const resultSession = {
26
27
  session: session.session,
27
- user: mapUserToAPI(session.user),
28
- organization: mapOrganizationToAPI(session.organization),
29
- project: mapProjectToAPI(session.project),
28
+ user: session.user,
29
+ organization: session.organization,
30
+ project: session.project,
30
31
  authType: "session",
31
32
  permissions,
32
33
  roles
@@ -68,7 +69,7 @@ const getAuth = (dbClient) => {
68
69
  },
69
70
  hooks: {
70
71
  after: createAuthMiddleware(async (ctx) => {
71
- const { path, context } = ctx;
72
+ const { path, context, error } = ctx;
72
73
  const newUser = context.newSession?.user;
73
74
  const existingUser = context.session?.user;
74
75
  const user = newUser ?? existingUser;
@@ -150,7 +151,8 @@ const getAuth = (dbClient) => {
150
151
  project: projectAPI ?? null,
151
152
  authType: "session"
152
153
  };
153
- return formatSession(sessionWithNoPermission);
154
+ const formattedSession = formatSession(sessionWithNoPermission);
155
+ return mapSessionToAPI(formattedSession);
154
156
  })
155
157
  ],
156
158
  emailAndPassword: {
@@ -179,6 +181,7 @@ const getAuth = (dbClient) => {
179
181
  },
180
182
  emailVerification: {
181
183
  autoSignInAfterVerification: true,
184
+ sendOnSignIn: true,
182
185
  sendVerificationEmail: async ({ user, url }) => {
183
186
  logger.info("sending verification email", { email: user.email });
184
187
  await sendEmail({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/auth/getAuth.ts"],"sourcesContent":["import type { OrganizationAPI } from '@/types/organization.types';\nimport type { ProjectAPI } from '@/types/project.types';\nimport type {\n SessionAPI,\n SessionContext,\n SessionDataApi,\n} from '@/types/session.types';\nimport type { User, UserAPI } from '@/types/user.types';\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 { mapUserToAPI } from '@utils/mapper/user';\nimport {\n computeEffectivePermission,\n getSessionRoles,\n intersectPermissions,\n} from '@utils/permissions';\nimport { betterAuth, OmitId } from 'better-auth';\nimport { mongodbAdapter } from 'better-auth/adapters/mongodb';\nimport { createAuthMiddleware } from 'better-auth/api';\nimport { customSession } from 'better-auth/plugins';\nimport type { MongoClient } from 'mongodb';\n\nexport type Auth = ReturnType<typeof betterAuth>;\n\nexport const formatSession = (session: SessionContext): OmitId<SessionAPI> => {\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: mapUserToAPI(session.user),\n organization: mapOrganizationToAPI(session.organization),\n project: mapProjectToAPI(session.project),\n authType: 'session',\n permissions,\n roles,\n } as OmitId<SessionAPI>;\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 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.CLIENT_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 (['/verify-email'].includes(path)) {\n sendVerificationUpdate(user as unknown as User);\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.CLIENT_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 // 1️⃣ Change or drop the global prefix\n // cookiePrefix: \"intlayer\", // => intlayer.session_token\n cookiePrefix: 'intlayer', // => session_token (no prefix)\n\n // 2️⃣ Override just the session‑token cookie\n cookies: {\n session_token: {\n // name: 'intlayer_session_token', // final name depends on the prefix above\n // attributes: { sameSite: \"lax\", maxAge: 60 * 60 * 24 } // optional\n },\n },\n\n // 3️⃣ (optional) turn off the automatic __Secure‑ prefix in non‑prod\n // useSecureCookies: false,\n },\n\n session: {\n modelName: 'sessions',\n id: 'id',\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 let userAPI: UserAPI | null = null;\n let organizationAPI: OrganizationAPI | null = null;\n let projectAPI: ProjectAPI | null = null;\n\n if (typedSession.userId) {\n const userData = await getUserById(typedSession.userId);\n\n if (userData) {\n userAPI = mapUserToAPI(userData);\n }\n }\n\n if (typedSession.activeOrganizationId) {\n const orgData = await getOrganizationById(\n typedSession.activeOrganizationId\n );\n\n if (orgData) {\n organizationAPI = mapOrganizationToAPI(orgData);\n }\n }\n if (typedSession.activeProjectId) {\n const projectData = await getProjectById(\n typedSession.activeProjectId\n );\n\n if (projectData) {\n projectAPI = mapProjectToAPI(projectData);\n }\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 return formatSession(sessionWithNoPermission);\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, url }) => {\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: url,\n });\n },\n resetPasswordTokenExpiresIn: 3600,\n },\n accountLinking: {\n enabled: true, // allow linking in general\n trustedProviders: ['google', 'github'], // optional: auto‑link when Google verifies the e‑mail\n },\n emailVerification: {\n autoSignInAfterVerification: true,\n sendVerificationEmail: async ({ user, url }) => {\n logger.info('sending verification email', { email: user.email });\n await sendEmail({\n type: 'validate',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n validationLink: url,\n });\n },\n },\n\n crossSubDomainCookies: {\n enabled: true,\n additionalCookies: ['session_token'],\n domain: process.env.CLIENT_URL as string,\n },\n cookiePrefix: 'intlayer',\n cookies: {\n session_token: {\n name: 'session_token',\n attributes: {\n httpOnly: true,\n secure: true,\n },\n },\n },\n\n trustedOrigins: [process.env.CLIENT_URL as string],\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 },\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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","names":[]}
1
+ {"version":3,"sources":["../../../../src/utils/auth/getAuth.ts"],"sourcesContent":["import 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 { User, UserAPI } from '@/types/user.types';\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 {\n computeEffectivePermission,\n getSessionRoles,\n intersectPermissions,\n} from '@utils/permissions';\nimport { betterAuth, OmitId } from 'better-auth';\nimport { mongodbAdapter } from 'better-auth/adapters/mongodb';\nimport { createAuthMiddleware } from 'better-auth/api';\nimport { customSession } from 'better-auth/plugins';\nimport type { MongoClient } from 'mongodb';\n\nexport type Auth = ReturnType<typeof betterAuth>;\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 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.CLIENT_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, error } = 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 (['/verify-email'].includes(path)) {\n sendVerificationUpdate(user as unknown as User);\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.CLIENT_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 // 1️⃣ Change or drop the global prefix\n // cookiePrefix: \"intlayer\", // => intlayer.session_token\n cookiePrefix: 'intlayer', // => session_token (no prefix)\n\n // 2️⃣ Override just the session‑token cookie\n cookies: {\n session_token: {\n // name: 'intlayer_session_token', // final name depends on the prefix above\n // attributes: { sameSite: \"lax\", maxAge: 60 * 60 * 24 } // optional\n },\n },\n\n // 3️⃣ (optional) turn off the automatic __Secure‑ prefix in non‑prod\n // useSecureCookies: false,\n },\n\n session: {\n modelName: 'sessions',\n id: 'id',\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 let userAPI: UserAPI | null = null;\n let organizationAPI: OrganizationAPI | null = null;\n let projectAPI: ProjectAPI | null = null;\n\n if (typedSession.userId) {\n const userData = await getUserById(typedSession.userId);\n\n if (userData) {\n userAPI = mapUserToAPI(userData);\n }\n }\n\n if (typedSession.activeOrganizationId) {\n const orgData = await getOrganizationById(\n typedSession.activeOrganizationId\n );\n\n if (orgData) {\n organizationAPI = mapOrganizationToAPI(orgData);\n }\n }\n if (typedSession.activeProjectId) {\n const projectData = await getProjectById(\n typedSession.activeProjectId\n );\n\n if (projectData) {\n projectAPI = mapProjectToAPI(projectData);\n }\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 ],\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, url }) => {\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: url,\n });\n },\n resetPasswordTokenExpiresIn: 3600,\n },\n accountLinking: {\n enabled: true, // allow linking in general\n trustedProviders: ['google', 'github'], // optional: auto‑link when Google verifies the e‑mail\n },\n emailVerification: {\n autoSignInAfterVerification: true,\n sendOnSignIn: true,\n sendVerificationEmail: async ({ user, url }) => {\n logger.info('sending verification email', { email: user.email });\n await sendEmail({\n type: 'validate',\n to: user.email,\n username: user.name ?? user.email.split('@')[0],\n validationLink: url,\n });\n },\n },\n\n crossSubDomainCookies: {\n enabled: true,\n additionalCookies: ['session_token'],\n domain: process.env.CLIENT_URL as string,\n },\n cookiePrefix: 'intlayer',\n cookies: {\n session_token: {\n name: 'session_token',\n attributes: {\n httpOnly: true,\n secure: true,\n },\n },\n },\n\n trustedOrigins: [process.env.CLIENT_URL as string],\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 },\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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","names":[]}
@@ -1364,6 +1364,19 @@ const errorData = {
1364
1364
  es: "No tienes permisos para acceder a este recurso."
1365
1365
  },
1366
1366
  statusCode: HttpStatusCodes.FORBIDDEN_403
1367
+ },
1368
+ INVALID_REQUEST_BODY: {
1369
+ title: {
1370
+ en: "Invalid Request Body",
1371
+ fr: "Corps de requ\xEAte invalide",
1372
+ es: "Cuerpo de solicitud inv\xE1lido"
1373
+ },
1374
+ message: {
1375
+ en: "The request body is invalid.",
1376
+ fr: "Le corps de la requ\xEAte est invalide.",
1377
+ es: "El cuerpo de la solicitud es inv\xE1lido."
1378
+ },
1379
+ statusCode: HttpStatusCodes.BAD_REQUEST_400
1367
1380
  }
1368
1381
  };
1369
1382
  export {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/utils/errors/errorCodes.ts"],"sourcesContent":["import { HttpStatusCodes } from '@utils/httpStatusCodes';\n// @ts-ignore express-intlayer not build yet\nimport type { LanguageContent } from 'express-intlayer';\n\ntype ErrorCode = {\n title: LanguageContent<string>;\n message: LanguageContent<string>;\n statusCode: HttpStatusCodes;\n};\n\nexport const errorData = {\n USER_NOT_DEFINED: {\n title: {\n en: 'User not defined',\n fr: 'Utilisateur non défini',\n es: 'Usuario no definido',\n },\n message: {\n en: 'User is required, but not defined.',\n fr: 'Utilisateur requis, mais non défini.',\n es: 'Usuario es requerido, pero no está definido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_NOT_FOUND: {\n title: {\n en: 'User not found',\n fr: 'Utilisateur non trouvé',\n es: 'Usuario no encontrado',\n },\n message: {\n en: 'The user is probably not authenticated. Please try again.',\n fr: \"L'utilisateur n'est probablement pas authentifié. Veuillez réessayer.\",\n es: 'El usuario probablemente no está autenticado. Por favor, inténtelo de nuevo.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n USER_DATA_NOT_FOUND: {\n title: {\n en: 'User Data Not Found',\n fr: 'Données utilisateur non trouvées',\n es: 'Datos de usuario no encontrados',\n },\n message: {\n en: 'The user data was not found.',\n fr: \"Les données utilisateur n'ont pas été trouvées.\",\n es: 'Los datos del usuario no se han encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n USER_ALREADY_LOGGED_IN: {\n title: {\n en: 'User Already Logged In',\n fr: 'Utilisateur déjà connecté',\n es: 'Usuario ya conectado',\n },\n message: {\n en: 'The user is already logged in.',\n fr: \"L'utilisateur est déjà connecté.\",\n es: 'El usuario ya está conectado.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_ID_MISMATCH: {\n title: {\n en: 'User ID Mismatch',\n fr: 'Identifiant utilisateur ne correspond pas',\n es: 'Identificador de usuario no coincide',\n },\n message: {\n en: 'The provided user ID does not match the expected value. Please verify and try again.',\n fr: \"L'identifiant utilisateur fourni ne correspond pas à la valeur attendue. Veuillez vérifier et réessayer.\",\n es: 'El identificador de usuario proporcionado no coincide con el valor esperado. Verifique e intente nuevamente.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_INVALID_FIELDS: {\n title: {\n en: 'User Invalid Fields',\n fr: \"Champs d'utilisateur invalides\",\n es: 'Campos de usuario no válidos',\n },\n message: {\n en: 'The provided user fields are invalid.',\n fr: \"Les champs fournis pour l'utilisateur sont invalides.\",\n es: 'Los campos proporcionados para el usuario no son válidos.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_CREATION_FAILED: {\n title: {\n en: 'User Creation Failed',\n fr: \"Échec de la création de l'utilisateur\",\n es: 'Error al crear el usuario',\n },\n message: {\n en: 'Failed to create the specified user.',\n fr: \"La création de l'utilisateur a échoué.\",\n es: 'No se pudo crear el usuario especificado.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n USER_SESSION_EXPIRED: {\n title: {\n en: 'User Session Expired',\n fr: 'Session utilisateur expirée',\n es: 'Sesión de usuario caducada',\n },\n message: {\n en: 'The user session has expired.',\n fr: \"La session de l'utilisateur a expiré.\",\n es: 'La sesión de usuario ha caducado.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n USER_UPDATE_FAILED: {\n title: {\n en: 'User Update Failed',\n fr: \"Échec de la mise à jour de l'utilisateur\",\n es: 'Error al actualizar el usuario',\n },\n message: {\n en: 'Failed to update the specified user.',\n fr: \"La mise à jour de l'utilisateur a échoué.\",\n es: 'No se pudo actualizar el usuario especificado.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n USER_UPDATED_USER_NOT_FOUND: {\n title: {\n en: 'User Updated User Not Found',\n fr: 'Utilisateur utilisateur non trouvé',\n es: 'Usuario actualizado no encontrado',\n },\n message: {\n en: 'The updated user was not found.',\n fr: \"L'utilisateur utilisateur n'a pas été trouvé.\",\n es: 'El usuario actualizado no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n USER_COUNT_FAILED: {\n title: {\n en: 'User Count Failed',\n fr: 'Échec du comptage des utilisateurs',\n es: 'Error al contar los usuarios',\n },\n message: {\n en: 'Failed to count users.',\n fr: 'Le comptage des utilisateurs a échoué.',\n es: 'No se pudo contar los usuarios.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n USER_PROVIDER_NOT_FOUND: {\n title: {\n en: 'User Provider Not Found',\n fr: \"Fournisseur d'utilisateur non trouvé\",\n es: 'Proveedor de usuario no encontrado',\n },\n message: {\n en: 'The user provider was not found.',\n fr: \"Le fournisseur d'utilisateur n'a pas été trouvé.\",\n es: 'El proveedor de usuario no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n USER_PROVIDER_ALREADY_EXISTS: {\n title: {\n en: 'User Provider Already Exists',\n fr: \"Fournisseur d'utilisateur existe déjà\",\n es: 'Proveedor de usuario ya existe',\n },\n message: {\n en: 'The user provider already exists.',\n fr: \"Le fournisseur d'utilisateur existe déjà.\",\n es: 'El proveedor de usuario ya existe.',\n },\n statusCode: HttpStatusCodes.CONFLICT_409,\n },\n USER_PROVIDER_EMAIL_ALREADY_VALIDATED: {\n title: {\n en: 'User provider email already validated',\n fr: \"Email du fournisseur d'utilisateur déjà validé\",\n es: 'Correo electrónico del proveedor de usuario ya validado',\n },\n message: {\n en: 'The user provider email is already validated.',\n fr: \"L'email du fournisseur d'utilisateur est déjà validé.\",\n es: 'El correo electrónico del proveedor de usuario ya está validado.',\n },\n statusCode: HttpStatusCodes.CONFLICT_409,\n },\n USER_PREVIOUS_PASSWORD_NOT_PROVIDED: {\n title: {\n en: 'User previous password not provided',\n fr: \"Mot de passe précédent de l'utilisateur non fourni\",\n es: 'Contraseña anterior de usuario no proporcionada',\n },\n message: {\n en: 'The user previous password was not provided.',\n fr: \"Le mot de passe précédent de l'utilisateur n'a pas été fourni.\",\n es: 'La contraseña anterior de usuario no fue proporcionada.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_PASSWORD_NOT_DEFINED: {\n title: {\n en: 'User password not defined',\n fr: \"Mot de passe de l'utilisateur non défini\",\n es: 'Contraseña de usuario no definida',\n },\n message: {\n en: 'The user password was not defined.',\n fr: \"Le mot de passe de l'utilisateur n'a pas été défini.\",\n es: 'La contraseña de usuario no se ha definido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_PROVIDER_SECRET_NOT_DEFINED: {\n title: {\n en: 'User Provider Secret Not Defined',\n fr: \"Secret du fournisseur d'utilisateur non défini\",\n es: 'Secret del proveedor de usuario no definido',\n },\n message: {\n en: 'The user provider secret was not defined.',\n fr: \"Le secret du fournisseur d'utilisateur n'a pas été défini.\",\n es: 'El secret del proveedor de usuario no se ha definido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_PROVIDER_SECRET_NOT_VALID: {\n title: {\n en: 'User Provider Secret Not Valid',\n fr: \"Secret du fournisseur d'utilisateur non valide\",\n es: 'Secret del proveedor de usuario no válido',\n },\n message: {\n en: 'The user provider secret was not valid.',\n fr: \"Le secret du fournisseur d'utilisateur n'a pas été valide.\",\n es: 'El secret del proveedor de usuario no es válido.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n USER_ORGANIZATION_MEMBER_MISSING: {\n title: {\n en: 'User Not Organization Member',\n fr: \"Utilisateur non membre de l'organisation\",\n es: 'Usuario no miembro de la organización',\n },\n message: {\n en: 'The user is not a member of the organization.',\n fr: \"L'utilisateur n'est pas membre de l'organisation.\",\n es: 'El usuario no es miembro de la organización.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n USER_ORGANIZATION_ADMIN_MISSING: {\n title: {\n en: 'User Not Organization Admin',\n fr: \"Utilisateur non administrateur de l'organisation\",\n es: 'Usuario no administrador de la organización',\n },\n message: {\n en: 'The user is not an admin of the organization.',\n fr: \"L'utilisateur n'est pas administrateur de l'organisation.\",\n es: 'El usuario no es administrador de la organización.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n JWT_TOKEN_CREATION_FAILED_USER: {\n title: {\n en: 'JWT Token Creation Failed',\n fr: 'Echec de la création du jeton JWT',\n es: 'Error al crear el token JWT',\n },\n message: {\n en: 'JWT token creation failed for user.',\n fr: \"Echec de la création du jeton JWT pour l'utilisateur.\",\n es: 'Error al crear el token JWT para el usuario.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n JWT_TOKEN_CREATION_FAILED_ORGANIZATION: {\n title: {\n en: 'JWT Token Creation Failed',\n fr: 'Echec de la création du jeton JWT',\n es: 'Error al crear el token JWT',\n },\n message: {\n en: 'JWT token creation failed for organization.',\n fr: \"Echec de la création du jeton JWT pour l'organisation.\",\n es: 'Error al crear el token JWT para la organización.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n JWT_TOKEN_CREATION_FAILED_PROJECT: {\n title: {\n en: 'JWT Token Creation Failed',\n fr: 'Echec de la création du jeton JWT',\n es: 'Error al crear el token JWT',\n },\n message: {\n en: 'JWT token creation failed for project.',\n fr: 'Echec de la création du jeton JWT pour le projet.',\n es: 'Error al crear el token JWT para el proyecto.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n JWT_TOKEN_ORGANIZATION_MISMATCH_PROJECT: {\n title: {\n en: 'Organization Mismatch',\n fr: 'Organisation non correspondante',\n es: 'Organización no coincidente',\n },\n message: {\n en: 'The specified organization does not match the organization of the project.',\n fr: \"L'organisation spécifiée ne correspond pas à l'organisation du projet.\",\n es: 'La organización especificada no coincide con la organización del proyecto.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n ORGANIZATION_NOT_FOUND: {\n title: {\n en: 'Organization not Found',\n fr: 'Organisation non trouvée',\n es: 'Organización no encontrada',\n },\n message: {\n en: 'Organization not found.',\n fr: 'Organisation non trouvée.',\n es: 'Organización no encontrada.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ORGANIZATION_NOT_DEFINED: {\n title: {\n en: 'Organization not defined',\n fr: 'Organisation non définie',\n es: 'Organización no definida',\n },\n message: {\n en: 'Organization is required, but not defined.',\n fr: 'Organisation requise, mais non définie.',\n es: 'Organización es requerida, pero no está definida.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ORGANIZATION_ID_NOT_FOUND: {\n title: {\n en: 'Organization ID Not Found',\n fr: \"Identifiant de l'organisation non trouvé\",\n es: 'Identificador de la organización no encontrado',\n },\n message: {\n en: 'The organization ID was not found.',\n fr: \"L'identifiant de l'organisation n'a pas été trouvé.\",\n es: 'El identificador de la organización no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ORGANIZATION_CREATION_FAILED: {\n title: {\n en: 'Organization Creation Failed',\n fr: \"Échec de la création de l'organisation\",\n es: 'Error al crear la organización',\n },\n message: {\n en: 'Failed to create the specified organization.',\n fr: \"La création de l'organisation a échoué.\",\n es: 'No se pudo crear la organización especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ORGANIZATION_COUNT_FAILED: {\n title: {\n en: 'Organization Count Failed',\n fr: \"Échec du comptage de l'organisation\",\n es: 'Error al contar la organización',\n },\n message: {\n en: 'Failed to count organizations.',\n fr: 'Le comptage des organisations a échoué.',\n es: 'No se pudo contar las organizaciones.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ORGANIZATION_INVALID_FIELDS: {\n title: {\n en: 'Organization Invalid Fields',\n fr: \"Champs de l'organisation invalides\",\n es: 'Campos de la organización no válidos',\n },\n message: {\n en: 'The provided organization fields are invalid.',\n fr: \"Les champs fournis pour l'organisation sont invalides.\",\n es: 'Los campos proporcionados para la organización no son válidos.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n ORGANIZATION_DATA_NOT_FOUND: {\n title: {\n en: 'Organization Data Not Found',\n fr: \"Données de l'organisation non trouvées\",\n es: 'Datos de la organización no encontrados',\n },\n message: {\n en: 'The organization data was not found.',\n fr: \"Les données de l'organisation n'ont pas été trouvées.\",\n es: 'Los datos de la organización no se han encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ORGANIZATION_UPDATE_FAILED: {\n title: {\n en: 'Organization Update Failed',\n fr: \"Échec de la mise à jour de l'organisation\",\n es: 'Error al actualizar la organización',\n },\n message: {\n en: 'Failed to update the specified organization.',\n fr: \"La mise à jour de l'organisation a échoué.\",\n es: 'No se pudo actualizar la organización especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ORGANIZATION_MUST_HAVE_MEMBER: {\n title: {\n en: 'Organization Must Have Member',\n fr: \"L'organisation doit avoir au moins un membre\",\n es: 'La organización debe tener al menos un miembro',\n },\n message: {\n en: 'The organization must have at least one member.',\n fr: \"L'organisation doit avoir au moins un membre.\",\n es: 'La organización debe tener al menos un miembro.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n ORGANIZATION_MUST_HAVE_ADMIN: {\n title: {\n en: 'Organization Must Have Admin',\n fr: \"L'organisation doit avoir au moins un administrateur\",\n es: 'La organización debe tener al menos un administrador',\n },\n message: {\n en: 'The organization must have at least one admin.',\n fr: \"L'organisation doit avoir au moins un administrateur.\",\n es: 'La organización debe tener al menos un administrador.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n ORGANIZATION_PROJECT_MISMATCH: {\n title: {\n en: 'Organization Project Mismatch',\n fr: \"Projet non trouvé dans l'organisation\",\n es: 'El proyecto no se encuentra en la organización',\n },\n message: {\n en: 'The specified organization does not have the requested project.',\n fr: \"L'organisation spécifiée n'a pas le projet demandé.\",\n es: 'La organización especificada no tiene el proyecto solicitado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ORGANIZATION_PLAN_NOT_FOUND: {\n title: {\n en: 'Organization Plan Not Found',\n fr: \"Plan d'organisation non trouvé\",\n es: 'Plan de organización no encontrado',\n },\n message: {\n en: 'The specified organization does not have a plan.',\n fr: \"L'organisation spécifiée n'a pas de plan.\",\n es: 'La organización especificada no tiene un plan.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n DICTIONARY_NOT_FOUND: {\n title: {\n en: 'Dictionary Not Found',\n fr: 'Dictionnaire non trouvé',\n es: 'Diccionario no encontrado',\n },\n message: {\n en: 'The specified dictionary could not be found.',\n fr: 'Le dictionnaire spécifié est introuvable.',\n es: 'El diccionario especificado no se pudo encontrar.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n DICTIONARY_DATA_NOT_FOUND: {\n title: {\n en: 'Dictionary Data Not Found',\n fr: 'Données du dictionnaire non trouvées',\n es: 'Datos del diccionario no encontrados',\n },\n message: {\n en: 'The dictionary data was not found.',\n fr: \"Les données du dictionnaire n'ont pas été trouvées.\",\n es: 'Los datos del diccionario no se han encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n DICTIONARY_ID_NOT_FOUND: {\n title: {\n en: 'Dictionary ID Not Found',\n fr: 'Identifiant de dictionnaire non trouvé',\n es: 'Identificador de diccionario no encontrado',\n },\n message: {\n en: 'The dictionary ID was not found.',\n fr: \"L'identifiant de dictionnaire n'a pas été trouvé.\",\n es: 'El identificador de diccionario no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n DICTIONARY_COUNT_FAILED: {\n title: {\n en: 'Dictionary Count Failed',\n fr: 'Echec du comptage du dictionnaire',\n es: 'Error al contar el diccionario',\n },\n message: {\n en: 'Failed to count dictionaries.',\n fr: 'Le comptage des dictionnaires a échoué.',\n es: 'No se pudo contar los diccionarios.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n DICTIONARY_INVALID_FIELDS: {\n title: {\n en: 'Dictionary Invalid Fields',\n fr: 'Champs du dictionnaire invalides',\n es: 'Campos del diccionario no válidos',\n },\n message: {\n en: 'The provided dictionary fields are invalid.',\n fr: 'Les champs fournis pour le dictionnaire sont invalides.',\n es: 'Los campos proporcionados para el diccionario no son válidos.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n DICTIONARIES_NOT_PROVIDED: {\n title: {\n en: 'Dictionaries Not Provided',\n fr: 'Aucune dictionnaire fourni',\n es: 'No se proporcionaron diccionarios',\n },\n message: {\n en: 'No dictionaries were provided.',\n fr: 'Aucune dictionnaire fourni.',\n es: 'No se proporcionaron diccionarios.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n DICTIONARY_PROJECT_MISMATCH: {\n title: {\n en: 'Dictionary Project Mismatch',\n fr: \"Le dictionnaire n'est pas dans le projet\",\n es: 'El diccionario no está en el proyecto',\n },\n message: {\n en: 'The specified dictionary is not in the project.',\n fr: \"Le dictionnaire n'est pas dans le projet.\",\n es: 'El diccionario no está en el proyecto.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n DICTIONARY_UPDATE_FAILED: {\n title: {\n en: 'Dictionary Update Failed',\n fr: 'Echec de la mise à jour du dictionnaire',\n es: 'Error al actualizar el diccionario',\n },\n message: {\n en: 'Failed to update the specified dictionary.',\n fr: 'La mise à jour du dictionnaire a échoué.',\n es: 'No se pudo actualizar el diccionario especificado.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n DICTIONARY_ACCESS_DENIED: {\n title: {\n en: 'Access Denied to Dictionary',\n fr: 'Accès refusé au dictionnaire',\n es: 'Acceso denegado al diccionario',\n },\n message: {\n en: 'You do not have access to this dictionary.',\n fr: \"Vous n'avez pas accès à ce dictionnaire.\",\n es: 'No tienes acceso a este diccionario.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n NO_DICTIONARIES_PROVIDED: {\n title: {\n en: 'No Dictionaries Provided',\n fr: 'Aucun dictionnaire fourni',\n es: 'No se proporcionaron diccionarios',\n },\n message: {\n en: 'No dictionaries were provided for the operation.',\n fr: 'Aucun dictionnaire n’a été fourni pour l’opération.',\n es: 'No se proporcionaron diccionarios para la operación.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PROJECT_NOT_DEFINED: {\n title: {\n en: 'Project not defined',\n fr: 'Projet non défini',\n es: 'Proyecto no definido',\n },\n message: {\n en: 'Project is required, but not defined.',\n fr: 'Projet requis, mais non défini.',\n es: 'Proyecto es requerido, pero no está definido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PROJECT_NOT_FOUND: {\n title: {\n en: 'Project Not Found',\n fr: 'Projet non trouvé',\n es: 'Proyecto no encontrado',\n },\n message: {\n en: 'The specified project could not be found.',\n fr: 'Le projet spécifié est introuvable.',\n es: 'El proyecto especificado no se pudo encontrar.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n PROJECT_ID_NOT_FOUND: {\n title: {\n en: 'Project ID Not Found',\n fr: 'Identifiant de projet non trouvé',\n es: 'Identificador de proyecto no encontrado',\n },\n message: {\n en: 'The project ID was not found.',\n fr: \"L'identifiant de projet n'a pas été trouvé.\",\n es: 'El identificador de proyecto no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n PROJECT_ID_MISMATCH: {\n title: {\n en: 'Project ID Mismatch',\n fr: 'Identifiant de projet non correspondant',\n es: 'Identificador de proyecto no coincidente',\n },\n message: {\n en: 'The provided project ID does not match the expected value. Please verify and try again.',\n fr: \"L'identifiant de projet fourni ne correspond pas à la valeur attendue. Veuillez vérifier et réessayer.\",\n es: 'El identificador de proyecto proporcionado no coincide con el valor esperado. Verifique e intente nuevamente.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PROJECT_COUNT_FAILED: {\n title: {\n en: 'Project Count Failed',\n fr: 'Échec du comptage du projet',\n es: 'Error al contar el proyecto',\n },\n message: {\n en: 'Failed to count projects.',\n fr: 'Le comptage des projets a échoué.',\n es: 'No se pudo contar los proyectos.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n PROJECT_INVALID_FIELDS: {\n title: {\n en: 'Project Invalid Fields',\n fr: 'Champs du projet invalides',\n es: 'Campos del proyecto no válidos',\n },\n message: {\n en: 'The provided project fields are invalid.',\n fr: 'Les champs fournis pour le projet sont invalides.',\n es: 'Los campos proporcionados para el proyecto no son válidos.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PROJECT_UPDATE_FAILED: {\n title: {\n en: 'Project Update Failed',\n fr: 'Échec de la mise à jour du projet',\n es: 'Error al actualizar el proyecto',\n },\n message: {\n en: 'Failed to update the specified project.',\n fr: 'La mise à jour du projet a échoué.',\n es: 'No se pudo actualizar el proyecto especificado.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n PROJECT_MUST_HAVE_MEMBER: {\n title: {\n en: 'Project Must Have Member',\n fr: 'Le projet doit avoir au moins un membre',\n es: 'El proyecto debe tener al menos un miembro',\n },\n message: {\n en: 'The project must have at least one member.',\n fr: 'Le projet doit avoir au moins un membre.',\n es: 'El proyecto debe tener al menos un miembro.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PROJECT_MUST_HAVE_ADMIN: {\n title: {\n en: 'Project Must Have Admin',\n fr: 'Le projet doit avoir au moins un administrateur',\n es: 'El proyecto debe tener al menos un administrador',\n },\n message: {\n en: 'The project must have at least one admin.',\n fr: 'Le projet doit avoir au moins un administrateur.',\n es: 'El proyecto debe tener al menos un administrador.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n ACCESS_KEY_NOT_FOUND: {\n title: {\n en: 'Access Key Not Found',\n fr: \"Clé d'accès non trouvée\",\n es: 'Clave de acceso no encontrada',\n },\n message: {\n en: 'The specified access key could not be found.',\n fr: \"La clé d'accès spécifiée est introuvable.\",\n es: 'La clave de acceso especificada no se pudo encontrar.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ACCESS_KEY_CREATION_FAILED: {\n title: {\n en: 'Access Key Creation Failed',\n fr: \"Échec de la création de la clé d'accès\",\n es: 'Error al crear la clave de acceso',\n },\n message: {\n en: 'Failed to create a new access key for the project.',\n fr: \"La création d'une nouvelle clé d'accès pour le projet a échoué.\",\n es: 'No se pudo crear una nueva clave de acceso para el proyecto.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ACCESS_KEY_DELETION_FAILED: {\n title: {\n en: 'Access Key Deletion Failed',\n fr: \"Échec de la suppression de la clé d'accès\",\n es: 'Error al eliminar la clave de acceso',\n },\n message: {\n en: 'Failed to delete the specified access key.',\n fr: \"La suppression de la clé d'accès a échoué.\",\n es: 'No se pudo eliminar la clave de acceso especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ACCESS_KEY_UPDATE_FAILED: {\n title: {\n en: 'Access Key Update Failed',\n fr: \"Échec de la mise à jour de la clé d'accès\",\n es: 'Error al actualizar la clave de acceso',\n },\n message: {\n en: 'Failed to update the specified access key.',\n fr: \"La mise à jour de la clé d'accès a échoué.\",\n es: 'No se pudo actualizar la clave de acceso especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ACCESS_KEY_INVALID: {\n title: {\n en: 'Invalid Access Key',\n fr: \"Clé d'accès invalide\",\n es: 'Clave de acceso no válida',\n },\n message: {\n en: 'The provided access key is invalid or expired.',\n fr: \"La clé d'accès fournie est invalide ou expirée.\",\n es: 'La clave de acceso proporcionada no es válida o ha expirado.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n GITHUB_FETCH_USER_DATA_FAILED: {\n title: {\n en: 'GitHub Fetch User Data Failed',\n fr: 'Échec de la récupération des données utilisateur de GitHub',\n es: 'Error al obtener datos del usuario de GitHub',\n },\n message: {\n en: 'Failed to fetch user data from GitHub.',\n fr: 'Échec de la récupération des données utilisateur de GitHub.',\n es: 'Error al obtener datos del usuario de GitHub.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n GIT_HUB_FETCH_USER_EMAIL_FAILED: {\n title: {\n en: 'GitHub Fetch User Email Failed',\n fr: \"Échec de la récupération de l'email utilisateur de GitHub\",\n es: 'Error al obtener el correo electrónico del usuario de GitHub',\n },\n message: {\n en: 'Failed to fetch user email from GitHub.',\n fr: \"Échec de la récupération de l'email utilisateur de GitHub.\",\n es: 'Error al obtener el correo electrónico del usuario de GitHub.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n LOGIN_FAILED: {\n title: {\n en: 'Login Failed',\n fr: 'Échec de la connexion',\n es: 'Error al iniciar sesión',\n },\n message: {\n en: 'The email or password provided is incorrect.',\n fr: \"L'email ou le mot de passe fourni est incorrect.\",\n es: 'El correo electrónico o la contraseña proporcionada es incorrecta.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_NOT_AUTHENTICATED: {\n title: {\n en: 'User not authenticated',\n fr: 'Utilisateur non authentifié',\n es: 'Usuario no autenticado',\n },\n message: {\n en: 'The user is not authenticated.',\n fr: \"L'utilisateur n'est pas authentifié.\",\n es: 'El usuario no está autenticado.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n AUTH_ERROR: {\n title: {\n en: 'Authentication Error',\n fr: \"Erreur d'authentification\",\n es: 'Error de autentication',\n },\n message: {\n en: 'Authentication fail because access token is invalid.',\n fr: \"L'authentification a échoué car le jeton d'accès est invalide.\",\n es: 'La autenticación falló porque el token de acceso es inválido.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n TOO_MANY_CONNECTIONS: {\n title: {\n en: 'Too many connections',\n fr: 'Trop de connexions',\n es: 'Demasiadas conexiones',\n },\n message: {\n en: 'Too many connections. Please try again later.',\n fr: 'Trop de connexions. Veuillez réessayer plus tard.',\n es: 'Demasiadas conexiones. Por favor, inténtelo de nuevo más tarde.',\n },\n statusCode: HttpStatusCodes.CONFLICT_409,\n },\n INVALID_USER_ID: {\n title: {\n en: 'Invalid User ID',\n fr: 'Identifiant utilisateur non valide',\n es: 'Identificador de usuario no válido',\n },\n message: {\n en: 'The provided user ID is invalid.',\n fr: \"L'identifiant utilisateur fourni n'est pas valide.\",\n es: 'El identificador de usuario proporcionado no es válido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n EMAIL_NOT_PROVIDED: {\n title: {\n en: 'Email Not Provided',\n fr: 'Email non fourni',\n es: 'Email no proporcionado',\n },\n message: {\n en: 'Email not provided.',\n fr: 'Email non fourni.',\n es: 'Email no proporcionado.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_ALREADY_EXISTS: {\n title: {\n en: 'User Already Exists',\n fr: 'Utilisateur existe déjà',\n es: 'Usuario ya existe',\n },\n message: {\n en: 'A user with this email already exists in our system.',\n fr: 'Un utilisateur avec cet email existe déjà dans notre système.',\n es: 'Un usuario con este correo electrónico ya existe en nuestro sistema.',\n },\n statusCode: HttpStatusCodes.CONFLICT_409,\n },\n SECRET_NOT_PROVIDED: {\n title: {\n en: 'Secret Not Provided',\n fr: 'Secret non fourni',\n es: 'Secreto no proporcionado',\n },\n message: {\n en: 'Secret not provided.',\n fr: 'Secret non fourni.',\n es: 'Secreto no proporcionado.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n SESSION_NOT_FOUND: {\n title: {\n en: 'Session Not Found',\n fr: 'Session non trouvée',\n es: 'Sesión no encontrada',\n },\n message: {\n en: 'The session was not found.',\n fr: \"La session n'a pas été trouvée.\",\n es: 'La sesión no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n CLIENT_ID_NOT_FOUND: {\n title: {\n en: 'Client ID Not Found',\n fr: 'Identifiant client non trouvé',\n es: 'Identificador de cliente no encontrado',\n },\n message: {\n en: 'The client ID was not found.',\n fr: \"L'identifiant client n'a pas été trouvé.\",\n es: 'El identificador de cliente no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n PROJECT_DATA_NOT_FOUND: {\n title: {\n en: 'Project Data Not Found',\n fr: 'Données du projet non trouvées',\n es: 'Datos del proyecto no encontrados',\n },\n message: {\n en: 'The project data was not found.',\n fr: \"Les données du projet n'ont pas été trouvées.\",\n es: 'Los datos del proyecto no se han encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n PROJECT_NOT_IN_ORGANIZATION: {\n title: {\n en: 'Project Not In Organization',\n fr: \"Projet non dans l'organisation\",\n es: 'Proyecto no en la organización',\n },\n message: {\n en: 'The project is not in the organization.',\n fr: \"Le projet n'est pas dans l'organisation.\",\n es: 'El proyecto no está en la organización.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n PROJECTS_EXIST: {\n title: {\n en: 'Projects Exist',\n fr: 'Des projets existent',\n es: 'Existen proyectos',\n },\n message: {\n en: 'Projects exist in this organization. Please delete them before deleting the organization.',\n fr: \"Des projets existent dans cette organisation. Veuillez les supprimer avant de supprimer l'organisation.\",\n es: 'Existen proyectos en esta organización. Por favor, elimine los antes de eliminar la organización.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n PLAN_NOT_FOUND: {\n title: {\n en: 'Plan Not Found',\n fr: 'Plan non trouvé',\n es: 'Plan no encontrado',\n },\n message: {\n en: 'Plan not found',\n fr: 'Plan non trouvé',\n es: 'Plan no encontrado',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n MULTIPLE_PLANS_FOUND: {\n title: {\n en: 'Multiple Plans Found',\n fr: 'Plusieurs plans trouvés',\n es: 'Múltiples planes encontrados',\n },\n message: {\n en: 'Multiple plans found for the provided information.',\n fr: \"Plusieurs plans trouvés pour l'information fournie.\",\n es: 'Múltiples planes encontrados para la información proporcionada.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PLAN_USER_LIMIT_REACHED: {\n title: {\n en: 'Plan User Limit Reached',\n fr: 'Limite de participants atteint',\n es: 'Límite de participantes alcanzado',\n },\n message: {\n en: 'The plan has reached its user limit. Please upgrade to add more users.',\n fr: 'Le plan a atteint son limite de participants. Veuillez mettre à niveau pour ajouter plus de participants.',\n es: 'El plan ha alcanzado su límite de participantes. Actualice para agregar más usuarios.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n PLAN_PROJECT_LIMIT_REACHED: {\n title: {\n en: 'Plan Project Limit Reached',\n fr: 'Limite de projets atteint',\n es: 'Límite de proyectos alcanzado',\n },\n message: {\n en: 'The plan has reached its project limit. Please upgrade to add more projects.',\n fr: 'Le plan a atteint son limite de projets. Veuillez mettre à niveau pour ajouter plus de projets.',\n es: 'El plan ha alcanzado su límite de proyectos. Actualice para agregar más proyectos.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n\n SUBSCRIPTION_CREATION_FAILED: {\n title: {\n en: 'Subscription Creation Failed',\n fr: 'Échec de la création de la souscription',\n es: 'Error al crear la suscripción',\n },\n message: {\n en: 'Failed to create the specified subscription.',\n fr: 'La création de la souscription a échoué.',\n es: 'No se pudo crear la suscripción especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n\n CALLBACK_URL_NOT_VALID: {\n title: {\n en: 'Callback URL not valid',\n fr: 'URL de rappel non valide',\n es: 'URL de devolución no válida',\n },\n message: {\n en: 'The callback URL is not valid.',\n fr: 'L’URL de rappel n’est pas valide.',\n es: 'La URL de devolución no es válida.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n STRIPE_SUBSCRIPTION_NO_CUSTOMER: {\n title: {\n en: 'No customer found',\n fr: 'Aucun client trouvé',\n es: 'No se encontró el cliente',\n },\n message: {\n en: 'No customer found for the provided subscription.',\n fr: \"Aucun client n'a été trouvé pour l'abonnement fourni.\",\n es: 'No se encontró ningún cliente para el suscripción proporcionada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n NO_SUBSCRIPTION_ID_PROVIDED: {\n title: {\n en: 'No subscription ID provided',\n fr: \"Aucun ID d'abonnement fourni\",\n es: 'No se proporcionó ningún ID de suscripción',\n },\n message: {\n en: 'No subscription ID provided.',\n fr: \"Aucun ID d'abonnement n'a été fourni.\",\n es: 'No se proporcionó ningún ID de suscripción.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n CANNOT_CANCEL_SUBSCRIPTION: {\n title: {\n en: 'Cannot cancel subscription',\n fr: \"Impossible d'annuler l'abonnement\",\n es: 'No se puede cancelar la suscripción',\n },\n message: {\n en: 'Cannot cancel subscription.',\n fr: \"Impossible d'annuler l'abonnement.\",\n es: 'No se puede cancelar la suscripción.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ALREADY_SUBSCRIBED: {\n title: {\n en: 'Already Subscribed',\n fr: 'Déjà abonné',\n es: 'Ya suscrito',\n },\n message: {\n en: 'You are already subscribed to this plan.',\n fr: 'Vous êtes déjà abonné à ce plan.',\n es: 'Ya estás suscrito a este plan.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n SESSION_CREATION_FAILED: {\n title: {\n en: 'Session Creation Failed',\n fr: 'Échec de la création de la session',\n es: 'Error al crear la sesión',\n },\n message: {\n en: 'Failed to create the specified session.',\n fr: 'La création de la session a échoué.',\n es: 'No se pudo crear la sesión especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n SETUP_INTENT_CREATION_FAILED: {\n title: {\n en: 'Setup Intent Creation Failed',\n fr: \"Échec de la création de l'intention de configuration\",\n es: 'Error al crear la intención de configuración',\n },\n message: {\n en: 'Failed to create the setup intent.',\n fr: \"Échec de la création de l'intention de configuration.\",\n es: 'Error al crear la intención de configuración.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n QUERY_FAILED: {\n title: {\n en: 'Query failed',\n fr: 'Requête échouée',\n es: 'Consulta fallida',\n },\n message: {\n en: 'Query failed',\n fr: 'Requête échouée',\n es: 'Consulta fallida',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n AUDIT_FAILED: {\n title: {\n en: 'Audit failed',\n fr: 'Audit échoué',\n es: 'Audito fallido',\n },\n message: {\n en: 'Failed to audit the content declaration files.',\n fr: \"Échec de l'audit des fichiers de déclaration de contenu.\",\n es: 'Error al auditar los archivos de declaración de contenido.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n\n TAG_NOT_FOUND: {\n title: {\n en: 'Tag Not Found',\n fr: 'Tag non trouvé',\n es: 'Tag no encontrado',\n },\n message: {\n en: 'The specified tag could not be found.',\n fr: 'Le tag spécifié est introuvable.',\n es: 'El tag especificado no se pudo encontrar.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n TAG_ID_NOT_FOUND: {\n title: {\n en: 'Tag ID Not Found',\n fr: 'Identifiant de tag non trouvé',\n es: 'Identificador de tag no encontrado',\n },\n message: {\n en: 'The tag ID was not found.',\n fr: \"L'identifiant de tag n'a pas été trouvé.\",\n es: 'El identificador de tag no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n TAG_ID_MISMATCH: {\n title: {\n en: 'Tag ID Mismatch',\n fr: 'Identifiant de tag non correspondant',\n es: 'Identificador de tag no coincidente',\n },\n message: {\n en: 'The provided tag ID does not match the expected value. Please verify and try again.',\n fr: \"L'identifiant de tag fourni ne correspond pas à la valeur attendue. Veuillez vérifier et réessayer.\",\n es: 'El identificador de tag proporcionado no coincide con el valor esperado. Verifique e intente nuevamente.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n TAG_COUNT_FAILED: {\n title: {\n en: 'Tag Count Failed',\n fr: 'Échec du comptage du tag',\n es: 'Error al contar el tag',\n },\n message: {\n en: 'Failed to count tags.',\n fr: 'Le comptage des tags a échoué.',\n es: 'No se pudo contar los tags.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n TAG_INVALID_FIELDS: {\n title: {\n en: 'Tag Invalid Fields',\n fr: 'Champs du tag invalides',\n es: 'Campos del tag no válidos',\n },\n message: {\n en: 'The provided tag fields are invalid.',\n fr: 'Les champs fournis pour le tag sont invalides.',\n es: 'Los campos proporcionados para el tag no son válidos.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n TAG_UPDATE_FAILED: {\n title: {\n en: 'Tag Update Failed',\n fr: 'Échec de la mise à jour du tag',\n es: 'Error al actualizar el tag',\n },\n message: {\n en: 'Failed to update the specified tag.',\n fr: 'La mise à jour du tag a échoué.',\n es: 'No se pudo actualizar el tag especificado.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n TAG_NOT_IN_ORGANIZATION: {\n title: {\n en: 'Tag Not In Organization',\n fr: \"Tag non dans l'organisation\",\n es: 'Etiqueta no en la organización',\n },\n message: {\n en: 'The specified tag is not in the organization.',\n fr: \"Le tag spécifié n'est pas dans l'organisation.\",\n es: 'La etiqueta especificada no está en la organización.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n AI_ACCESS_DENIED: {\n title: {\n en: 'Access denied',\n fr: 'Accès refusé',\n es: 'Acceso denegado',\n },\n message: {\n en: 'Invalid Access keys. Access keys should be defined to use AI features. See https://intlayer.org/doc/concept/editor. Alternatively, you can add your own openAI API key in the settings.',\n fr: \"Clées d'accès invalides. Les clés d'accès doivent être définies pour utiliser les fonctionnalités AI. Voir https://intlayer.org/doc/concept/editor. Alternativement, vous pouvez ajouter votre propre clé API openAI dans les paramètres.\",\n es: 'Claves de acceso no válidas. Las claves de acceso deben definirse para usar funciones AI. Ver https://intlayer.org/doc/concept/editor. Alternativamente, puede agregar su propia clave API openAI en la configuración.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n RATE_LIMIT_EXCEEDED: {\n title: {\n en: 'Rate Limit Exceeded',\n fr: 'Limite de taux dépassée',\n es: 'Límite de tasa excedido',\n },\n message: {\n en: 'Rate limit exceeded. Please try again later.',\n fr: 'Limite de taux dépassée. Veuillez réessayer plus tard.',\n es: 'Límite de tasa excedido. Por favor, inténtelo de nuevo más tarde.',\n },\n statusCode: HttpStatusCodes.TOO_MANY_REQUESTS_429,\n },\n RATE_LIMIT_EXCEEDED_UNAUTHENTICATED: {\n title: {\n en: 'Rate Limit Exceeded',\n fr: 'Limite de taux dépassée',\n es: 'Límite de tasa excedido',\n },\n message: {\n en: 'The number of requests is limited for unauthenticated users. Please try again later, or sign in at https://intlayer.org/login to increase your limit.',\n fr: 'Le nombre de requêtes est limité pour les utilisateurs non authentifiés. Veuillez réessayer plus tard, ou connectez-vous à https://intlayer.org/login pour augmenter votre limite.',\n es: 'El número de solicitudes está limitado para usuarios no autenticados. Por favor, inténtelo de nuevo más tarde, o inicie sesión en https://intlayer.org/login para aumentar su límite.',\n },\n statusCode: HttpStatusCodes.TOO_MANY_REQUESTS_429,\n },\n SESSION_NOT_DEFINED: {\n title: {\n en: 'Session not defined',\n fr: 'Session non définie',\n es: 'Sesión no definida',\n },\n message: {\n en: 'The session is not defined.',\n fr: \"La session n'est pas définie.\",\n es: 'La sesión no está definida.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n INVALID_OAUTH_GRANT_TYPE: {\n title: {\n en: 'Invalid OAuth grant type',\n fr: 'Type de grant OAuth invalide',\n es: 'Tipo de grant OAuth inválido',\n },\n message: {\n en: 'The grant type is invalid.',\n fr: 'Le type de grant est invalide.',\n es: 'El tipo de grant es inválido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n INVALID_OAUTH_CLIENT: {\n title: {\n en: 'Invalid OAuth client',\n fr: 'Client OAuth invalide',\n es: 'Cliente OAuth inválido',\n },\n message: {\n en: 'The client is invalid.',\n fr: 'Le client est invalide.',\n es: 'El cliente es inválido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n INVALID_ACCESS_TOKEN: {\n title: {\n en: 'Invalid access token',\n fr: \"Jeton d'accès invalide\",\n es: 'Token de acceso inválido',\n },\n message: {\n en: 'The access token is invalid.',\n fr: \"Le jeton d'accès est invalide.\",\n es: 'El token de acceso es inválido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n EXPIRED_ACCESS_TOKEN: {\n title: {\n en: 'Expired access token',\n fr: \"Jeton d'accès expiré\",\n es: 'Token de acceso expirado',\n },\n message: {\n en: 'The access token has expired.',\n fr: \"Le jeton d'accès a expiré.\",\n es: 'El token de acceso ha expirado.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PERMISSION_DENIED: {\n title: {\n en: 'Permission Denied',\n fr: 'Permission refusée',\n es: 'Permiso denegado',\n },\n message: {\n en: 'You do not have permission to access this resource.',\n fr: \"Vous n'avez pas les permissions nécessaires pour accéder à cette ressource.\",\n es: 'No tienes permisos para acceder a este recurso.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n} satisfies Record<string, ErrorCode>;\n\nexport type ErrorCodes = keyof typeof errorData;\n"],"mappings":"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","names":[]}
1
+ {"version":3,"sources":["../../../../src/utils/errors/errorCodes.ts"],"sourcesContent":["import { HttpStatusCodes } from '@utils/httpStatusCodes';\n// @ts-ignore express-intlayer not build yet\nimport type { LanguageContent } from 'express-intlayer';\n\ntype ErrorCode = {\n title: LanguageContent<string>;\n message: LanguageContent<string>;\n statusCode: HttpStatusCodes;\n};\n\nexport const errorData = {\n USER_NOT_DEFINED: {\n title: {\n en: 'User not defined',\n fr: 'Utilisateur non défini',\n es: 'Usuario no definido',\n },\n message: {\n en: 'User is required, but not defined.',\n fr: 'Utilisateur requis, mais non défini.',\n es: 'Usuario es requerido, pero no está definido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_NOT_FOUND: {\n title: {\n en: 'User not found',\n fr: 'Utilisateur non trouvé',\n es: 'Usuario no encontrado',\n },\n message: {\n en: 'The user is probably not authenticated. Please try again.',\n fr: \"L'utilisateur n'est probablement pas authentifié. Veuillez réessayer.\",\n es: 'El usuario probablemente no está autenticado. Por favor, inténtelo de nuevo.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n USER_DATA_NOT_FOUND: {\n title: {\n en: 'User Data Not Found',\n fr: 'Données utilisateur non trouvées',\n es: 'Datos de usuario no encontrados',\n },\n message: {\n en: 'The user data was not found.',\n fr: \"Les données utilisateur n'ont pas été trouvées.\",\n es: 'Los datos del usuario no se han encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n USER_ALREADY_LOGGED_IN: {\n title: {\n en: 'User Already Logged In',\n fr: 'Utilisateur déjà connecté',\n es: 'Usuario ya conectado',\n },\n message: {\n en: 'The user is already logged in.',\n fr: \"L'utilisateur est déjà connecté.\",\n es: 'El usuario ya está conectado.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_ID_MISMATCH: {\n title: {\n en: 'User ID Mismatch',\n fr: 'Identifiant utilisateur ne correspond pas',\n es: 'Identificador de usuario no coincide',\n },\n message: {\n en: 'The provided user ID does not match the expected value. Please verify and try again.',\n fr: \"L'identifiant utilisateur fourni ne correspond pas à la valeur attendue. Veuillez vérifier et réessayer.\",\n es: 'El identificador de usuario proporcionado no coincide con el valor esperado. Verifique e intente nuevamente.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_INVALID_FIELDS: {\n title: {\n en: 'User Invalid Fields',\n fr: \"Champs d'utilisateur invalides\",\n es: 'Campos de usuario no válidos',\n },\n message: {\n en: 'The provided user fields are invalid.',\n fr: \"Les champs fournis pour l'utilisateur sont invalides.\",\n es: 'Los campos proporcionados para el usuario no son válidos.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_CREATION_FAILED: {\n title: {\n en: 'User Creation Failed',\n fr: \"Échec de la création de l'utilisateur\",\n es: 'Error al crear el usuario',\n },\n message: {\n en: 'Failed to create the specified user.',\n fr: \"La création de l'utilisateur a échoué.\",\n es: 'No se pudo crear el usuario especificado.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n USER_SESSION_EXPIRED: {\n title: {\n en: 'User Session Expired',\n fr: 'Session utilisateur expirée',\n es: 'Sesión de usuario caducada',\n },\n message: {\n en: 'The user session has expired.',\n fr: \"La session de l'utilisateur a expiré.\",\n es: 'La sesión de usuario ha caducado.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n USER_UPDATE_FAILED: {\n title: {\n en: 'User Update Failed',\n fr: \"Échec de la mise à jour de l'utilisateur\",\n es: 'Error al actualizar el usuario',\n },\n message: {\n en: 'Failed to update the specified user.',\n fr: \"La mise à jour de l'utilisateur a échoué.\",\n es: 'No se pudo actualizar el usuario especificado.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n USER_UPDATED_USER_NOT_FOUND: {\n title: {\n en: 'User Updated User Not Found',\n fr: 'Utilisateur utilisateur non trouvé',\n es: 'Usuario actualizado no encontrado',\n },\n message: {\n en: 'The updated user was not found.',\n fr: \"L'utilisateur utilisateur n'a pas été trouvé.\",\n es: 'El usuario actualizado no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n USER_COUNT_FAILED: {\n title: {\n en: 'User Count Failed',\n fr: 'Échec du comptage des utilisateurs',\n es: 'Error al contar los usuarios',\n },\n message: {\n en: 'Failed to count users.',\n fr: 'Le comptage des utilisateurs a échoué.',\n es: 'No se pudo contar los usuarios.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n USER_PROVIDER_NOT_FOUND: {\n title: {\n en: 'User Provider Not Found',\n fr: \"Fournisseur d'utilisateur non trouvé\",\n es: 'Proveedor de usuario no encontrado',\n },\n message: {\n en: 'The user provider was not found.',\n fr: \"Le fournisseur d'utilisateur n'a pas été trouvé.\",\n es: 'El proveedor de usuario no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n USER_PROVIDER_ALREADY_EXISTS: {\n title: {\n en: 'User Provider Already Exists',\n fr: \"Fournisseur d'utilisateur existe déjà\",\n es: 'Proveedor de usuario ya existe',\n },\n message: {\n en: 'The user provider already exists.',\n fr: \"Le fournisseur d'utilisateur existe déjà.\",\n es: 'El proveedor de usuario ya existe.',\n },\n statusCode: HttpStatusCodes.CONFLICT_409,\n },\n USER_PROVIDER_EMAIL_ALREADY_VALIDATED: {\n title: {\n en: 'User provider email already validated',\n fr: \"Email du fournisseur d'utilisateur déjà validé\",\n es: 'Correo electrónico del proveedor de usuario ya validado',\n },\n message: {\n en: 'The user provider email is already validated.',\n fr: \"L'email du fournisseur d'utilisateur est déjà validé.\",\n es: 'El correo electrónico del proveedor de usuario ya está validado.',\n },\n statusCode: HttpStatusCodes.CONFLICT_409,\n },\n USER_PREVIOUS_PASSWORD_NOT_PROVIDED: {\n title: {\n en: 'User previous password not provided',\n fr: \"Mot de passe précédent de l'utilisateur non fourni\",\n es: 'Contraseña anterior de usuario no proporcionada',\n },\n message: {\n en: 'The user previous password was not provided.',\n fr: \"Le mot de passe précédent de l'utilisateur n'a pas été fourni.\",\n es: 'La contraseña anterior de usuario no fue proporcionada.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_PASSWORD_NOT_DEFINED: {\n title: {\n en: 'User password not defined',\n fr: \"Mot de passe de l'utilisateur non défini\",\n es: 'Contraseña de usuario no definida',\n },\n message: {\n en: 'The user password was not defined.',\n fr: \"Le mot de passe de l'utilisateur n'a pas été défini.\",\n es: 'La contraseña de usuario no se ha definido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_PROVIDER_SECRET_NOT_DEFINED: {\n title: {\n en: 'User Provider Secret Not Defined',\n fr: \"Secret du fournisseur d'utilisateur non défini\",\n es: 'Secret del proveedor de usuario no definido',\n },\n message: {\n en: 'The user provider secret was not defined.',\n fr: \"Le secret du fournisseur d'utilisateur n'a pas été défini.\",\n es: 'El secret del proveedor de usuario no se ha definido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_PROVIDER_SECRET_NOT_VALID: {\n title: {\n en: 'User Provider Secret Not Valid',\n fr: \"Secret du fournisseur d'utilisateur non valide\",\n es: 'Secret del proveedor de usuario no válido',\n },\n message: {\n en: 'The user provider secret was not valid.',\n fr: \"Le secret du fournisseur d'utilisateur n'a pas été valide.\",\n es: 'El secret del proveedor de usuario no es válido.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n USER_ORGANIZATION_MEMBER_MISSING: {\n title: {\n en: 'User Not Organization Member',\n fr: \"Utilisateur non membre de l'organisation\",\n es: 'Usuario no miembro de la organización',\n },\n message: {\n en: 'The user is not a member of the organization.',\n fr: \"L'utilisateur n'est pas membre de l'organisation.\",\n es: 'El usuario no es miembro de la organización.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n USER_ORGANIZATION_ADMIN_MISSING: {\n title: {\n en: 'User Not Organization Admin',\n fr: \"Utilisateur non administrateur de l'organisation\",\n es: 'Usuario no administrador de la organización',\n },\n message: {\n en: 'The user is not an admin of the organization.',\n fr: \"L'utilisateur n'est pas administrateur de l'organisation.\",\n es: 'El usuario no es administrador de la organización.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n JWT_TOKEN_CREATION_FAILED_USER: {\n title: {\n en: 'JWT Token Creation Failed',\n fr: 'Echec de la création du jeton JWT',\n es: 'Error al crear el token JWT',\n },\n message: {\n en: 'JWT token creation failed for user.',\n fr: \"Echec de la création du jeton JWT pour l'utilisateur.\",\n es: 'Error al crear el token JWT para el usuario.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n JWT_TOKEN_CREATION_FAILED_ORGANIZATION: {\n title: {\n en: 'JWT Token Creation Failed',\n fr: 'Echec de la création du jeton JWT',\n es: 'Error al crear el token JWT',\n },\n message: {\n en: 'JWT token creation failed for organization.',\n fr: \"Echec de la création du jeton JWT pour l'organisation.\",\n es: 'Error al crear el token JWT para la organización.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n JWT_TOKEN_CREATION_FAILED_PROJECT: {\n title: {\n en: 'JWT Token Creation Failed',\n fr: 'Echec de la création du jeton JWT',\n es: 'Error al crear el token JWT',\n },\n message: {\n en: 'JWT token creation failed for project.',\n fr: 'Echec de la création du jeton JWT pour le projet.',\n es: 'Error al crear el token JWT para el proyecto.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n JWT_TOKEN_ORGANIZATION_MISMATCH_PROJECT: {\n title: {\n en: 'Organization Mismatch',\n fr: 'Organisation non correspondante',\n es: 'Organización no coincidente',\n },\n message: {\n en: 'The specified organization does not match the organization of the project.',\n fr: \"L'organisation spécifiée ne correspond pas à l'organisation du projet.\",\n es: 'La organización especificada no coincide con la organización del proyecto.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n ORGANIZATION_NOT_FOUND: {\n title: {\n en: 'Organization not Found',\n fr: 'Organisation non trouvée',\n es: 'Organización no encontrada',\n },\n message: {\n en: 'Organization not found.',\n fr: 'Organisation non trouvée.',\n es: 'Organización no encontrada.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ORGANIZATION_NOT_DEFINED: {\n title: {\n en: 'Organization not defined',\n fr: 'Organisation non définie',\n es: 'Organización no definida',\n },\n message: {\n en: 'Organization is required, but not defined.',\n fr: 'Organisation requise, mais non définie.',\n es: 'Organización es requerida, pero no está definida.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ORGANIZATION_ID_NOT_FOUND: {\n title: {\n en: 'Organization ID Not Found',\n fr: \"Identifiant de l'organisation non trouvé\",\n es: 'Identificador de la organización no encontrado',\n },\n message: {\n en: 'The organization ID was not found.',\n fr: \"L'identifiant de l'organisation n'a pas été trouvé.\",\n es: 'El identificador de la organización no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ORGANIZATION_CREATION_FAILED: {\n title: {\n en: 'Organization Creation Failed',\n fr: \"Échec de la création de l'organisation\",\n es: 'Error al crear la organización',\n },\n message: {\n en: 'Failed to create the specified organization.',\n fr: \"La création de l'organisation a échoué.\",\n es: 'No se pudo crear la organización especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ORGANIZATION_COUNT_FAILED: {\n title: {\n en: 'Organization Count Failed',\n fr: \"Échec du comptage de l'organisation\",\n es: 'Error al contar la organización',\n },\n message: {\n en: 'Failed to count organizations.',\n fr: 'Le comptage des organisations a échoué.',\n es: 'No se pudo contar las organizaciones.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ORGANIZATION_INVALID_FIELDS: {\n title: {\n en: 'Organization Invalid Fields',\n fr: \"Champs de l'organisation invalides\",\n es: 'Campos de la organización no válidos',\n },\n message: {\n en: 'The provided organization fields are invalid.',\n fr: \"Les champs fournis pour l'organisation sont invalides.\",\n es: 'Los campos proporcionados para la organización no son válidos.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n ORGANIZATION_DATA_NOT_FOUND: {\n title: {\n en: 'Organization Data Not Found',\n fr: \"Données de l'organisation non trouvées\",\n es: 'Datos de la organización no encontrados',\n },\n message: {\n en: 'The organization data was not found.',\n fr: \"Les données de l'organisation n'ont pas été trouvées.\",\n es: 'Los datos de la organización no se han encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ORGANIZATION_UPDATE_FAILED: {\n title: {\n en: 'Organization Update Failed',\n fr: \"Échec de la mise à jour de l'organisation\",\n es: 'Error al actualizar la organización',\n },\n message: {\n en: 'Failed to update the specified organization.',\n fr: \"La mise à jour de l'organisation a échoué.\",\n es: 'No se pudo actualizar la organización especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ORGANIZATION_MUST_HAVE_MEMBER: {\n title: {\n en: 'Organization Must Have Member',\n fr: \"L'organisation doit avoir au moins un membre\",\n es: 'La organización debe tener al menos un miembro',\n },\n message: {\n en: 'The organization must have at least one member.',\n fr: \"L'organisation doit avoir au moins un membre.\",\n es: 'La organización debe tener al menos un miembro.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n ORGANIZATION_MUST_HAVE_ADMIN: {\n title: {\n en: 'Organization Must Have Admin',\n fr: \"L'organisation doit avoir au moins un administrateur\",\n es: 'La organización debe tener al menos un administrador',\n },\n message: {\n en: 'The organization must have at least one admin.',\n fr: \"L'organisation doit avoir au moins un administrateur.\",\n es: 'La organización debe tener al menos un administrador.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n ORGANIZATION_PROJECT_MISMATCH: {\n title: {\n en: 'Organization Project Mismatch',\n fr: \"Projet non trouvé dans l'organisation\",\n es: 'El proyecto no se encuentra en la organización',\n },\n message: {\n en: 'The specified organization does not have the requested project.',\n fr: \"L'organisation spécifiée n'a pas le projet demandé.\",\n es: 'La organización especificada no tiene el proyecto solicitado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ORGANIZATION_PLAN_NOT_FOUND: {\n title: {\n en: 'Organization Plan Not Found',\n fr: \"Plan d'organisation non trouvé\",\n es: 'Plan de organización no encontrado',\n },\n message: {\n en: 'The specified organization does not have a plan.',\n fr: \"L'organisation spécifiée n'a pas de plan.\",\n es: 'La organización especificada no tiene un plan.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n DICTIONARY_NOT_FOUND: {\n title: {\n en: 'Dictionary Not Found',\n fr: 'Dictionnaire non trouvé',\n es: 'Diccionario no encontrado',\n },\n message: {\n en: 'The specified dictionary could not be found.',\n fr: 'Le dictionnaire spécifié est introuvable.',\n es: 'El diccionario especificado no se pudo encontrar.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n DICTIONARY_DATA_NOT_FOUND: {\n title: {\n en: 'Dictionary Data Not Found',\n fr: 'Données du dictionnaire non trouvées',\n es: 'Datos del diccionario no encontrados',\n },\n message: {\n en: 'The dictionary data was not found.',\n fr: \"Les données du dictionnaire n'ont pas été trouvées.\",\n es: 'Los datos del diccionario no se han encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n DICTIONARY_ID_NOT_FOUND: {\n title: {\n en: 'Dictionary ID Not Found',\n fr: 'Identifiant de dictionnaire non trouvé',\n es: 'Identificador de diccionario no encontrado',\n },\n message: {\n en: 'The dictionary ID was not found.',\n fr: \"L'identifiant de dictionnaire n'a pas été trouvé.\",\n es: 'El identificador de diccionario no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n DICTIONARY_COUNT_FAILED: {\n title: {\n en: 'Dictionary Count Failed',\n fr: 'Echec du comptage du dictionnaire',\n es: 'Error al contar el diccionario',\n },\n message: {\n en: 'Failed to count dictionaries.',\n fr: 'Le comptage des dictionnaires a échoué.',\n es: 'No se pudo contar los diccionarios.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n DICTIONARY_INVALID_FIELDS: {\n title: {\n en: 'Dictionary Invalid Fields',\n fr: 'Champs du dictionnaire invalides',\n es: 'Campos del diccionario no válidos',\n },\n message: {\n en: 'The provided dictionary fields are invalid.',\n fr: 'Les champs fournis pour le dictionnaire sont invalides.',\n es: 'Los campos proporcionados para el diccionario no son válidos.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n DICTIONARIES_NOT_PROVIDED: {\n title: {\n en: 'Dictionaries Not Provided',\n fr: 'Aucune dictionnaire fourni',\n es: 'No se proporcionaron diccionarios',\n },\n message: {\n en: 'No dictionaries were provided.',\n fr: 'Aucune dictionnaire fourni.',\n es: 'No se proporcionaron diccionarios.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n DICTIONARY_PROJECT_MISMATCH: {\n title: {\n en: 'Dictionary Project Mismatch',\n fr: \"Le dictionnaire n'est pas dans le projet\",\n es: 'El diccionario no está en el proyecto',\n },\n message: {\n en: 'The specified dictionary is not in the project.',\n fr: \"Le dictionnaire n'est pas dans le projet.\",\n es: 'El diccionario no está en el proyecto.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n DICTIONARY_UPDATE_FAILED: {\n title: {\n en: 'Dictionary Update Failed',\n fr: 'Echec de la mise à jour du dictionnaire',\n es: 'Error al actualizar el diccionario',\n },\n message: {\n en: 'Failed to update the specified dictionary.',\n fr: 'La mise à jour du dictionnaire a échoué.',\n es: 'No se pudo actualizar el diccionario especificado.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n DICTIONARY_ACCESS_DENIED: {\n title: {\n en: 'Access Denied to Dictionary',\n fr: 'Accès refusé au dictionnaire',\n es: 'Acceso denegado al diccionario',\n },\n message: {\n en: 'You do not have access to this dictionary.',\n fr: \"Vous n'avez pas accès à ce dictionnaire.\",\n es: 'No tienes acceso a este diccionario.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n NO_DICTIONARIES_PROVIDED: {\n title: {\n en: 'No Dictionaries Provided',\n fr: 'Aucun dictionnaire fourni',\n es: 'No se proporcionaron diccionarios',\n },\n message: {\n en: 'No dictionaries were provided for the operation.',\n fr: 'Aucun dictionnaire n’a été fourni pour l’opération.',\n es: 'No se proporcionaron diccionarios para la operación.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PROJECT_NOT_DEFINED: {\n title: {\n en: 'Project not defined',\n fr: 'Projet non défini',\n es: 'Proyecto no definido',\n },\n message: {\n en: 'Project is required, but not defined.',\n fr: 'Projet requis, mais non défini.',\n es: 'Proyecto es requerido, pero no está definido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PROJECT_NOT_FOUND: {\n title: {\n en: 'Project Not Found',\n fr: 'Projet non trouvé',\n es: 'Proyecto no encontrado',\n },\n message: {\n en: 'The specified project could not be found.',\n fr: 'Le projet spécifié est introuvable.',\n es: 'El proyecto especificado no se pudo encontrar.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n PROJECT_ID_NOT_FOUND: {\n title: {\n en: 'Project ID Not Found',\n fr: 'Identifiant de projet non trouvé',\n es: 'Identificador de proyecto no encontrado',\n },\n message: {\n en: 'The project ID was not found.',\n fr: \"L'identifiant de projet n'a pas été trouvé.\",\n es: 'El identificador de proyecto no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n PROJECT_ID_MISMATCH: {\n title: {\n en: 'Project ID Mismatch',\n fr: 'Identifiant de projet non correspondant',\n es: 'Identificador de proyecto no coincidente',\n },\n message: {\n en: 'The provided project ID does not match the expected value. Please verify and try again.',\n fr: \"L'identifiant de projet fourni ne correspond pas à la valeur attendue. Veuillez vérifier et réessayer.\",\n es: 'El identificador de proyecto proporcionado no coincide con el valor esperado. Verifique e intente nuevamente.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PROJECT_COUNT_FAILED: {\n title: {\n en: 'Project Count Failed',\n fr: 'Échec du comptage du projet',\n es: 'Error al contar el proyecto',\n },\n message: {\n en: 'Failed to count projects.',\n fr: 'Le comptage des projets a échoué.',\n es: 'No se pudo contar los proyectos.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n PROJECT_INVALID_FIELDS: {\n title: {\n en: 'Project Invalid Fields',\n fr: 'Champs du projet invalides',\n es: 'Campos del proyecto no válidos',\n },\n message: {\n en: 'The provided project fields are invalid.',\n fr: 'Les champs fournis pour le projet sont invalides.',\n es: 'Los campos proporcionados para el proyecto no son válidos.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PROJECT_UPDATE_FAILED: {\n title: {\n en: 'Project Update Failed',\n fr: 'Échec de la mise à jour du projet',\n es: 'Error al actualizar el proyecto',\n },\n message: {\n en: 'Failed to update the specified project.',\n fr: 'La mise à jour du projet a échoué.',\n es: 'No se pudo actualizar el proyecto especificado.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n PROJECT_MUST_HAVE_MEMBER: {\n title: {\n en: 'Project Must Have Member',\n fr: 'Le projet doit avoir au moins un membre',\n es: 'El proyecto debe tener al menos un miembro',\n },\n message: {\n en: 'The project must have at least one member.',\n fr: 'Le projet doit avoir au moins un membre.',\n es: 'El proyecto debe tener al menos un miembro.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PROJECT_MUST_HAVE_ADMIN: {\n title: {\n en: 'Project Must Have Admin',\n fr: 'Le projet doit avoir au moins un administrateur',\n es: 'El proyecto debe tener al menos un administrador',\n },\n message: {\n en: 'The project must have at least one admin.',\n fr: 'Le projet doit avoir au moins un administrateur.',\n es: 'El proyecto debe tener al menos un administrador.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n ACCESS_KEY_NOT_FOUND: {\n title: {\n en: 'Access Key Not Found',\n fr: \"Clé d'accès non trouvée\",\n es: 'Clave de acceso no encontrada',\n },\n message: {\n en: 'The specified access key could not be found.',\n fr: \"La clé d'accès spécifiée est introuvable.\",\n es: 'La clave de acceso especificada no se pudo encontrar.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n ACCESS_KEY_CREATION_FAILED: {\n title: {\n en: 'Access Key Creation Failed',\n fr: \"Échec de la création de la clé d'accès\",\n es: 'Error al crear la clave de acceso',\n },\n message: {\n en: 'Failed to create a new access key for the project.',\n fr: \"La création d'une nouvelle clé d'accès pour le projet a échoué.\",\n es: 'No se pudo crear una nueva clave de acceso para el proyecto.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ACCESS_KEY_DELETION_FAILED: {\n title: {\n en: 'Access Key Deletion Failed',\n fr: \"Échec de la suppression de la clé d'accès\",\n es: 'Error al eliminar la clave de acceso',\n },\n message: {\n en: 'Failed to delete the specified access key.',\n fr: \"La suppression de la clé d'accès a échoué.\",\n es: 'No se pudo eliminar la clave de acceso especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ACCESS_KEY_UPDATE_FAILED: {\n title: {\n en: 'Access Key Update Failed',\n fr: \"Échec de la mise à jour de la clé d'accès\",\n es: 'Error al actualizar la clave de acceso',\n },\n message: {\n en: 'Failed to update the specified access key.',\n fr: \"La mise à jour de la clé d'accès a échoué.\",\n es: 'No se pudo actualizar la clave de acceso especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ACCESS_KEY_INVALID: {\n title: {\n en: 'Invalid Access Key',\n fr: \"Clé d'accès invalide\",\n es: 'Clave de acceso no válida',\n },\n message: {\n en: 'The provided access key is invalid or expired.',\n fr: \"La clé d'accès fournie est invalide ou expirée.\",\n es: 'La clave de acceso proporcionada no es válida o ha expirado.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n GITHUB_FETCH_USER_DATA_FAILED: {\n title: {\n en: 'GitHub Fetch User Data Failed',\n fr: 'Échec de la récupération des données utilisateur de GitHub',\n es: 'Error al obtener datos del usuario de GitHub',\n },\n message: {\n en: 'Failed to fetch user data from GitHub.',\n fr: 'Échec de la récupération des données utilisateur de GitHub.',\n es: 'Error al obtener datos del usuario de GitHub.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n GIT_HUB_FETCH_USER_EMAIL_FAILED: {\n title: {\n en: 'GitHub Fetch User Email Failed',\n fr: \"Échec de la récupération de l'email utilisateur de GitHub\",\n es: 'Error al obtener el correo electrónico del usuario de GitHub',\n },\n message: {\n en: 'Failed to fetch user email from GitHub.',\n fr: \"Échec de la récupération de l'email utilisateur de GitHub.\",\n es: 'Error al obtener el correo electrónico del usuario de GitHub.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n LOGIN_FAILED: {\n title: {\n en: 'Login Failed',\n fr: 'Échec de la connexion',\n es: 'Error al iniciar sesión',\n },\n message: {\n en: 'The email or password provided is incorrect.',\n fr: \"L'email ou le mot de passe fourni est incorrect.\",\n es: 'El correo electrónico o la contraseña proporcionada es incorrecta.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_NOT_AUTHENTICATED: {\n title: {\n en: 'User not authenticated',\n fr: 'Utilisateur non authentifié',\n es: 'Usuario no autenticado',\n },\n message: {\n en: 'The user is not authenticated.',\n fr: \"L'utilisateur n'est pas authentifié.\",\n es: 'El usuario no está autenticado.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n AUTH_ERROR: {\n title: {\n en: 'Authentication Error',\n fr: \"Erreur d'authentification\",\n es: 'Error de autentication',\n },\n message: {\n en: 'Authentication fail because access token is invalid.',\n fr: \"L'authentification a échoué car le jeton d'accès est invalide.\",\n es: 'La autenticación falló porque el token de acceso es inválido.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n TOO_MANY_CONNECTIONS: {\n title: {\n en: 'Too many connections',\n fr: 'Trop de connexions',\n es: 'Demasiadas conexiones',\n },\n message: {\n en: 'Too many connections. Please try again later.',\n fr: 'Trop de connexions. Veuillez réessayer plus tard.',\n es: 'Demasiadas conexiones. Por favor, inténtelo de nuevo más tarde.',\n },\n statusCode: HttpStatusCodes.CONFLICT_409,\n },\n INVALID_USER_ID: {\n title: {\n en: 'Invalid User ID',\n fr: 'Identifiant utilisateur non valide',\n es: 'Identificador de usuario no válido',\n },\n message: {\n en: 'The provided user ID is invalid.',\n fr: \"L'identifiant utilisateur fourni n'est pas valide.\",\n es: 'El identificador de usuario proporcionado no es válido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n EMAIL_NOT_PROVIDED: {\n title: {\n en: 'Email Not Provided',\n fr: 'Email non fourni',\n es: 'Email no proporcionado',\n },\n message: {\n en: 'Email not provided.',\n fr: 'Email non fourni.',\n es: 'Email no proporcionado.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n USER_ALREADY_EXISTS: {\n title: {\n en: 'User Already Exists',\n fr: 'Utilisateur existe déjà',\n es: 'Usuario ya existe',\n },\n message: {\n en: 'A user with this email already exists in our system.',\n fr: 'Un utilisateur avec cet email existe déjà dans notre système.',\n es: 'Un usuario con este correo electrónico ya existe en nuestro sistema.',\n },\n statusCode: HttpStatusCodes.CONFLICT_409,\n },\n SECRET_NOT_PROVIDED: {\n title: {\n en: 'Secret Not Provided',\n fr: 'Secret non fourni',\n es: 'Secreto no proporcionado',\n },\n message: {\n en: 'Secret not provided.',\n fr: 'Secret non fourni.',\n es: 'Secreto no proporcionado.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n SESSION_NOT_FOUND: {\n title: {\n en: 'Session Not Found',\n fr: 'Session non trouvée',\n es: 'Sesión no encontrada',\n },\n message: {\n en: 'The session was not found.',\n fr: \"La session n'a pas été trouvée.\",\n es: 'La sesión no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n CLIENT_ID_NOT_FOUND: {\n title: {\n en: 'Client ID Not Found',\n fr: 'Identifiant client non trouvé',\n es: 'Identificador de cliente no encontrado',\n },\n message: {\n en: 'The client ID was not found.',\n fr: \"L'identifiant client n'a pas été trouvé.\",\n es: 'El identificador de cliente no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n PROJECT_DATA_NOT_FOUND: {\n title: {\n en: 'Project Data Not Found',\n fr: 'Données du projet non trouvées',\n es: 'Datos del proyecto no encontrados',\n },\n message: {\n en: 'The project data was not found.',\n fr: \"Les données du projet n'ont pas été trouvées.\",\n es: 'Los datos del proyecto no se han encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n PROJECT_NOT_IN_ORGANIZATION: {\n title: {\n en: 'Project Not In Organization',\n fr: \"Projet non dans l'organisation\",\n es: 'Proyecto no en la organización',\n },\n message: {\n en: 'The project is not in the organization.',\n fr: \"Le projet n'est pas dans l'organisation.\",\n es: 'El proyecto no está en la organización.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n PROJECTS_EXIST: {\n title: {\n en: 'Projects Exist',\n fr: 'Des projets existent',\n es: 'Existen proyectos',\n },\n message: {\n en: 'Projects exist in this organization. Please delete them before deleting the organization.',\n fr: \"Des projets existent dans cette organisation. Veuillez les supprimer avant de supprimer l'organisation.\",\n es: 'Existen proyectos en esta organización. Por favor, elimine los antes de eliminar la organización.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n PLAN_NOT_FOUND: {\n title: {\n en: 'Plan Not Found',\n fr: 'Plan non trouvé',\n es: 'Plan no encontrado',\n },\n message: {\n en: 'Plan not found',\n fr: 'Plan non trouvé',\n es: 'Plan no encontrado',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n MULTIPLE_PLANS_FOUND: {\n title: {\n en: 'Multiple Plans Found',\n fr: 'Plusieurs plans trouvés',\n es: 'Múltiples planes encontrados',\n },\n message: {\n en: 'Multiple plans found for the provided information.',\n fr: \"Plusieurs plans trouvés pour l'information fournie.\",\n es: 'Múltiples planes encontrados para la información proporcionada.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PLAN_USER_LIMIT_REACHED: {\n title: {\n en: 'Plan User Limit Reached',\n fr: 'Limite de participants atteint',\n es: 'Límite de participantes alcanzado',\n },\n message: {\n en: 'The plan has reached its user limit. Please upgrade to add more users.',\n fr: 'Le plan a atteint son limite de participants. Veuillez mettre à niveau pour ajouter plus de participants.',\n es: 'El plan ha alcanzado su límite de participantes. Actualice para agregar más usuarios.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n PLAN_PROJECT_LIMIT_REACHED: {\n title: {\n en: 'Plan Project Limit Reached',\n fr: 'Limite de projets atteint',\n es: 'Límite de proyectos alcanzado',\n },\n message: {\n en: 'The plan has reached its project limit. Please upgrade to add more projects.',\n fr: 'Le plan a atteint son limite de projets. Veuillez mettre à niveau pour ajouter plus de projets.',\n es: 'El plan ha alcanzado su límite de proyectos. Actualice para agregar más proyectos.',\n },\n statusCode: HttpStatusCodes.UNAUTHORIZED_401,\n },\n\n SUBSCRIPTION_CREATION_FAILED: {\n title: {\n en: 'Subscription Creation Failed',\n fr: 'Échec de la création de la souscription',\n es: 'Error al crear la suscripción',\n },\n message: {\n en: 'Failed to create the specified subscription.',\n fr: 'La création de la souscription a échoué.',\n es: 'No se pudo crear la suscripción especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n\n CALLBACK_URL_NOT_VALID: {\n title: {\n en: 'Callback URL not valid',\n fr: 'URL de rappel non valide',\n es: 'URL de devolución no válida',\n },\n message: {\n en: 'The callback URL is not valid.',\n fr: 'L’URL de rappel n’est pas valide.',\n es: 'La URL de devolución no es válida.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n STRIPE_SUBSCRIPTION_NO_CUSTOMER: {\n title: {\n en: 'No customer found',\n fr: 'Aucun client trouvé',\n es: 'No se encontró el cliente',\n },\n message: {\n en: 'No customer found for the provided subscription.',\n fr: \"Aucun client n'a été trouvé pour l'abonnement fourni.\",\n es: 'No se encontró ningún cliente para el suscripción proporcionada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n NO_SUBSCRIPTION_ID_PROVIDED: {\n title: {\n en: 'No subscription ID provided',\n fr: \"Aucun ID d'abonnement fourni\",\n es: 'No se proporcionó ningún ID de suscripción',\n },\n message: {\n en: 'No subscription ID provided.',\n fr: \"Aucun ID d'abonnement n'a été fourni.\",\n es: 'No se proporcionó ningún ID de suscripción.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n CANNOT_CANCEL_SUBSCRIPTION: {\n title: {\n en: 'Cannot cancel subscription',\n fr: \"Impossible d'annuler l'abonnement\",\n es: 'No se puede cancelar la suscripción',\n },\n message: {\n en: 'Cannot cancel subscription.',\n fr: \"Impossible d'annuler l'abonnement.\",\n es: 'No se puede cancelar la suscripción.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n ALREADY_SUBSCRIBED: {\n title: {\n en: 'Already Subscribed',\n fr: 'Déjà abonné',\n es: 'Ya suscrito',\n },\n message: {\n en: 'You are already subscribed to this plan.',\n fr: 'Vous êtes déjà abonné à ce plan.',\n es: 'Ya estás suscrito a este plan.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n SESSION_CREATION_FAILED: {\n title: {\n en: 'Session Creation Failed',\n fr: 'Échec de la création de la session',\n es: 'Error al crear la sesión',\n },\n message: {\n en: 'Failed to create the specified session.',\n fr: 'La création de la session a échoué.',\n es: 'No se pudo crear la sesión especificada.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n SETUP_INTENT_CREATION_FAILED: {\n title: {\n en: 'Setup Intent Creation Failed',\n fr: \"Échec de la création de l'intention de configuration\",\n es: 'Error al crear la intención de configuración',\n },\n message: {\n en: 'Failed to create the setup intent.',\n fr: \"Échec de la création de l'intention de configuration.\",\n es: 'Error al crear la intención de configuración.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n QUERY_FAILED: {\n title: {\n en: 'Query failed',\n fr: 'Requête échouée',\n es: 'Consulta fallida',\n },\n message: {\n en: 'Query failed',\n fr: 'Requête échouée',\n es: 'Consulta fallida',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n AUDIT_FAILED: {\n title: {\n en: 'Audit failed',\n fr: 'Audit échoué',\n es: 'Audito fallido',\n },\n message: {\n en: 'Failed to audit the content declaration files.',\n fr: \"Échec de l'audit des fichiers de déclaration de contenu.\",\n es: 'Error al auditar los archivos de declaración de contenido.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n\n TAG_NOT_FOUND: {\n title: {\n en: 'Tag Not Found',\n fr: 'Tag non trouvé',\n es: 'Tag no encontrado',\n },\n message: {\n en: 'The specified tag could not be found.',\n fr: 'Le tag spécifié est introuvable.',\n es: 'El tag especificado no se pudo encontrar.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n TAG_ID_NOT_FOUND: {\n title: {\n en: 'Tag ID Not Found',\n fr: 'Identifiant de tag non trouvé',\n es: 'Identificador de tag no encontrado',\n },\n message: {\n en: 'The tag ID was not found.',\n fr: \"L'identifiant de tag n'a pas été trouvé.\",\n es: 'El identificador de tag no se ha encontrado.',\n },\n statusCode: HttpStatusCodes.NOT_FOUND_404,\n },\n TAG_ID_MISMATCH: {\n title: {\n en: 'Tag ID Mismatch',\n fr: 'Identifiant de tag non correspondant',\n es: 'Identificador de tag no coincidente',\n },\n message: {\n en: 'The provided tag ID does not match the expected value. Please verify and try again.',\n fr: \"L'identifiant de tag fourni ne correspond pas à la valeur attendue. Veuillez vérifier et réessayer.\",\n es: 'El identificador de tag proporcionado no coincide con el valor esperado. Verifique e intente nuevamente.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n TAG_COUNT_FAILED: {\n title: {\n en: 'Tag Count Failed',\n fr: 'Échec du comptage du tag',\n es: 'Error al contar el tag',\n },\n message: {\n en: 'Failed to count tags.',\n fr: 'Le comptage des tags a échoué.',\n es: 'No se pudo contar los tags.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n TAG_INVALID_FIELDS: {\n title: {\n en: 'Tag Invalid Fields',\n fr: 'Champs du tag invalides',\n es: 'Campos del tag no válidos',\n },\n message: {\n en: 'The provided tag fields are invalid.',\n fr: 'Les champs fournis pour le tag sont invalides.',\n es: 'Los campos proporcionados para el tag no son válidos.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n TAG_UPDATE_FAILED: {\n title: {\n en: 'Tag Update Failed',\n fr: 'Échec de la mise à jour du tag',\n es: 'Error al actualizar el tag',\n },\n message: {\n en: 'Failed to update the specified tag.',\n fr: 'La mise à jour du tag a échoué.',\n es: 'No se pudo actualizar el tag especificado.',\n },\n statusCode: HttpStatusCodes.INTERNAL_SERVER_ERROR_500,\n },\n TAG_NOT_IN_ORGANIZATION: {\n title: {\n en: 'Tag Not In Organization',\n fr: \"Tag non dans l'organisation\",\n es: 'Etiqueta no en la organización',\n },\n message: {\n en: 'The specified tag is not in the organization.',\n fr: \"Le tag spécifié n'est pas dans l'organisation.\",\n es: 'La etiqueta especificada no está en la organización.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n AI_ACCESS_DENIED: {\n title: {\n en: 'Access denied',\n fr: 'Accès refusé',\n es: 'Acceso denegado',\n },\n message: {\n en: 'Invalid Access keys. Access keys should be defined to use AI features. See https://intlayer.org/doc/concept/editor. Alternatively, you can add your own openAI API key in the settings.',\n fr: \"Clées d'accès invalides. Les clés d'accès doivent être définies pour utiliser les fonctionnalités AI. Voir https://intlayer.org/doc/concept/editor. Alternativement, vous pouvez ajouter votre propre clé API openAI dans les paramètres.\",\n es: 'Claves de acceso no válidas. Las claves de acceso deben definirse para usar funciones AI. Ver https://intlayer.org/doc/concept/editor. Alternativamente, puede agregar su propia clave API openAI en la configuración.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n RATE_LIMIT_EXCEEDED: {\n title: {\n en: 'Rate Limit Exceeded',\n fr: 'Limite de taux dépassée',\n es: 'Límite de tasa excedido',\n },\n message: {\n en: 'Rate limit exceeded. Please try again later.',\n fr: 'Limite de taux dépassée. Veuillez réessayer plus tard.',\n es: 'Límite de tasa excedido. Por favor, inténtelo de nuevo más tarde.',\n },\n statusCode: HttpStatusCodes.TOO_MANY_REQUESTS_429,\n },\n RATE_LIMIT_EXCEEDED_UNAUTHENTICATED: {\n title: {\n en: 'Rate Limit Exceeded',\n fr: 'Limite de taux dépassée',\n es: 'Límite de tasa excedido',\n },\n message: {\n en: 'The number of requests is limited for unauthenticated users. Please try again later, or sign in at https://intlayer.org/login to increase your limit.',\n fr: 'Le nombre de requêtes est limité pour les utilisateurs non authentifiés. Veuillez réessayer plus tard, ou connectez-vous à https://intlayer.org/login pour augmenter votre limite.',\n es: 'El número de solicitudes está limitado para usuarios no autenticados. Por favor, inténtelo de nuevo más tarde, o inicie sesión en https://intlayer.org/login para aumentar su límite.',\n },\n statusCode: HttpStatusCodes.TOO_MANY_REQUESTS_429,\n },\n SESSION_NOT_DEFINED: {\n title: {\n en: 'Session not defined',\n fr: 'Session non définie',\n es: 'Sesión no definida',\n },\n message: {\n en: 'The session is not defined.',\n fr: \"La session n'est pas définie.\",\n es: 'La sesión no está definida.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n INVALID_OAUTH_GRANT_TYPE: {\n title: {\n en: 'Invalid OAuth grant type',\n fr: 'Type de grant OAuth invalide',\n es: 'Tipo de grant OAuth inválido',\n },\n message: {\n en: 'The grant type is invalid.',\n fr: 'Le type de grant est invalide.',\n es: 'El tipo de grant es inválido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n INVALID_OAUTH_CLIENT: {\n title: {\n en: 'Invalid OAuth client',\n fr: 'Client OAuth invalide',\n es: 'Cliente OAuth inválido',\n },\n message: {\n en: 'The client is invalid.',\n fr: 'Le client est invalide.',\n es: 'El cliente es inválido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n INVALID_ACCESS_TOKEN: {\n title: {\n en: 'Invalid access token',\n fr: \"Jeton d'accès invalide\",\n es: 'Token de acceso inválido',\n },\n message: {\n en: 'The access token is invalid.',\n fr: \"Le jeton d'accès est invalide.\",\n es: 'El token de acceso es inválido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n EXPIRED_ACCESS_TOKEN: {\n title: {\n en: 'Expired access token',\n fr: \"Jeton d'accès expiré\",\n es: 'Token de acceso expirado',\n },\n message: {\n en: 'The access token has expired.',\n fr: \"Le jeton d'accès a expiré.\",\n es: 'El token de acceso ha expirado.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n PERMISSION_DENIED: {\n title: {\n en: 'Permission Denied',\n fr: 'Permission refusée',\n es: 'Permiso denegado',\n },\n message: {\n en: 'You do not have permission to access this resource.',\n fr: \"Vous n'avez pas les permissions nécessaires pour accéder à cette ressource.\",\n es: 'No tienes permisos para acceder a este recurso.',\n },\n statusCode: HttpStatusCodes.FORBIDDEN_403,\n },\n INVALID_REQUEST_BODY: {\n title: {\n en: 'Invalid Request Body',\n fr: 'Corps de requête invalide',\n es: 'Cuerpo de solicitud inválido',\n },\n message: {\n en: 'The request body is invalid.',\n fr: 'Le corps de la requête est invalide.',\n es: 'El cuerpo de la solicitud es inválido.',\n },\n statusCode: HttpStatusCodes.BAD_REQUEST_400,\n },\n} satisfies Record<string, ErrorCode>;\n\nexport type ErrorCodes = keyof typeof errorData;\n"],"mappings":"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","names":[]}
@@ -4,8 +4,7 @@ const mapProjectToAPI = (project) => {
4
4
  return null;
5
5
  }
6
6
  const projectObject = ensureMongoDocumentToObject(project);
7
- const { adminsIds, ...projectAPI } = projectObject;
8
- return projectAPI;
7
+ return projectObject;
9
8
  };
10
9
  const mapProjectsToAPI = (projects) => projects.map(mapProjectToAPI).filter(Boolean);
11
10
  export {