@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,269 +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_utils_permissions = require('../utils/permissions.cjs');
|
|
6
|
-
const require_services_user_service = require('../services/user.service.cjs');
|
|
7
|
-
const require_utils_mapper_user = require('../utils/mapper/user.cjs');
|
|
8
|
-
const require_services_email_service = require('../services/email.service.cjs');
|
|
9
|
-
const require_utils_filtersAndPagination_getUserFiltersAndPagination = require('../utils/filtersAndPagination/getUserFiltersAndPagination.cjs');
|
|
10
|
-
let express_intlayer = require("express-intlayer");
|
|
11
|
-
|
|
12
|
-
//#region src/controllers/user.controller.ts
|
|
13
|
-
/**
|
|
14
|
-
* Creates a new user.
|
|
15
|
-
*/
|
|
16
|
-
const createUser = async (req, res, _next) => {
|
|
17
|
-
const user = req.body;
|
|
18
|
-
if (!user) {
|
|
19
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
20
|
-
return;
|
|
21
|
-
}
|
|
22
|
-
try {
|
|
23
|
-
const newUser = await require_services_user_service.createUser(user);
|
|
24
|
-
await require_services_email_service.sendEmail({
|
|
25
|
-
type: "welcome",
|
|
26
|
-
to: newUser.email,
|
|
27
|
-
username: newUser.name,
|
|
28
|
-
loginLink: `${process.env.CLIENT_URL}/auth/login`
|
|
29
|
-
});
|
|
30
|
-
const formattedUser = require_utils_mapper_user.mapUserToAPI(newUser);
|
|
31
|
-
const responseData = require_utils_responseData.formatResponse({
|
|
32
|
-
message: (0, express_intlayer.t)({
|
|
33
|
-
en: "User created",
|
|
34
|
-
fr: "Utilisateur créé",
|
|
35
|
-
es: "Usuario creado"
|
|
36
|
-
}),
|
|
37
|
-
description: (0, express_intlayer.t)({
|
|
38
|
-
en: "User created successfully",
|
|
39
|
-
fr: "Utilisateur créé avec succès",
|
|
40
|
-
es: "Usuario creado con éxito"
|
|
41
|
-
}),
|
|
42
|
-
data: formattedUser
|
|
43
|
-
});
|
|
44
|
-
res.json(responseData);
|
|
45
|
-
return;
|
|
46
|
-
} catch (error) {
|
|
47
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
48
|
-
return;
|
|
49
|
-
}
|
|
50
|
-
};
|
|
51
|
-
/**
|
|
52
|
-
* Retrieves a list of users based on filters and pagination.
|
|
53
|
-
*/
|
|
54
|
-
const getUsers = async (req, res, _next) => {
|
|
55
|
-
const { user, roles } = res.locals;
|
|
56
|
-
if (!user) {
|
|
57
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
58
|
-
return;
|
|
59
|
-
}
|
|
60
|
-
const { filters, sortOptions, pageSize, skip, page, getNumberOfPages } = require_utils_filtersAndPagination_getUserFiltersAndPagination.getUserFiltersAndPagination(req, res);
|
|
61
|
-
try {
|
|
62
|
-
const users = await require_services_user_service.findUsers(filters, skip, pageSize, sortOptions);
|
|
63
|
-
if (!require_utils_permissions.hasPermission(roles, "user:read")({
|
|
64
|
-
...res.locals,
|
|
65
|
-
targetUsers: users
|
|
66
|
-
})) {
|
|
67
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const totalItems = await require_services_user_service.countUsers(filters);
|
|
71
|
-
const responseData = require_utils_responseData.formatPaginatedResponse({
|
|
72
|
-
data: require_utils_mapper_user.mapUsersToAPI(users),
|
|
73
|
-
page,
|
|
74
|
-
pageSize,
|
|
75
|
-
totalPages: getNumberOfPages(totalItems),
|
|
76
|
-
totalItems
|
|
77
|
-
});
|
|
78
|
-
res.json(responseData);
|
|
79
|
-
return;
|
|
80
|
-
} catch (error) {
|
|
81
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
82
|
-
return;
|
|
83
|
-
}
|
|
84
|
-
};
|
|
85
|
-
const getUserById = async (req, res, _next) => {
|
|
86
|
-
const { userId } = req.params;
|
|
87
|
-
try {
|
|
88
|
-
const user = await require_services_user_service.getUserById(userId);
|
|
89
|
-
if (!user) {
|
|
90
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
91
|
-
return;
|
|
92
|
-
}
|
|
93
|
-
const responseData = require_utils_responseData.formatResponse({ data: require_utils_mapper_user.mapUserToAPI(user) });
|
|
94
|
-
res.json(responseData);
|
|
95
|
-
return;
|
|
96
|
-
} catch (error) {
|
|
97
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
98
|
-
return;
|
|
99
|
-
}
|
|
100
|
-
};
|
|
101
|
-
const getUserByEmail = async (req, res, _next) => {
|
|
102
|
-
const { email } = req.params;
|
|
103
|
-
const { roles } = res.locals;
|
|
104
|
-
try {
|
|
105
|
-
const user = await require_services_user_service.getUserByEmail(email);
|
|
106
|
-
if (!user) {
|
|
107
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
108
|
-
return;
|
|
109
|
-
}
|
|
110
|
-
if (!require_utils_permissions.hasPermission(roles, "user:read")({
|
|
111
|
-
...res.locals,
|
|
112
|
-
targetUsers: [user]
|
|
113
|
-
})) {
|
|
114
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
|
|
115
|
-
return;
|
|
116
|
-
}
|
|
117
|
-
const responseData = require_utils_responseData.formatResponse({ data: require_utils_mapper_user.mapUserToAPI(user) });
|
|
118
|
-
res.json(responseData);
|
|
119
|
-
} catch (error) {
|
|
120
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
121
|
-
return;
|
|
122
|
-
}
|
|
123
|
-
};
|
|
124
|
-
/**
|
|
125
|
-
* Updates user information (phone number, date of birth).
|
|
126
|
-
*/
|
|
127
|
-
const updateUser = async (req, res, _next) => {
|
|
128
|
-
const userData = req.body;
|
|
129
|
-
const { user, roles } = res.locals;
|
|
130
|
-
if (!user) {
|
|
131
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_DEFINED");
|
|
132
|
-
return;
|
|
133
|
-
}
|
|
134
|
-
if (typeof userData !== "object") {
|
|
135
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_DATA_NOT_FOUND");
|
|
136
|
-
return;
|
|
137
|
-
}
|
|
138
|
-
if (!userData.id) {
|
|
139
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_INVALID_FIELDS");
|
|
140
|
-
return;
|
|
141
|
-
}
|
|
142
|
-
const userDB = await require_services_user_service.getUserById(userData.id);
|
|
143
|
-
if (!userDB) {
|
|
144
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
|
|
145
|
-
return;
|
|
146
|
-
}
|
|
147
|
-
if (!require_utils_permissions.hasPermission(roles, "user:write")({
|
|
148
|
-
...res.locals,
|
|
149
|
-
targetUsers: [userDB]
|
|
150
|
-
})) {
|
|
151
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
|
|
152
|
-
return;
|
|
153
|
-
}
|
|
154
|
-
try {
|
|
155
|
-
const updatedUser = await require_services_user_service.updateUserById(userDB.id, userData);
|
|
156
|
-
require_logger_index.logger.info(`User updated: Name: ${updatedUser.name}, id: ${String(updatedUser.id)}`);
|
|
157
|
-
const formattedUser = require_utils_mapper_user.mapUserToAPI(updatedUser);
|
|
158
|
-
const responseData = require_utils_responseData.formatResponse({
|
|
159
|
-
message: (0, express_intlayer.t)({
|
|
160
|
-
en: "User updated",
|
|
161
|
-
fr: "Utilisateur mis à jour",
|
|
162
|
-
es: "Usuario actualizado"
|
|
163
|
-
}),
|
|
164
|
-
description: (0, express_intlayer.t)({
|
|
165
|
-
en: "User updated successfully",
|
|
166
|
-
fr: "Utilisateur mis à jour avec succès",
|
|
167
|
-
es: "Usuario actualizado con éxito"
|
|
168
|
-
}),
|
|
169
|
-
data: formattedUser
|
|
170
|
-
});
|
|
171
|
-
res.json(responseData);
|
|
172
|
-
return;
|
|
173
|
-
} catch (error) {
|
|
174
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
175
|
-
return;
|
|
176
|
-
}
|
|
177
|
-
};
|
|
178
|
-
/**
|
|
179
|
-
* Deletes a user based on the provided ID.
|
|
180
|
-
*/
|
|
181
|
-
const deleteUser = async (req, res, _next) => {
|
|
182
|
-
const { userId } = req.params;
|
|
183
|
-
const { roles } = res.locals;
|
|
184
|
-
try {
|
|
185
|
-
const user = await require_services_user_service.getUserById(userId);
|
|
186
|
-
if (!user) {
|
|
187
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "USER_NOT_FOUND");
|
|
188
|
-
return;
|
|
189
|
-
}
|
|
190
|
-
if (!require_utils_permissions.hasPermission(roles, "user:admin")({
|
|
191
|
-
...res.locals,
|
|
192
|
-
targetUsers: [user]
|
|
193
|
-
})) {
|
|
194
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleGenericErrorResponse(res, "PERMISSION_DENIED");
|
|
195
|
-
return;
|
|
196
|
-
}
|
|
197
|
-
await require_services_user_service.deleteUser(userId);
|
|
198
|
-
const formattedUser = require_utils_mapper_user.mapUserToAPI(user);
|
|
199
|
-
const responseData = require_utils_responseData.formatResponse({
|
|
200
|
-
message: (0, express_intlayer.t)({
|
|
201
|
-
en: "User deleted",
|
|
202
|
-
fr: "Utilisateur supprimé",
|
|
203
|
-
es: "Usuario eliminado"
|
|
204
|
-
}),
|
|
205
|
-
description: (0, express_intlayer.t)({
|
|
206
|
-
en: "User deleted successfully",
|
|
207
|
-
fr: "Utilisateur supprimé avec succès",
|
|
208
|
-
es: "Usuario eliminado con éxito"
|
|
209
|
-
}),
|
|
210
|
-
data: formattedUser
|
|
211
|
-
});
|
|
212
|
-
res.json(responseData);
|
|
213
|
-
} catch (error) {
|
|
214
|
-
require_utils_errors_ErrorHandler.ErrorHandler.handleAppErrorResponse(res, error);
|
|
215
|
-
return;
|
|
216
|
-
}
|
|
217
|
-
};
|
|
218
|
-
let clients = [];
|
|
219
|
-
const sendVerificationUpdate = (user) => {
|
|
220
|
-
const filteredClients = clients.filter((client) => String(client.userId) === String(user.id));
|
|
221
|
-
for (const client of filteredClients) if (user.emailVerified) client.res.write(`data: ${JSON.stringify({
|
|
222
|
-
userId: user.id,
|
|
223
|
-
status: "verified"
|
|
224
|
-
})}\n\n`);
|
|
225
|
-
};
|
|
226
|
-
/**
|
|
227
|
-
* SSE to check the email verification status
|
|
228
|
-
*/
|
|
229
|
-
const verifyEmailStatusSSE = async (req, res) => {
|
|
230
|
-
res.setHeader("Content-Type", "text/event-stream;charset=utf-8");
|
|
231
|
-
res.setHeader("Cache-Control", "no-cache, no-transform");
|
|
232
|
-
res.setHeader("Connection", "keep-alive");
|
|
233
|
-
res.setHeader("X-Accel-Buffering", "no");
|
|
234
|
-
res.write(":\n\n");
|
|
235
|
-
res.flushHeaders();
|
|
236
|
-
const { userId } = req.params;
|
|
237
|
-
const clientId = Date.now();
|
|
238
|
-
const user = await require_services_user_service.getUserById(userId);
|
|
239
|
-
if (!user) {
|
|
240
|
-
require_logger_index.logger.error(`User not found - User ID: ${userId}`);
|
|
241
|
-
res.write(`data: ${JSON.stringify({
|
|
242
|
-
userId,
|
|
243
|
-
status: "error"
|
|
244
|
-
})}\n\n`);
|
|
245
|
-
res.end();
|
|
246
|
-
return;
|
|
247
|
-
}
|
|
248
|
-
const newClient = {
|
|
249
|
-
id: clientId,
|
|
250
|
-
userId,
|
|
251
|
-
res
|
|
252
|
-
};
|
|
253
|
-
clients.push(newClient);
|
|
254
|
-
sendVerificationUpdate(user);
|
|
255
|
-
req.on("close", () => {
|
|
256
|
-
clients = clients.filter((client) => client.id !== clientId);
|
|
257
|
-
});
|
|
258
|
-
};
|
|
259
|
-
|
|
260
|
-
//#endregion
|
|
261
|
-
exports.createUser = createUser;
|
|
262
|
-
exports.deleteUser = deleteUser;
|
|
263
|
-
exports.getUserByEmail = getUserByEmail;
|
|
264
|
-
exports.getUserById = getUserById;
|
|
265
|
-
exports.getUsers = getUsers;
|
|
266
|
-
exports.sendVerificationUpdate = sendVerificationUpdate;
|
|
267
|
-
exports.updateUser = updateUser;
|
|
268
|
-
exports.verifyEmailStatusSSE = verifyEmailStatusSSE;
|
|
269
|
-
//# sourceMappingURL=user.controller.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"user.controller.cjs","names":["user: User | undefined","sendEmail","mapUserToAPI","formatResponse","getUserFiltersAndPagination","hasPermission","formatPaginatedResponse","mapUsersToAPI","clients: Array<{ id: number; userId: string; res: ResponseWithSession }>"],"sources":["../../../src/controllers/user.controller.ts"],"sourcesContent":["import { logger } from '@logger';\nimport type { ResponseWithSession } from '@middlewares/sessionAuth.middleware';\nimport { sendEmail } from '@services/email.service';\nimport * as userService from '@services/user.service';\nimport { type AppError, ErrorHandler } from '@utils/errors';\nimport type { FiltersAndPagination } from '@utils/filtersAndPagination/getFiltersAndPaginationFromBody';\nimport {\n getUserFiltersAndPagination,\n type UserFiltersParam,\n} from '@utils/filtersAndPagination/getUserFiltersAndPagination';\nimport { mapUsersToAPI, mapUserToAPI } from '@utils/mapper/user';\nimport { hasPermission } from '@utils/permissions';\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 { User, UserAPI } from '@/types/user.types';\n\nexport type CreateUserBody = { email: string; password?: string };\nexport type CreateUserResult = ResponseData<UserAPI>;\n\n/**\n * Creates a new user.\n */\nexport const createUser = async (\n req: Request<any, any, User>,\n res: ResponseWithSession<CreateUserResult>,\n _next: NextFunction\n): Promise<void> => {\n const user: User | undefined = req.body;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n try {\n const newUser = await userService.createUser(user);\n\n await sendEmail({\n type: 'welcome',\n to: newUser.email,\n username: newUser.name,\n loginLink: `${process.env.CLIENT_URL}/auth/login`,\n });\n\n const formattedUser = mapUserToAPI(newUser);\n\n const responseData = formatResponse<UserAPI>({\n message: t({\n en: 'User created',\n fr: 'Utilisateur créé',\n es: 'Usuario creado',\n }),\n description: t({\n en: 'User created successfully',\n fr: 'Utilisateur créé avec succès',\n es: 'Usuario creado con éxito',\n }),\n data: formattedUser,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type GetUsersParams = FiltersAndPagination<UserFiltersParam>;\nexport type GetUsersResult = PaginatedResponse<UserAPI>;\n\n/**\n * Retrieves a list of users based on filters and pagination.\n */\nexport const getUsers = async (\n req: Request<GetUsersParams>,\n res: ResponseWithSession<GetUsersResult>,\n _next: NextFunction\n): Promise<void> => {\n const { user, roles } = res.locals;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n const { filters, sortOptions, pageSize, skip, page, getNumberOfPages } =\n getUserFiltersAndPagination(req, res);\n\n try {\n const users = await userService.findUsers(\n filters,\n skip,\n pageSize,\n sortOptions\n );\n\n if (\n !hasPermission(\n roles,\n 'user:read'\n )({\n ...res.locals,\n targetUsers: users,\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n const totalItems = await userService.countUsers(filters);\n\n const formattedUsers = mapUsersToAPI(users);\n\n const responseData = formatPaginatedResponse<UserAPI>({\n data: formattedUsers,\n page,\n pageSize,\n totalPages: getNumberOfPages(totalItems),\n totalItems,\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 GetUserByIdParams = { userId: UserAPI['id'] };\nexport type GetUserByIdResult = ResponseData<UserAPI>;\n\nexport const getUserById = async (\n req: Request<GetUserByIdParams>,\n res: ResponseWithSession<GetUserByIdResult>,\n _next: NextFunction\n): Promise<void> => {\n const { userId } = req.params;\n\n try {\n const user = await userService.getUserById(userId);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n const formattedUser = mapUserToAPI(user);\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type GetUserByEmailParams = { email: string };\nexport type GetUserByEmailResult = ResponseData<UserAPI>;\n\nexport const getUserByEmail = async (\n req: Request<GetUserByEmailParams>,\n res: ResponseWithSession<GetUserByEmailResult>,\n _next: NextFunction\n): Promise<void> => {\n const { email } = req.params;\n const { roles } = res.locals;\n\n try {\n const user = await userService.getUserByEmail(email);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'user:read'\n )({\n ...res.locals,\n targetUsers: [user],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n const formattedUser = mapUserToAPI(user);\n const responseData = formatResponse<UserAPI>({ data: formattedUser });\n\n res.json(responseData);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type UpdateUserBody = Partial<UserAPI>;\nexport type UpdateUserResult = ResponseData<UserAPI>;\n\n/**\n * Updates user information (phone number, date of birth).\n */\nexport const updateUser = async (\n req: Request<any, any, UpdateUserBody | undefined>,\n res: ResponseWithSession<UpdateUserResult>,\n _next: NextFunction\n): Promise<void> => {\n const userData = req.body;\n const { user, roles } = res.locals;\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_DEFINED');\n return;\n }\n\n if (typeof userData !== 'object') {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_DATA_NOT_FOUND');\n return;\n }\n\n if (!userData.id) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_INVALID_FIELDS');\n return;\n }\n\n const userDB = await userService.getUserById(userData.id);\n\n if (!userDB) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'user:write'\n )({\n ...res.locals,\n targetUsers: [userDB],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n try {\n const updatedUser = await userService.updateUserById(userDB.id, userData);\n\n logger.info(\n `User updated: Name: ${updatedUser.name}, id: ${String(updatedUser.id)}`\n );\n\n const formattedUser = mapUserToAPI(updatedUser);\n const responseData = formatResponse<UserAPI>({\n message: t({\n en: 'User updated',\n fr: 'Utilisateur mis à jour',\n es: 'Usuario actualizado',\n }),\n description: t({\n en: 'User updated successfully',\n fr: 'Utilisateur mis à jour avec succès',\n es: 'Usuario actualizado con éxito',\n }),\n data: formattedUser,\n });\n\n res.json(responseData);\n return;\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nexport type DeleteUserParams = { userId: string };\nexport type DeleteUserResult = ResponseData<UserAPI>;\n\n/**\n * Deletes a user based on the provided ID.\n */\nexport const deleteUser = async (\n req: Request<DeleteUserParams>,\n res: ResponseWithSession<DeleteUserResult>,\n _next: NextFunction\n): Promise<void> => {\n const { userId } = req.params;\n const { roles } = res.locals;\n\n try {\n const user = await userService.getUserById(userId);\n\n if (!user) {\n ErrorHandler.handleGenericErrorResponse(res, 'USER_NOT_FOUND');\n return;\n }\n\n if (\n !hasPermission(\n roles,\n 'user:admin'\n )({\n ...res.locals,\n targetUsers: [user],\n })\n ) {\n ErrorHandler.handleGenericErrorResponse(res, 'PERMISSION_DENIED');\n return;\n }\n\n await userService.deleteUser(userId);\n\n const formattedUser = mapUserToAPI(user);\n const responseData = formatResponse<UserAPI>({\n message: t({\n en: 'User deleted',\n fr: 'Utilisateur supprimé',\n es: 'Usuario eliminado',\n }),\n description: t({\n en: 'User deleted successfully',\n fr: 'Utilisateur supprimé avec succès',\n es: 'Usuario eliminado con éxito',\n }),\n data: formattedUser,\n });\n\n res.json(responseData);\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(res, error as AppError);\n return;\n }\n};\n\nlet clients: Array<{ id: number; userId: string; res: ResponseWithSession }> =\n [];\n\nexport const sendVerificationUpdate = (user: User) => {\n const filteredClients = clients.filter(\n (client) => String(client.userId) === String(user.id)\n );\n\n for (const client of filteredClients) {\n if (user.emailVerified) {\n client.res.write(\n `data: ${JSON.stringify({ userId: user.id, status: 'verified' })}\\n\\n`\n );\n }\n }\n};\n\nexport type VerifyEmailStatusSSEParams = { userId: string };\n\n/**\n * SSE to check the email verification status\n */\nexport const verifyEmailStatusSSE = async (\n req: Request<VerifyEmailStatusSSEParams, any, any>,\n res: ResponseWithSession\n) => {\n // Set headers for SSE\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'); // For Nginx buffering\n\n // Send initial data to ensure the connection is open\n res.write(':\\n\\n'); // Comment to keep connection alive\n res.flushHeaders();\n\n const { userId } = req.params; // Get user ID from query parameters\n const clientId = Date.now();\n\n const user = await userService.getUserById(userId);\n\n if (!user) {\n logger.error(`User not found - User ID: ${userId}`);\n res.write(`data: ${JSON.stringify({ userId, status: 'error' })}\\n\\n`);\n res.end();\n return;\n }\n\n // Add client to the list\n const newClient = { id: clientId, userId, res };\n clients.push(newClient);\n\n sendVerificationUpdate(user);\n\n // Remove client on connection close\n req.on('close', () => {\n clients = clients.filter((client) => client.id !== clientId);\n });\n};\n"],"mappings":"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"}
|
|
@@ -1,325 +0,0 @@
|
|
|
1
|
-
const require_rolldown_runtime = require('../_virtual/rolldown_runtime.cjs');
|
|
2
|
-
let __react_email_components = require("@react-email/components");
|
|
3
|
-
let react_jsx_runtime = require("react/jsx-runtime");
|
|
4
|
-
|
|
5
|
-
//#region src/emails/InviteUserEmail.tsx
|
|
6
|
-
const InviteUserEmailEN = ({ username, invitedByUsername, invitedByEmail, organizationName, inviteLink, inviteFromIp, inviteFromLocation }) => {
|
|
7
|
-
const previewText = `Join ${invitedByUsername} on Intlayer`;
|
|
8
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Html, { children: [
|
|
9
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Head, {}),
|
|
10
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Preview, { children: previewText }),
|
|
11
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Tailwind, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Body, {
|
|
12
|
-
className: "m-auto px-2 font-sans",
|
|
13
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Container, {
|
|
14
|
-
className: "mx-auto my-[40px] max-w-[465px] rounded-xl border border-[#eaeaea] border-solid bg-white p-[20px]",
|
|
15
|
-
children: [
|
|
16
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Section, {
|
|
17
|
-
className: "mt-[32px]",
|
|
18
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Img, {
|
|
19
|
-
src: "https://intlayer.org/apple-touch-icon.png",
|
|
20
|
-
width: "40",
|
|
21
|
-
height: "37",
|
|
22
|
-
alt: "Intlayer",
|
|
23
|
-
className: "mx-auto my-0"
|
|
24
|
-
})
|
|
25
|
-
}),
|
|
26
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Heading, {
|
|
27
|
-
className: "mx-0 my-[30px] p-0 text-center font-normal text-[24px] text-black",
|
|
28
|
-
children: [
|
|
29
|
-
"Join ",
|
|
30
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: organizationName }),
|
|
31
|
-
" on",
|
|
32
|
-
" ",
|
|
33
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: "Intlayer" })
|
|
34
|
-
]
|
|
35
|
-
}),
|
|
36
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Text, {
|
|
37
|
-
className: "text-[14px] text-black leading-[24px]",
|
|
38
|
-
children: [
|
|
39
|
-
"Hello ",
|
|
40
|
-
username,
|
|
41
|
-
","
|
|
42
|
-
]
|
|
43
|
-
}),
|
|
44
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Text, {
|
|
45
|
-
className: "text-[14px] text-black leading-[24px]",
|
|
46
|
-
children: [
|
|
47
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: invitedByUsername }),
|
|
48
|
-
" (",
|
|
49
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Link, {
|
|
50
|
-
href: `mailto:${invitedByEmail}`,
|
|
51
|
-
className: "text-[#8a8a8a] no-underline",
|
|
52
|
-
children: invitedByEmail
|
|
53
|
-
}),
|
|
54
|
-
") has invited you to the ",
|
|
55
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: organizationName }),
|
|
56
|
-
" team on ",
|
|
57
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: "Intlayer" }),
|
|
58
|
-
"."
|
|
59
|
-
]
|
|
60
|
-
}),
|
|
61
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Section, {
|
|
62
|
-
className: "my-[32px] text-center",
|
|
63
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Button, {
|
|
64
|
-
className: "rounded-md bg-[#000000] px-5 py-3 text-center font-semibold text-[12px] text-white no-underline",
|
|
65
|
-
href: inviteLink,
|
|
66
|
-
children: "Join the team"
|
|
67
|
-
})
|
|
68
|
-
}),
|
|
69
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Text, {
|
|
70
|
-
className: "text-[14px] text-black leading-[24px]",
|
|
71
|
-
children: "or copy and paste this URL into your browser:"
|
|
72
|
-
}),
|
|
73
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Link, {
|
|
74
|
-
href: inviteLink,
|
|
75
|
-
className: "text-[#8a8a8a] text-[10px] no-underline",
|
|
76
|
-
children: inviteLink
|
|
77
|
-
}),
|
|
78
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Hr, { className: "mx-0 my-[26px] w-full border border-[#eaeaea] border-solid" }),
|
|
79
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Text, {
|
|
80
|
-
className: "text-[#666666] text-[12px] leading-[24px]",
|
|
81
|
-
children: [
|
|
82
|
-
"This invitation was intended for",
|
|
83
|
-
" ",
|
|
84
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
85
|
-
className: "text-black",
|
|
86
|
-
children: username
|
|
87
|
-
}),
|
|
88
|
-
". This invite was sent from ",
|
|
89
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
90
|
-
className: "text-black",
|
|
91
|
-
children: inviteFromIp
|
|
92
|
-
}),
|
|
93
|
-
" ",
|
|
94
|
-
inviteFromLocation && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [" located in ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
95
|
-
className: "text-black",
|
|
96
|
-
children: inviteFromLocation
|
|
97
|
-
})] }),
|
|
98
|
-
". If you were not expecting this invitation, you can ignore this email. If you are concerned about your account's safety, please reply to this email to get in touch with us."
|
|
99
|
-
]
|
|
100
|
-
})
|
|
101
|
-
]
|
|
102
|
-
})
|
|
103
|
-
}) })
|
|
104
|
-
] });
|
|
105
|
-
};
|
|
106
|
-
const InviteUserEmailFR = ({ username, invitedByUsername, invitedByEmail, organizationName, inviteLink, inviteFromIp, inviteFromLocation }) => {
|
|
107
|
-
const previewText = `Rejoignez ${invitedByUsername} sur Intlayer`;
|
|
108
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Html, { children: [
|
|
109
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Head, {}),
|
|
110
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Preview, { children: previewText }),
|
|
111
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Tailwind, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Body, {
|
|
112
|
-
className: "m-auto px-2 font-sans",
|
|
113
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Container, {
|
|
114
|
-
className: "mx-auto my-[40px] max-w-[465px] rounded-xl border border-[#eaeaea] border-solid bg-white p-[20px]",
|
|
115
|
-
children: [
|
|
116
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Section, {
|
|
117
|
-
className: "mt-[32px]",
|
|
118
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Img, {
|
|
119
|
-
src: "https://intlayer.org/apple-touch-icon.png",
|
|
120
|
-
width: "40",
|
|
121
|
-
height: "37",
|
|
122
|
-
alt: "Intlayer",
|
|
123
|
-
className: "mx-auto my-0"
|
|
124
|
-
})
|
|
125
|
-
}),
|
|
126
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Heading, {
|
|
127
|
-
className: "mx-0 my-[30px] p-0 text-center font-normal text-[24px] text-black",
|
|
128
|
-
children: [
|
|
129
|
-
"Rejoignez ",
|
|
130
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: organizationName }),
|
|
131
|
-
" sur",
|
|
132
|
-
" ",
|
|
133
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: "Intlayer" })
|
|
134
|
-
]
|
|
135
|
-
}),
|
|
136
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Text, {
|
|
137
|
-
className: "text-[14px] text-black leading-[24px]",
|
|
138
|
-
children: [
|
|
139
|
-
"Bonjour ",
|
|
140
|
-
username,
|
|
141
|
-
","
|
|
142
|
-
]
|
|
143
|
-
}),
|
|
144
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Text, {
|
|
145
|
-
className: "text-[14px] text-black leading-[24px]",
|
|
146
|
-
children: [
|
|
147
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: invitedByUsername }),
|
|
148
|
-
" (",
|
|
149
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Link, {
|
|
150
|
-
href: `mailto:${invitedByEmail}`,
|
|
151
|
-
className: "text-[#8a8a8a] no-underline",
|
|
152
|
-
children: invitedByEmail
|
|
153
|
-
}),
|
|
154
|
-
") vous a invité à rejoindre l'équipe de",
|
|
155
|
-
" ",
|
|
156
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: organizationName }),
|
|
157
|
-
" sur ",
|
|
158
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: "Intlayer" }),
|
|
159
|
-
"."
|
|
160
|
-
]
|
|
161
|
-
}),
|
|
162
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Section, {
|
|
163
|
-
className: "my-[32px] text-center",
|
|
164
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Button, {
|
|
165
|
-
className: "rounded-md bg-[#000000] px-5 py-3 text-center font-semibold text-[12px] text-white no-underline",
|
|
166
|
-
href: inviteLink,
|
|
167
|
-
children: "Rejoindre l'équipe"
|
|
168
|
-
})
|
|
169
|
-
}),
|
|
170
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Text, {
|
|
171
|
-
className: "text-[14px] text-black leading-[24px]",
|
|
172
|
-
children: ["ou copiez et collez cette URL dans votre navigateur :", " "]
|
|
173
|
-
}),
|
|
174
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Link, {
|
|
175
|
-
href: inviteLink,
|
|
176
|
-
className: "text-[#8a8a8a] text-[10px] no-underline",
|
|
177
|
-
children: inviteLink
|
|
178
|
-
}),
|
|
179
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Hr, { className: "mx-0 my-[26px] w-full border border-[#eaeaea] border-solid" }),
|
|
180
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Text, {
|
|
181
|
-
className: "text-[#666666] text-[12px] leading-[24px]",
|
|
182
|
-
children: [
|
|
183
|
-
"Cette invitation était destinée à",
|
|
184
|
-
" ",
|
|
185
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
186
|
-
className: "text-black",
|
|
187
|
-
children: username
|
|
188
|
-
}),
|
|
189
|
-
". Cette invitation a été envoyée depuis",
|
|
190
|
-
" ",
|
|
191
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
192
|
-
className: "text-black",
|
|
193
|
-
children: inviteFromIp
|
|
194
|
-
}),
|
|
195
|
-
inviteFromLocation && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [", située à ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
196
|
-
className: "text-black",
|
|
197
|
-
children: inviteFromLocation
|
|
198
|
-
})] }),
|
|
199
|
-
". Si vous n'attendiez pas cette invitation, vous pouvez ignorer cet email. Si vous êtes préoccupé par la sécurité de votre compte, veuillez répondre à cet email pour nous contacter."
|
|
200
|
-
]
|
|
201
|
-
})
|
|
202
|
-
]
|
|
203
|
-
})
|
|
204
|
-
}) })
|
|
205
|
-
] });
|
|
206
|
-
};
|
|
207
|
-
const InviteUserEmailES = ({ username, invitedByUsername, invitedByEmail, organizationName, inviteLink, inviteFromIp, inviteFromLocation }) => {
|
|
208
|
-
const previewText = `Únete a ${invitedByUsername} en Intlayer`;
|
|
209
|
-
return /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Html, { children: [
|
|
210
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Head, {}),
|
|
211
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Preview, { children: previewText }),
|
|
212
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Tailwind, { children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Body, {
|
|
213
|
-
className: "m-auto px-2 font-sans",
|
|
214
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Container, {
|
|
215
|
-
className: "mx-auto my-[40px] max-w-[465px] rounded-xl border border-[#eaeaea] border-solid bg-white p-[20px]",
|
|
216
|
-
children: [
|
|
217
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Section, {
|
|
218
|
-
className: "mt-[32px]",
|
|
219
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Img, {
|
|
220
|
-
src: "https://intlayer.org/apple-touch-icon.png",
|
|
221
|
-
width: "40",
|
|
222
|
-
height: "37",
|
|
223
|
-
alt: "Intlayer",
|
|
224
|
-
className: "mx-auto my-0"
|
|
225
|
-
})
|
|
226
|
-
}),
|
|
227
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Heading, {
|
|
228
|
-
className: "mx-0 my-[30px] p-0 text-center font-normal text-[24px] text-black",
|
|
229
|
-
children: [
|
|
230
|
-
"Únete a ",
|
|
231
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: organizationName }),
|
|
232
|
-
" en",
|
|
233
|
-
" ",
|
|
234
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: "Intlayer" })
|
|
235
|
-
]
|
|
236
|
-
}),
|
|
237
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Text, {
|
|
238
|
-
className: "text-[14px] text-black leading-[24px]",
|
|
239
|
-
children: [
|
|
240
|
-
"Hola ",
|
|
241
|
-
username,
|
|
242
|
-
","
|
|
243
|
-
]
|
|
244
|
-
}),
|
|
245
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Text, {
|
|
246
|
-
className: "text-[14px] text-black leading-[24px]",
|
|
247
|
-
children: [
|
|
248
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: invitedByUsername }),
|
|
249
|
-
" (",
|
|
250
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Link, {
|
|
251
|
-
href: `mailto:${invitedByEmail}`,
|
|
252
|
-
className: "text-[#8a8a8a] no-underline",
|
|
253
|
-
children: invitedByEmail
|
|
254
|
-
}),
|
|
255
|
-
") te ha invitado a unirte al equipo de",
|
|
256
|
-
" ",
|
|
257
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: organizationName }),
|
|
258
|
-
" en ",
|
|
259
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("strong", { children: "Intlayer" }),
|
|
260
|
-
"."
|
|
261
|
-
]
|
|
262
|
-
}),
|
|
263
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Section, {
|
|
264
|
-
className: "my-[32px] text-center",
|
|
265
|
-
children: /* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Button, {
|
|
266
|
-
className: "rounded-md bg-[#000000] px-5 py-3 text-center font-semibold text-[12px] text-white no-underline",
|
|
267
|
-
href: inviteLink,
|
|
268
|
-
children: "Unirse al equipo"
|
|
269
|
-
})
|
|
270
|
-
}),
|
|
271
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Text, {
|
|
272
|
-
className: "text-[14px] text-black leading-[24px]",
|
|
273
|
-
children: ["o copia y pega esta URL en tu navegador:", " "]
|
|
274
|
-
}),
|
|
275
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Link, {
|
|
276
|
-
href: inviteLink,
|
|
277
|
-
className: "text-[#8a8a8a] text-[10px] no-underline",
|
|
278
|
-
children: inviteLink
|
|
279
|
-
}),
|
|
280
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)(__react_email_components.Hr, { className: "mx-0 my-[26px] w-full border border-[#eaeaea] border-solid" }),
|
|
281
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsxs)(__react_email_components.Text, {
|
|
282
|
-
className: "text-[#666666] text-[12px] leading-[24px]",
|
|
283
|
-
children: [
|
|
284
|
-
"Esta invitación estaba destinada para",
|
|
285
|
-
" ",
|
|
286
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
287
|
-
className: "text-black",
|
|
288
|
-
children: username
|
|
289
|
-
}),
|
|
290
|
-
". Esta invitación fue enviada desde",
|
|
291
|
-
" ",
|
|
292
|
-
/* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
293
|
-
className: "text-black",
|
|
294
|
-
children: inviteFromIp
|
|
295
|
-
}),
|
|
296
|
-
inviteFromLocation && /* @__PURE__ */ (0, react_jsx_runtime.jsxs)(react_jsx_runtime.Fragment, { children: [", ubicada en ", /* @__PURE__ */ (0, react_jsx_runtime.jsx)("span", {
|
|
297
|
-
className: "text-black",
|
|
298
|
-
children: inviteFromLocation
|
|
299
|
-
})] }),
|
|
300
|
-
". Si no esperabas esta invitación, puedes ignorar este correo. Si estás preocupado por la seguridad de tu cuenta, por favor responde a este correo para contactarte con nosotros."
|
|
301
|
-
]
|
|
302
|
-
})
|
|
303
|
-
]
|
|
304
|
-
})
|
|
305
|
-
}) })
|
|
306
|
-
] });
|
|
307
|
-
};
|
|
308
|
-
const PreviewProps = {
|
|
309
|
-
username: "alanturing",
|
|
310
|
-
invitedByUsername: "Alan",
|
|
311
|
-
invitedByEmail: "alan.turing@example.com",
|
|
312
|
-
organizationName: "Enigma",
|
|
313
|
-
inviteLink: "https://intlayer.org/teams/invite/foo",
|
|
314
|
-
inviteFromIp: "204.13.x.x",
|
|
315
|
-
inviteFromLocation: "São Paulo, Brazil"
|
|
316
|
-
};
|
|
317
|
-
InviteUserEmailEN.PreviewProps = PreviewProps;
|
|
318
|
-
InviteUserEmailFR.PreviewProps = PreviewProps;
|
|
319
|
-
InviteUserEmailES.PreviewProps = PreviewProps;
|
|
320
|
-
|
|
321
|
-
//#endregion
|
|
322
|
-
exports.InviteUserEmailEN = InviteUserEmailEN;
|
|
323
|
-
exports.InviteUserEmailES = InviteUserEmailES;
|
|
324
|
-
exports.InviteUserEmailFR = InviteUserEmailFR;
|
|
325
|
-
//# sourceMappingURL=InviteUserEmail.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"InviteUserEmail.cjs","names":["Html","Head","Preview","Tailwind","Body","Container","Section","Img","Heading","Text","Link","Button","Hr","PreviewProps: InviteUserEmailProps"],"sources":["../../../src/emails/InviteUserEmail.tsx"],"sourcesContent":["import {\n Body,\n Button,\n Container,\n Head,\n Heading,\n Hr,\n Html,\n Img,\n Link,\n Preview,\n Section,\n Tailwind,\n Text,\n} from '@react-email/components';\n\nexport type InviteUserEmailProps = {\n username: string;\n invitedByUsername: string;\n invitedByEmail: string;\n organizationName: string;\n inviteLink: string;\n inviteFromIp: string;\n inviteFromLocation: string;\n};\n\nexport const InviteUserEmailEN = ({\n username,\n invitedByUsername,\n invitedByEmail,\n organizationName,\n inviteLink,\n inviteFromIp,\n inviteFromLocation,\n}: InviteUserEmailProps) => {\n const previewText = `Join ${invitedByUsername} on Intlayer`;\n\n return (\n <Html>\n <Head />\n <Preview>{previewText}</Preview>\n <Tailwind>\n <Body className=\"m-auto px-2 font-sans\">\n <Container className=\"mx-auto my-[40px] max-w-[465px] rounded-xl border border-[#eaeaea] border-solid bg-white p-[20px]\">\n <Section className=\"mt-[32px]\">\n <Img\n src=\"https://intlayer.org/apple-touch-icon.png\"\n width=\"40\"\n height=\"37\"\n alt=\"Intlayer\"\n className=\"mx-auto my-0\"\n />\n </Section>\n <Heading className=\"mx-0 my-[30px] p-0 text-center font-normal text-[24px] text-black\">\n Join <strong>{organizationName}</strong> on{' '}\n <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Hello {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n <strong>{invitedByUsername}</strong> (\n <Link\n href={`mailto:${invitedByEmail}`}\n className=\"text-[#8a8a8a] no-underline\"\n >\n {invitedByEmail}\n </Link>\n ) has invited you to the <strong>{organizationName}</strong> team\n on <strong>Intlayer</strong>.\n </Text>\n\n <Section className=\"my-[32px] text-center\">\n <Button\n className=\"rounded-md bg-[#000000] px-5 py-3 text-center font-semibold text-[12px] text-white no-underline\"\n href={inviteLink}\n >\n Join the team\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n or copy and paste this URL into your browser:\n </Text>\n <Link\n href={inviteLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {inviteLink}\n </Link>\n <Hr className=\"mx-0 my-[26px] w-full border border-[#eaeaea] border-solid\" />\n <Text className=\"text-[#666666] text-[12px] leading-[24px]\">\n This invitation was intended for{' '}\n <span className=\"text-black\">{username}</span>. This invite was\n sent from <span className=\"text-black\">{inviteFromIp}</span>{' '}\n {inviteFromLocation && (\n <>\n {' located in '}\n <span className=\"text-black\">{inviteFromLocation}</span>\n </>\n )}\n . If you were not expecting this invitation, you can ignore this\n email. If you are concerned about your account's safety, please\n reply to this email to get in touch with us.\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const InviteUserEmailFR = ({\n username,\n invitedByUsername,\n invitedByEmail,\n organizationName,\n inviteLink,\n inviteFromIp,\n inviteFromLocation,\n}: InviteUserEmailProps) => {\n const previewText = `Rejoignez ${invitedByUsername} sur Intlayer`;\n\n return (\n <Html>\n <Head />\n <Preview>{previewText}</Preview>\n <Tailwind>\n <Body className=\"m-auto px-2 font-sans\">\n <Container className=\"mx-auto my-[40px] max-w-[465px] rounded-xl border border-[#eaeaea] border-solid bg-white p-[20px]\">\n <Section className=\"mt-[32px]\">\n <Img\n src=\"https://intlayer.org/apple-touch-icon.png\"\n width=\"40\"\n height=\"37\"\n alt=\"Intlayer\"\n className=\"mx-auto my-0\"\n />\n </Section>\n <Heading className=\"mx-0 my-[30px] p-0 text-center font-normal text-[24px] text-black\">\n Rejoignez <strong>{organizationName}</strong> sur{' '}\n <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Bonjour {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n <strong>{invitedByUsername}</strong> (\n <Link\n href={`mailto:${invitedByEmail}`}\n className=\"text-[#8a8a8a] no-underline\"\n >\n {invitedByEmail}\n </Link>\n ) vous a invité à rejoindre l'équipe de{' '}\n <strong>{organizationName}</strong> sur <strong>Intlayer</strong>.\n </Text>\n <Section className=\"my-[32px] text-center\">\n <Button\n className=\"rounded-md bg-[#000000] px-5 py-3 text-center font-semibold text-[12px] text-white no-underline\"\n href={inviteLink}\n >\n Rejoindre l'équipe\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n ou copiez et collez cette URL dans votre navigateur :{' '}\n </Text>\n <Link\n href={inviteLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {inviteLink}\n </Link>\n <Hr className=\"mx-0 my-[26px] w-full border border-[#eaeaea] border-solid\" />\n <Text className=\"text-[#666666] text-[12px] leading-[24px]\">\n Cette invitation était destinée à{' '}\n <span className=\"text-black\">{username}</span>. Cette invitation a\n été envoyée depuis{' '}\n <span className=\"text-black\">{inviteFromIp}</span>\n {inviteFromLocation && (\n <>\n {', située à '}\n <span className=\"text-black\">{inviteFromLocation}</span>\n </>\n )}\n . Si vous n'attendiez pas cette invitation, vous pouvez ignorer\n cet email. Si vous êtes préoccupé par la sécurité de votre compte,\n veuillez répondre à cet email pour nous contacter.\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const InviteUserEmailES = ({\n username,\n invitedByUsername,\n invitedByEmail,\n organizationName,\n inviteLink,\n inviteFromIp,\n inviteFromLocation,\n}: InviteUserEmailProps) => {\n const previewText = `Únete a ${invitedByUsername} en Intlayer`;\n\n return (\n <Html>\n <Head />\n <Preview>{previewText}</Preview>\n <Tailwind>\n <Body className=\"m-auto px-2 font-sans\">\n <Container className=\"mx-auto my-[40px] max-w-[465px] rounded-xl border border-[#eaeaea] border-solid bg-white p-[20px]\">\n <Section className=\"mt-[32px]\">\n <Img\n src=\"https://intlayer.org/apple-touch-icon.png\"\n width=\"40\"\n height=\"37\"\n alt=\"Intlayer\"\n className=\"mx-auto my-0\"\n />\n </Section>\n <Heading className=\"mx-0 my-[30px] p-0 text-center font-normal text-[24px] text-black\">\n Únete a <strong>{organizationName}</strong> en{' '}\n <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Hola {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n <strong>{invitedByUsername}</strong> (\n <Link\n href={`mailto:${invitedByEmail}`}\n className=\"text-[#8a8a8a] no-underline\"\n >\n {invitedByEmail}\n </Link>\n ) te ha invitado a unirte al equipo de{' '}\n <strong>{organizationName}</strong> en <strong>Intlayer</strong>.\n </Text>\n <Section className=\"my-[32px] text-center\">\n <Button\n className=\"rounded-md bg-[#000000] px-5 py-3 text-center font-semibold text-[12px] text-white no-underline\"\n href={inviteLink}\n >\n Unirse al equipo\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n o copia y pega esta URL en tu navegador:{' '}\n </Text>\n <Link\n href={inviteLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {inviteLink}\n </Link>\n <Hr className=\"mx-0 my-[26px] w-full border border-[#eaeaea] border-solid\" />\n <Text className=\"text-[#666666] text-[12px] leading-[24px]\">\n Esta invitación estaba destinada para{' '}\n <span className=\"text-black\">{username}</span>. Esta invitación\n fue enviada desde{' '}\n <span className=\"text-black\">{inviteFromIp}</span>\n {inviteFromLocation && (\n <>\n {', ubicada en '}\n <span className=\"text-black\">{inviteFromLocation}</span>\n </>\n )}\n . Si no esperabas esta invitación, puedes ignorar este correo. Si\n estás preocupado por la seguridad de tu cuenta, por favor responde\n a este correo para contactarte con nosotros.\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nconst PreviewProps: InviteUserEmailProps = {\n username: 'alanturing',\n invitedByUsername: 'Alan',\n invitedByEmail: 'alan.turing@example.com',\n organizationName: 'Enigma',\n inviteLink: 'https://intlayer.org/teams/invite/foo',\n inviteFromIp: '204.13.x.x',\n inviteFromLocation: 'São Paulo, Brazil',\n};\n\nInviteUserEmailEN.PreviewProps = PreviewProps;\nInviteUserEmailFR.PreviewProps = PreviewProps;\nInviteUserEmailES.PreviewProps = PreviewProps;\n"],"mappings":";;;;;AA0BA,MAAa,qBAAqB,EAChC,UACA,mBACA,gBACA,kBACA,YACA,cACA,yBAC0B;CAC1B,MAAM,cAAc,QAAQ,kBAAkB;AAE9C,QACE,4CAACA;EACC,2CAACC,kCAAO;EACR,2CAACC,8CAAS,cAAsB;EAChC,2CAACC,+CACC,2CAACC;GAAK,WAAU;aACd,4CAACC;IAAU,WAAU;;KACnB,2CAACC;MAAQ,WAAU;gBACjB,2CAACC;OACC,KAAI;OACJ,OAAM;OACN,QAAO;OACP,KAAI;OACJ,WAAU;QACV;OACM;KACV,4CAACC;MAAQ,WAAU;;OAAoE;OAChF,2CAAC,sBAAQ,mBAA0B;;OAAI;OAC5C,2CAAC,sBAAO,aAAiB;;OACjB;KACV,4CAACC;MAAK,WAAU;;OAAwC;OAC/C;OAAS;;OACX;KACP,4CAACA;MAAK,WAAU;;OACd,2CAAC,sBAAQ,oBAA2B;;OACpC,2CAACC;QACC,MAAM,UAAU;QAChB,WAAU;kBAET;SACI;;OACkB,2CAAC,sBAAQ,mBAA0B;;OACzD,2CAAC,sBAAO,aAAiB;;;OACvB;KAEP,2CAACJ;MAAQ,WAAU;gBACjB,2CAACK;OACC,WAAU;OACV,MAAM;iBACP;QAEQ;OACD;KACV,2CAACF;MAAK,WAAU;gBAAwC;OAEjD;KACP,2CAACC;MACC,MAAM;MACN,WAAU;gBAET;OACI;KACP,2CAACE,+BAAG,WAAU,+DAA+D;KAC7E,4CAACH;MAAK,WAAU;;OAA4C;OACzB;OACjC,2CAAC;QAAK,WAAU;kBAAc;SAAgB;;OACpC,2CAAC;QAAK,WAAU;kBAAc;SAAoB;OAAC;OAC5D,sBACC,qFACG,gBACD,2CAAC;QAAK,WAAU;kBAAc;SAA0B,IACvD;OACH;;OAIG;;KACG;IACP,GACE;KACN;;AAIX,MAAa,qBAAqB,EAChC,UACA,mBACA,gBACA,kBACA,YACA,cACA,yBAC0B;CAC1B,MAAM,cAAc,aAAa,kBAAkB;AAEnD,QACE,4CAACT;EACC,2CAACC,kCAAO;EACR,2CAACC,8CAAS,cAAsB;EAChC,2CAACC,+CACC,2CAACC;GAAK,WAAU;aACd,4CAACC;IAAU,WAAU;;KACnB,2CAACC;MAAQ,WAAU;gBACjB,2CAACC;OACC,KAAI;OACJ,OAAM;OACN,QAAO;OACP,KAAI;OACJ,WAAU;QACV;OACM;KACV,4CAACC;MAAQ,WAAU;;OAAoE;OAC3E,2CAAC,sBAAQ,mBAA0B;;OAAK;OAClD,2CAAC,sBAAO,aAAiB;;OACjB;KACV,4CAACC;MAAK,WAAU;;OAAwC;OAC7C;OAAS;;OACb;KACP,4CAACA;MAAK,WAAU;;OACd,2CAAC,sBAAQ,oBAA2B;;OACpC,2CAACC;QACC,MAAM,UAAU;QAChB,WAAU;kBAET;SACI;;OACiC;OACxC,2CAAC,sBAAQ,mBAA0B;;OAAK,2CAAC,sBAAO,aAAiB;;;OAC5D;KACP,2CAACJ;MAAQ,WAAU;gBACjB,2CAACK;OACC,WAAU;OACV,MAAM;iBACP;QAEQ;OACD;KACV,4CAACF;MAAK,WAAU;iBAAwC,yDACA;OACjD;KACP,2CAACC;MACC,MAAM;MACN,WAAU;gBAET;OACI;KACP,2CAACE,+BAAG,WAAU,+DAA+D;KAC7E,4CAACH;MAAK,WAAU;;OAA4C;OACxB;OAClC,2CAAC;QAAK,WAAU;kBAAc;SAAgB;;OAC3B;OACnB,2CAAC;QAAK,WAAU;kBAAc;SAAoB;OACjD,sBACC,qFACG,eACD,2CAAC;QAAK,WAAU;kBAAc;SAA0B,IACvD;OACH;;OAIG;;KACG;IACP,GACE;KACN;;AAIX,MAAa,qBAAqB,EAChC,UACA,mBACA,gBACA,kBACA,YACA,cACA,yBAC0B;CAC1B,MAAM,cAAc,WAAW,kBAAkB;AAEjD,QACE,4CAACT;EACC,2CAACC,kCAAO;EACR,2CAACC,8CAAS,cAAsB;EAChC,2CAACC,+CACC,2CAACC;GAAK,WAAU;aACd,4CAACC;IAAU,WAAU;;KACnB,2CAACC;MAAQ,WAAU;gBACjB,2CAACC;OACC,KAAI;OACJ,OAAM;OACN,QAAO;OACP,KAAI;OACJ,WAAU;QACV;OACM;KACV,4CAACC;MAAQ,WAAU;;OAAoE;OAC7E,2CAAC,sBAAQ,mBAA0B;;OAAI;OAC/C,2CAAC,sBAAO,aAAiB;;OACjB;KACV,4CAACC;MAAK,WAAU;;OAAwC;OAChD;OAAS;;OACV;KACP,4CAACA;MAAK,WAAU;;OACd,2CAAC,sBAAQ,oBAA2B;;OACpC,2CAACC;QACC,MAAM,UAAU;QAChB,WAAU;kBAET;SACI;;OACgC;OACvC,2CAAC,sBAAQ,mBAA0B;;OAAI,2CAAC,sBAAO,aAAiB;;;OAC3D;KACP,2CAACJ;MAAQ,WAAU;gBACjB,2CAACK;OACC,WAAU;OACV,MAAM;iBACP;QAEQ;OACD;KACV,4CAACF;MAAK,WAAU;iBAAwC,4CACb;OACpC;KACP,2CAACC;MACC,MAAM;MACN,WAAU;gBAET;OACI;KACP,2CAACE,+BAAG,WAAU,+DAA+D;KAC7E,4CAACH;MAAK,WAAU;;OAA4C;OACpB;OACtC,2CAAC;QAAK,WAAU;kBAAc;SAAgB;;OAC5B;OAClB,2CAAC;QAAK,WAAU;kBAAc;SAAoB;OACjD,sBACC,qFACG,iBACD,2CAAC;QAAK,WAAU;kBAAc;SAA0B,IACvD;OACH;;OAIG;;KACG;IACP,GACE;KACN;;AAIX,MAAMI,eAAqC;CACzC,UAAU;CACV,mBAAmB;CACnB,gBAAgB;CAChB,kBAAkB;CAClB,YAAY;CACZ,cAAc;CACd,oBAAoB;CACrB;AAED,kBAAkB,eAAe;AACjC,kBAAkB,eAAe;AACjC,kBAAkB,eAAe"}
|