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