@intlayer/backend 7.2.1-canary.0 → 7.2.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/esm/utils/AI/aiSdk.mjs +7 -1
- package/dist/esm/utils/AI/aiSdk.mjs.map +1 -1
- package/dist/types/controllers/dictionary.controller.d.ts.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/PasswordChangeConfirmation.d.ts +4 -4
- package/dist/types/emails/PasswordChangeConfirmation.d.ts.map +1 -1
- package/dist/types/emails/ResetUserPassword.d.ts +4 -4
- package/dist/types/emails/ResetUserPassword.d.ts.map +1 -1
- package/dist/types/emails/SubscriptionPaymentCancellation.d.ts +4 -4
- package/dist/types/emails/SubscriptionPaymentError.d.ts +4 -4
- package/dist/types/emails/SubscriptionPaymentSuccess.d.ts +4 -4
- package/dist/types/emails/SubscriptionPaymentSuccess.d.ts.map +1 -1
- package/dist/types/emails/ValidateUserEmail.d.ts +4 -4
- package/dist/types/emails/Welcome.d.ts +4 -4
- 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/discussion.model.d.ts.map +1 -1
- 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/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/services/email.service.d.ts +11 -11
- 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,492 +0,0 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
-
const require_logger_index = require('../logger/index.cjs');
|
|
3
|
-
const require_utils_responseData = require('../utils/responseData.cjs');
|
|
4
|
-
const require_utils_errors_ErrorHandler = require('../utils/errors/ErrorHandler.cjs');
|
|
5
|
-
const require_services_organization_service = require('../services/organization.service.cjs');
|
|
6
|
-
const require_services_project_service = require('../services/project.service.cjs');
|
|
7
|
-
const require_utils_permissions = require('../utils/permissions.cjs');
|
|
8
|
-
const require_services_user_service = require('../services/user.service.cjs');
|
|
9
|
-
const require_models_session_model = require('../models/session.model.cjs');
|
|
10
|
-
const require_services_email_service = require('../services/email.service.cjs');
|
|
11
|
-
const require_utils_filtersAndPagination_getOrganizationFiltersAndPagination = require('../utils/filtersAndPagination/getOrganizationFiltersAndPagination.cjs');
|
|
12
|
-
const require_utils_mapper_organization = require('../utils/mapper/organization.cjs');
|
|
13
|
-
const require_utils_plan = require('../utils/plan.cjs');
|
|
14
|
-
let express_intlayer = require("express-intlayer");
|
|
15
|
-
let stripe = require("stripe");
|
|
16
|
-
|
|
17
|
-
//#region src/controllers/organization.controller.ts
|
|
18
|
-
/**
|
|
19
|
-
* Retrieves a list of organizations based on filters and pagination.
|
|
20
|
-
*/
|
|
21
|
-
const getOrganizations = async (req, res, _next) => {
|
|
22
|
-
const { user, roles } = res.locals;
|
|
23
|
-
const { filters, sortOptions, pageSize, skip, page, getNumberOfPages } = require_utils_filtersAndPagination_getOrganizationFiltersAndPagination.getOrganizationFiltersAndPagination(req, res);
|
|
24
|
-
if (!user) {
|
|
25
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
try {
|
|
29
|
-
const organizations = await require_services_organization_service.findOrganizations(filters, skip, pageSize, sortOptions);
|
|
30
|
-
if (!require_utils_permissions.hasPermission(roles, "organization:read")({
|
|
31
|
-
...res.locals,
|
|
32
|
-
targetOrganizations: organizations
|
|
33
|
-
})) {
|
|
34
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
|
|
35
|
-
return;
|
|
36
|
-
}
|
|
37
|
-
const totalItems = await require_services_organization_service.countOrganizations(filters);
|
|
38
|
-
const responseData = require_utils_responseData.formatPaginatedResponse({
|
|
39
|
-
data: require_utils_mapper_organization.mapOrganizationsToAPI(organizations),
|
|
40
|
-
page,
|
|
41
|
-
pageSize,
|
|
42
|
-
totalPages: getNumberOfPages(totalItems),
|
|
43
|
-
totalItems
|
|
44
|
-
});
|
|
45
|
-
res.status(200).json(responseData);
|
|
46
|
-
return;
|
|
47
|
-
} catch (error) {
|
|
48
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
49
|
-
return;
|
|
50
|
-
}
|
|
51
|
-
};
|
|
52
|
-
/**
|
|
53
|
-
* Retrieves an organization by its ID.
|
|
54
|
-
*/
|
|
55
|
-
const getOrganization = async (req, res, _next) => {
|
|
56
|
-
const { roles } = res.locals;
|
|
57
|
-
const { organizationId } = req.params;
|
|
58
|
-
if (!organizationId) {
|
|
59
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_ID_NOT_FOUND");
|
|
60
|
-
return;
|
|
61
|
-
}
|
|
62
|
-
try {
|
|
63
|
-
const organization = await require_services_organization_service.getOrganizationById(organizationId);
|
|
64
|
-
if (!require_utils_permissions.hasPermission(roles, "organization:read")({
|
|
65
|
-
...res.locals,
|
|
66
|
-
targetOrganizations: [organization]
|
|
67
|
-
})) {
|
|
68
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
|
|
69
|
-
return;
|
|
70
|
-
}
|
|
71
|
-
const responseData = require_utils_responseData.formatResponse({ data: require_utils_mapper_organization.mapOrganizationToAPI(organization) });
|
|
72
|
-
res.json(responseData);
|
|
73
|
-
return;
|
|
74
|
-
} catch (error) {
|
|
75
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
};
|
|
79
|
-
/**
|
|
80
|
-
* Adds a new organization to the database.
|
|
81
|
-
*/
|
|
82
|
-
const addOrganization = async (req, res, _next) => {
|
|
83
|
-
const { user } = res.locals;
|
|
84
|
-
const organization = req.body;
|
|
85
|
-
if (!organization) {
|
|
86
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_DATA_NOT_FOUND");
|
|
87
|
-
return;
|
|
88
|
-
}
|
|
89
|
-
if (!user) {
|
|
90
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
try {
|
|
94
|
-
const newOrganization = await require_services_organization_service.createOrganization(organization, user.id);
|
|
95
|
-
const responseData = require_utils_responseData.formatResponse({
|
|
96
|
-
message: (0, express_intlayer.t)({
|
|
97
|
-
en: "Organization created successfully",
|
|
98
|
-
fr: "Organisation créée avec succès",
|
|
99
|
-
es: "Organización creada con éxito"
|
|
100
|
-
}),
|
|
101
|
-
description: (0, express_intlayer.t)({
|
|
102
|
-
en: "Your organization has been created successfully",
|
|
103
|
-
fr: "Votre organisation a été créée avec succès",
|
|
104
|
-
es: "Su organización ha sido creada con éxito"
|
|
105
|
-
}),
|
|
106
|
-
data: require_utils_mapper_organization.mapOrganizationToAPI(newOrganization)
|
|
107
|
-
});
|
|
108
|
-
res.json(responseData);
|
|
109
|
-
return;
|
|
110
|
-
} catch (error) {
|
|
111
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
112
|
-
return;
|
|
113
|
-
}
|
|
114
|
-
};
|
|
115
|
-
/**
|
|
116
|
-
* Updates an existing organization in the database.
|
|
117
|
-
*/
|
|
118
|
-
const updateOrganization = async (req, res, _next) => {
|
|
119
|
-
const { organization, roles } = res.locals;
|
|
120
|
-
const organizationFields = req.body;
|
|
121
|
-
if (!organizationFields) {
|
|
122
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_DATA_NOT_FOUND");
|
|
123
|
-
return;
|
|
124
|
-
}
|
|
125
|
-
if (!organization) {
|
|
126
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
|
|
127
|
-
return;
|
|
128
|
-
}
|
|
129
|
-
if (!require_utils_permissions.hasPermission(roles, "organization:write")({
|
|
130
|
-
...res.locals,
|
|
131
|
-
targetOrganizations: [organization]
|
|
132
|
-
})) {
|
|
133
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
|
|
134
|
-
return;
|
|
135
|
-
}
|
|
136
|
-
try {
|
|
137
|
-
const updatedOrganization = await require_services_organization_service.updateOrganizationById(organization.id, organizationFields);
|
|
138
|
-
const responseData = require_utils_responseData.formatResponse({
|
|
139
|
-
message: (0, express_intlayer.t)({
|
|
140
|
-
en: "Organization updated successfully",
|
|
141
|
-
fr: "Organisation mise à jour avec succès",
|
|
142
|
-
es: "Organización actualizada con éxito"
|
|
143
|
-
}),
|
|
144
|
-
description: (0, express_intlayer.t)({
|
|
145
|
-
en: "Your organization has been updated successfully",
|
|
146
|
-
fr: "Votre organisation a été mise à jour avec succès",
|
|
147
|
-
es: "Su organización ha sido actualizada con éxito"
|
|
148
|
-
}),
|
|
149
|
-
data: require_utils_mapper_organization.mapOrganizationToAPI(updatedOrganization)
|
|
150
|
-
});
|
|
151
|
-
res.json(responseData);
|
|
152
|
-
return;
|
|
153
|
-
} catch (error) {
|
|
154
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
155
|
-
return;
|
|
156
|
-
}
|
|
157
|
-
};
|
|
158
|
-
/**
|
|
159
|
-
* Add member to the organization in the database.
|
|
160
|
-
*/
|
|
161
|
-
const addOrganizationMember = async (req, res, _next) => {
|
|
162
|
-
const { organization, user, roles } = res.locals;
|
|
163
|
-
const { userEmail } = req.body;
|
|
164
|
-
if (!organization) {
|
|
165
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
|
|
166
|
-
return;
|
|
167
|
-
}
|
|
168
|
-
if (!user) {
|
|
169
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
170
|
-
return;
|
|
171
|
-
}
|
|
172
|
-
if (!require_utils_permissions.hasPermission(roles, "organization:admin")({
|
|
173
|
-
...res.locals,
|
|
174
|
-
targetOrganizations: [organization]
|
|
175
|
-
})) {
|
|
176
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
|
|
177
|
-
return;
|
|
178
|
-
}
|
|
179
|
-
const planType = require_utils_plan.getPlanDetails(organization.plan);
|
|
180
|
-
if (planType.numberOfOrganizationUsers && organization.membersIds.length >= planType.numberOfOrganizationUsers) {
|
|
181
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PLAN_USER_LIMIT_REACHED", { organizationId: organization.id });
|
|
182
|
-
return;
|
|
183
|
-
}
|
|
184
|
-
try {
|
|
185
|
-
let newMember = await require_services_user_service.getUserByEmail(userEmail);
|
|
186
|
-
if (!newMember) {
|
|
187
|
-
const newUser = await require_services_user_service.createUser({ email: userEmail });
|
|
188
|
-
if (!newUser) {
|
|
189
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_CREATION_FAILED", { email: userEmail });
|
|
190
|
-
return;
|
|
191
|
-
}
|
|
192
|
-
newMember = newUser;
|
|
193
|
-
}
|
|
194
|
-
const updatedOrganization = await require_services_organization_service.updateOrganizationById(organization.id, {
|
|
195
|
-
...organization,
|
|
196
|
-
membersIds: [...organization.membersIds, newMember.id]
|
|
197
|
-
});
|
|
198
|
-
const responseData = require_utils_responseData.formatResponse({
|
|
199
|
-
message: (0, express_intlayer.t)({
|
|
200
|
-
en: "Organization updated successfully",
|
|
201
|
-
fr: "Organisation mise à jour avec succès",
|
|
202
|
-
es: "Organización actualizada con éxito"
|
|
203
|
-
}),
|
|
204
|
-
description: (0, express_intlayer.t)({
|
|
205
|
-
en: "Your organization has been updated successfully",
|
|
206
|
-
fr: "Votre organisation a été mise à jour avec succès",
|
|
207
|
-
es: "Su organización ha sido actualizada con éxito"
|
|
208
|
-
}),
|
|
209
|
-
data: require_utils_mapper_organization.mapOrganizationToAPI(updatedOrganization)
|
|
210
|
-
});
|
|
211
|
-
res.json(responseData);
|
|
212
|
-
await require_services_email_service.sendEmail({
|
|
213
|
-
type: "invite",
|
|
214
|
-
to: userEmail,
|
|
215
|
-
username: newMember.email.slice(0, newMember.email.indexOf("@")),
|
|
216
|
-
invitedByUsername: user.name,
|
|
217
|
-
invitedByEmail: user.email,
|
|
218
|
-
organizationName: organization.name,
|
|
219
|
-
inviteLink: `${process.env.CLIENT_URL}/auth/login?email=${newMember.email}`,
|
|
220
|
-
inviteFromIp: req.ip ?? "",
|
|
221
|
-
inviteFromLocation: req.hostname
|
|
222
|
-
});
|
|
223
|
-
return;
|
|
224
|
-
} catch (error) {
|
|
225
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
226
|
-
return;
|
|
227
|
-
}
|
|
228
|
-
};
|
|
229
|
-
/**
|
|
230
|
-
* Update members to the organization in the database.
|
|
231
|
-
*/
|
|
232
|
-
const updateOrganizationMembers = async (req, res, _next) => {
|
|
233
|
-
const { organization, roles } = res.locals;
|
|
234
|
-
const { membersIds, adminsIds } = req.body;
|
|
235
|
-
if (!organization) {
|
|
236
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
|
|
237
|
-
return;
|
|
238
|
-
}
|
|
239
|
-
if (!require_utils_permissions.hasPermission(roles, "organization:admin")({
|
|
240
|
-
...res.locals,
|
|
241
|
-
targetOrganizations: [organization]
|
|
242
|
-
})) {
|
|
243
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
|
|
244
|
-
return;
|
|
245
|
-
}
|
|
246
|
-
if (!membersIds) {
|
|
247
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "INVALID_REQUEST_BODY");
|
|
248
|
-
return;
|
|
249
|
-
}
|
|
250
|
-
if (membersIds?.length === 0) {
|
|
251
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_MUST_HAVE_MEMBER");
|
|
252
|
-
return;
|
|
253
|
-
}
|
|
254
|
-
if (adminsIds?.filter((id) => membersIds?.includes(id)).length === 0) {
|
|
255
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_MUST_HAVE_ADMIN");
|
|
256
|
-
return;
|
|
257
|
-
}
|
|
258
|
-
try {
|
|
259
|
-
const existingUsers = await require_services_user_service.getUsersByIds(membersIds);
|
|
260
|
-
if (!existingUsers) {
|
|
261
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
|
|
262
|
-
return;
|
|
263
|
-
}
|
|
264
|
-
const existingAdmins = await require_services_user_service.getUsersByIds(adminsIds);
|
|
265
|
-
if (!existingAdmins) {
|
|
266
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
|
|
267
|
-
return;
|
|
268
|
-
}
|
|
269
|
-
const updatedOrganization = await require_services_organization_service.updateOrganizationById(organization.id, {
|
|
270
|
-
membersIds: existingUsers.map((user) => user.id),
|
|
271
|
-
adminsIds: existingAdmins.map((user) => user.id)
|
|
272
|
-
});
|
|
273
|
-
const responseData = require_utils_responseData.formatResponse({
|
|
274
|
-
message: (0, express_intlayer.t)({
|
|
275
|
-
en: "Organization updated successfully",
|
|
276
|
-
fr: "Organisation mise à jour avec succès",
|
|
277
|
-
es: "Organización actualizada con éxito"
|
|
278
|
-
}),
|
|
279
|
-
description: (0, express_intlayer.t)({
|
|
280
|
-
en: "Your organization has been updated successfully",
|
|
281
|
-
fr: "Votre organisation a été mise à jour avec succès",
|
|
282
|
-
es: "Su organización ha sido actualizada con éxito"
|
|
283
|
-
}),
|
|
284
|
-
data: require_utils_mapper_organization.mapOrganizationToAPI(updatedOrganization)
|
|
285
|
-
});
|
|
286
|
-
res.json(responseData);
|
|
287
|
-
return;
|
|
288
|
-
} catch (error) {
|
|
289
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
290
|
-
return;
|
|
291
|
-
}
|
|
292
|
-
};
|
|
293
|
-
/**
|
|
294
|
-
* Admin-only: Update members of any organization by ID
|
|
295
|
-
*/
|
|
296
|
-
const updateOrganizationMembersById = async (req, res, _next) => {
|
|
297
|
-
const { user } = res.locals;
|
|
298
|
-
const { organizationId } = req.params;
|
|
299
|
-
const { membersIds, adminsIds } = req.body;
|
|
300
|
-
if (!user) {
|
|
301
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
302
|
-
return;
|
|
303
|
-
}
|
|
304
|
-
if (user.role !== "admin") {
|
|
305
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
|
|
306
|
-
return;
|
|
307
|
-
}
|
|
308
|
-
if (!membersIds) {
|
|
309
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "INVALID_REQUEST_BODY");
|
|
310
|
-
return;
|
|
311
|
-
}
|
|
312
|
-
if (membersIds?.length === 0) {
|
|
313
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_MUST_HAVE_MEMBER");
|
|
314
|
-
return;
|
|
315
|
-
}
|
|
316
|
-
try {
|
|
317
|
-
const targetOrganization = await require_services_organization_service.getOrganizationById(organizationId);
|
|
318
|
-
if (!targetOrganization) {
|
|
319
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND");
|
|
320
|
-
return;
|
|
321
|
-
}
|
|
322
|
-
const existingUsers = await require_services_user_service.getUsersByIds(membersIds);
|
|
323
|
-
if (!existingUsers) {
|
|
324
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
|
|
325
|
-
return;
|
|
326
|
-
}
|
|
327
|
-
const finalAdminsIds = adminsIds && adminsIds.length > 0 ? adminsIds : targetOrganization.adminsIds;
|
|
328
|
-
const existingAdmins = finalAdminsIds ? await require_services_user_service.getUsersByIds(finalAdminsIds) : [];
|
|
329
|
-
if (!existingAdmins || existingAdmins.length === 0) {
|
|
330
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_MUST_HAVE_ADMIN");
|
|
331
|
-
return;
|
|
332
|
-
}
|
|
333
|
-
const updatedOrganization = await require_services_organization_service.updateOrganizationById(targetOrganization.id, {
|
|
334
|
-
membersIds: existingUsers.map((user$1) => user$1.id),
|
|
335
|
-
adminsIds: existingAdmins.map((user$1) => user$1.id)
|
|
336
|
-
});
|
|
337
|
-
const responseData = require_utils_responseData.formatResponse({
|
|
338
|
-
message: (0, express_intlayer.t)({
|
|
339
|
-
en: "Organization members updated successfully",
|
|
340
|
-
fr: "Membres de l'organisation mis à jour avec succès",
|
|
341
|
-
es: "Miembros de la organización actualizados con éxito"
|
|
342
|
-
}),
|
|
343
|
-
description: (0, express_intlayer.t)({
|
|
344
|
-
en: "Organization members have been updated successfully",
|
|
345
|
-
fr: "Les membres de l'organisation ont été mis à jour avec succès",
|
|
346
|
-
es: "Los miembros de la organización han sido actualizados con éxito"
|
|
347
|
-
}),
|
|
348
|
-
data: require_utils_mapper_organization.mapOrganizationToAPI(updatedOrganization)
|
|
349
|
-
});
|
|
350
|
-
res.json(responseData);
|
|
351
|
-
return;
|
|
352
|
-
} catch (error) {
|
|
353
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
354
|
-
return;
|
|
355
|
-
}
|
|
356
|
-
};
|
|
357
|
-
/**
|
|
358
|
-
* Deletes an organization from the database by its ID.
|
|
359
|
-
*/
|
|
360
|
-
const deleteOrganization = async (_req, res, _next) => {
|
|
361
|
-
const stripe$1 = new stripe.Stripe(process.env.STRIPE_SECRET_KEY);
|
|
362
|
-
const { organization, roles } = res.locals;
|
|
363
|
-
if (!organization) {
|
|
364
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_DEFINED");
|
|
365
|
-
return;
|
|
366
|
-
}
|
|
367
|
-
if ((await require_services_project_service.findProjects({ organizationId: organization.id })).length > 0) {
|
|
368
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PROJECTS_EXIST", { organizationId: organization.id });
|
|
369
|
-
return;
|
|
370
|
-
}
|
|
371
|
-
if (!require_utils_permissions.hasPermission(roles, "organization:admin")({
|
|
372
|
-
...res.locals,
|
|
373
|
-
targetOrganizations: [organization]
|
|
374
|
-
})) {
|
|
375
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
|
|
376
|
-
return;
|
|
377
|
-
}
|
|
378
|
-
try {
|
|
379
|
-
if (organization.plan?.subscriptionId) await stripe$1.subscriptions.cancel(organization.plan.subscriptionId);
|
|
380
|
-
const deletedOrganization = await require_services_organization_service.deleteOrganizationById(organization.id);
|
|
381
|
-
if (!deletedOrganization) {
|
|
382
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_NOT_FOUND", { organizationId: organization.id });
|
|
383
|
-
return;
|
|
384
|
-
}
|
|
385
|
-
require_logger_index.logger.info(`Organization deleted: ${String(deletedOrganization.id)}`);
|
|
386
|
-
const responseData = require_utils_responseData.formatResponse({
|
|
387
|
-
message: (0, express_intlayer.t)({
|
|
388
|
-
en: "Organization deleted successfully",
|
|
389
|
-
fr: "Organisation supprimée avec succès",
|
|
390
|
-
es: "Organización eliminada con éxito"
|
|
391
|
-
}),
|
|
392
|
-
description: (0, express_intlayer.t)({
|
|
393
|
-
en: "Your organization has been deleted successfully",
|
|
394
|
-
fr: "Votre organisation a été supprimée avec succès",
|
|
395
|
-
es: "Su organización ha sido eliminada con éxito"
|
|
396
|
-
}),
|
|
397
|
-
data: require_utils_mapper_organization.mapOrganizationToAPI(deletedOrganization)
|
|
398
|
-
});
|
|
399
|
-
res.json(responseData);
|
|
400
|
-
return;
|
|
401
|
-
} catch (error) {
|
|
402
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
403
|
-
return;
|
|
404
|
-
}
|
|
405
|
-
};
|
|
406
|
-
/**
|
|
407
|
-
* Select an organization.
|
|
408
|
-
*/
|
|
409
|
-
const selectOrganization = async (req, res, _next) => {
|
|
410
|
-
const { organizationId } = req.params;
|
|
411
|
-
const { session } = res.locals;
|
|
412
|
-
if (!organizationId) {
|
|
413
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "ORGANIZATION_ID_NOT_FOUND");
|
|
414
|
-
return;
|
|
415
|
-
}
|
|
416
|
-
if (typeof session === "undefined") {
|
|
417
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "SESSION_NOT_DEFINED");
|
|
418
|
-
return;
|
|
419
|
-
}
|
|
420
|
-
try {
|
|
421
|
-
const organization = await require_services_organization_service.getOrganizationById(organizationId);
|
|
422
|
-
await require_models_session_model.SessionModel.updateOne({ _id: session.id }, { $set: {
|
|
423
|
-
activeOrganizationId: String(organization.id),
|
|
424
|
-
activeProjectId: null
|
|
425
|
-
} });
|
|
426
|
-
const responseData = require_utils_responseData.formatResponse({
|
|
427
|
-
message: (0, express_intlayer.t)({
|
|
428
|
-
en: "Organization retrieved successfully",
|
|
429
|
-
fr: "Organisation récupérée avec succès",
|
|
430
|
-
es: "Organización recuperada con éxito"
|
|
431
|
-
}),
|
|
432
|
-
description: (0, express_intlayer.t)({
|
|
433
|
-
en: "Your organization has been retrieved successfully",
|
|
434
|
-
fr: "Votre organisation a été récupérée avec succès",
|
|
435
|
-
es: "Su organización ha sido recuperada con éxito"
|
|
436
|
-
}),
|
|
437
|
-
data: require_utils_mapper_organization.mapOrganizationToAPI(organization)
|
|
438
|
-
});
|
|
439
|
-
res.json(responseData);
|
|
440
|
-
return;
|
|
441
|
-
} catch (error) {
|
|
442
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
443
|
-
return;
|
|
444
|
-
}
|
|
445
|
-
};
|
|
446
|
-
/**
|
|
447
|
-
* Unselect an organization.
|
|
448
|
-
*/
|
|
449
|
-
const unselectOrganization = async (_req, res, _next) => {
|
|
450
|
-
const { session } = res.locals;
|
|
451
|
-
try {
|
|
452
|
-
if (typeof session === "undefined") {
|
|
453
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "SESSION_NOT_DEFINED");
|
|
454
|
-
return;
|
|
455
|
-
}
|
|
456
|
-
await require_models_session_model.SessionModel.updateOne({ _id: session.id }, { $set: {
|
|
457
|
-
activeOrganizationId: null,
|
|
458
|
-
activeProjectId: null
|
|
459
|
-
} });
|
|
460
|
-
const responseData = require_utils_responseData.formatResponse({
|
|
461
|
-
message: (0, express_intlayer.t)({
|
|
462
|
-
en: "Organization unselected successfully",
|
|
463
|
-
fr: "Organisation désélectionnée avec succès",
|
|
464
|
-
es: "Organización deseleccionada con éxito"
|
|
465
|
-
}),
|
|
466
|
-
description: (0, express_intlayer.t)({
|
|
467
|
-
en: "Your organization has been unselected successfully",
|
|
468
|
-
fr: "Votre organisation a été désélectionnée avec succès",
|
|
469
|
-
es: "Su organización ha sido deseleccionada con éxito"
|
|
470
|
-
}),
|
|
471
|
-
data: null
|
|
472
|
-
});
|
|
473
|
-
res.json(responseData);
|
|
474
|
-
return;
|
|
475
|
-
} catch (error) {
|
|
476
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
477
|
-
return;
|
|
478
|
-
}
|
|
479
|
-
};
|
|
480
|
-
|
|
481
|
-
//#endregion
|
|
482
|
-
exports.addOrganization = addOrganization;
|
|
483
|
-
exports.addOrganizationMember = addOrganizationMember;
|
|
484
|
-
exports.deleteOrganization = deleteOrganization;
|
|
485
|
-
exports.getOrganization = getOrganization;
|
|
486
|
-
exports.getOrganizations = getOrganizations;
|
|
487
|
-
exports.selectOrganization = selectOrganization;
|
|
488
|
-
exports.unselectOrganization = unselectOrganization;
|
|
489
|
-
exports.updateOrganization = updateOrganization;
|
|
490
|
-
exports.updateOrganizationMembers = updateOrganizationMembers;
|
|
491
|
-
exports.updateOrganizationMembersById = updateOrganizationMembersById;
|
|
492
|
-
//# sourceMappingURL=organization.controller.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"organization.controller.cjs","names":["getOrganizationFiltersAndPagination","hasPermission","formatPaginatedResponse","mapOrganizationsToAPI","formatResponse","mapOrganizationToAPI","getPlanDetails","sendEmail","user","stripe","Stripe","SessionModel"],"sources":["../../../src/controllers/organization.controller.ts"],"sourcesContent":["import { logger } from '@logger';\nimport type { ResponseWithSession } from '@middlewares/sessionAuth.middleware';\nimport { SessionModel } from '@models/session.model';\nimport { sendEmail } from '@services/email.service';\nimport * as organizationService from '@services/organization.service';\nimport * as projectService from '@services/project.service';\nimport * as userService from '@services/user.service';\nimport { type AppError, ErrorHandler } from '@utils/errors';\nimport type { FiltersAndPagination } from '@utils/filtersAndPagination/getFiltersAndPaginationFromBody';\nimport {\n getOrganizationFiltersAndPagination,\n type OrganizationFiltersParams,\n} from '@utils/filtersAndPagination/getOrganizationFiltersAndPagination';\nimport {\n mapOrganizationsToAPI,\n mapOrganizationToAPI,\n} from '@utils/mapper/organization';\nimport { hasPermission } from '@utils/permissions';\nimport { getPlanDetails } from '@utils/plan';\nimport {\n formatPaginatedResponse,\n formatResponse,\n type PaginatedResponse,\n type ResponseData,\n} from '@utils/responseData';\nimport type { NextFunction, Request } from 'express';\nimport { t } from 'express-intlayer';\nimport type { Types } from 'mongoose';\nimport { Stripe } from 'stripe';\nimport type {\n Organization,\n OrganizationAPI,\n OrganizationCreationData,\n} from '@/types/organization.types';\nimport type { User, UserAPI } from '@/types/user.types';\n\nexport type GetOrganizationsParams =\n FiltersAndPagination<OrganizationFiltersParams>;\nexport type GetOrganizationsResult = PaginatedResponse<OrganizationAPI>;\n\n/**\n * Retrieves a list of organizations based on filters and pagination.\n */\nexport const getOrganizations = async (\n req: Request<GetOrganizationsParams>,\n res: ResponseWithSession<GetOrganizationsResult>,\n _next: NextFunction\n) => {\n const { user, roles } = res.locals;\n const { filters, sortOptions, pageSize, skip, page, getNumberOfPages } =\n getOrganizationFiltersAndPagination(req, res);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n try {\n const organizations = await organizationService.findOrganizations(\n filters,\n skip,\n pageSize,\n sortOptions\n );\n\n if (\n !hasPermission(\n roles,\n 'organization:read'\n )({\n ...res.locals,\n targetOrganizations: organizations,\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n const totalItems = await organizationService.countOrganizations(filters);\n\n const responseData = formatPaginatedResponse<OrganizationAPI>({\n data: mapOrganizationsToAPI(organizations),\n page,\n pageSize,\n totalPages: getNumberOfPages(totalItems),\n totalItems,\n });\n\n res.status(200).json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type GetOrganizationParam = { organizationId: string };\nexport type GetOrganizationResult = ResponseData<OrganizationAPI>;\n\n/**\n * Retrieves an organization by its ID.\n */\nexport const getOrganization = async (\n req: Request<GetOrganizationParam, any, any>,\n res: ResponseWithSession<GetOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { roles } = res.locals;\n const { organizationId } = req.params as Partial<GetOrganizationParam>;\n\n if (!organizationId) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_ID_NOT_FOUND');\n return;\n }\n\n try {\n const organization =\n await organizationService.getOrganizationById(organizationId);\n\n if (\n !hasPermission(\n roles,\n 'organization:read'\n )({\n ...res.locals,\n targetOrganizations: [organization],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n const responseData = formatResponse<OrganizationAPI>({\n data: mapOrganizationToAPI(organization),\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 AddOrganizationBody = OrganizationCreationData;\nexport type AddOrganizationResult = ResponseData<OrganizationAPI>;\n\n/**\n * Adds a new organization to the database.\n */\nexport const addOrganization = async (\n req: Request<any, any, AddOrganizationBody>,\n res: ResponseWithSession<AddOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user } = res.locals;\n const organization = req.body;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_DATA_NOT_FOUND');\n return;\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n try {\n const newOrganization = await organizationService.createOrganization(\n organization,\n user.id\n );\n\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization created successfully',\n fr: 'Organisation créée avec succès',\n es: 'Organización creada con éxito',\n }),\n description: t({\n en: 'Your organization has been created successfully',\n fr: 'Votre organisation a été créée avec succès',\n es: 'Su organización ha sido creada con éxito',\n }),\n data: mapOrganizationToAPI(newOrganization),\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 UpdateOrganizationBody = Partial<Organization>;\nexport type UpdateOrganizationResult = ResponseData<OrganizationAPI>;\n\n/**\n * Updates an existing organization in the database.\n */\nexport const updateOrganization = async (\n req: Request<undefined, undefined, UpdateOrganizationBody>,\n res: ResponseWithSession<UpdateOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, roles } = res.locals;\n const organizationFields = req.body;\n\n if (!organizationFields) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_DATA_NOT_FOUND');\n return;\n }\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_DEFINED');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'organization:write'\n )({\n ...res.locals,\n targetOrganizations: [organization],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n try {\n const updatedOrganization =\n await organizationService.updateOrganizationById(\n organization.id,\n organizationFields\n );\n\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization updated successfully',\n fr: 'Organisation mise à jour avec succès',\n es: 'Organización actualizada con éxito',\n }),\n description: t({\n en: 'Your organization has been updated successfully',\n fr: 'Votre organisation a été mise à jour avec succès',\n es: 'Su organización ha sido actualizada con éxito',\n }),\n data: mapOrganizationToAPI(updatedOrganization),\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 AddOrganizationMemberBody = {\n userEmail: string;\n};\nexport type AddOrganizationMemberResult = ResponseData<OrganizationAPI>;\n\n/**\n * Add member to the organization in the database.\n */\nexport const addOrganizationMember = async (\n req: Request<any, any, AddOrganizationMemberBody>,\n res: ResponseWithSession<AddOrganizationMemberResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, user, roles } = res.locals;\n const { userEmail } = req.body;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_DEFINED');\n return;\n }\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'organization:admin'\n )({\n ...res.locals,\n targetOrganizations: [organization],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n const planType = getPlanDetails(organization.plan);\n\n if (\n planType.numberOfOrganizationUsers &&\n organization.membersIds.length >= planType.numberOfOrganizationUsers\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PLAN_USER_LIMIT_REACHED', {\n organizationId: organization.id,\n });\n return;\n }\n\n try {\n let newMember = await userService.getUserByEmail(userEmail);\n\n if (!newMember) {\n // Create user if not found\n const newUser = await userService.createUser({ email: userEmail });\n if (!newUser) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_CREATION_FAILED', {\n email: userEmail,\n });\n return;\n }\n\n newMember = newUser;\n }\n\n const updatedOrganization =\n await organizationService.updateOrganizationById(organization.id, {\n ...organization,\n membersIds: [...organization.membersIds, newMember.id],\n });\n\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization updated successfully',\n fr: 'Organisation mise à jour avec succès',\n es: 'Organización actualizada con éxito',\n }),\n description: t({\n en: 'Your organization has been updated successfully',\n fr: 'Votre organisation a été mise à jour avec succès',\n es: 'Su organización ha sido actualizada con éxito',\n }),\n data: mapOrganizationToAPI(updatedOrganization),\n });\n\n res.json(responseData);\n\n await sendEmail({\n type: 'invite',\n to: userEmail,\n username: newMember.email.slice(0, newMember.email.indexOf('@')),\n invitedByUsername: user.name,\n invitedByEmail: user.email,\n organizationName: organization.name,\n inviteLink: `${process.env.CLIENT_URL}/auth/login?email=${newMember.email}`,\n inviteFromIp: req.ip ?? '',\n inviteFromLocation: req.hostname,\n });\n\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type UpdateOrganizationMembersBody = Partial<{\n membersIds: (User | UserAPI)['id'][];\n adminsIds: (User | UserAPI)['id'][];\n}>;\nexport type UpdateOrganizationMembersResult = ResponseData<OrganizationAPI>;\n\n/**\n * Update members to the organization in the database.\n */\nexport const updateOrganizationMembers = async (\n req: Request<any, any, UpdateOrganizationMembersBody>,\n res: ResponseWithSession<UpdateOrganizationMembersResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organization, roles } = res.locals;\n const { membersIds, adminsIds } = req.body;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_DEFINED');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'organization:admin'\n )({\n ...res.locals,\n targetOrganizations: [organization],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n if (!membersIds) {\n ErrorHandler.handleGenericErrorResponse(res, 'INVALID_REQUEST_BODY');\n return;\n }\n\n if (membersIds?.length === 0) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'ORGANIZATION_MUST_HAVE_MEMBER'\n );\n return;\n }\n\n if (adminsIds?.filter((id) => membersIds?.includes(id)).length === 0) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'ORGANIZATION_MUST_HAVE_ADMIN'\n );\n return;\n }\n\n try {\n const existingUsers = await userService.getUsersByIds(membersIds);\n\n if (!existingUsers) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n const existingAdmins = await userService.getUsersByIds(adminsIds!);\n\n if (!existingAdmins) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n const updatedOrganization =\n await organizationService.updateOrganizationById(organization.id, {\n membersIds: existingUsers.map((user) => user.id),\n adminsIds: existingAdmins.map((user) => user.id),\n });\n\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization updated successfully',\n fr: 'Organisation mise à jour avec succès',\n es: 'Organización actualizada con éxito',\n }),\n description: t({\n en: 'Your organization has been updated successfully',\n fr: 'Votre organisation a été mise à jour avec succès',\n es: 'Su organización ha sido actualizada con éxito',\n }),\n data: mapOrganizationToAPI(updatedOrganization),\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 UpdateOrganizationMembersByIdParams = { organizationId: string };\nexport type UpdateOrganizationMembersByIdBody = Partial<{\n membersIds: (User | UserAPI)['id'][];\n adminsIds: (User | UserAPI)['id'][];\n}>;\nexport type UpdateOrganizationMembersByIdResult = ResponseData<OrganizationAPI>;\n\n/**\n * Admin-only: Update members of any organization by ID\n */\nexport const updateOrganizationMembersById = async (\n req: Request<\n UpdateOrganizationMembersByIdParams,\n any,\n UpdateOrganizationMembersByIdBody\n >,\n res: ResponseWithSession<UpdateOrganizationMembersByIdResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user } = res.locals;\n const { organizationId } = req.params;\n const { membersIds, adminsIds } = req.body;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (user.role !== 'admin') {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n if (!membersIds) {\n ErrorHandler.handleGenericErrorResponse(res, 'INVALID_REQUEST_BODY');\n return;\n }\n\n if (membersIds?.length === 0) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'ORGANIZATION_MUST_HAVE_MEMBER'\n );\n return;\n }\n\n try {\n const targetOrganization =\n await organizationService.getOrganizationById(organizationId);\n\n if (!targetOrganization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND');\n return;\n }\n\n const existingUsers = await userService.getUsersByIds(membersIds);\n\n if (!existingUsers) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n const finalAdminsIds =\n adminsIds && adminsIds.length > 0\n ? adminsIds\n : targetOrganization.adminsIds;\n const existingAdmins = finalAdminsIds\n ? await userService.getUsersByIds(finalAdminsIds)\n : [];\n\n if (!existingAdmins || existingAdmins.length === 0) {\n ErrorHandler.handleGenericErrorResponse(\n res,\n 'ORGANIZATION_MUST_HAVE_ADMIN'\n );\n return;\n }\n\n const updatedOrganization =\n await organizationService.updateOrganizationById(targetOrganization.id, {\n membersIds: existingUsers.map((user) => user.id),\n adminsIds: existingAdmins.map((user) => user.id),\n });\n\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization members updated successfully',\n fr: \"Membres de l'organisation mis à jour avec succès\",\n es: 'Miembros de la organización actualizados con éxito',\n }),\n description: t({\n en: 'Organization members have been updated successfully',\n fr: \"Les membres de l'organisation ont été mis à jour avec succès\",\n es: 'Los miembros de la organización han sido actualizados con éxito',\n }),\n data: mapOrganizationToAPI(updatedOrganization),\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 DeleteOrganizationResult = ResponseData<OrganizationAPI>;\n\n/**\n * Deletes an organization from the database by its ID.\n */\nexport const deleteOrganization = async (\n _req: Request,\n res: ResponseWithSession,\n _next: NextFunction\n): Promise<void> => {\n const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);\n const { organization, roles } = res.locals;\n\n if (!organization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_DEFINED');\n return;\n }\n\n const projects = await projectService.findProjects({\n organizationId: organization.id,\n });\n\n if (projects.length > 0) {\n ErrorHandler.handleGenericErrorResponse(res, 'PROJECTS_EXIST', {\n organizationId: organization.id,\n });\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'organization:admin'\n )({\n ...res.locals,\n targetOrganizations: [organization],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n try {\n // Cancel the subscription on Stripe if it exists\n if (organization.plan?.subscriptionId) {\n await stripe.subscriptions.cancel(organization.plan.subscriptionId);\n }\n\n const deletedOrganization =\n await organizationService.deleteOrganizationById(organization.id);\n\n if (!deletedOrganization) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_NOT_FOUND', {\n organizationId: organization.id,\n });\n return;\n }\n\n logger.info(`Organization deleted: ${String(deletedOrganization.id)}`);\n\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization deleted successfully',\n fr: 'Organisation supprimée avec succès',\n es: 'Organización eliminada con éxito',\n }),\n description: t({\n en: 'Your organization has been deleted successfully',\n fr: 'Votre organisation a été supprimée avec succès',\n es: 'Su organización ha sido eliminada con éxito',\n }),\n data: mapOrganizationToAPI(deletedOrganization),\n });\n\n // No need to update session here, as it's a delete operation\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type SelectOrganizationParam = {\n organizationId: string | Types.ObjectId;\n};\nexport type SelectOrganizationResult = ResponseData<OrganizationAPI>;\n\n/**\n * Select an organization.\n */\nexport const selectOrganization = async (\n req: Request<SelectOrganizationParam>,\n res: ResponseWithSession<SelectOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { organizationId } = req.params as Partial<SelectOrganizationParam>;\n const { session } = res.locals;\n\n if (!organizationId) {\n ErrorHandler.handleGenericErrorResponse(res, 'ORGANIZATION_ID_NOT_FOUND');\n return;\n }\n\n if (typeof session === 'undefined') {\n ErrorHandler.handleGenericErrorResponse(res, 'SESSION_NOT_DEFINED');\n return;\n }\n\n try {\n const organization =\n await organizationService.getOrganizationById(organizationId);\n\n // Update session to set activeOrganizationId\n await SessionModel.updateOne(\n { _id: session.id },\n {\n $set: {\n activeOrganizationId: String(organization.id),\n activeProjectId: null,\n },\n }\n );\n\n // No need to update session here, as it's a select operation\n const responseData = formatResponse<OrganizationAPI>({\n message: t({\n en: 'Organization retrieved successfully',\n fr: 'Organisation récupérée avec succès',\n es: 'Organización recuperada con éxito',\n }),\n description: t({\n en: 'Your organization has been retrieved successfully',\n fr: 'Votre organisation a été récupérée avec succès',\n es: 'Su organización ha sido recuperada con éxito',\n }),\n data: mapOrganizationToAPI(organization),\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 UnselectOrganizationResult = ResponseData<null>;\n\n/**\n * Unselect an organization.\n */\nexport const unselectOrganization = async (\n _req: Request,\n res: ResponseWithSession<UnselectOrganizationResult>,\n _next: NextFunction\n): Promise<void> => {\n const { session } = res.locals;\n try {\n // Update session to clear activeOrganizationId and activeProjectId\n\n if (typeof session === 'undefined') {\n ErrorHandler.handleGenericErrorResponse(res, 'SESSION_NOT_DEFINED');\n return;\n }\n\n await SessionModel.updateOne(\n { _id: session.id },\n {\n $set: {\n activeOrganizationId: null,\n activeProjectId: null,\n },\n }\n );\n\n const responseData = formatResponse<null>({\n message: t({\n en: 'Organization unselected successfully',\n fr: 'Organisation désélectionnée avec succès',\n es: 'Organización deseleccionada con éxito',\n }),\n description: t({\n en: 'Your organization has been unselected successfully',\n fr: 'Votre organisation a été désélectionnée avec succès',\n es: 'Su organización ha sido deseleccionada con éxito',\n }),\n data: null,\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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"}
|