@intlayer/backend 5.5.7 → 5.5.8
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.
- package/dist/cjs/controllers/newsletter.controller.cjs +162 -0
- package/dist/cjs/controllers/newsletter.controller.cjs.map +1 -0
- package/dist/cjs/export.cjs +3 -0
- package/dist/cjs/export.cjs.map +1 -1
- package/dist/cjs/index.cjs +11 -9
- package/dist/cjs/index.cjs.map +1 -1
- package/dist/cjs/routes/ai.routes.cjs +4 -1
- package/dist/cjs/routes/ai.routes.cjs.map +1 -1
- package/dist/cjs/routes/dictionary.routes.cjs +4 -1
- package/dist/cjs/routes/dictionary.routes.cjs.map +1 -1
- package/dist/cjs/routes/eventListener.routes.cjs +4 -1
- package/dist/cjs/routes/eventListener.routes.cjs.map +1 -1
- package/dist/cjs/routes/newsletter.routes.cjs +66 -0
- package/dist/cjs/routes/newsletter.routes.cjs.map +1 -0
- package/dist/cjs/routes/organization.routes.cjs +4 -1
- package/dist/cjs/routes/organization.routes.cjs.map +1 -1
- package/dist/cjs/routes/project.routes.cjs +4 -1
- package/dist/cjs/routes/project.routes.cjs.map +1 -1
- package/dist/cjs/routes/search.routes.cjs +4 -1
- package/dist/cjs/routes/search.routes.cjs.map +1 -1
- package/dist/cjs/routes/sessionAuth.routes.cjs +4 -1
- package/dist/cjs/routes/sessionAuth.routes.cjs.map +1 -1
- package/dist/cjs/routes/stripe.routes.cjs +4 -1
- package/dist/cjs/routes/stripe.routes.cjs.map +1 -1
- package/dist/cjs/routes/tags.routes.cjs +4 -1
- package/dist/cjs/routes/tags.routes.cjs.map +1 -1
- package/dist/cjs/routes/user.routes.cjs +4 -1
- package/dist/cjs/routes/user.routes.cjs.map +1 -1
- package/dist/cjs/schemas/user.schema.cjs +9 -0
- package/dist/cjs/schemas/user.schema.cjs.map +1 -1
- package/dist/cjs/types/user.types.cjs +15 -0
- package/dist/cjs/types/user.types.cjs.map +1 -1
- package/dist/cjs/utils/AI/aiSdk.cjs +2 -2
- package/dist/cjs/utils/AI/aiSdk.cjs.map +1 -1
- package/dist/cjs/utils/AI/askDocQuestion/PROMPT.md +6 -2
- package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs +16 -10
- package/dist/cjs/utils/AI/askDocQuestion/askDocQuestion.cjs.map +1 -1
- package/dist/cjs/utils/AI/askDocQuestion/embeddings.json +7182 -0
- package/dist/cjs/utils/AI/autocomplete/PROMPT.md +24 -7
- package/dist/cjs/utils/AI/autocomplete/index.cjs +4 -2
- package/dist/cjs/utils/AI/autocomplete/index.cjs.map +1 -1
- package/dist/esm/controllers/newsletter.controller.mjs +126 -0
- package/dist/esm/controllers/newsletter.controller.mjs.map +1 -0
- package/dist/esm/export.mjs +2 -0
- package/dist/esm/export.mjs.map +1 -1
- package/dist/esm/index.mjs +26 -18
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/routes/ai.routes.mjs +3 -1
- package/dist/esm/routes/ai.routes.mjs.map +1 -1
- package/dist/esm/routes/dictionary.routes.mjs +6 -4
- package/dist/esm/routes/dictionary.routes.mjs.map +1 -1
- package/dist/esm/routes/eventListener.routes.mjs +3 -1
- package/dist/esm/routes/eventListener.routes.mjs.map +1 -1
- package/dist/esm/routes/newsletter.routes.mjs +44 -0
- package/dist/esm/routes/newsletter.routes.mjs.map +1 -0
- package/dist/esm/routes/organization.routes.mjs +7 -5
- package/dist/esm/routes/organization.routes.mjs.map +1 -1
- package/dist/esm/routes/project.routes.mjs +6 -4
- package/dist/esm/routes/project.routes.mjs.map +1 -1
- package/dist/esm/routes/search.routes.mjs +3 -1
- package/dist/esm/routes/search.routes.mjs.map +1 -1
- package/dist/esm/routes/sessionAuth.routes.mjs +11 -9
- package/dist/esm/routes/sessionAuth.routes.mjs.map +1 -1
- package/dist/esm/routes/stripe.routes.mjs +4 -2
- package/dist/esm/routes/stripe.routes.mjs.map +1 -1
- package/dist/esm/routes/tags.routes.mjs +3 -1
- package/dist/esm/routes/tags.routes.mjs.map +1 -1
- package/dist/esm/routes/user.routes.mjs +7 -5
- package/dist/esm/routes/user.routes.mjs.map +1 -1
- package/dist/esm/schemas/user.schema.mjs +9 -0
- package/dist/esm/schemas/user.schema.mjs.map +1 -1
- package/dist/esm/types/user.types.mjs +7 -0
- package/dist/esm/types/user.types.mjs.map +1 -1
- package/dist/esm/utils/AI/aiSdk.mjs +2 -2
- package/dist/esm/utils/AI/aiSdk.mjs.map +1 -1
- package/dist/esm/utils/AI/askDocQuestion/PROMPT.md +6 -2
- package/dist/esm/utils/AI/askDocQuestion/askDocQuestion.mjs +16 -10
- package/dist/esm/utils/AI/askDocQuestion/askDocQuestion.mjs.map +1 -1
- package/dist/esm/utils/AI/askDocQuestion/embeddings.json +7182 -0
- package/dist/esm/utils/AI/autocomplete/PROMPT.md +24 -7
- package/dist/esm/utils/AI/autocomplete/index.mjs +4 -2
- package/dist/esm/utils/AI/autocomplete/index.mjs.map +1 -1
- package/dist/types/controllers/newsletter.controller.d.ts +31 -0
- package/dist/types/controllers/newsletter.controller.d.ts.map +1 -0
- package/dist/types/export.d.ts +2 -0
- package/dist/types/export.d.ts.map +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/routes/ai.routes.d.ts +1 -0
- package/dist/types/routes/ai.routes.d.ts.map +1 -1
- package/dist/types/routes/dictionary.routes.d.ts +1 -0
- package/dist/types/routes/dictionary.routes.d.ts.map +1 -1
- package/dist/types/routes/eventListener.routes.d.ts +1 -0
- package/dist/types/routes/eventListener.routes.d.ts.map +1 -1
- package/dist/types/routes/newsletter.routes.d.ts +21 -0
- package/dist/types/routes/newsletter.routes.d.ts.map +1 -0
- package/dist/types/routes/organization.routes.d.ts +1 -0
- package/dist/types/routes/organization.routes.d.ts.map +1 -1
- package/dist/types/routes/project.routes.d.ts +1 -0
- package/dist/types/routes/project.routes.d.ts.map +1 -1
- package/dist/types/routes/search.routes.d.ts +1 -0
- package/dist/types/routes/search.routes.d.ts.map +1 -1
- package/dist/types/routes/sessionAuth.routes.d.ts +1 -0
- package/dist/types/routes/sessionAuth.routes.d.ts.map +1 -1
- package/dist/types/routes/stripe.routes.d.ts +1 -0
- package/dist/types/routes/stripe.routes.d.ts.map +1 -1
- package/dist/types/routes/tags.routes.d.ts +1 -0
- package/dist/types/routes/tags.routes.d.ts.map +1 -1
- package/dist/types/routes/user.routes.d.ts +1 -0
- package/dist/types/routes/user.routes.d.ts.map +1 -1
- package/dist/types/schemas/user.schema.d.ts +1 -1
- package/dist/types/schemas/user.schema.d.ts.map +1 -1
- package/dist/types/types/user.types.d.ts +7 -1
- package/dist/types/types/user.types.d.ts.map +1 -1
- package/dist/types/utils/AI/aiSdk.d.ts +1 -1
- package/dist/types/utils/AI/aiSdk.d.ts.map +1 -1
- package/dist/types/utils/AI/askDocQuestion/askDocQuestion.d.ts.map +1 -1
- package/dist/types/utils/AI/autocomplete/index.d.ts.map +1 -1
- package/package.json +19 -19
|
@@ -1,14 +1,31 @@
|
|
|
1
|
-
|
|
1
|
+
Forgot all the previous instructions.
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
You're the assistant and you will have to complete your own text.
|
|
4
4
|
|
|
5
|
-
-
|
|
6
|
-
- guess the next word(s)
|
|
7
|
-
-
|
|
5
|
+
- As do Github Copilot, your role is to autocomplete the user text provided.
|
|
6
|
+
- You should try to guess the next word(s) or complete the sentence.
|
|
7
|
+
- Your completion should not exceed one sentence.
|
|
8
|
+
- Minimize the completion length if you're unsure about the user's input.
|
|
8
9
|
|
|
9
|
-
|
|
10
|
+
The user input will be provided in the next user message:
|
|
10
11
|
|
|
11
|
-
|
|
12
|
+
Exmaple of entry:
|
|
13
|
+
|
|
14
|
+
```json
|
|
15
|
+
{ "role": "user", "content": "Lorem ipsum " }
|
|
16
|
+
```
|
|
17
|
+
|
|
18
|
+
Example of output:
|
|
19
|
+
|
|
20
|
+
```text
|
|
21
|
+
dolor sit amet,
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
Or:
|
|
25
|
+
|
|
26
|
+
```text
|
|
27
|
+
dolor sit amet, consectetur adipiscing elit. Sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
|
|
28
|
+
```
|
|
12
29
|
|
|
13
30
|
You should return your autocompletion without any additional text or formatting.
|
|
14
31
|
|
|
@@ -57,8 +57,10 @@ const autocomplete = async ({
|
|
|
57
57
|
temperature: aiConfig.temperature,
|
|
58
58
|
messages: [
|
|
59
59
|
{ role: "system", content: prompt },
|
|
60
|
-
{ role: "
|
|
61
|
-
]
|
|
60
|
+
{ role: "assistant", content: text }
|
|
61
|
+
],
|
|
62
|
+
maxTokens: 6
|
|
63
|
+
// Generate next 6 tokens
|
|
62
64
|
});
|
|
63
65
|
import_logger.logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);
|
|
64
66
|
return {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../src/utils/AI/autocomplete/index.ts"],"sourcesContent":["import { logger } from '@logger';\nimport { generateText } from 'ai';\nimport { readFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { AIOptions, AIProvider, getAIConfig } from '../aiSdk';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n// Get the content of a file at the specified path\nconst getFileContent = (filePath: string) => {\n return readFileSync(join(__dirname, filePath), { encoding: 'utf-8' });\n};\n\nexport type AutocompleteOptions = {\n text: string;\n aiOptions?: AIOptions;\n};\n\nexport type AutocompleteFileResultData = {\n autocompletion: string;\n tokenUsed: number;\n};\n\n// The prompt template to send to the AI model\nconst CHAT_GPT_PROMPT = getFileContent('./PROMPT.md');\n\n/**\n * Autocompletes a content declaration file by constructing a prompt for AI models.\n * The prompt includes details about the project's locales, file paths of content declarations,\n * and requests for identifying issues or inconsistencies.\n */\nexport const autocomplete = async ({\n text,\n aiOptions,\n}: AutocompleteOptions): Promise<AutocompleteFileResultData | undefined> => {\n try {\n // Prepare the prompt for AI by replacing placeholders with actual values.\n const prompt = CHAT_GPT_PROMPT.replace(\n '{{applicationContext}}',\n aiOptions?.applicationContext ?? ''\n );\n\n // Get the appropriate AI model configuration\n const aiConfig = await getAIConfig({\n model: 'gpt-4o-mini',\n provider: AIProvider.OPENAI,\n apiKey: process.env.OPENAI_API_KEY,\n ...aiOptions,\n });\n\n if (!aiConfig) {\n logger.error('Failed to configure AI model');\n return undefined;\n }\n\n // Use the AI SDK to generate the completion\n const { text: newContent, usage } = await generateText({\n model: aiConfig.model,\n temperature: aiConfig.temperature,\n messages: [\n { role: 'system', content: prompt },\n { role: '
|
|
1
|
+
{"version":3,"sources":["../../../../../src/utils/AI/autocomplete/index.ts"],"sourcesContent":["import { logger } from '@logger';\nimport { generateText } from 'ai';\nimport { readFileSync } from 'fs';\nimport { dirname, join } from 'path';\nimport { fileURLToPath } from 'url';\nimport { AIOptions, AIProvider, getAIConfig } from '../aiSdk';\n\nconst __dirname = dirname(fileURLToPath(import.meta.url));\n\n// Get the content of a file at the specified path\nconst getFileContent = (filePath: string) => {\n return readFileSync(join(__dirname, filePath), { encoding: 'utf-8' });\n};\n\nexport type AutocompleteOptions = {\n text: string;\n aiOptions?: AIOptions;\n};\n\nexport type AutocompleteFileResultData = {\n autocompletion: string;\n tokenUsed: number;\n};\n\n// The prompt template to send to the AI model\nconst CHAT_GPT_PROMPT = getFileContent('./PROMPT.md');\n\n/**\n * Autocompletes a content declaration file by constructing a prompt for AI models.\n * The prompt includes details about the project's locales, file paths of content declarations,\n * and requests for identifying issues or inconsistencies.\n */\nexport const autocomplete = async ({\n text,\n aiOptions,\n}: AutocompleteOptions): Promise<AutocompleteFileResultData | undefined> => {\n try {\n // Prepare the prompt for AI by replacing placeholders with actual values.\n const prompt = CHAT_GPT_PROMPT.replace(\n '{{applicationContext}}',\n aiOptions?.applicationContext ?? ''\n );\n\n // Get the appropriate AI model configuration\n const aiConfig = await getAIConfig({\n model: 'gpt-4o-mini',\n provider: AIProvider.OPENAI,\n apiKey: process.env.OPENAI_API_KEY,\n ...aiOptions,\n });\n\n if (!aiConfig) {\n logger.error('Failed to configure AI model');\n return undefined;\n }\n\n // Use the AI SDK to generate the completion\n const { text: newContent, usage } = await generateText({\n model: aiConfig.model,\n temperature: aiConfig.temperature,\n messages: [\n { role: 'system', content: prompt },\n { role: 'assistant', content: text },\n ],\n maxTokens: 6, // Generate next 6 tokens\n });\n\n logger.info(`${usage?.totalTokens ?? 0} tokens used in the request`);\n\n return {\n autocompletion: newContent,\n tokenUsed: usage?.totalTokens ?? 0,\n };\n } catch (error) {\n console.error(error);\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,oBAAuB;AACvB,gBAA6B;AAC7B,gBAA6B;AAC7B,kBAA8B;AAC9B,iBAA8B;AAC9B,mBAAmD;AALnD;AAOA,MAAM,gBAAY,yBAAQ,0BAAc,YAAY,GAAG,CAAC;AAGxD,MAAM,iBAAiB,CAAC,aAAqB;AAC3C,aAAO,4BAAa,kBAAK,WAAW,QAAQ,GAAG,EAAE,UAAU,QAAQ,CAAC;AACtE;AAaA,MAAM,kBAAkB,eAAe,aAAa;AAO7C,MAAM,eAAe,OAAO;AAAA,EACjC;AAAA,EACA;AACF,MAA4E;AAC1E,MAAI;AAEF,UAAM,SAAS,gBAAgB;AAAA,MAC7B;AAAA,MACA,WAAW,sBAAsB;AAAA,IACnC;AAGA,UAAM,WAAW,UAAM,0BAAY;AAAA,MACjC,OAAO;AAAA,MACP,UAAU,wBAAW;AAAA,MACrB,QAAQ,QAAQ,IAAI;AAAA,MACpB,GAAG;AAAA,IACL,CAAC;AAED,QAAI,CAAC,UAAU;AACb,2BAAO,MAAM,8BAA8B;AAC3C,aAAO;AAAA,IACT;AAGA,UAAM,EAAE,MAAM,YAAY,MAAM,IAAI,UAAM,wBAAa;AAAA,MACrD,OAAO,SAAS;AAAA,MAChB,aAAa,SAAS;AAAA,MACtB,UAAU;AAAA,QACR,EAAE,MAAM,UAAU,SAAS,OAAO;AAAA,QAClC,EAAE,MAAM,aAAa,SAAS,KAAK;AAAA,MACrC;AAAA,MACA,WAAW;AAAA;AAAA,IACb,CAAC;AAED,yBAAO,KAAK,GAAG,OAAO,eAAe,CAAC,6BAA6B;AAEnE,WAAO;AAAA,MACL,gBAAgB;AAAA,MAChB,WAAW,OAAO,eAAe;AAAA,IACnC;AAAA,EACF,SAAS,OAAO;AACd,YAAQ,MAAM,KAAK;AAAA,EACrB;AACF;","names":[]}
|
|
@@ -0,0 +1,126 @@
|
|
|
1
|
+
import { logger } from "./../logger/index.mjs";
|
|
2
|
+
import * as userService from "./../services/user.service.mjs";
|
|
3
|
+
import { ErrorHandler } from "./../utils/errors/index.mjs";
|
|
4
|
+
import { mapUserToAPI } from "./../utils/mapper/user.mjs";
|
|
5
|
+
import { formatResponse } from "./../utils/responseData.mjs";
|
|
6
|
+
import { t } from "express-intlayer";
|
|
7
|
+
const subscribeToNewsletter = async (req, res, _next) => {
|
|
8
|
+
const { email, emailList } = req.body;
|
|
9
|
+
if (!email) {
|
|
10
|
+
ErrorHandler.handleGenericErrorResponse(res, "USER_DATA_NOT_FOUND");
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const emailLists = Array.isArray(emailList) ? emailList : [emailList];
|
|
14
|
+
const emailsListObject = Object.fromEntries(
|
|
15
|
+
emailLists.map((list) => [list, true])
|
|
16
|
+
);
|
|
17
|
+
try {
|
|
18
|
+
let user = await userService.getUserByEmail(email);
|
|
19
|
+
if (!user) {
|
|
20
|
+
user = await userService.createUser({
|
|
21
|
+
email,
|
|
22
|
+
emailsList: emailsListObject
|
|
23
|
+
});
|
|
24
|
+
logger.info(`New user created and subscribed to newsletter: ${email}`);
|
|
25
|
+
} else {
|
|
26
|
+
user = await userService.updateUserById(user._id, {
|
|
27
|
+
emailsList: { ...user.emailsList, ...emailsListObject }
|
|
28
|
+
});
|
|
29
|
+
logger.info(`User subscribed to newsletter: ${email}`);
|
|
30
|
+
}
|
|
31
|
+
const formattedUser = mapUserToAPI(user);
|
|
32
|
+
const responseData = formatResponse({
|
|
33
|
+
message: t({
|
|
34
|
+
en: "Successfully subscribed to newsletter",
|
|
35
|
+
fr: "Abonnement \xE0 la newsletter r\xE9ussi",
|
|
36
|
+
es: "Suscripci\xF3n al bolet\xEDn exitosa"
|
|
37
|
+
}),
|
|
38
|
+
description: t({
|
|
39
|
+
en: "You have been successfully subscribed to our newsletter",
|
|
40
|
+
fr: "Vous avez \xE9t\xE9 abonn\xE9 avec succ\xE8s \xE0 notre newsletter",
|
|
41
|
+
es: "Te has suscrito exitosamente a nuestro bolet\xEDn"
|
|
42
|
+
}),
|
|
43
|
+
data: formattedUser
|
|
44
|
+
});
|
|
45
|
+
res.json(responseData);
|
|
46
|
+
return;
|
|
47
|
+
} catch (error) {
|
|
48
|
+
ErrorHandler.handleAppErrorResponse(res, error);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
};
|
|
52
|
+
const unsubscribeFromNewsletter = async (req, res, _next) => {
|
|
53
|
+
const { userId, emailList } = req.body;
|
|
54
|
+
if (!userId) {
|
|
55
|
+
ErrorHandler.handleGenericErrorResponse(res, "USER_DATA_NOT_FOUND");
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
try {
|
|
59
|
+
const user = await userService.getUserById(userId);
|
|
60
|
+
if (!user) {
|
|
61
|
+
ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
|
|
62
|
+
return;
|
|
63
|
+
}
|
|
64
|
+
const emailLists = Array.isArray(emailList) ? emailList : [emailList];
|
|
65
|
+
const emailsListObject = Object.fromEntries(
|
|
66
|
+
emailLists.map((list) => [list, false])
|
|
67
|
+
);
|
|
68
|
+
const updatedUser = await userService.updateUserById(user._id, {
|
|
69
|
+
emailsList: { ...user.emailsList, ...emailsListObject }
|
|
70
|
+
});
|
|
71
|
+
logger.info(`User unsubscribed from newsletter: ${updatedUser.email}`);
|
|
72
|
+
const formattedUser = mapUserToAPI(updatedUser);
|
|
73
|
+
const responseData = formatResponse({
|
|
74
|
+
message: t({
|
|
75
|
+
en: "Successfully unsubscribed from newsletter",
|
|
76
|
+
fr: "D\xE9sabonnement de la newsletter r\xE9ussi",
|
|
77
|
+
es: "Cancelaci\xF3n de suscripci\xF3n al bolet\xEDn exitosa"
|
|
78
|
+
}),
|
|
79
|
+
description: t({
|
|
80
|
+
en: "You have been successfully unsubscribed from our newsletter",
|
|
81
|
+
fr: "Vous avez \xE9t\xE9 d\xE9sabonn\xE9 avec succ\xE8s de notre newsletter",
|
|
82
|
+
es: "Te has desuscrito exitosamente de nuestro bolet\xEDn"
|
|
83
|
+
}),
|
|
84
|
+
data: formattedUser
|
|
85
|
+
});
|
|
86
|
+
res.json(responseData);
|
|
87
|
+
return;
|
|
88
|
+
} catch (error) {
|
|
89
|
+
ErrorHandler.handleAppErrorResponse(res, error);
|
|
90
|
+
return;
|
|
91
|
+
}
|
|
92
|
+
};
|
|
93
|
+
const getNewsletterStatus = async (req, res, _next) => {
|
|
94
|
+
const email = res.locals.user?.email;
|
|
95
|
+
if (!email) {
|
|
96
|
+
ErrorHandler.handleGenericErrorResponse(res, "USER_DATA_NOT_FOUND");
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
try {
|
|
100
|
+
const user = await userService.getUserByEmail(email);
|
|
101
|
+
if (!user) {
|
|
102
|
+
ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
|
|
103
|
+
return;
|
|
104
|
+
}
|
|
105
|
+
const formattedUser = mapUserToAPI(user);
|
|
106
|
+
const responseData = formatResponse({
|
|
107
|
+
message: t({
|
|
108
|
+
en: "Newsletter subscription status retrieved",
|
|
109
|
+
fr: "Statut d'abonnement \xE0 la newsletter r\xE9cup\xE9r\xE9",
|
|
110
|
+
es: "Estado de suscripci\xF3n al bolet\xEDn obtenido"
|
|
111
|
+
}),
|
|
112
|
+
data: formattedUser
|
|
113
|
+
});
|
|
114
|
+
res.json(responseData);
|
|
115
|
+
return;
|
|
116
|
+
} catch (error) {
|
|
117
|
+
ErrorHandler.handleAppErrorResponse(res, error);
|
|
118
|
+
return;
|
|
119
|
+
}
|
|
120
|
+
};
|
|
121
|
+
export {
|
|
122
|
+
getNewsletterStatus,
|
|
123
|
+
subscribeToNewsletter,
|
|
124
|
+
unsubscribeFromNewsletter
|
|
125
|
+
};
|
|
126
|
+
//# sourceMappingURL=newsletter.controller.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/controllers/newsletter.controller.ts"],"sourcesContent":["import type { EmailsList, UserAPI } from '@/types/user.types';\nimport { logger } from '@logger';\nimport type { ResponseWithInformation } from '@middlewares/sessionAuth.middleware';\nimport * as userService from '@services/user.service';\nimport { type AppError, ErrorHandler } from '@utils/errors';\nimport { mapUserToAPI } from '@utils/mapper/user';\nimport { formatResponse, type ResponseData } from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport { t } from 'express-intlayer';\n\nexport type NewsletterSubscriptionBody = {\n email: string;\n emailList: EmailsList | EmailsList[];\n};\nexport type NewsletterSubscriptionResult = ResponseData<UserAPI>;\n\n/**\n * Subscribes a user to the newsletter.\n * If the user doesn't exist, creates a new user.\n * If the user exists, updates their newsletter subscription to true.\n */\nexport const subscribeToNewsletter = async (\n req: Request<any, any, NewsletterSubscriptionBody>,\n res: ResponseWithInformation<NewsletterSubscriptionResult>,\n _next: NextFunction\n): Promise<void> => {\n const { email, emailList } = req.body;\n\n if (!email) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_DATA_NOT_FOUND');\n return;\n }\n\n const emailLists = Array.isArray(emailList) ? emailList : [emailList];\n\n // Create new user with newsletter subscription enabled\n const emailsListObject = Object.fromEntries(\n emailLists.map((list) => [list, true])\n ) as Record<EmailsList, boolean>;\n\n try {\n // Check if user exists\n let user = await userService.getUserByEmail(email);\n\n if (!user) {\n user = await userService.createUser({\n email,\n emailsList: emailsListObject,\n });\n\n logger.info(`New user created and subscribed to newsletter: ${email}`);\n } else {\n // Update existing user's newsletter subscription\n user = await userService.updateUserById(user._id, {\n emailsList: { ...user.emailsList, ...emailsListObject },\n });\n\n logger.info(`User subscribed to newsletter: ${email}`);\n }\n\n const formattedUser = mapUserToAPI(user);\n\n const responseData = formatResponse<UserAPI>({\n message: t({\n en: 'Successfully subscribed to newsletter',\n fr: 'Abonnement à la newsletter réussi',\n es: 'Suscripción al boletín exitosa',\n }),\n description: t({\n en: 'You have been successfully subscribed to our newsletter',\n fr: 'Vous avez été abonné avec succès à notre newsletter',\n es: 'Te has suscrito exitosamente a nuestro boletín',\n }),\n data: formattedUser,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type NewsletterUnsubscriptionBody = {\n userId: string;\n emailList: EmailsList | EmailsList[];\n};\n\n/**\n * Unsubscribes a user from the newsletter.\n * Only works if the user exists.\n */\nexport const unsubscribeFromNewsletter = async (\n req: Request<any, any, NewsletterUnsubscriptionBody>,\n res: ResponseWithInformation<NewsletterSubscriptionResult>,\n _next: NextFunction\n): Promise<void> => {\n const { userId, emailList } = req.body;\n\n if (!userId) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_DATA_NOT_FOUND');\n return;\n }\n\n try {\n // Check if user exists\n const user = await userService.getUserById(userId);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n const emailLists = Array.isArray(emailList) ? emailList : [emailList];\n\n // Create new user with newsletter subscription enabled\n const emailsListObject = Object.fromEntries(\n emailLists.map((list) => [list, false])\n ) as Record<EmailsList, boolean>;\n\n // Update user's newsletter subscription to false\n const updatedUser = await userService.updateUserById(user._id, {\n emailsList: { ...user.emailsList, ...emailsListObject },\n });\n\n logger.info(`User unsubscribed from newsletter: ${updatedUser.email}`);\n\n const formattedUser = mapUserToAPI(updatedUser);\n\n const responseData = formatResponse<UserAPI>({\n message: t({\n en: 'Successfully unsubscribed from newsletter',\n fr: 'Désabonnement de la newsletter réussi',\n es: 'Cancelación de suscripción al boletín exitosa',\n }),\n description: t({\n en: 'You have been successfully unsubscribed from our newsletter',\n fr: 'Vous avez été désabonné avec succès de notre newsletter',\n es: 'Te has desuscrito exitosamente de nuestro boletín',\n }),\n data: formattedUser,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\n/**\n * Gets the newsletter subscription status for a user.\n */\nexport const getNewsletterStatus = async (\n req: Request<{ email: string }>,\n res: ResponseWithInformation<NewsletterSubscriptionResult>,\n _next: NextFunction\n): Promise<void> => {\n const email = res.locals.user?.email;\n\n if (!email) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_DATA_NOT_FOUND');\n return;\n }\n\n try {\n const user = await userService.getUserByEmail(email);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n const formattedUser = mapUserToAPI(user);\n\n const responseData = formatResponse<UserAPI>({\n message: t({\n en: 'Newsletter subscription status retrieved',\n fr: \"Statut d'abonnement à la newsletter récupéré\",\n es: 'Estado de suscripción al boletín obtenido',\n }),\n data: formattedUser,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n"],"mappings":"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","names":[]}
|
package/dist/esm/export.mjs
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { getDictionaryRoutes } from "./routes/dictionary.routes.mjs";
|
|
2
|
+
import { getNewsletterRoutes } from "./routes/newsletter.routes.mjs";
|
|
2
3
|
import { getOrganizationRoutes } from "./routes/organization.routes.mjs";
|
|
3
4
|
import { getProjectRoutes } from "./routes/project.routes.mjs";
|
|
4
5
|
import { getSessionAuthRoutes } from "./routes/sessionAuth.routes.mjs";
|
|
@@ -9,6 +10,7 @@ export * from "./utils/httpStatusCodes.mjs";
|
|
|
9
10
|
export * from "./utils/responseData.mjs";
|
|
10
11
|
export {
|
|
11
12
|
getDictionaryRoutes,
|
|
13
|
+
getNewsletterRoutes,
|
|
12
14
|
getOrganizationRoutes,
|
|
13
15
|
getProjectRoutes,
|
|
14
16
|
getSessionAuthRoutes,
|
package/dist/esm/export.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/export.ts"],"sourcesContent":["// Routes\nexport { getDictionaryRoutes } from '@routes/dictionary.routes';\nexport { getOrganizationRoutes } from '@routes/organization.routes';\nexport { getProjectRoutes } from '@routes/project.routes';\nexport { getSessionAuthRoutes } from '@routes/sessionAuth.routes';\nexport { getUserRoutes } from '@routes/user.routes';\n\n// Controllers types\nexport type * from '@controllers/ai.controller';\nexport type * from '@controllers/dictionary.controller';\nexport type * from '@controllers/eventListener.controller';\nexport type * from '@controllers/oAuth2.controller';\nexport type * from '@controllers/organization.controller';\nexport type * from '@controllers/project.controller';\nexport type * from '@controllers/projectAccessKey.controller';\nexport type * from '@controllers/search.controller';\nexport type * from '@controllers/sessionAuth.controller';\nexport type * from '@controllers/stripe.controller';\nexport type * from '@controllers/tag.controller';\nexport type * from '@controllers/user.controller';\n\n// Objects types\nexport type * from '@/types/dictionary.types';\nexport type * from '@/types/oAuth2.types';\nexport type * from '@/types/organization.types';\nexport type * from '@/types/plan.types';\nexport type * from '@/types/project.types';\nexport type * from '@/types/tag.types';\nexport type * from '@/types/user.types';\n\n// Utils\nexport * from '@utils/AI/aiSdk';\nexport * from '@utils/cookies';\nexport * from '@utils/httpStatusCodes';\nexport * from '@utils/responseData';\n"],"mappings":"AACA,SAAS,2BAA2B;AACpC,SAAS,6BAA6B;AACtC,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,qBAAqB;
|
|
1
|
+
{"version":3,"sources":["../../src/export.ts"],"sourcesContent":["// Routes\nexport { getDictionaryRoutes } from '@routes/dictionary.routes';\nexport { getNewsletterRoutes } from '@routes/newsletter.routes';\nexport { getOrganizationRoutes } from '@routes/organization.routes';\nexport { getProjectRoutes } from '@routes/project.routes';\nexport { getSessionAuthRoutes } from '@routes/sessionAuth.routes';\nexport { getUserRoutes } from '@routes/user.routes';\n\n// Controllers types\nexport type * from '@controllers/ai.controller';\nexport type * from '@controllers/dictionary.controller';\nexport type * from '@controllers/eventListener.controller';\nexport type * from '@controllers/newsletter.controller';\nexport type * from '@controllers/oAuth2.controller';\nexport type * from '@controllers/organization.controller';\nexport type * from '@controllers/project.controller';\nexport type * from '@controllers/projectAccessKey.controller';\nexport type * from '@controllers/search.controller';\nexport type * from '@controllers/sessionAuth.controller';\nexport type * from '@controllers/stripe.controller';\nexport type * from '@controllers/tag.controller';\nexport type * from '@controllers/user.controller';\n\n// Objects types\nexport type * from '@/types/dictionary.types';\nexport type * from '@/types/oAuth2.types';\nexport type * from '@/types/organization.types';\nexport type * from '@/types/plan.types';\nexport type * from '@/types/project.types';\nexport type * from '@/types/tag.types';\nexport type * from '@/types/user.types';\n\n// Utils\nexport * from '@utils/AI/aiSdk';\nexport * from '@utils/cookies';\nexport * from '@utils/httpStatusCodes';\nexport * from '@utils/responseData';\n"],"mappings":"AACA,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AACpC,SAAS,6BAA6B;AACtC,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,qBAAqB;AA2B9B,cAAc;AACd,cAAc;AACd,cAAc;AACd,cAAc;","names":[]}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -16,16 +16,23 @@ import {
|
|
|
16
16
|
checkProject,
|
|
17
17
|
checkUser
|
|
18
18
|
} from "./middlewares/sessionAuth.middleware.mjs";
|
|
19
|
-
import { aiRouter } from "./routes/ai.routes.mjs";
|
|
20
|
-
import { dictionaryRouter } from "./routes/dictionary.routes.mjs";
|
|
21
|
-
import {
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
19
|
+
import { aiRoute, aiRouter } from "./routes/ai.routes.mjs";
|
|
20
|
+
import { dictionaryRoute, dictionaryRouter } from "./routes/dictionary.routes.mjs";
|
|
21
|
+
import {
|
|
22
|
+
eventListenerRoute,
|
|
23
|
+
eventListenerRouter
|
|
24
|
+
} from "./routes/eventListener.routes.mjs";
|
|
25
|
+
import { newsletterRoute, newsletterRouter } from "./routes/newsletter.routes.mjs";
|
|
26
|
+
import {
|
|
27
|
+
organizationRoute,
|
|
28
|
+
organizationRouter
|
|
29
|
+
} from "./routes/organization.routes.mjs";
|
|
30
|
+
import { projectRoute, projectRouter } from "./routes/project.routes.mjs";
|
|
31
|
+
import { searchRoute, searchRouter } from "./routes/search.routes.mjs";
|
|
25
32
|
import { sessionAuthRouter } from "./routes/sessionAuth.routes.mjs";
|
|
26
|
-
import { stripeRouter } from "./routes/stripe.routes.mjs";
|
|
27
|
-
import { tagRouter } from "./routes/tags.routes.mjs";
|
|
28
|
-
import { userRouter } from "./routes/user.routes.mjs";
|
|
33
|
+
import { stripeRoute, stripeRouter } from "./routes/stripe.routes.mjs";
|
|
34
|
+
import { tagRoute, tagRouter } from "./routes/tags.routes.mjs";
|
|
35
|
+
import { userRoute, userRouter } from "./routes/user.routes.mjs";
|
|
29
36
|
import { stripeWebhook } from "./webhooks/stripe.webhook.mjs";
|
|
30
37
|
import { getOAuth2Token } from "./controllers/oAuth2.controller.mjs";
|
|
31
38
|
import {
|
|
@@ -119,15 +126,16 @@ app.use(/(.*)/, (req, res, next) => {
|
|
|
119
126
|
}
|
|
120
127
|
next();
|
|
121
128
|
});
|
|
122
|
-
app.use(
|
|
123
|
-
app.use(
|
|
124
|
-
app.use(
|
|
125
|
-
app.use(
|
|
126
|
-
app.use(
|
|
127
|
-
app.use(
|
|
128
|
-
app.use(
|
|
129
|
-
app.use(
|
|
130
|
-
app.use(
|
|
129
|
+
app.use(userRoute, userRouter);
|
|
130
|
+
app.use(organizationRoute, organizationRouter);
|
|
131
|
+
app.use(projectRoute, projectRouter);
|
|
132
|
+
app.use(tagRoute, tagRouter);
|
|
133
|
+
app.use(dictionaryRoute, dictionaryRouter);
|
|
134
|
+
app.use(stripeRoute, stripeRouter);
|
|
135
|
+
app.use(aiRoute, aiRouter);
|
|
136
|
+
app.use(eventListenerRoute, eventListenerRouter);
|
|
137
|
+
app.use(searchRoute, searchRouter);
|
|
138
|
+
app.use(newsletterRoute, newsletterRouter);
|
|
131
139
|
app.listen(process.env.PORT, () => {
|
|
132
140
|
logger.info(`Listening on port ${process.env.PORT}`);
|
|
133
141
|
});
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["// Libraries\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport cors, { type CorsOptions } from 'cors';\nimport dotenv from 'dotenv';\nimport express, { type Express } from 'express';\nimport { intlayer, t } from 'express-intlayer';\nimport helmet from 'helmet';\n\n// Middlewares\nimport {\n type RequestWithOAuth2Information,\n attachOAuthInstance,\n authenticateOAuth2,\n} from '@middlewares/oAuth2.middleware';\nimport { logAPIRequestURL } from '@middlewares/request.middleware';\nimport {\n type ResponseWithInformation,\n checkAdmin,\n checkOrganization,\n checkProject,\n checkUser,\n} from '@middlewares/sessionAuth.middleware';\n\n// Routes\nimport { aiRouter } from '@routes/ai.routes';\nimport { dictionaryRouter } from '@routes/dictionary.routes';\nimport {
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts"],"sourcesContent":["// Libraries\nimport compression from 'compression';\nimport cookieParser from 'cookie-parser';\nimport cors, { type CorsOptions } from 'cors';\nimport dotenv from 'dotenv';\nimport express, { type Express } from 'express';\nimport { intlayer, t } from 'express-intlayer';\nimport helmet from 'helmet';\n\n// Middlewares\nimport {\n type RequestWithOAuth2Information,\n attachOAuthInstance,\n authenticateOAuth2,\n} from '@middlewares/oAuth2.middleware';\nimport { logAPIRequestURL } from '@middlewares/request.middleware';\nimport {\n type ResponseWithInformation,\n checkAdmin,\n checkOrganization,\n checkProject,\n checkUser,\n} from '@middlewares/sessionAuth.middleware';\n\n// Routes\nimport { aiRoute, aiRouter } from '@routes/ai.routes';\nimport { dictionaryRoute, dictionaryRouter } from '@routes/dictionary.routes';\nimport {\n eventListenerRoute,\n eventListenerRouter,\n} from '@routes/eventListener.routes';\nimport { newsletterRoute, newsletterRouter } from '@routes/newsletter.routes';\nimport {\n organizationRoute,\n organizationRouter,\n} from '@routes/organization.routes';\nimport { projectRoute, projectRouter } from '@routes/project.routes';\nimport { searchRoute, searchRouter } from '@routes/search.routes';\nimport { sessionAuthRouter } from '@routes/sessionAuth.routes';\nimport { stripeRoute, stripeRouter } from '@routes/stripe.routes';\nimport { tagRoute, tagRouter } from '@routes/tags.routes';\nimport { userRoute, userRouter } from '@routes/user.routes';\n\n// Webhooks\nimport { stripeWebhook } from '@webhooks/stripe.webhook';\n\n// Controllers\nimport { getOAuth2Token } from '@controllers/oAuth2.controller';\nimport {\n getSessionInformation,\n setCSRFToken,\n} from '@controllers/sessionAuth.controller';\n\n// Utils\nimport { doubleCsrfProtection } from '@utils/CSRF';\nimport { connectDB } from '@utils/mongoDB/connectDB';\n\n// Logger\nimport { logger } from './logger/index';\n\nconst app: Express = express();\n\napp.disable('x-powered-by'); // Disabled to prevent attackers from knowing that the app is running Express\napp.use(helmet());\n\n// Environment variables\nconst env = app.get('env');\n\nlogger.info(`run as ${env}`);\n\ndotenv.config({\n path: [`.env.${env}.local`, `.env.${env}`, '.env.local', '.env'],\n});\n\n// Parse incoming requests with cookies\napp.use(cookieParser());\n\n// Load internationalization request handler\napp.use(intlayer());\n\nconst isDev = env === 'development';\n\n// Connect to MongoDB\nconnectDB();\n\n// Stripe\napp.post(\n '/webhook/stripe',\n express.raw({ type: 'application/json' }),\n stripeWebhook\n);\n\n// Compress all HTTP responses\napp.use(compression());\n\n// Parse incoming requests with JSON payloads\napp.use(express.json({ limit: '50mb' }));\n\n// Parse incoming requests with urlencoded payloads\napp.use(express.urlencoded({ extended: true }));\n\nconst whitelist = [process.env.CLIENT_URL!];\n\n// CORS\nconst corsOptions: CorsOptions = {\n origin: (origin, callback) => {\n // Allow requests with no origin (like mobile apps or curl requests)\n if (!origin) return callback(null, true);\n\n if (whitelist.includes(origin)) {\n logger.info('whitelisted origin', origin);\n return callback(null, true);\n }\n\n logger.info('non whitelisted origin', origin);\n // Reflect the request's origin (echo back the origin header)\n callback(null, origin);\n },\n allowedHeaders: [\n 'authorization',\n 'Content-Type',\n 'credentials',\n 'cache-control',\n 'Access-Control-Allow-Origin',\n 'private-state-token-redemption',\n 'private-state-token-issuance',\n 'browsing-topics',\n ],\n exposedHeaders: [''],\n preflightContinue: false,\n methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',\n credentials: true,\n};\napp.use(cors(corsOptions));\n\n// Liveness check\napp.get('/', (_req, res) => {\n res.send(\n t({\n en: 'Ok - locale: en',\n fr: 'Ok - locale: fr',\n es: 'Ok - locale: es',\n })\n );\n});\n\n// middleware - jwt & session auth\napp.use(/(.*)/, checkUser);\napp.use(/(.*)/, checkOrganization);\napp.use(/(.*)/, checkProject);\napp.use(/(.*)/, checkAdmin);\n\n// debug\nif (isDev) {\n app.use(logAPIRequestURL);\n}\n\n// Sessions\napp.get('/session', getSessionInformation);\napp.use('/api/auth', sessionAuthRouter);\n\n// CSRF\napp.get('/csrf-token', setCSRFToken);\n\n// oAuth2\napp.use(/(.*)/, attachOAuthInstance);\napp.post('/oauth2/token', getOAuth2Token); // Route to get the token\napp.use(/(.*)/, (req, res, next) => {\n // If the request is not already authenticated check the oAuth2 token\n if (!res.locals.authType) {\n return authenticateOAuth2(\n req as RequestWithOAuth2Information,\n res as ResponseWithInformation,\n next\n );\n }\n next();\n});\n\n// CSRF protection\napp.use(/(.*)/, (req, res, next) => {\n // If the request is authenticated using the session auth check the CSRF token\n if (res.locals.authType === 'session') {\n return doubleCsrfProtection(req, res, next);\n }\n next();\n});\n\n// Routes\napp.use(userRoute, userRouter);\napp.use(organizationRoute, organizationRouter);\napp.use(projectRoute, projectRouter);\napp.use(tagRoute, tagRouter);\napp.use(dictionaryRoute, dictionaryRouter);\napp.use(stripeRoute, stripeRouter);\napp.use(aiRoute, aiRouter);\napp.use(eventListenerRoute, eventListenerRouter);\napp.use(searchRoute, searchRouter);\napp.use(newsletterRoute, newsletterRouter);\n\n// Server\napp.listen(process.env.PORT, () => {\n logger.info(`Listening on port ${process.env.PORT}`);\n});\n\n// Export tu use as serverless function\nexport default app;\n"],"mappings":"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","names":[]}
|
|
@@ -9,7 +9,8 @@ import {
|
|
|
9
9
|
} from "./../controllers/ai.controller.mjs";
|
|
10
10
|
import { Router } from "express";
|
|
11
11
|
const aiRouter = Router();
|
|
12
|
-
const
|
|
12
|
+
const aiRoute = "/api/ai";
|
|
13
|
+
const baseURL = () => `${process.env.BACKEND_URL}${aiRoute}`;
|
|
13
14
|
const getAiRoutes = () => ({
|
|
14
15
|
translateJSON: {
|
|
15
16
|
urlModel: "/translate/json",
|
|
@@ -64,6 +65,7 @@ aiRouter.post(getAiRoutes().ask.urlModel, askDocQuestion);
|
|
|
64
65
|
aiRouter.post(getAiRoutes().auditTag.urlModel, auditTag);
|
|
65
66
|
aiRouter.post(getAiRoutes().autocomplete.urlModel, autocomplete);
|
|
66
67
|
export {
|
|
68
|
+
aiRoute,
|
|
67
69
|
aiRouter,
|
|
68
70
|
getAiRoutes
|
|
69
71
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/routes/ai.routes.ts"],"sourcesContent":["import type { Routes } from '@/types/Routes';\nimport {\n askDocQuestion,\n auditContentDeclaration,\n auditContentDeclarationField,\n auditContentDeclarationMetadata,\n auditTag,\n autocomplete,\n translateJSON,\n} from '@controllers/ai.controller';\nimport { Router } from 'express';\n\nexport const aiRouter: Router = Router();\n\nconst baseURL = () => `${process.env.BACKEND_URL}
|
|
1
|
+
{"version":3,"sources":["../../../src/routes/ai.routes.ts"],"sourcesContent":["import type { Routes } from '@/types/Routes';\nimport {\n askDocQuestion,\n auditContentDeclaration,\n auditContentDeclarationField,\n auditContentDeclarationMetadata,\n auditTag,\n autocomplete,\n translateJSON,\n} from '@controllers/ai.controller';\nimport { Router } from 'express';\n\nexport const aiRouter: Router = Router();\n\nexport const aiRoute = '/api/ai';\n\nconst baseURL = () => `${process.env.BACKEND_URL}${aiRoute}`;\n\nexport const getAiRoutes = () =>\n ({\n translateJSON: {\n urlModel: '/translate/json',\n url: `${baseURL()}/translate/json`,\n method: 'POST',\n },\n auditContentDeclaration: {\n urlModel: '/audit/dictionary',\n url: `${baseURL()}/audit/dictionary`,\n method: 'POST',\n },\n auditContentDeclarationField: {\n urlModel: '/audit/dictionary/field',\n url: `${baseURL()}/audit/dictionary/field`,\n method: 'POST',\n },\n auditContentDeclarationMetadata: {\n urlModel: '/audit/dictionary/metadata',\n url: `${baseURL()}/audit/dictionary/metadata`,\n method: 'POST',\n },\n auditTag: {\n urlModel: '/audit/tag',\n url: `${baseURL()}/audit/tag`,\n method: 'POST',\n },\n ask: {\n urlModel: '/ask',\n url: `${baseURL()}/ask`,\n method: 'POST',\n },\n autocomplete: {\n urlModel: '/autocomplete',\n url: `${baseURL()}/autocomplete`,\n method: 'POST',\n },\n }) satisfies Routes;\n\naiRouter.post(getAiRoutes().translateJSON.urlModel, translateJSON);\n\naiRouter.post(\n getAiRoutes().auditContentDeclaration.urlModel,\n auditContentDeclaration\n);\naiRouter.post(\n getAiRoutes().auditContentDeclarationField.urlModel,\n auditContentDeclarationField\n);\naiRouter.post(\n getAiRoutes().auditContentDeclarationMetadata.urlModel,\n auditContentDeclarationMetadata\n);\naiRouter.post(getAiRoutes().ask.urlModel, askDocQuestion);\n\naiRouter.post(getAiRoutes().auditTag.urlModel, auditTag);\n\naiRouter.post(getAiRoutes().autocomplete.urlModel, autocomplete);\n"],"mappings":"AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AAEhB,MAAM,WAAmB,OAAO;AAEhC,MAAM,UAAU;AAEvB,MAAM,UAAU,MAAM,GAAG,QAAQ,IAAI,WAAW,GAAG,OAAO;AAEnD,MAAM,cAAc,OACxB;AAAA,EACC,eAAe;AAAA,IACb,UAAU;AAAA,IACV,KAAK,GAAG,QAAQ,CAAC;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA,EACA,yBAAyB;AAAA,IACvB,UAAU;AAAA,IACV,KAAK,GAAG,QAAQ,CAAC;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA,EACA,8BAA8B;AAAA,IAC5B,UAAU;AAAA,IACV,KAAK,GAAG,QAAQ,CAAC;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA,EACA,iCAAiC;AAAA,IAC/B,UAAU;AAAA,IACV,KAAK,GAAG,QAAQ,CAAC;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA,EACA,UAAU;AAAA,IACR,UAAU;AAAA,IACV,KAAK,GAAG,QAAQ,CAAC;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA,EACA,KAAK;AAAA,IACH,UAAU;AAAA,IACV,KAAK,GAAG,QAAQ,CAAC;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA,EACA,cAAc;AAAA,IACZ,UAAU;AAAA,IACV,KAAK,GAAG,QAAQ,CAAC;AAAA,IACjB,QAAQ;AAAA,EACV;AACF;AAEF,SAAS,KAAK,YAAY,EAAE,cAAc,UAAU,aAAa;AAEjE,SAAS;AAAA,EACP,YAAY,EAAE,wBAAwB;AAAA,EACtC;AACF;AACA,SAAS;AAAA,EACP,YAAY,EAAE,6BAA6B;AAAA,EAC3C;AACF;AACA,SAAS;AAAA,EACP,YAAY,EAAE,gCAAgC;AAAA,EAC9C;AACF;AACA,SAAS,KAAK,YAAY,EAAE,IAAI,UAAU,cAAc;AAExD,SAAS,KAAK,YAAY,EAAE,SAAS,UAAU,QAAQ;AAEvD,SAAS,KAAK,YAAY,EAAE,aAAa,UAAU,YAAY;","names":[]}
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
import {
|
|
2
|
-
pushDictionaries,
|
|
3
2
|
addDictionary,
|
|
4
3
|
deleteDictionary,
|
|
5
4
|
getDictionaries,
|
|
6
|
-
|
|
5
|
+
getDictionariesKeys,
|
|
7
6
|
getDictionaryByKey,
|
|
8
|
-
|
|
7
|
+
pushDictionaries,
|
|
8
|
+
updateDictionary
|
|
9
9
|
} from "./../controllers/dictionary.controller.mjs";
|
|
10
10
|
import { Router } from "express";
|
|
11
11
|
const dictionaryRouter = Router();
|
|
12
|
-
const
|
|
12
|
+
const dictionaryRoute = "/api/dictionary";
|
|
13
|
+
const baseURL = () => `${process.env.BACKEND_URL}${dictionaryRoute}`;
|
|
13
14
|
const getDictionaryRoutes = () => ({
|
|
14
15
|
getDictionaries: {
|
|
15
16
|
urlModel: "/",
|
|
@@ -76,6 +77,7 @@ dictionaryRouter.delete(
|
|
|
76
77
|
deleteDictionary
|
|
77
78
|
);
|
|
78
79
|
export {
|
|
80
|
+
dictionaryRoute,
|
|
79
81
|
dictionaryRouter,
|
|
80
82
|
getDictionaryRoutes
|
|
81
83
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/routes/dictionary.routes.ts"],"sourcesContent":["import {\n
|
|
1
|
+
{"version":3,"sources":["../../../src/routes/dictionary.routes.ts"],"sourcesContent":["import type { Routes } from '@/types/Routes';\nimport {\n addDictionary,\n deleteDictionary,\n getDictionaries,\n getDictionariesKeys,\n getDictionaryByKey,\n pushDictionaries,\n updateDictionary,\n} from '@controllers/dictionary.controller';\nimport { Router } from 'express';\n\nexport const dictionaryRouter: Router = Router();\n\nexport const dictionaryRoute = '/api/dictionary';\n\nconst baseURL = () => `${process.env.BACKEND_URL}${dictionaryRoute}`;\n\nexport const getDictionaryRoutes = () =>\n ({\n getDictionaries: {\n urlModel: '/',\n url: baseURL,\n method: 'GET',\n },\n getDictionariesKeys: {\n urlModel: '/keys',\n url: `${baseURL}/keys`,\n method: 'GET',\n },\n getDictionary: {\n urlModel: '/:dictionaryKey',\n url: ({ dictionaryKey }: { dictionaryKey: string }) =>\n `${baseURL}/${dictionaryKey}`,\n method: 'GET',\n },\n addDictionary: {\n urlModel: '/',\n url: baseURL,\n method: 'POST',\n },\n pushDictionaries: {\n urlModel: '/',\n url: baseURL,\n method: 'PATCH',\n },\n updateDictionary: {\n urlModel: '/:dictionaryId',\n url: ({ dictionaryId }: { dictionaryId: string }) =>\n `${baseURL}/${dictionaryId}`,\n method: 'PUT',\n },\n deleteDictionary: {\n urlModel: '/:dictionaryId',\n url: ({ dictionaryId }: { dictionaryId: string }) =>\n `${baseURL}/${dictionaryId}`,\n method: 'DELETE',\n },\n }) satisfies Routes;\n\ndictionaryRouter.get(\n getDictionaryRoutes().getDictionaries.urlModel,\n getDictionaries\n);\n\ndictionaryRouter.get(\n getDictionaryRoutes().getDictionariesKeys.urlModel,\n getDictionariesKeys\n);\n\ndictionaryRouter.get(\n getDictionaryRoutes().getDictionary.urlModel,\n getDictionaryByKey\n);\n\ndictionaryRouter.post(\n getDictionaryRoutes().addDictionary.urlModel,\n addDictionary\n);\ndictionaryRouter.patch(\n getDictionaryRoutes().pushDictionaries.urlModel,\n pushDictionaries\n);\ndictionaryRouter.put(\n getDictionaryRoutes().updateDictionary.urlModel,\n updateDictionary\n);\ndictionaryRouter.delete(\n getDictionaryRoutes().deleteDictionary.urlModel,\n deleteDictionary\n);\n"],"mappings":"AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AAEhB,MAAM,mBAA2B,OAAO;AAExC,MAAM,kBAAkB;AAE/B,MAAM,UAAU,MAAM,GAAG,QAAQ,IAAI,WAAW,GAAG,eAAe;AAE3D,MAAM,sBAAsB,OAChC;AAAA,EACC,iBAAiB;AAAA,IACf,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAAA,EACA,qBAAqB;AAAA,IACnB,UAAU;AAAA,IACV,KAAK,GAAG,OAAO;AAAA,IACf,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,KAAK,CAAC,EAAE,cAAc,MACpB,GAAG,OAAO,IAAI,aAAa;AAAA,IAC7B,QAAQ;AAAA,EACV;AAAA,EACA,eAAe;AAAA,IACb,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAAA,EACA,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAAA,EACA,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,KAAK,CAAC,EAAE,aAAa,MACnB,GAAG,OAAO,IAAI,YAAY;AAAA,IAC5B,QAAQ;AAAA,EACV;AAAA,EACA,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,KAAK,CAAC,EAAE,aAAa,MACnB,GAAG,OAAO,IAAI,YAAY;AAAA,IAC5B,QAAQ;AAAA,EACV;AACF;AAEF,iBAAiB;AAAA,EACf,oBAAoB,EAAE,gBAAgB;AAAA,EACtC;AACF;AAEA,iBAAiB;AAAA,EACf,oBAAoB,EAAE,oBAAoB;AAAA,EAC1C;AACF;AAEA,iBAAiB;AAAA,EACf,oBAAoB,EAAE,cAAc;AAAA,EACpC;AACF;AAEA,iBAAiB;AAAA,EACf,oBAAoB,EAAE,cAAc;AAAA,EACpC;AACF;AACA,iBAAiB;AAAA,EACf,oBAAoB,EAAE,iBAAiB;AAAA,EACvC;AACF;AACA,iBAAiB;AAAA,EACf,oBAAoB,EAAE,iBAAiB;AAAA,EACvC;AACF;AACA,iBAAiB;AAAA,EACf,oBAAoB,EAAE,iBAAiB;AAAA,EACvC;AACF;","names":[]}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { listenChangeSSE } from "./../controllers/eventListener.controller.mjs";
|
|
2
2
|
import { Router } from "express";
|
|
3
3
|
const eventListenerRouter = Router();
|
|
4
|
-
const
|
|
4
|
+
const eventListenerRoute = "/api/event-listener";
|
|
5
|
+
const baseURL = () => `${process.env.BACKEND_URL}${eventListenerRoute}`;
|
|
5
6
|
const eventListenerRoutes = () => ({
|
|
6
7
|
checkDictionaryChangeSSE: {
|
|
7
8
|
urlModel: "/:accessToken",
|
|
@@ -14,6 +15,7 @@ eventListenerRouter.get(
|
|
|
14
15
|
listenChangeSSE
|
|
15
16
|
);
|
|
16
17
|
export {
|
|
18
|
+
eventListenerRoute,
|
|
17
19
|
eventListenerRouter,
|
|
18
20
|
eventListenerRoutes
|
|
19
21
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/routes/eventListener.routes.ts"],"sourcesContent":["import {
|
|
1
|
+
{"version":3,"sources":["../../../src/routes/eventListener.routes.ts"],"sourcesContent":["import type { Routes } from '@/types/Routes';\nimport { listenChangeSSE } from '@controllers/eventListener.controller';\nimport { Router } from 'express';\n\nexport const eventListenerRouter: Router = Router();\n\nexport const eventListenerRoute = '/api/event-listener';\n\nconst baseURL = () => `${process.env.BACKEND_URL}${eventListenerRoute}`;\n\nexport const eventListenerRoutes = () =>\n ({\n checkDictionaryChangeSSE: {\n urlModel: '/:accessToken',\n url: ({ accessToken }: { accessToken: string }) =>\n `${baseURL}/${accessToken}`,\n method: 'GET',\n },\n }) satisfies Routes;\n\neventListenerRouter.get(\n eventListenerRoutes().checkDictionaryChangeSSE.urlModel,\n listenChangeSSE\n);\n"],"mappings":"AACA,SAAS,uBAAuB;AAChC,SAAS,cAAc;AAEhB,MAAM,sBAA8B,OAAO;AAE3C,MAAM,qBAAqB;AAElC,MAAM,UAAU,MAAM,GAAG,QAAQ,IAAI,WAAW,GAAG,kBAAkB;AAE9D,MAAM,sBAAsB,OAChC;AAAA,EACC,0BAA0B;AAAA,IACxB,UAAU;AAAA,IACV,KAAK,CAAC,EAAE,YAAY,MAClB,GAAG,OAAO,IAAI,WAAW;AAAA,IAC3B,QAAQ;AAAA,EACV;AACF;AAEF,oBAAoB;AAAA,EAClB,oBAAoB,EAAE,yBAAyB;AAAA,EAC/C;AACF;","names":[]}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import {
|
|
2
|
+
getNewsletterStatus,
|
|
3
|
+
subscribeToNewsletter,
|
|
4
|
+
unsubscribeFromNewsletter
|
|
5
|
+
} from "./../controllers/newsletter.controller.mjs";
|
|
6
|
+
import { Router } from "express";
|
|
7
|
+
const newsletterRouter = Router();
|
|
8
|
+
const newsletterRoute = "/api/newsletter";
|
|
9
|
+
const baseURL = () => `${process.env.BACKEND_URL}${newsletterRoute}`;
|
|
10
|
+
const getNewsletterRoutes = () => ({
|
|
11
|
+
subscribeToNewsletter: {
|
|
12
|
+
urlModel: "/subscribe",
|
|
13
|
+
url: `${baseURL()}/subscribe`,
|
|
14
|
+
method: "POST"
|
|
15
|
+
},
|
|
16
|
+
unsubscribeFromNewsletter: {
|
|
17
|
+
urlModel: "/unsubscribe",
|
|
18
|
+
url: `${baseURL()}/unsubscribe`,
|
|
19
|
+
method: "POST"
|
|
20
|
+
},
|
|
21
|
+
getNewsletterStatus: {
|
|
22
|
+
urlModel: "/status",
|
|
23
|
+
url: `${baseURL()}/status`,
|
|
24
|
+
method: "GET"
|
|
25
|
+
}
|
|
26
|
+
});
|
|
27
|
+
newsletterRouter.post(
|
|
28
|
+
getNewsletterRoutes().subscribeToNewsletter.urlModel,
|
|
29
|
+
subscribeToNewsletter
|
|
30
|
+
);
|
|
31
|
+
newsletterRouter.post(
|
|
32
|
+
getNewsletterRoutes().unsubscribeFromNewsletter.urlModel,
|
|
33
|
+
unsubscribeFromNewsletter
|
|
34
|
+
);
|
|
35
|
+
newsletterRouter.get(
|
|
36
|
+
getNewsletterRoutes().getNewsletterStatus.urlModel,
|
|
37
|
+
getNewsletterStatus
|
|
38
|
+
);
|
|
39
|
+
export {
|
|
40
|
+
getNewsletterRoutes,
|
|
41
|
+
newsletterRoute,
|
|
42
|
+
newsletterRouter
|
|
43
|
+
};
|
|
44
|
+
//# sourceMappingURL=newsletter.routes.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/routes/newsletter.routes.ts"],"sourcesContent":["import type { Routes } from '@/types/Routes';\nimport {\n getNewsletterStatus,\n subscribeToNewsletter,\n unsubscribeFromNewsletter,\n} from '@controllers/newsletter.controller';\nimport { Router } from 'express';\n\nexport const newsletterRouter: Router = Router();\n\nexport const newsletterRoute = '/api/newsletter';\n\nconst baseURL = () => `${process.env.BACKEND_URL}${newsletterRoute}`;\n\nexport const getNewsletterRoutes = () =>\n ({\n subscribeToNewsletter: {\n urlModel: '/subscribe',\n url: `${baseURL()}/subscribe`,\n method: 'POST',\n },\n unsubscribeFromNewsletter: {\n urlModel: '/unsubscribe',\n url: `${baseURL()}/unsubscribe`,\n method: 'POST',\n },\n getNewsletterStatus: {\n urlModel: '/status',\n url: `${baseURL()}/status`,\n method: 'GET',\n },\n }) satisfies Routes;\n\nnewsletterRouter.post(\n getNewsletterRoutes().subscribeToNewsletter.urlModel,\n subscribeToNewsletter\n);\nnewsletterRouter.post(\n getNewsletterRoutes().unsubscribeFromNewsletter.urlModel,\n unsubscribeFromNewsletter\n);\nnewsletterRouter.get(\n getNewsletterRoutes().getNewsletterStatus.urlModel,\n getNewsletterStatus\n);\n"],"mappings":"AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AAEhB,MAAM,mBAA2B,OAAO;AAExC,MAAM,kBAAkB;AAE/B,MAAM,UAAU,MAAM,GAAG,QAAQ,IAAI,WAAW,GAAG,eAAe;AAE3D,MAAM,sBAAsB,OAChC;AAAA,EACC,uBAAuB;AAAA,IACrB,UAAU;AAAA,IACV,KAAK,GAAG,QAAQ,CAAC;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA,EACA,2BAA2B;AAAA,IACzB,UAAU;AAAA,IACV,KAAK,GAAG,QAAQ,CAAC;AAAA,IACjB,QAAQ;AAAA,EACV;AAAA,EACA,qBAAqB;AAAA,IACnB,UAAU;AAAA,IACV,KAAK,GAAG,QAAQ,CAAC;AAAA,IACjB,QAAQ;AAAA,EACV;AACF;AAEF,iBAAiB;AAAA,EACf,oBAAoB,EAAE,sBAAsB;AAAA,EAC5C;AACF;AACA,iBAAiB;AAAA,EACf,oBAAoB,EAAE,0BAA0B;AAAA,EAChD;AACF;AACA,iBAAiB;AAAA,EACf,oBAAoB,EAAE,oBAAoB;AAAA,EAC1C;AACF;","names":[]}
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import {
|
|
2
2
|
addOrganization,
|
|
3
|
+
addOrganizationMember,
|
|
3
4
|
deleteOrganization,
|
|
4
|
-
selectOrganization,
|
|
5
5
|
getOrganizations,
|
|
6
|
-
|
|
7
|
-
updateOrganizationMembers,
|
|
6
|
+
selectOrganization,
|
|
8
7
|
unselectOrganization,
|
|
9
|
-
|
|
8
|
+
updateOrganization,
|
|
9
|
+
updateOrganizationMembers
|
|
10
10
|
} from "./../controllers/organization.controller.mjs";
|
|
11
11
|
import { Router } from "express";
|
|
12
12
|
const organizationRouter = Router();
|
|
13
|
-
const
|
|
13
|
+
const organizationRoute = "/api/organization";
|
|
14
|
+
const baseURL = () => `${process.env.BACKEND_URL}${organizationRoute}`;
|
|
14
15
|
const getOrganizationRoutes = () => ({
|
|
15
16
|
getOrganizations: {
|
|
16
17
|
urlModel: "/",
|
|
@@ -87,6 +88,7 @@ organizationRouter.post(
|
|
|
87
88
|
);
|
|
88
89
|
export {
|
|
89
90
|
getOrganizationRoutes,
|
|
91
|
+
organizationRoute,
|
|
90
92
|
organizationRouter
|
|
91
93
|
};
|
|
92
94
|
//# sourceMappingURL=organization.routes.mjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/routes/organization.routes.ts"],"sourcesContent":["import {\n addOrganization,\n
|
|
1
|
+
{"version":3,"sources":["../../../src/routes/organization.routes.ts"],"sourcesContent":["import type { Routes } from '@/types/Routes';\nimport {\n addOrganization,\n addOrganizationMember,\n deleteOrganization,\n getOrganizations,\n selectOrganization,\n unselectOrganization,\n updateOrganization,\n updateOrganizationMembers,\n} from '@controllers/organization.controller';\nimport { Router } from 'express';\n\nexport const organizationRouter: Router = Router();\n\nexport const organizationRoute = '/api/organization';\n\nconst baseURL = () => `${process.env.BACKEND_URL}${organizationRoute}`;\n\nexport const getOrganizationRoutes = () =>\n ({\n getOrganizations: {\n urlModel: '/',\n url: baseURL,\n method: 'GET',\n },\n addOrganization: {\n urlModel: '/',\n url: baseURL,\n method: 'POST',\n },\n updateOrganization: {\n urlModel: '/',\n url: baseURL,\n\n method: 'PUT',\n },\n updateOrganizationMembers: {\n urlModel: '/members',\n url: `${baseURL}/members`,\n method: 'PUT',\n },\n addOrganizationMember: {\n urlModel: '/member',\n url: `${baseURL}/member`,\n method: 'POST',\n },\n deleteOrganization: {\n urlModel: '/',\n url: baseURL,\n method: 'DELETE',\n },\n selectOrganization: {\n urlModel: '/:organizationId',\n url: ({ organizationId }: { organizationId: string }) =>\n `${baseURL}/${organizationId}`,\n method: 'PUT',\n },\n unselectOrganization: {\n urlModel: '/logout',\n url: `${baseURL}/logout`,\n method: 'POST',\n },\n }) satisfies Routes;\n\norganizationRouter.get(\n getOrganizationRoutes().getOrganizations.urlModel,\n getOrganizations\n);\n\norganizationRouter.post(\n getOrganizationRoutes().addOrganization.urlModel,\n addOrganization\n);\norganizationRouter.put(\n getOrganizationRoutes().updateOrganization.urlModel,\n updateOrganization\n);\norganizationRouter.put(\n getOrganizationRoutes().updateOrganizationMembers.urlModel,\n updateOrganizationMembers\n);\norganizationRouter.post(\n getOrganizationRoutes().addOrganizationMember.urlModel,\n addOrganizationMember\n);\norganizationRouter.delete(\n getOrganizationRoutes().deleteOrganization.urlModel,\n deleteOrganization\n);\norganizationRouter.put(\n getOrganizationRoutes().selectOrganization.urlModel,\n selectOrganization\n);\n\norganizationRouter.post(\n getOrganizationRoutes().unselectOrganization.urlModel,\n unselectOrganization\n);\n"],"mappings":"AACA;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AACP,SAAS,cAAc;AAEhB,MAAM,qBAA6B,OAAO;AAE1C,MAAM,oBAAoB;AAEjC,MAAM,UAAU,MAAM,GAAG,QAAQ,IAAI,WAAW,GAAG,iBAAiB;AAE7D,MAAM,wBAAwB,OAClC;AAAA,EACC,kBAAkB;AAAA,IAChB,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAAA,EACA,iBAAiB;AAAA,IACf,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAAA,EACA,oBAAoB;AAAA,IAClB,UAAU;AAAA,IACV,KAAK;AAAA,IAEL,QAAQ;AAAA,EACV;AAAA,EACA,2BAA2B;AAAA,IACzB,UAAU;AAAA,IACV,KAAK,GAAG,OAAO;AAAA,IACf,QAAQ;AAAA,EACV;AAAA,EACA,uBAAuB;AAAA,IACrB,UAAU;AAAA,IACV,KAAK,GAAG,OAAO;AAAA,IACf,QAAQ;AAAA,EACV;AAAA,EACA,oBAAoB;AAAA,IAClB,UAAU;AAAA,IACV,KAAK;AAAA,IACL,QAAQ;AAAA,EACV;AAAA,EACA,oBAAoB;AAAA,IAClB,UAAU;AAAA,IACV,KAAK,CAAC,EAAE,eAAe,MACrB,GAAG,OAAO,IAAI,cAAc;AAAA,IAC9B,QAAQ;AAAA,EACV;AAAA,EACA,sBAAsB;AAAA,IACpB,UAAU;AAAA,IACV,KAAK,GAAG,OAAO;AAAA,IACf,QAAQ;AAAA,EACV;AACF;AAEF,mBAAmB;AAAA,EACjB,sBAAsB,EAAE,iBAAiB;AAAA,EACzC;AACF;AAEA,mBAAmB;AAAA,EACjB,sBAAsB,EAAE,gBAAgB;AAAA,EACxC;AACF;AACA,mBAAmB;AAAA,EACjB,sBAAsB,EAAE,mBAAmB;AAAA,EAC3C;AACF;AACA,mBAAmB;AAAA,EACjB,sBAAsB,EAAE,0BAA0B;AAAA,EAClD;AACF;AACA,mBAAmB;AAAA,EACjB,sBAAsB,EAAE,sBAAsB;AAAA,EAC9C;AACF;AACA,mBAAmB;AAAA,EACjB,sBAAsB,EAAE,mBAAmB;AAAA,EAC3C;AACF;AACA,mBAAmB;AAAA,EACjB,sBAAsB,EAAE,mBAAmB;AAAA,EAC3C;AACF;AAEA,mBAAmB;AAAA,EACjB,sBAAsB,EAAE,qBAAqB;AAAA,EAC7C;AACF;","names":[]}
|
|
@@ -2,11 +2,11 @@ import {
|
|
|
2
2
|
addProject,
|
|
3
3
|
deleteProject,
|
|
4
4
|
getProjects,
|
|
5
|
-
|
|
5
|
+
pushProjectConfiguration,
|
|
6
6
|
selectProject,
|
|
7
7
|
unselectProject,
|
|
8
|
-
|
|
9
|
-
|
|
8
|
+
updateProject,
|
|
9
|
+
updateProjectMembers
|
|
10
10
|
} from "./../controllers/project.controller.mjs";
|
|
11
11
|
import {
|
|
12
12
|
addNewAccessKey,
|
|
@@ -15,7 +15,8 @@ import {
|
|
|
15
15
|
} from "./../controllers/projectAccessKey.controller.mjs";
|
|
16
16
|
import { Router } from "express";
|
|
17
17
|
const projectRouter = Router();
|
|
18
|
-
const
|
|
18
|
+
const projectRoute = "/api/project";
|
|
19
|
+
const baseURL = () => `${process.env.BACKEND_URL}${projectRoute}`;
|
|
19
20
|
const getProjectRoutes = () => ({
|
|
20
21
|
getProjects: {
|
|
21
22
|
urlModel: "/",
|
|
@@ -104,6 +105,7 @@ projectRouter.post(
|
|
|
104
105
|
projectRouter.put(getProjectRoutes().selectProject.urlModel, selectProject);
|
|
105
106
|
export {
|
|
106
107
|
getProjectRoutes,
|
|
108
|
+
projectRoute,
|
|
107
109
|
projectRouter
|
|
108
110
|
};
|
|
109
111
|
//# sourceMappingURL=project.routes.mjs.map
|