@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 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateDictionary.cjs","names":["defaultFieldsToCheck: DictionaryFields","errors: ValidationErrors","findProjects","projectsErrors: string[]","validateArray","projectErrors: string[]","value"],"sources":["../../../../src/utils/validation/validateDictionary.ts"],"sourcesContent":["import { findProjects } from '@services/project.service';\nimport type { Dictionary } from '@/types/dictionary.types';\nimport { validateArray } from './validateArray';\n\nexport type DictionaryFields = (keyof Dictionary)[];\n\nconst defaultFieldsToCheck: DictionaryFields = ['projectIds'];\n\ntype FieldsToCheck = (typeof defaultFieldsToCheck)[number];\ntype ValidationErrors = Partial<\n Record<(typeof defaultFieldsToCheck)[number], string[]>\n>;\n\n/**\n * Validates an dictionary object.\n * @param dictionary The dictionary object to validate.\n * @returns An object containing the validation errors for each field.\n */\nexport const validateDictionary = async (\n dictionary: Partial<Dictionary>,\n fieldsToCheck = defaultFieldsToCheck\n): Promise<ValidationErrors> => {\n const errors: ValidationErrors = {};\n\n // Define the fields to validate\n const fieldsToValidate = new Set<FieldsToCheck>(fieldsToCheck);\n\n const dictionaryJSON = JSON.parse(JSON.stringify(dictionary));\n\n const projects = await findProjects({\n _id: dictionary.projectIds as unknown as string[],\n });\n\n // Validate each field\n for (const field of fieldsToValidate) {\n const value = dictionaryJSON[field];\n\n // Initialize error array for the field\n errors[field] = [];\n\n if (field === 'projectIds') {\n const projectsErrors: string[] = validateArray<string>(\n value as unknown as string[],\n 'Project',\n 'string',\n (value) => {\n const projectErrors: string[] = [];\n\n if (typeof value !== 'string') {\n projectErrors.push('Project id must be a string');\n }\n\n if (!value) {\n projectErrors.push('Project id is required');\n }\n\n if (!projects) {\n projectErrors.push('Project not found');\n }\n\n return projectsErrors;\n }\n );\n }\n\n // Remove the error field if there are no errors\n if (errors[field].length === 0) {\n delete errors[field];\n }\n }\n\n return errors;\n};\n"],"mappings":";;;;AAMA,MAAMA,uBAAyC,CAAC,aAAa;;;;;;AAY7D,MAAa,qBAAqB,OAChC,YACA,gBAAgB,yBACc;CAC9B,MAAMC,SAA2B,EAAE;CAGnC,MAAM,mBAAmB,IAAI,IAAmB,cAAc;CAE9D,MAAM,iBAAiB,KAAK,MAAM,KAAK,UAAU,WAAW,CAAC;CAE7D,MAAM,WAAW,MAAMC,8CAAa,EAClC,KAAK,WAAW,YACjB,CAAC;AAGF,MAAK,MAAM,SAAS,kBAAkB;EACpC,MAAM,QAAQ,eAAe;AAG7B,SAAO,SAAS,EAAE;AAElB,MAAI,UAAU,cAAc;GAC1B,MAAMC,iBAA2BC,qDAC/B,OACA,WACA,WACC,YAAU;IACT,MAAMC,gBAA0B,EAAE;AAElC,QAAI,OAAOC,YAAU,SACnB,eAAc,KAAK,8BAA8B;AAGnD,QAAI,CAACA,QACH,eAAc,KAAK,yBAAyB;AAG9C,QAAI,CAAC,SACH,eAAc,KAAK,oBAAoB;AAGzC,WAAO;KAEV;;AAIH,MAAI,OAAO,OAAO,WAAW,EAC3B,QAAO,OAAO;;AAIlB,QAAO"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
const require_utils_validation_validateString = require('./validateString.cjs');
|
|
2
|
-
|
|
3
|
-
//#region src/utils/validation/validateEmail.ts
|
|
4
|
-
/**
|
|
5
|
-
* Validates a email field.
|
|
6
|
-
* @param value The value to validate.
|
|
7
|
-
* @param entityName The name of the entity being validated.
|
|
8
|
-
* @param minLength The minimum length of the string.
|
|
9
|
-
* @param maxLength The maximum length of the string.
|
|
10
|
-
* @returns An array of validation errors.
|
|
11
|
-
*/
|
|
12
|
-
const validateEmail = (value, entityName = "Email", minLength = 6, maxLength = 100) => {
|
|
13
|
-
const errors = require_utils_validation_validateString.validateString(value, entityName, minLength, maxLength);
|
|
14
|
-
if (typeof value === "string" && !/^[^\s@]+@[^\s@][^\s.@]*\.[^\s@]+$/.test(value)) errors.push(`${entityName} must be a valid email address.`);
|
|
15
|
-
return errors;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
//#endregion
|
|
19
|
-
exports.validateEmail = validateEmail;
|
|
20
|
-
//# sourceMappingURL=validateEmail.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateEmail.cjs","names":["validateString"],"sources":["../../../../src/utils/validation/validateEmail.ts"],"sourcesContent":["import { validateString } from './validateString';\n\n/**\n * Validates a email field.\n * @param value The value to validate.\n * @param entityName The name of the entity being validated.\n * @param minLength The minimum length of the string.\n * @param maxLength The maximum length of the string.\n * @returns An array of validation errors.\n */\nexport const validateEmail = (\n value: unknown,\n entityName = 'Email',\n minLength = 6,\n maxLength = 100\n): string[] => {\n const errors = validateString(value, entityName, minLength, maxLength);\n\n const emailRegex = /^[^\\s@]+@[^\\s@][^\\s.@]*\\.[^\\s@]+$/;\n\n if (typeof value === 'string' && !emailRegex.test(value)) {\n errors.push(`${entityName} must be a valid email address.`);\n }\n\n return errors;\n};\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,iBACX,OACA,aAAa,SACb,YAAY,GACZ,YAAY,QACC;CACb,MAAM,SAASA,uDAAe,OAAO,YAAY,WAAW,UAAU;AAItE,KAAI,OAAO,UAAU,YAAY,CAFd,oCAE0B,KAAK,MAAM,CACtD,QAAO,KAAK,GAAG,WAAW,iCAAiC;AAG7D,QAAO"}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
const require_utils_validation_validateArray = require('./validateArray.cjs');
|
|
2
|
-
const require_utils_validation_validateString = require('./validateString.cjs');
|
|
3
|
-
|
|
4
|
-
//#region src/utils/validation/validateOrganization.ts
|
|
5
|
-
const defaultFieldsToCheck = [
|
|
6
|
-
"name",
|
|
7
|
-
"membersIds",
|
|
8
|
-
"adminsIds"
|
|
9
|
-
];
|
|
10
|
-
const NAME_MIN_LENGTH = 4;
|
|
11
|
-
const NAME_MAX_LENGTH = 100;
|
|
12
|
-
const MEMBERS_MIN_LENGTH = 1;
|
|
13
|
-
/**
|
|
14
|
-
* Validates an organization object.
|
|
15
|
-
* @param organization The organization object to validate.
|
|
16
|
-
* @returns An object containing the validation errors for each field.
|
|
17
|
-
*/
|
|
18
|
-
const validateOrganization = (organization, fieldsToCheck = defaultFieldsToCheck) => {
|
|
19
|
-
const errors = {};
|
|
20
|
-
const organizationObject = JSON.parse(JSON.stringify(organization));
|
|
21
|
-
const fieldsToValidate = new Set(fieldsToCheck);
|
|
22
|
-
for (const field of fieldsToValidate) {
|
|
23
|
-
const value = organizationObject[field];
|
|
24
|
-
errors[field] = [];
|
|
25
|
-
if (field === "name") {
|
|
26
|
-
const nameErrors = require_utils_validation_validateString.validateString(value, "Name", NAME_MIN_LENGTH, NAME_MAX_LENGTH);
|
|
27
|
-
if (nameErrors.length > 0) errors[field] = nameErrors;
|
|
28
|
-
}
|
|
29
|
-
if (field === "membersIds" || field === "adminsIds") {
|
|
30
|
-
const membersErrors = require_utils_validation_validateArray.validateArray(value, "Members", "string", void 0, MEMBERS_MIN_LENGTH);
|
|
31
|
-
if (membersErrors.length > 0) errors[field] = membersErrors;
|
|
32
|
-
}
|
|
33
|
-
if (errors[field].length === 0) delete errors[field];
|
|
34
|
-
}
|
|
35
|
-
return errors;
|
|
36
|
-
};
|
|
37
|
-
|
|
38
|
-
//#endregion
|
|
39
|
-
exports.MEMBERS_MIN_LENGTH = MEMBERS_MIN_LENGTH;
|
|
40
|
-
exports.NAME_MAX_LENGTH = NAME_MAX_LENGTH;
|
|
41
|
-
exports.NAME_MIN_LENGTH = NAME_MIN_LENGTH;
|
|
42
|
-
exports.validateOrganization = validateOrganization;
|
|
43
|
-
//# sourceMappingURL=validateOrganization.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateOrganization.cjs","names":["defaultFieldsToCheck: OrganizationFields","errors: ValidationErrors","validateString","validateArray"],"sources":["../../../../src/utils/validation/validateOrganization.ts"],"sourcesContent":["import type { Organization, OrganizationAPI } from '@/types/organization.types';\nimport { validateArray } from './validateArray';\nimport { validateString } from './validateString';\n\nexport type OrganizationFields = (keyof Organization)[];\n\nconst defaultFieldsToCheck: OrganizationFields = [\n 'name',\n 'membersIds',\n 'adminsIds',\n];\n\ntype FieldsToCheck = (typeof defaultFieldsToCheck)[number];\ntype ValidationErrors = Partial<\n Record<(typeof defaultFieldsToCheck)[number], string[]>\n>;\n\nexport const NAME_MIN_LENGTH = 4;\nexport const NAME_MAX_LENGTH = 100;\n\nexport const MEMBERS_MIN_LENGTH = 1;\n\n/**\n * Validates an organization object.\n * @param organization The organization object to validate.\n * @returns An object containing the validation errors for each field.\n */\nexport const validateOrganization = (\n organization: Partial<Organization | OrganizationAPI>,\n fieldsToCheck = defaultFieldsToCheck\n): ValidationErrors => {\n const errors: ValidationErrors = {};\n\n const organizationObject = JSON.parse(JSON.stringify(organization));\n\n // Define the fields to validate\n const fieldsToValidate = new Set<FieldsToCheck>(fieldsToCheck);\n\n // Validate each field\n for (const field of fieldsToValidate) {\n const value = organizationObject[field];\n\n // Initialize error array for the field\n errors[field] = [];\n\n // Check for name validity\n if (field === 'name') {\n const nameErrors = validateString(\n value,\n 'Name',\n NAME_MIN_LENGTH,\n NAME_MAX_LENGTH\n );\n\n if (nameErrors.length > 0) {\n errors[field] = nameErrors;\n }\n }\n\n if (field === 'membersIds' || field === 'adminsIds') {\n const membersErrors = validateArray<string>(\n value as unknown as string[],\n 'Members',\n 'string',\n undefined,\n MEMBERS_MIN_LENGTH\n );\n\n if (membersErrors.length > 0) {\n errors[field] = membersErrors;\n }\n }\n\n // Remove the error field if there are no errors\n if (errors[field].length === 0) {\n delete errors[field];\n }\n }\n\n return errors;\n};\n"],"mappings":";;;;AAMA,MAAMA,uBAA2C;CAC/C;CACA;CACA;CACD;AAOD,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;AAE/B,MAAa,qBAAqB;;;;;;AAOlC,MAAa,wBACX,cACA,gBAAgB,yBACK;CACrB,MAAMC,SAA2B,EAAE;CAEnC,MAAM,qBAAqB,KAAK,MAAM,KAAK,UAAU,aAAa,CAAC;CAGnE,MAAM,mBAAmB,IAAI,IAAmB,cAAc;AAG9D,MAAK,MAAM,SAAS,kBAAkB;EACpC,MAAM,QAAQ,mBAAmB;AAGjC,SAAO,SAAS,EAAE;AAGlB,MAAI,UAAU,QAAQ;GACpB,MAAM,aAAaC,uDACjB,OACA,QACA,iBACA,gBACD;AAED,OAAI,WAAW,SAAS,EACtB,QAAO,SAAS;;AAIpB,MAAI,UAAU,gBAAgB,UAAU,aAAa;GACnD,MAAM,gBAAgBC,qDACpB,OACA,WACA,UACA,QACA,mBACD;AAED,OAAI,cAAc,SAAS,EACzB,QAAO,SAAS;;AAKpB,MAAI,OAAO,OAAO,WAAW,EAC3B,QAAO,OAAO;;AAIlB,QAAO"}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
const require_utils_validation_validateString = require('./validateString.cjs');
|
|
2
|
-
|
|
3
|
-
//#region src/utils/validation/validatePhone.ts
|
|
4
|
-
/**
|
|
5
|
-
* Validates a email field.
|
|
6
|
-
* @param value The value to validate.
|
|
7
|
-
* @param entityName The name of the entity being validated.
|
|
8
|
-
* @param minLength The minimum length of the string.
|
|
9
|
-
* @param maxLength The maximum length of the string.
|
|
10
|
-
* @returns An array of validation errors.
|
|
11
|
-
*/
|
|
12
|
-
const validatePhone = (value, entityName = "Phone", minLength = 6, maxLength = 20) => {
|
|
13
|
-
const errors = require_utils_validation_validateString.validateString(value, entityName, minLength, maxLength);
|
|
14
|
-
if (typeof value === "string" && !/^\+?\(?\d{3}\)?[-\s.]?\d{3}[-\s.]?\d{4,6}$/.test(value)) errors.push(`${entityName} must be a valid phone number.`);
|
|
15
|
-
return errors;
|
|
16
|
-
};
|
|
17
|
-
|
|
18
|
-
//#endregion
|
|
19
|
-
exports.validatePhone = validatePhone;
|
|
20
|
-
//# sourceMappingURL=validatePhone.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validatePhone.cjs","names":["validateString"],"sources":["../../../../src/utils/validation/validatePhone.ts"],"sourcesContent":["import { validateString } from './validateString';\n\n/**\n * Validates a email field.\n * @param value The value to validate.\n * @param entityName The name of the entity being validated.\n * @param minLength The minimum length of the string.\n * @param maxLength The maximum length of the string.\n * @returns An array of validation errors.\n */\nexport const validatePhone = (\n value: unknown,\n entityName = 'Phone',\n minLength = 6,\n maxLength = 20\n): string[] => {\n const errors = validateString(value, entityName, minLength, maxLength);\n\n const phoneRegex = /^\\+?\\(?\\d{3}\\)?[-\\s.]?\\d{3}[-\\s.]?\\d{4,6}$/;\n\n if (typeof value === 'string' && !phoneRegex.test(value)) {\n errors.push(`${entityName} must be a valid phone number.`);\n }\n\n return errors;\n};\n"],"mappings":";;;;;;;;;;;AAUA,MAAa,iBACX,OACA,aAAa,SACb,YAAY,GACZ,YAAY,OACC;CACb,MAAM,SAASA,uDAAe,OAAO,YAAY,WAAW,UAAU;AAItE,KAAI,OAAO,UAAU,YAAY,CAFd,6CAE0B,KAAK,MAAM,CACtD,QAAO,KAAK,GAAG,WAAW,gCAAgC;AAG5D,QAAO"}
|
|
@@ -1,55 +0,0 @@
|
|
|
1
|
-
const require_utils_validation_validateArray = require('./validateArray.cjs');
|
|
2
|
-
const require_utils_validation_validateString = require('./validateString.cjs');
|
|
3
|
-
const require_services_organization_service = require('../../services/organization.service.cjs');
|
|
4
|
-
|
|
5
|
-
//#region src/utils/validation/validateProject.ts
|
|
6
|
-
const defaultFieldsToCheck = [
|
|
7
|
-
"name",
|
|
8
|
-
"membersIds",
|
|
9
|
-
"adminsIds",
|
|
10
|
-
"organizationId"
|
|
11
|
-
];
|
|
12
|
-
const NAME_MIN_LENGTH = 4;
|
|
13
|
-
const NAME_MAX_LENGTH = 100;
|
|
14
|
-
const MEMBERS_MIN_LENGTH = 1;
|
|
15
|
-
/**
|
|
16
|
-
* Validates an project object.
|
|
17
|
-
* @param project The project object to validate.
|
|
18
|
-
* @returns An object containing the validation errors for each field.
|
|
19
|
-
*/
|
|
20
|
-
const validateProject = async (project, fieldsToCheck = defaultFieldsToCheck) => {
|
|
21
|
-
const errors = {};
|
|
22
|
-
const fieldsToValidate = new Set(fieldsToCheck);
|
|
23
|
-
const projectJson = JSON.parse(JSON.stringify(project));
|
|
24
|
-
for (const field of fieldsToValidate) {
|
|
25
|
-
const value = projectJson[field];
|
|
26
|
-
errors[field] = [];
|
|
27
|
-
if (field === "name") {
|
|
28
|
-
const nameErrors = require_utils_validation_validateString.validateString(value, "Name", NAME_MIN_LENGTH, NAME_MAX_LENGTH);
|
|
29
|
-
if (nameErrors.length > 0) errors[field] = nameErrors;
|
|
30
|
-
}
|
|
31
|
-
if (field === "organizationId") {
|
|
32
|
-
const organization = await require_services_organization_service.getOrganizationById(field);
|
|
33
|
-
const organizationErrors = [];
|
|
34
|
-
if (typeof value !== "string") organizationErrors.push("Organization id must be a string");
|
|
35
|
-
if (!value) organizationErrors.push("Organization id is required");
|
|
36
|
-
if (!organization) organizationErrors.push("Organization not found");
|
|
37
|
-
if (organizationErrors.length > 0) errors[field] = organizationErrors;
|
|
38
|
-
}
|
|
39
|
-
if (field === "membersIds" || field === "adminsIds") if (!project.organizationId) errors[field] = ["Organization id is required to validate project members"];
|
|
40
|
-
else {
|
|
41
|
-
const organization = await require_services_organization_service.getOrganizationById(project.organizationId);
|
|
42
|
-
const membersErrors = require_utils_validation_validateArray.validateArray(value, "Members", "string", (item) => (organization?.membersIds).includes(item), MEMBERS_MIN_LENGTH);
|
|
43
|
-
if (membersErrors.length > 0) errors[field] = membersErrors;
|
|
44
|
-
}
|
|
45
|
-
if (errors[field].length === 0) delete errors[field];
|
|
46
|
-
}
|
|
47
|
-
return errors;
|
|
48
|
-
};
|
|
49
|
-
|
|
50
|
-
//#endregion
|
|
51
|
-
exports.MEMBERS_MIN_LENGTH = MEMBERS_MIN_LENGTH;
|
|
52
|
-
exports.NAME_MAX_LENGTH = NAME_MAX_LENGTH;
|
|
53
|
-
exports.NAME_MIN_LENGTH = NAME_MIN_LENGTH;
|
|
54
|
-
exports.validateProject = validateProject;
|
|
55
|
-
//# sourceMappingURL=validateProject.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateProject.cjs","names":["defaultFieldsToCheck: ProjectFields","errors: ValidationErrors","validateString","getOrganizationById","organizationErrors: string[]","validateArray"],"sources":["../../../../src/utils/validation/validateProject.ts"],"sourcesContent":["import { getOrganizationById } from '@services/organization.service';\nimport type { Project, ProjectAPI } from '@/types/project.types';\nimport { validateArray } from './validateArray';\nimport { validateString } from './validateString';\n\nexport type ProjectFields = (keyof Project)[];\n\nconst defaultFieldsToCheck: ProjectFields = [\n 'name',\n 'membersIds',\n 'adminsIds',\n 'organizationId',\n];\n\ntype FieldsToCheck = (typeof defaultFieldsToCheck)[number];\ntype ValidationErrors = Partial<\n Record<(typeof defaultFieldsToCheck)[number], string[]>\n>;\n\nexport const NAME_MIN_LENGTH = 4;\nexport const NAME_MAX_LENGTH = 100;\n\nexport const MEMBERS_MIN_LENGTH = 1;\n\n/**\n * Validates an project object.\n * @param project The project object to validate.\n * @returns An object containing the validation errors for each field.\n */\nexport const validateProject = async (\n project: Partial<Project | ProjectAPI>,\n fieldsToCheck = defaultFieldsToCheck\n): Promise<ValidationErrors> => {\n const errors: ValidationErrors = {};\n\n // Define the fields to validate\n const fieldsToValidate = new Set<FieldsToCheck>(fieldsToCheck);\n\n const projectJson = JSON.parse(JSON.stringify(project));\n\n // Validate each field\n for (const field of fieldsToValidate) {\n const value = projectJson[field];\n\n // Initialize error array for the field\n errors[field] = [];\n\n // Check for name validity\n if (field === 'name') {\n const nameErrors = validateString(\n value,\n 'Name',\n NAME_MIN_LENGTH,\n NAME_MAX_LENGTH\n );\n\n if (nameErrors.length > 0) {\n errors[field] = nameErrors;\n }\n }\n\n if (field === 'organizationId') {\n const organization = await getOrganizationById(field);\n const organizationErrors: string[] = [];\n\n if (typeof value !== 'string') {\n organizationErrors.push('Organization id must be a string');\n }\n\n if (!value) {\n organizationErrors.push('Organization id is required');\n }\n\n if (!organization) {\n organizationErrors.push('Organization not found');\n }\n\n if (organizationErrors.length > 0) {\n errors[field] = organizationErrors;\n }\n }\n\n if (field === 'membersIds' || field === 'adminsIds') {\n if (!project.organizationId) {\n errors[field] = [\n 'Organization id is required to validate project members',\n ];\n } else {\n const organization = await getOrganizationById(project.organizationId);\n const membersErrors = validateArray<string>(\n value as unknown as string[],\n 'Members',\n 'string',\n (item) =>\n (organization?.membersIds as unknown as string[]).includes(item),\n MEMBERS_MIN_LENGTH\n );\n\n if (membersErrors.length > 0) {\n errors[field] = membersErrors;\n }\n }\n }\n\n // Remove the error field if there are no errors\n if (errors[field].length === 0) {\n delete errors[field];\n }\n }\n\n return errors;\n};\n"],"mappings":";;;;;AAOA,MAAMA,uBAAsC;CAC1C;CACA;CACA;CACA;CACD;AAOD,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;AAE/B,MAAa,qBAAqB;;;;;;AAOlC,MAAa,kBAAkB,OAC7B,SACA,gBAAgB,yBACc;CAC9B,MAAMC,SAA2B,EAAE;CAGnC,MAAM,mBAAmB,IAAI,IAAmB,cAAc;CAE9D,MAAM,cAAc,KAAK,MAAM,KAAK,UAAU,QAAQ,CAAC;AAGvD,MAAK,MAAM,SAAS,kBAAkB;EACpC,MAAM,QAAQ,YAAY;AAG1B,SAAO,SAAS,EAAE;AAGlB,MAAI,UAAU,QAAQ;GACpB,MAAM,aAAaC,uDACjB,OACA,QACA,iBACA,gBACD;AAED,OAAI,WAAW,SAAS,EACtB,QAAO,SAAS;;AAIpB,MAAI,UAAU,kBAAkB;GAC9B,MAAM,eAAe,MAAMC,0DAAoB,MAAM;GACrD,MAAMC,qBAA+B,EAAE;AAEvC,OAAI,OAAO,UAAU,SACnB,oBAAmB,KAAK,mCAAmC;AAG7D,OAAI,CAAC,MACH,oBAAmB,KAAK,8BAA8B;AAGxD,OAAI,CAAC,aACH,oBAAmB,KAAK,yBAAyB;AAGnD,OAAI,mBAAmB,SAAS,EAC9B,QAAO,SAAS;;AAIpB,MAAI,UAAU,gBAAgB,UAAU,YACtC,KAAI,CAAC,QAAQ,eACX,QAAO,SAAS,CACd,0DACD;OACI;GACL,MAAM,eAAe,MAAMD,0DAAoB,QAAQ,eAAe;GACtE,MAAM,gBAAgBE,qDACpB,OACA,WACA,WACC,UACE,cAAc,YAAmC,SAAS,KAAK,EAClE,mBACD;AAED,OAAI,cAAc,SAAS,EACzB,QAAO,SAAS;;AAMtB,MAAI,OAAO,OAAO,WAAW,EAC3B,QAAO,OAAO;;AAIlB,QAAO"}
|
|
@@ -1,21 +0,0 @@
|
|
|
1
|
-
|
|
2
|
-
//#region src/utils/validation/validateString.ts
|
|
3
|
-
/**
|
|
4
|
-
* Validates a string field.
|
|
5
|
-
* @param value The value to validate.
|
|
6
|
-
* @param entityName The name of the entity being validated.
|
|
7
|
-
* @param minLength The minimum length of the string.
|
|
8
|
-
* @param maxLength The maximum length of the string.
|
|
9
|
-
* @returns An array of validation errors.
|
|
10
|
-
*/
|
|
11
|
-
const validateString = (value, entityName, minLength, maxLength) => {
|
|
12
|
-
const errors = [];
|
|
13
|
-
if (typeof value !== "string") errors.push(`${entityName} must be a string.`);
|
|
14
|
-
else if (minLength && value.length < minLength) errors.push(`${entityName} must be at least ${minLength} characters long.`);
|
|
15
|
-
else if (maxLength && value.length > maxLength) errors.push(`${entityName} must be at most ${maxLength} characters long.`);
|
|
16
|
-
return errors;
|
|
17
|
-
};
|
|
18
|
-
|
|
19
|
-
//#endregion
|
|
20
|
-
exports.validateString = validateString;
|
|
21
|
-
//# sourceMappingURL=validateString.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateString.cjs","names":["errors: string[]"],"sources":["../../../../src/utils/validation/validateString.ts"],"sourcesContent":["/**\n * Validates a string field.\n * @param value The value to validate.\n * @param entityName The name of the entity being validated.\n * @param minLength The minimum length of the string.\n * @param maxLength The maximum length of the string.\n * @returns An array of validation errors.\n */\nexport const validateString = (\n value: unknown,\n entityName: string,\n minLength?: number,\n maxLength?: number\n): string[] => {\n const errors: string[] = [];\n\n if (typeof value !== 'string') {\n errors.push(`${entityName} must be a string.`);\n } else if (minLength && value.length < minLength) {\n errors.push(`${entityName} must be at least ${minLength} characters long.`);\n } else if (maxLength && value.length > maxLength) {\n errors.push(`${entityName} must be at most ${maxLength} characters long.`);\n }\n\n return errors;\n};\n"],"mappings":";;;;;;;;;;AAQA,MAAa,kBACX,OACA,YACA,WACA,cACa;CACb,MAAMA,SAAmB,EAAE;AAE3B,KAAI,OAAO,UAAU,SACnB,QAAO,KAAK,GAAG,WAAW,oBAAoB;UACrC,aAAa,MAAM,SAAS,UACrC,QAAO,KAAK,GAAG,WAAW,oBAAoB,UAAU,mBAAmB;UAClE,aAAa,MAAM,SAAS,UACrC,QAAO,KAAK,GAAG,WAAW,mBAAmB,UAAU,mBAAmB;AAG5E,QAAO"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
const require_utils_validation_validateString = require('./validateString.cjs');
|
|
2
|
-
const require_services_organization_service = require('../../services/organization.service.cjs');
|
|
3
|
-
|
|
4
|
-
//#region src/utils/validation/validateTag.ts
|
|
5
|
-
const defaultFieldsToCheck = ["name"];
|
|
6
|
-
const KEY_MIN_LENGTH = 4;
|
|
7
|
-
const KEY_MAX_LENGTH = 20;
|
|
8
|
-
const NAME_MIN_LENGTH = 4;
|
|
9
|
-
const NAME_MAX_LENGTH = 50;
|
|
10
|
-
/**
|
|
11
|
-
* Validates an tag object.
|
|
12
|
-
* @param tag The tag object to validate.
|
|
13
|
-
* @returns An object containing the validation errors for each field.
|
|
14
|
-
*/
|
|
15
|
-
const validateTag = async (tag, fieldsToCheck = defaultFieldsToCheck) => {
|
|
16
|
-
const errors = {};
|
|
17
|
-
const fieldsToValidate = new Set(fieldsToCheck);
|
|
18
|
-
for (const field of fieldsToValidate) {
|
|
19
|
-
const value = tag[field];
|
|
20
|
-
errors[field] = [];
|
|
21
|
-
if (field === "key") {
|
|
22
|
-
const nameErrors = require_utils_validation_validateString.validateString(value, "Key", KEY_MIN_LENGTH, KEY_MAX_LENGTH);
|
|
23
|
-
if (nameErrors.length > 0) errors[field] = nameErrors;
|
|
24
|
-
}
|
|
25
|
-
if (field === "name") {
|
|
26
|
-
const nameErrors = require_utils_validation_validateString.validateString(value, "Name", NAME_MIN_LENGTH, NAME_MAX_LENGTH);
|
|
27
|
-
if (nameErrors.length > 0) errors[field] = nameErrors;
|
|
28
|
-
}
|
|
29
|
-
if (field === "organizationId") {
|
|
30
|
-
const organizationErrors = [];
|
|
31
|
-
if (typeof value !== "string") organizationErrors.push("Organization id must be a string");
|
|
32
|
-
if (!value) organizationErrors.push("Organization id is required");
|
|
33
|
-
if (!await require_services_organization_service.getOrganizationById(field)) organizationErrors.push("Organization not found");
|
|
34
|
-
if (organizationErrors.length > 0) errors[field] = organizationErrors;
|
|
35
|
-
}
|
|
36
|
-
if (errors[field].length === 0) delete errors[field];
|
|
37
|
-
}
|
|
38
|
-
return errors;
|
|
39
|
-
};
|
|
40
|
-
|
|
41
|
-
//#endregion
|
|
42
|
-
exports.KEY_MAX_LENGTH = KEY_MAX_LENGTH;
|
|
43
|
-
exports.KEY_MIN_LENGTH = KEY_MIN_LENGTH;
|
|
44
|
-
exports.NAME_MAX_LENGTH = NAME_MAX_LENGTH;
|
|
45
|
-
exports.NAME_MIN_LENGTH = NAME_MIN_LENGTH;
|
|
46
|
-
exports.validateTag = validateTag;
|
|
47
|
-
//# sourceMappingURL=validateTag.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateTag.cjs","names":["defaultFieldsToCheck: TagFields","errors: ValidationErrors","validateString","organizationErrors: string[]","getOrganizationById"],"sources":["../../../../src/utils/validation/validateTag.ts"],"sourcesContent":["import { getOrganizationById } from '@services/organization.service';\nimport type { Tag } from '@/types/tag.types';\nimport { validateString } from './validateString';\n\nexport type TagFields = (keyof Tag)[];\n\nconst defaultFieldsToCheck: TagFields = ['name'];\n\ntype FieldsToCheck = (typeof defaultFieldsToCheck)[number];\ntype ValidationErrors = Partial<\n Record<(typeof defaultFieldsToCheck)[number], string[]>\n>;\n\nexport const KEY_MIN_LENGTH = 4;\nexport const KEY_MAX_LENGTH = 20;\n\nexport const NAME_MIN_LENGTH = 4;\nexport const NAME_MAX_LENGTH = 50;\n\n/**\n * Validates an tag object.\n * @param tag The tag object to validate.\n * @returns An object containing the validation errors for each field.\n */\nexport const validateTag = async (\n tag: Partial<Tag>,\n fieldsToCheck = defaultFieldsToCheck\n): Promise<ValidationErrors> => {\n const errors: ValidationErrors = {};\n\n // Define the fields to validate\n const fieldsToValidate = new Set<FieldsToCheck>(fieldsToCheck);\n\n // Validate each field\n for (const field of fieldsToValidate) {\n const value = tag[field];\n\n // Initialize error array for the field\n errors[field] = [];\n\n // Check for name validity\n if (field === 'key') {\n const nameErrors = validateString(\n value,\n 'Key',\n KEY_MIN_LENGTH,\n KEY_MAX_LENGTH\n );\n\n if (nameErrors.length > 0) {\n errors[field] = nameErrors;\n }\n }\n\n // Check for name validity\n if (field === 'name') {\n const nameErrors = validateString(\n value,\n 'Name',\n NAME_MIN_LENGTH,\n NAME_MAX_LENGTH\n );\n\n if (nameErrors.length > 0) {\n errors[field] = nameErrors;\n }\n }\n\n if (field === 'organizationId') {\n const organizationErrors: string[] = [];\n\n if (typeof value !== 'string') {\n organizationErrors.push('Organization id must be a string');\n }\n\n if (!value) {\n organizationErrors.push('Organization id is required');\n }\n\n const organization = await getOrganizationById(field);\n if (!organization) {\n organizationErrors.push('Organization not found');\n }\n\n if (organizationErrors.length > 0) {\n errors[field] = organizationErrors;\n }\n }\n\n // Remove the error field if there are no errors\n if (errors[field].length === 0) {\n delete errors[field];\n }\n }\n\n return errors;\n};\n"],"mappings":";;;;AAMA,MAAMA,uBAAkC,CAAC,OAAO;AAOhD,MAAa,iBAAiB;AAC9B,MAAa,iBAAiB;AAE9B,MAAa,kBAAkB;AAC/B,MAAa,kBAAkB;;;;;;AAO/B,MAAa,cAAc,OACzB,KACA,gBAAgB,yBACc;CAC9B,MAAMC,SAA2B,EAAE;CAGnC,MAAM,mBAAmB,IAAI,IAAmB,cAAc;AAG9D,MAAK,MAAM,SAAS,kBAAkB;EACpC,MAAM,QAAQ,IAAI;AAGlB,SAAO,SAAS,EAAE;AAGlB,MAAI,UAAU,OAAO;GACnB,MAAM,aAAaC,uDACjB,OACA,OACA,gBACA,eACD;AAED,OAAI,WAAW,SAAS,EACtB,QAAO,SAAS;;AAKpB,MAAI,UAAU,QAAQ;GACpB,MAAM,aAAaA,uDACjB,OACA,QACA,iBACA,gBACD;AAED,OAAI,WAAW,SAAS,EACtB,QAAO,SAAS;;AAIpB,MAAI,UAAU,kBAAkB;GAC9B,MAAMC,qBAA+B,EAAE;AAEvC,OAAI,OAAO,UAAU,SACnB,oBAAmB,KAAK,mCAAmC;AAG7D,OAAI,CAAC,MACH,oBAAmB,KAAK,8BAA8B;AAIxD,OAAI,CADiB,MAAMC,0DAAoB,MAAM,CAEnD,oBAAmB,KAAK,yBAAyB;AAGnD,OAAI,mBAAmB,SAAS,EAC9B,QAAO,SAAS;;AAKpB,MAAI,OAAO,OAAO,WAAW,EAC3B,QAAO,OAAO;;AAIlB,QAAO"}
|
|
@@ -1,47 +0,0 @@
|
|
|
1
|
-
const require_utils_validation_validateString = require('./validateString.cjs');
|
|
2
|
-
const require_utils_validation_validateEmail = require('./validateEmail.cjs');
|
|
3
|
-
const require_utils_validation_validatePhone = require('./validatePhone.cjs');
|
|
4
|
-
|
|
5
|
-
//#region src/utils/validation/validateUser.ts
|
|
6
|
-
const defaultFieldsToCheck = [
|
|
7
|
-
"name",
|
|
8
|
-
"phone",
|
|
9
|
-
"email",
|
|
10
|
-
"phone"
|
|
11
|
-
];
|
|
12
|
-
const NAMES_MIN_LENGTH = 4;
|
|
13
|
-
const NAMES_MAX_LENGTH = 100;
|
|
14
|
-
/**
|
|
15
|
-
* Validates an user object.
|
|
16
|
-
* @param user The user object to validate.
|
|
17
|
-
* @returns An object containing the validation errors for each field.
|
|
18
|
-
*/
|
|
19
|
-
const validateUser = (user, fieldsToCheck = defaultFieldsToCheck) => {
|
|
20
|
-
const errors = {};
|
|
21
|
-
const fieldsToValidate = new Set(fieldsToCheck);
|
|
22
|
-
const userJson = JSON.parse(JSON.stringify(user));
|
|
23
|
-
for (const field of fieldsToValidate) {
|
|
24
|
-
const value = userJson[field];
|
|
25
|
-
errors[field] = [];
|
|
26
|
-
if (field === "name") {
|
|
27
|
-
const nameErrors = require_utils_validation_validateString.validateString(value, `User ${field}`, NAMES_MIN_LENGTH, NAMES_MAX_LENGTH);
|
|
28
|
-
if (nameErrors.length > 0) errors[field] = nameErrors;
|
|
29
|
-
}
|
|
30
|
-
if (field === "email") {
|
|
31
|
-
const emailErrors = require_utils_validation_validateEmail.validateEmail(value, "User Email");
|
|
32
|
-
if (emailErrors.length > 0) errors[field] = emailErrors;
|
|
33
|
-
}
|
|
34
|
-
if (field === "phone") {
|
|
35
|
-
const phoneErrors = require_utils_validation_validatePhone.validatePhone(value, "User Phone", 8, 20);
|
|
36
|
-
if (phoneErrors.length > 0) errors[field] = phoneErrors;
|
|
37
|
-
}
|
|
38
|
-
if (errors[field].length === 0) delete errors[field];
|
|
39
|
-
}
|
|
40
|
-
return errors;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
//#endregion
|
|
44
|
-
exports.NAMES_MAX_LENGTH = NAMES_MAX_LENGTH;
|
|
45
|
-
exports.NAMES_MIN_LENGTH = NAMES_MIN_LENGTH;
|
|
46
|
-
exports.validateUser = validateUser;
|
|
47
|
-
//# sourceMappingURL=validateUser.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"validateUser.cjs","names":["defaultFieldsToCheck: UserFields","errors: ValidationErrors","validateString","validateEmail","validatePhone"],"sources":["../../../../src/utils/validation/validateUser.ts"],"sourcesContent":["import type { User, UserAPI } from '@/types/user.types';\nimport { validateEmail } from './validateEmail';\nimport { validatePhone } from './validatePhone';\nimport { validateString } from './validateString';\n\nexport type UserFields = (keyof User)[];\n\nconst defaultFieldsToCheck: UserFields = ['name', 'phone', 'email', 'phone'];\n\nexport type FieldsToCheck = (typeof defaultFieldsToCheck)[number];\ntype ValidationErrors = Partial<\n Record<(typeof defaultFieldsToCheck)[number], string[]>\n>;\nexport const NAMES_MIN_LENGTH = 4;\nexport const NAMES_MAX_LENGTH = 100;\n\n/**\n * Validates an user object.\n * @param user The user object to validate.\n * @returns An object containing the validation errors for each field.\n */\nexport const validateUser = (\n user: Partial<User | UserAPI>,\n fieldsToCheck = defaultFieldsToCheck\n): ValidationErrors => {\n const errors: ValidationErrors = {};\n\n // Define the fields to validate\n const fieldsToValidate = new Set<FieldsToCheck>(fieldsToCheck);\n\n const userJson = JSON.parse(JSON.stringify(user));\n\n // Validate each field\n for (const field of fieldsToValidate) {\n const value = userJson[field];\n\n // Initialize error array for the field\n errors[field] = [];\n\n // Check for name validity\n if (field === 'name') {\n const nameErrors = validateString(\n value,\n `User ${field}`,\n NAMES_MIN_LENGTH,\n NAMES_MAX_LENGTH\n );\n\n if (nameErrors.length > 0) {\n errors[field] = nameErrors;\n }\n }\n\n // Check for email validity\n if (field === 'email') {\n const emailErrors = validateEmail(value, 'User Email');\n\n if (emailErrors.length > 0) {\n errors[field] = emailErrors;\n }\n }\n\n if (field === 'phone') {\n const phoneErrors = validatePhone(value, 'User Phone', 8, 20);\n\n if (phoneErrors.length > 0) {\n errors[field] = phoneErrors;\n }\n }\n\n // Remove the error field if there are no errors\n if (errors[field].length === 0) {\n delete errors[field];\n }\n }\n\n return errors;\n};\n"],"mappings":";;;;;AAOA,MAAMA,uBAAmC;CAAC;CAAQ;CAAS;CAAS;CAAQ;AAM5E,MAAa,mBAAmB;AAChC,MAAa,mBAAmB;;;;;;AAOhC,MAAa,gBACX,MACA,gBAAgB,yBACK;CACrB,MAAMC,SAA2B,EAAE;CAGnC,MAAM,mBAAmB,IAAI,IAAmB,cAAc;CAE9D,MAAM,WAAW,KAAK,MAAM,KAAK,UAAU,KAAK,CAAC;AAGjD,MAAK,MAAM,SAAS,kBAAkB;EACpC,MAAM,QAAQ,SAAS;AAGvB,SAAO,SAAS,EAAE;AAGlB,MAAI,UAAU,QAAQ;GACpB,MAAM,aAAaC,uDACjB,OACA,QAAQ,SACR,kBACA,iBACD;AAED,OAAI,WAAW,SAAS,EACtB,QAAO,SAAS;;AAKpB,MAAI,UAAU,SAAS;GACrB,MAAM,cAAcC,qDAAc,OAAO,aAAa;AAEtD,OAAI,YAAY,SAAS,EACvB,QAAO,SAAS;;AAIpB,MAAI,UAAU,SAAS;GACrB,MAAM,cAAcC,qDAAc,OAAO,cAAc,GAAG,GAAG;AAE7D,OAAI,YAAY,SAAS,EACvB,QAAO,SAAS;;AAKpB,MAAI,OAAO,OAAO,WAAW,EAC3B,QAAO,OAAO;;AAIlB,QAAO"}
|
|
@@ -1,116 +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_errors_ErrorsClass = require('../utils/errors/ErrorsClass.cjs');
|
|
4
|
-
const require_services_organization_service = require('../services/organization.service.cjs');
|
|
5
|
-
const require_services_user_service = require('../services/user.service.cjs');
|
|
6
|
-
const require_services_email_service = require('../services/email.service.cjs');
|
|
7
|
-
const require_services_subscription_service = require('../services/subscription.service.cjs');
|
|
8
|
-
let stripe = require("stripe");
|
|
9
|
-
|
|
10
|
-
//#region src/webhooks/stripe.webhook.ts
|
|
11
|
-
/**
|
|
12
|
-
* Stripe webhook handler for processing subscription and invoice events.
|
|
13
|
-
* @param req - Express request object.
|
|
14
|
-
* @param res - Express response object.
|
|
15
|
-
*/
|
|
16
|
-
const stripeWebhook = async (req, res) => {
|
|
17
|
-
const stripe$1 = new stripe.Stripe(process.env.STRIPE_SECRET_KEY);
|
|
18
|
-
const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET;
|
|
19
|
-
const sig = req.headers["stripe-signature"];
|
|
20
|
-
let event;
|
|
21
|
-
try {
|
|
22
|
-
event = stripe$1.webhooks.constructEvent(req.body, sig, endpointSecret);
|
|
23
|
-
} catch (err) {
|
|
24
|
-
res.status(400).send(`Webhook Error: ${err.message}`);
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
const extractMetadata = async (customerId) => {
|
|
28
|
-
return (await stripe$1.customers.retrieve(customerId)).metadata;
|
|
29
|
-
};
|
|
30
|
-
const handleSubscriptionEvent = async (subscription, statusOverride) => {
|
|
31
|
-
const { id: subscriptionId, customer } = subscription;
|
|
32
|
-
const priceId = subscription.items.data[0]?.price?.id;
|
|
33
|
-
if (!customer) throw new require_utils_errors_ErrorsClass.GenericError("STRIPE_SUBSCRIPTION_NO_CUSTOMER");
|
|
34
|
-
const customerId = customer;
|
|
35
|
-
const { locale, userId, organizationId } = await extractMetadata(customerId);
|
|
36
|
-
if (locale) res.locals.locales = locale;
|
|
37
|
-
const organization = await require_services_organization_service.getOrganizationById(organizationId);
|
|
38
|
-
if (!organization) throw new require_utils_errors_ErrorsClass.GenericError("ORGANIZATION_NOT_FOUND");
|
|
39
|
-
const user = await require_services_user_service.getUserById(userId);
|
|
40
|
-
if (!user) throw new require_utils_errors_ErrorsClass.GenericError("USER_NOT_FOUND");
|
|
41
|
-
const status = statusOverride ?? subscription.status;
|
|
42
|
-
await require_services_subscription_service.addOrUpdateSubscription(subscriptionId, priceId, customerId, userId, organization, status);
|
|
43
|
-
if (status === "active") await require_services_email_service.sendEmail({
|
|
44
|
-
type: "subscriptionPaymentSuccess",
|
|
45
|
-
to: user.email,
|
|
46
|
-
email: user.email,
|
|
47
|
-
subscriptionStartDate: (/* @__PURE__ */ new Date()).toLocaleDateString(),
|
|
48
|
-
manageSubscriptionLink: `${process.env.CLIENT_URL}/dashboard/organization`,
|
|
49
|
-
username: user.name,
|
|
50
|
-
organizationName: organization.name,
|
|
51
|
-
planName: organization.plan?.type ?? "Unknown"
|
|
52
|
-
});
|
|
53
|
-
if (status === "canceled") await require_services_email_service.sendEmail({
|
|
54
|
-
type: "subscriptionPaymentCancellation",
|
|
55
|
-
to: user.email,
|
|
56
|
-
email: user.email,
|
|
57
|
-
cancellationDate: (/* @__PURE__ */ new Date(subscription.current_period_end * 1e3)).toLocaleDateString(),
|
|
58
|
-
reactivateLink: `${process.env.CLIENT_URL}/pricing`,
|
|
59
|
-
username: user.name,
|
|
60
|
-
organizationName: organization.name,
|
|
61
|
-
planName: organization.plan?.type ?? "Unknown"
|
|
62
|
-
});
|
|
63
|
-
};
|
|
64
|
-
const handleInvoiceEvent = async (invoice, status) => {
|
|
65
|
-
const subscriptionId = typeof invoice.subscription === "string" ? invoice.subscription : invoice.subscription?.id;
|
|
66
|
-
if (!subscriptionId) {
|
|
67
|
-
require_logger_index.logger.warn("Subscription ID is undefined in invoice.");
|
|
68
|
-
return;
|
|
69
|
-
}
|
|
70
|
-
const organization = await require_services_organization_service.getOrganizationById((await stripe$1.subscriptions.retrieve(subscriptionId)).metadata.organizationId);
|
|
71
|
-
if (organization.plan?.subscriptionId && organization.plan.subscriptionId !== subscriptionId) await stripe$1.subscriptions.cancel(subscriptionId);
|
|
72
|
-
const customerId = invoice.customer;
|
|
73
|
-
const { locale, userId, organizationId } = await extractMetadata(customerId);
|
|
74
|
-
if (locale) res.locals.locales = locale;
|
|
75
|
-
await require_services_subscription_service.changeSubscriptionStatus(subscriptionId, status, userId, organizationId);
|
|
76
|
-
};
|
|
77
|
-
try {
|
|
78
|
-
require_logger_index.logger.info(`Triggered event type ${event.type}`);
|
|
79
|
-
switch (event.type) {
|
|
80
|
-
case "customer.subscription.created":
|
|
81
|
-
require_logger_index.logger.info(`Handled event type ${event.type}`);
|
|
82
|
-
await handleSubscriptionEvent(event.data.object);
|
|
83
|
-
break;
|
|
84
|
-
case "customer.subscription.updated":
|
|
85
|
-
require_logger_index.logger.info(`Handled event type ${event.type}`);
|
|
86
|
-
await handleSubscriptionEvent(event.data.object);
|
|
87
|
-
break;
|
|
88
|
-
case "customer.subscription.deleted": {
|
|
89
|
-
require_logger_index.logger.info(`Handled event type ${event.type}`);
|
|
90
|
-
const subscription = event.data.object;
|
|
91
|
-
const customerId = subscription.customer;
|
|
92
|
-
const { locale, organizationId } = await extractMetadata(customerId);
|
|
93
|
-
if (locale) res.locals.locales = locale;
|
|
94
|
-
await require_services_subscription_service.cancelSubscription(subscription.id, organizationId);
|
|
95
|
-
break;
|
|
96
|
-
}
|
|
97
|
-
case "invoice.payment_succeeded":
|
|
98
|
-
require_logger_index.logger.info(`Handled event type ${event.type}`);
|
|
99
|
-
await handleInvoiceEvent(event.data.object, "active");
|
|
100
|
-
break;
|
|
101
|
-
case "invoice.payment_failed":
|
|
102
|
-
require_logger_index.logger.info(`Handled event type ${event.type}`);
|
|
103
|
-
await handleInvoiceEvent(event.data.object, "incomplete");
|
|
104
|
-
break;
|
|
105
|
-
default: require_logger_index.logger.info(`Unhandled event type ${event.type}`);
|
|
106
|
-
}
|
|
107
|
-
res.send();
|
|
108
|
-
} catch (error) {
|
|
109
|
-
require_logger_index.logger.error(`Error handling event ${event.type}: ${error.message}`);
|
|
110
|
-
res.status(500).send("Server Error");
|
|
111
|
-
}
|
|
112
|
-
};
|
|
113
|
-
|
|
114
|
-
//#endregion
|
|
115
|
-
exports.stripeWebhook = stripeWebhook;
|
|
116
|
-
//# sourceMappingURL=stripe.webhook.cjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"stripe.webhook.cjs","names":["stripe","Stripe","event: Stripe.Event","GenericError","getOrganizationById","getUserById","addOrUpdateSubscription","changeSubscriptionStatus","cancelSubscription"],"sources":["../../../src/webhooks/stripe.webhook.ts"],"sourcesContent":["import type { Locale } from '@intlayer/types';\nimport { logger } from '@logger';\nimport * as emailService from '@services/email.service';\nimport { getOrganizationById } from '@services/organization.service';\nimport {\n addOrUpdateSubscription,\n cancelSubscription,\n changeSubscriptionStatus,\n} from '@services/subscription.service';\nimport { getUserById } from '@services/user.service';\nimport { GenericError } from '@utils/errors';\nimport type { Request, Response } from 'express';\nimport { Stripe } from 'stripe';\nimport type { Plan } from '@/types/plan.types';\n\ntype SubscriptionMetadata = {\n locale: Locale; // Localization setting (e.g., 'en', 'fr', 'es')\n userId: string; // ID of the user associated with the subscription\n organizationId: string; // ID of the organization associated with the subscription\n};\n\n/**\n * Stripe webhook handler for processing subscription and invoice events.\n * @param req - Express request object.\n * @param res - Express response object.\n */\nexport const stripeWebhook = async (req: Request, res: Response) => {\n // Initialize the Stripe client with the secret key\n const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);\n\n const endpointSecret = process.env.STRIPE_WEBHOOK_SECRET!; // Webhook secret for verifying event signatures\n const sig = req.headers['stripe-signature']!; // Retrieve the signature from the webhook request headers\n\n let event: Stripe.Event;\n\n // Verify the webhook signature to ensure the request is authentic\n try {\n event = stripe.webhooks.constructEvent(req.body, sig, endpointSecret);\n } catch (err) {\n // Respond with a 400 status code if the signature verification fails\n res.status(400).send(`Webhook Error: ${(err as Error).message}`);\n return;\n }\n\n // Utility function to extract metadata from a Stripe customer\n const extractMetadata = async (customerId: string) => {\n const customer = await stripe.customers.retrieve(customerId); // Retrieve customer details from Stripe\n return (customer as Stripe.Customer).metadata as SubscriptionMetadata; // Return the metadata object\n };\n\n // Handles subscription-related events (creation, update, deletion)\n const handleSubscriptionEvent = async (\n subscription: Stripe.Subscription,\n statusOverride?: Plan['status'] // Optionally override the subscription status\n ) => {\n const { id: subscriptionId, customer } = subscription;\n const priceId = subscription.items.data[0]?.price?.id; // Extract the price ID from subscription items\n\n if (!customer) {\n throw new GenericError('STRIPE_SUBSCRIPTION_NO_CUSTOMER');\n }\n\n const customerId = customer as string;\n const { locale, userId, organizationId } =\n await extractMetadata(customerId); // Extract metadata from the customer\n\n // Set localization in response locals if available\n if (locale) {\n res.locals.locales = locale;\n }\n\n const organization = await getOrganizationById(organizationId); // Fetch organization details by ID\n\n if (!organization) {\n throw new GenericError('ORGANIZATION_NOT_FOUND');\n }\n\n const user = await getUserById(userId);\n\n if (!user) {\n throw new GenericError('USER_NOT_FOUND');\n }\n\n const status = statusOverride ?? subscription.status; // Use the provided status override or the subscription's status\n\n // Update or create a subscription record in the database\n await addOrUpdateSubscription(\n subscriptionId,\n priceId!,\n customerId,\n userId,\n organization,\n status\n );\n\n if (status === 'active') {\n await emailService.sendEmail({\n type: 'subscriptionPaymentSuccess',\n to: user.email,\n email: user.email,\n subscriptionStartDate: new Date().toLocaleDateString(),\n manageSubscriptionLink: `${process.env.CLIENT_URL}/dashboard/organization`,\n username: user.name,\n organizationName: organization.name,\n planName: organization.plan?.type ?? 'Unknown',\n });\n }\n if (status === 'canceled') {\n await emailService.sendEmail({\n type: 'subscriptionPaymentCancellation',\n to: user.email,\n email: user.email,\n cancellationDate: new Date(\n (subscription as any).current_period_end * 1000\n ).toLocaleDateString(),\n reactivateLink: `${process.env.CLIENT_URL}/pricing`,\n username: user.name,\n organizationName: organization.name,\n planName: organization.plan?.type ?? 'Unknown',\n });\n }\n };\n\n // Handles invoice-related events (payment success or failure)\n const handleInvoiceEvent = async (\n invoice: Stripe.Invoice,\n status: 'active' | 'incomplete'\n ) => {\n const subscriptionId =\n typeof (invoice as any).subscription === 'string'\n ? (invoice as any).subscription\n : (invoice as any).subscription?.id; // Extract the subscription ID from the invoice\n if (!subscriptionId) {\n logger.warn('Subscription ID is undefined in invoice.');\n return;\n }\n\n // Retrieve the subscription details from Stripe\n const subscription = await stripe.subscriptions.retrieve(subscriptionId);\n const organization = await getOrganizationById(\n subscription.metadata.organizationId\n );\n\n // Prevent duplicate subscriptions by canceling conflicting subscriptions\n if (\n organization.plan?.subscriptionId &&\n organization.plan.subscriptionId !== subscriptionId\n ) {\n await stripe.subscriptions.cancel(subscriptionId);\n }\n\n const customerId = invoice.customer as string;\n const { locale, userId, organizationId } =\n await extractMetadata(customerId);\n\n // Set localization in response locals if available\n if (locale) {\n res.locals.locales = locale;\n }\n\n // Update the subscription status in the database\n await changeSubscriptionStatus(\n subscriptionId,\n status,\n userId,\n organizationId\n );\n };\n\n try {\n // Log the event type for debugging and monitoring\n logger.info(`Triggered event type ${event.type}`);\n\n // Handle specific event types\n switch (event.type) {\n case 'customer.subscription.created': {\n logger.info(`Handled event type ${event.type}`);\n // Process a new subscription creation event\n await handleSubscriptionEvent(event.data.object as Stripe.Subscription);\n break;\n }\n case 'customer.subscription.updated': {\n logger.info(`Handled event type ${event.type}`);\n // Process a subscription update event\n await handleSubscriptionEvent(event.data.object as Stripe.Subscription);\n break;\n }\n case 'customer.subscription.deleted': {\n logger.info(`Handled event type ${event.type}`);\n const subscription = event.data\n .object as unknown as Stripe.Subscription;\n const customerId = subscription.customer as string;\n const { locale, organizationId } = await extractMetadata(customerId);\n\n // Set localization in response locals if available\n if (locale) {\n res.locals.locales = locale;\n }\n\n // Handle subscription deletion by canceling it in the database\n await cancelSubscription(subscription.id, organizationId);\n break;\n }\n case 'invoice.payment_succeeded': {\n logger.info(`Handled event type ${event.type}`);\n // Handle successful invoice payment\n await handleInvoiceEvent(event.data.object as Stripe.Invoice, 'active');\n break;\n }\n case 'invoice.payment_failed': {\n logger.info(`Handled event type ${event.type}`);\n // Handle failed invoice payment\n await handleInvoiceEvent(\n event.data.object as Stripe.Invoice,\n 'incomplete'\n );\n break;\n }\n default:\n // Log unhandled event types for visibility\n logger.info(`Unhandled event type ${event.type}`);\n }\n\n // Respond to Stripe to confirm the event was processed successfully\n res.send();\n } catch (error) {\n // Log errors for debugging and respond with a 500 status code\n logger.error(\n `Error handling event ${event.type}: ${(error as Error).message}`\n );\n res.status(500).send('Server Error');\n }\n};\n"],"mappings":";;;;;;;;;;;;;;;AA0BA,MAAa,gBAAgB,OAAO,KAAc,QAAkB;CAElE,MAAMA,WAAS,IAAIC,cAAO,QAAQ,IAAI,kBAAmB;CAEzD,MAAM,iBAAiB,QAAQ,IAAI;CACnC,MAAM,MAAM,IAAI,QAAQ;CAExB,IAAIC;AAGJ,KAAI;AACF,UAAQF,SAAO,SAAS,eAAe,IAAI,MAAM,KAAK,eAAe;UAC9D,KAAK;AAEZ,MAAI,OAAO,IAAI,CAAC,KAAK,kBAAmB,IAAc,UAAU;AAChE;;CAIF,MAAM,kBAAkB,OAAO,eAAuB;AAEpD,UADiB,MAAMA,SAAO,UAAU,SAAS,WAAW,EACvB;;CAIvC,MAAM,0BAA0B,OAC9B,cACA,mBACG;EACH,MAAM,EAAE,IAAI,gBAAgB,aAAa;EACzC,MAAM,UAAU,aAAa,MAAM,KAAK,IAAI,OAAO;AAEnD,MAAI,CAAC,SACH,OAAM,IAAIG,8CAAa,kCAAkC;EAG3D,MAAM,aAAa;EACnB,MAAM,EAAE,QAAQ,QAAQ,mBACtB,MAAM,gBAAgB,WAAW;AAGnC,MAAI,OACF,KAAI,OAAO,UAAU;EAGvB,MAAM,eAAe,MAAMC,0DAAoB,eAAe;AAE9D,MAAI,CAAC,aACH,OAAM,IAAID,8CAAa,yBAAyB;EAGlD,MAAM,OAAO,MAAME,0CAAY,OAAO;AAEtC,MAAI,CAAC,KACH,OAAM,IAAIF,8CAAa,iBAAiB;EAG1C,MAAM,SAAS,kBAAkB,aAAa;AAG9C,QAAMG,8DACJ,gBACA,SACA,YACA,QACA,cACA,OACD;AAED,MAAI,WAAW,SACb,gDAA6B;GAC3B,MAAM;GACN,IAAI,KAAK;GACT,OAAO,KAAK;GACZ,wCAAuB,IAAI,MAAM,EAAC,oBAAoB;GACtD,wBAAwB,GAAG,QAAQ,IAAI,WAAW;GAClD,UAAU,KAAK;GACf,kBAAkB,aAAa;GAC/B,UAAU,aAAa,MAAM,QAAQ;GACtC,CAAC;AAEJ,MAAI,WAAW,WACb,gDAA6B;GAC3B,MAAM;GACN,IAAI,KAAK;GACT,OAAO,KAAK;GACZ,mCAAkB,IAAI,KACnB,aAAqB,qBAAqB,IAC5C,EAAC,oBAAoB;GACtB,gBAAgB,GAAG,QAAQ,IAAI,WAAW;GAC1C,UAAU,KAAK;GACf,kBAAkB,aAAa;GAC/B,UAAU,aAAa,MAAM,QAAQ;GACtC,CAAC;;CAKN,MAAM,qBAAqB,OACzB,SACA,WACG;EACH,MAAM,iBACJ,OAAQ,QAAgB,iBAAiB,WACpC,QAAgB,eAChB,QAAgB,cAAc;AACrC,MAAI,CAAC,gBAAgB;AACnB,+BAAO,KAAK,2CAA2C;AACvD;;EAKF,MAAM,eAAe,MAAMF,2DADN,MAAMJ,SAAO,cAAc,SAAS,eAAe,EAEzD,SAAS,eACvB;AAGD,MACE,aAAa,MAAM,kBACnB,aAAa,KAAK,mBAAmB,eAErC,OAAMA,SAAO,cAAc,OAAO,eAAe;EAGnD,MAAM,aAAa,QAAQ;EAC3B,MAAM,EAAE,QAAQ,QAAQ,mBACtB,MAAM,gBAAgB,WAAW;AAGnC,MAAI,OACF,KAAI,OAAO,UAAU;AAIvB,QAAMO,+DACJ,gBACA,QACA,QACA,eACD;;AAGH,KAAI;AAEF,8BAAO,KAAK,wBAAwB,MAAM,OAAO;AAGjD,UAAQ,MAAM,MAAd;GACE,KAAK;AACH,gCAAO,KAAK,sBAAsB,MAAM,OAAO;AAE/C,UAAM,wBAAwB,MAAM,KAAK,OAA8B;AACvE;GAEF,KAAK;AACH,gCAAO,KAAK,sBAAsB,MAAM,OAAO;AAE/C,UAAM,wBAAwB,MAAM,KAAK,OAA8B;AACvE;GAEF,KAAK,iCAAiC;AACpC,gCAAO,KAAK,sBAAsB,MAAM,OAAO;IAC/C,MAAM,eAAe,MAAM,KACxB;IACH,MAAM,aAAa,aAAa;IAChC,MAAM,EAAE,QAAQ,mBAAmB,MAAM,gBAAgB,WAAW;AAGpE,QAAI,OACF,KAAI,OAAO,UAAU;AAIvB,UAAMC,yDAAmB,aAAa,IAAI,eAAe;AACzD;;GAEF,KAAK;AACH,gCAAO,KAAK,sBAAsB,MAAM,OAAO;AAE/C,UAAM,mBAAmB,MAAM,KAAK,QAA0B,SAAS;AACvE;GAEF,KAAK;AACH,gCAAO,KAAK,sBAAsB,MAAM,OAAO;AAE/C,UAAM,mBACJ,MAAM,KAAK,QACX,aACD;AACD;GAEF,QAEE,6BAAO,KAAK,wBAAwB,MAAM,OAAO;;AAIrD,MAAI,MAAM;UACH,OAAO;AAEd,8BAAO,MACL,wBAAwB,MAAM,KAAK,IAAK,MAAgB,UACzD;AACD,MAAI,OAAO,IAAI,CAAC,KAAK,eAAe"}
|