@intlayer/backend 8.7.12 → 8.7.14
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/README.md +27 -1
- package/dist/assets/utils/AI/askDocQuestion/embeddings/docs/en/benchmark/solid.json +4990 -0
- package/dist/assets/utils/AI/askDocQuestion/embeddings/docs/en/benchmark/svelte.json +4987 -0
- package/dist/assets/utils/AI/askDocQuestion/embeddings/docs/en/benchmark/vue.json +4975 -0
- package/dist/assets/utils/AI/askDocQuestion/embeddings/docs/en/intlayer_with_astro_lit.json +9936 -8930
- package/dist/assets/utils/AI/askDocQuestion/embeddings/docs/en/intlayer_with_astro_vanilla.json +7963 -6949
- package/dist/assets/utils/AI/askDocQuestion/embeddings/docs/en/readme.json +12908 -12288
- package/dist/esm/controllers/oAuth2.controller.mjs +21 -1
- package/dist/esm/controllers/oAuth2.controller.mjs.map +1 -1
- package/dist/esm/controllers/stripe.controller.mjs +86 -2
- package/dist/esm/controllers/stripe.controller.mjs.map +1 -1
- package/dist/esm/controllers/translation.controller.mjs +2 -0
- package/dist/esm/controllers/translation.controller.mjs.map +1 -1
- package/dist/esm/emails/InviteUserEmail.mjs +1541 -1
- package/dist/esm/emails/InviteUserEmail.mjs.map +1 -1
- package/dist/esm/emails/MagicLinkEmail.mjs +1128 -1
- package/dist/esm/emails/MagicLinkEmail.mjs.map +1 -1
- package/dist/esm/emails/OAuthTokenCreatedEmail.mjs +1389 -1
- package/dist/esm/emails/OAuthTokenCreatedEmail.mjs.map +1 -1
- package/dist/esm/emails/PasswordChangeConfirmation.mjs +814 -1
- package/dist/esm/emails/PasswordChangeConfirmation.mjs.map +1 -1
- package/dist/esm/emails/ResetUserPassword.mjs +1132 -1
- package/dist/esm/emails/ResetUserPassword.mjs.map +1 -1
- package/dist/esm/emails/SubscriptionPaymentCancellation.mjs +913 -1
- package/dist/esm/emails/SubscriptionPaymentCancellation.mjs.map +1 -1
- package/dist/esm/emails/SubscriptionPaymentError.mjs +908 -1
- package/dist/esm/emails/SubscriptionPaymentError.mjs.map +1 -1
- package/dist/esm/emails/SubscriptionPaymentSuccess.mjs +935 -1
- package/dist/esm/emails/SubscriptionPaymentSuccess.mjs.map +1 -1
- package/dist/esm/emails/ValidateUserEmail.mjs +1111 -1
- package/dist/esm/emails/ValidateUserEmail.mjs.map +1 -1
- package/dist/esm/emails/Welcome.mjs +1004 -1
- package/dist/esm/emails/Welcome.mjs.map +1 -1
- package/dist/esm/emails/index.mjs +7 -7
- package/dist/esm/index.mjs +8 -2
- package/dist/esm/index.mjs.map +1 -1
- package/dist/esm/middlewares/oAuth2.middleware.mjs +2 -2
- package/dist/esm/middlewares/oAuth2.middleware.mjs.map +1 -1
- package/dist/esm/routes/audit.routes.mjs +5 -4
- package/dist/esm/routes/audit.routes.mjs.map +1 -1
- package/dist/esm/routes/dictionary.routes.mjs +4 -3
- package/dist/esm/routes/dictionary.routes.mjs.map +1 -1
- package/dist/esm/routes/organization.routes.mjs +3 -2
- package/dist/esm/routes/organization.routes.mjs.map +1 -1
- package/dist/esm/routes/paramsSchemas.mjs +67 -0
- package/dist/esm/routes/paramsSchemas.mjs.map +1 -0
- package/dist/esm/routes/project.routes.mjs +2 -1
- package/dist/esm/routes/project.routes.mjs.map +1 -1
- package/dist/esm/routes/showcaseProject.routes.mjs +5 -4
- package/dist/esm/routes/showcaseProject.routes.mjs.map +1 -1
- package/dist/esm/routes/stripe.routes.mjs +19 -1
- package/dist/esm/routes/stripe.routes.mjs.map +1 -1
- package/dist/esm/routes/tags.routes.mjs +3 -2
- package/dist/esm/routes/tags.routes.mjs.map +1 -1
- package/dist/esm/routes/translate.routes.mjs +6 -5
- package/dist/esm/routes/translate.routes.mjs.map +1 -1
- package/dist/esm/routes/user.routes.mjs +5 -4
- package/dist/esm/routes/user.routes.mjs.map +1 -1
- package/dist/esm/schemas/oAuth2.schema.mjs +1 -1
- package/dist/esm/schemas/oAuth2.schema.mjs.map +1 -1
- package/dist/esm/services/email.service.mjs +338 -38
- package/dist/esm/services/email.service.mjs.map +1 -1
- package/dist/esm/services/oAuth2.service.mjs +20 -2
- package/dist/esm/services/oAuth2.service.mjs.map +1 -1
- package/dist/esm/services/subscription.service.mjs +5 -2
- package/dist/esm/services/subscription.service.mjs.map +1 -1
- package/dist/esm/utils/AI/askDocQuestion/embeddings/docs/en/benchmark/solid.json +4990 -0
- package/dist/esm/utils/AI/askDocQuestion/embeddings/docs/en/benchmark/svelte.json +4987 -0
- package/dist/esm/utils/AI/askDocQuestion/embeddings/docs/en/benchmark/vue.json +4975 -0
- package/dist/esm/utils/AI/askDocQuestion/embeddings/docs/en/intlayer_with_astro_lit.json +9936 -8930
- package/dist/esm/utils/AI/askDocQuestion/embeddings/docs/en/intlayer_with_astro_vanilla.json +7963 -6949
- package/dist/esm/utils/AI/askDocQuestion/embeddings/docs/en/readme.json +12908 -12288
- package/dist/esm/utils/AI/auditDictionary/index.mjs +1 -3
- package/dist/esm/utils/AI/auditDictionary/index.mjs.map +1 -1
- package/dist/esm/utils/AI/auditDictionaryField/index.mjs +1 -3
- package/dist/esm/utils/AI/auditDictionaryField/index.mjs.map +1 -1
- package/dist/esm/utils/AI/auditTag/index.mjs +1 -3
- package/dist/esm/utils/AI/auditTag/index.mjs.map +1 -1
- package/dist/esm/utils/AI/autocomplete/index.mjs +1 -3
- package/dist/esm/utils/AI/autocomplete/index.mjs.map +1 -1
- package/dist/esm/utils/auth/getAuth.mjs +6 -0
- package/dist/esm/utils/auth/getAuth.mjs.map +1 -1
- package/dist/esm/utils/errors/errorCodes.mjs +3917 -287
- package/dist/esm/utils/errors/errorCodes.mjs.map +1 -1
- package/dist/esm/utils/mongoDB/connectDB.mjs +5 -0
- package/dist/esm/utils/mongoDB/connectDB.mjs.map +1 -1
- package/dist/esm/utils/oAuth2.mjs +6 -2
- package/dist/esm/utils/oAuth2.mjs.map +1 -1
- package/dist/esm/utils/plan.mjs +13 -1
- package/dist/esm/utils/plan.mjs.map +1 -1
- package/dist/types/controllers/oAuth2.controller.d.ts +11 -1
- package/dist/types/controllers/oAuth2.controller.d.ts.map +1 -1
- package/dist/types/controllers/stripe.controller.d.ts +22 -2
- package/dist/types/controllers/stripe.controller.d.ts.map +1 -1
- package/dist/types/controllers/translation.controller.d.ts.map +1 -1
- package/dist/types/emails/InviteUserEmail.d.ts +181 -1
- package/dist/types/emails/InviteUserEmail.d.ts.map +1 -1
- package/dist/types/emails/MagicLinkEmail.d.ts +106 -1
- package/dist/types/emails/MagicLinkEmail.d.ts.map +1 -1
- package/dist/types/emails/OAuthTokenCreatedEmail.d.ts +166 -1
- package/dist/types/emails/OAuthTokenCreatedEmail.d.ts.map +1 -1
- package/dist/types/emails/PasswordChangeConfirmation.d.ts +91 -1
- package/dist/types/emails/PasswordChangeConfirmation.d.ts.map +1 -1
- package/dist/types/emails/ResetUserPassword.d.ts +106 -1
- package/dist/types/emails/ResetUserPassword.d.ts.map +1 -1
- package/dist/types/emails/SubscriptionPaymentCancellation.d.ts +151 -1
- package/dist/types/emails/SubscriptionPaymentCancellation.d.ts.map +1 -1
- package/dist/types/emails/SubscriptionPaymentError.d.ts +151 -1
- package/dist/types/emails/SubscriptionPaymentError.d.ts.map +1 -1
- package/dist/types/emails/SubscriptionPaymentSuccess.d.ts +151 -1
- package/dist/types/emails/SubscriptionPaymentSuccess.d.ts.map +1 -1
- package/dist/types/emails/ValidateUserEmail.d.ts +106 -1
- package/dist/types/emails/ValidateUserEmail.d.ts.map +1 -1
- package/dist/types/emails/Welcome.d.ts +106 -1
- package/dist/types/emails/Welcome.d.ts.map +1 -1
- package/dist/types/emails/index.d.ts +7 -7
- package/dist/types/export.d.ts +3 -3
- package/dist/types/middlewares/oAuth2.middleware.d.ts.map +1 -1
- package/dist/types/routes/audit.routes.d.ts.map +1 -1
- package/dist/types/routes/dictionary.routes.d.ts.map +1 -1
- package/dist/types/routes/organization.routes.d.ts.map +1 -1
- package/dist/types/routes/paramsSchemas.d.ts +102 -0
- package/dist/types/routes/paramsSchemas.d.ts.map +1 -0
- package/dist/types/routes/project.routes.d.ts.map +1 -1
- package/dist/types/routes/showcaseProject.routes.d.ts.map +1 -1
- package/dist/types/routes/stripe.routes.d.ts +15 -0
- package/dist/types/routes/stripe.routes.d.ts.map +1 -1
- package/dist/types/routes/tags.routes.d.ts.map +1 -1
- package/dist/types/routes/translate.routes.d.ts.map +1 -1
- package/dist/types/routes/user.routes.d.ts.map +1 -1
- package/dist/types/schemas/dictionary.schema.d.ts +5 -5
- package/dist/types/schemas/discussion.schema.d.ts +8 -8
- package/dist/types/schemas/organization.schema.d.ts +6 -6
- package/dist/types/schemas/plans.schema.d.ts +9 -9
- package/dist/types/schemas/project.schema.d.ts +12 -12
- package/dist/types/schemas/session.schema.d.ts +3 -3
- package/dist/types/schemas/showcaseProject.schema.d.ts +7 -7
- package/dist/types/schemas/tag.schema.d.ts +8 -8
- package/dist/types/services/email.service.d.ts.map +1 -1
- package/dist/types/services/oAuth2.service.d.ts +6 -1
- package/dist/types/services/oAuth2.service.d.ts.map +1 -1
- package/dist/types/types/plan.types.d.ts +2 -2
- package/dist/types/utils/errors/errorCodes.d.ts +3634 -4
- package/dist/types/utils/errors/errorCodes.d.ts.map +1 -1
- package/dist/types/utils/mongoDB/connectDB.d.ts.map +1 -1
- package/dist/types/utils/oAuth2.d.ts +3 -1
- package/dist/types/utils/oAuth2.d.ts.map +1 -1
- package/dist/types/utils/plan.d.ts +2 -1
- package/dist/types/utils/plan.d.ts.map +1 -1
- package/package.json +14 -13
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Welcome.mjs","names":[],"sources":["../../../src/emails/Welcome.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 WelcomeEmailProps = {\n username: string;\n loginLink: string;\n};\n\nexport const WelcomeEmailEN = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Welcome to 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 Welcome to <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 We're excited to have you on board! Get started by logging in to\n your <strong>Intlayer</strong> account.\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={loginLink}\n >\n Log In to Your Account\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={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 If you have any questions or need help getting started, feel free\n to reply to this email. We're here to help!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailFR = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Bienvenue chez 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 Bienvenue chez <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 Nous sommes ravis de vous avoir parmi nous ! Commencez par vous\n connecter à votre compte <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={loginLink}\n >\n Connectez-vous à votre compte\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={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Si vous avez des questions ou besoin d'aide pour commencer,\n n'hésitez pas à répondre à cet e-mail. Nous sommes là pour vous\n aider !\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailES = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `¡Bienvenido a 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 Bienvenido a <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 ¡Estamos emocionados de tenerte a bordo! Comienza iniciando sesión\n en tu cuenta de <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={loginLink}\n >\n Inicia sesión en tu cuenta\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={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Si tienes preguntas o necesitas ayuda para comenzar, no dudes en\n responder a este correo electrónico. ¡Estamos aquí para ayudarte!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nconst PreviewProps: WelcomeEmailProps = {\n username: 'alanturing',\n loginLink: 'https://intlayer.org/login',\n};\n\nWelcomeEmailEN.PreviewProps = PreviewProps;\nWelcomeEmailFR.PreviewProps = PreviewProps;\nWelcomeEmailES.PreviewProps = PreviewProps;\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"Welcome.mjs","names":[],"sources":["../../../src/emails/Welcome.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 WelcomeEmailProps = {\n username: string;\n loginLink: string;\n};\n\nexport const WelcomeEmailEN = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Welcome to 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 Welcome to <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 We're excited to have you on board! Get started by logging in to\n your <strong>Intlayer</strong> account.\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={loginLink}\n >\n Log In to Your Account\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={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 If you have any questions or need help getting started, feel free\n to reply to this email. We're here to help!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailFR = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Bienvenue chez 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 Bienvenue chez <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 Nous sommes ravis de vous avoir parmi nous ! Commencez par vous\n connecter à votre compte <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={loginLink}\n >\n Connectez-vous à votre compte\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={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Si vous avez des questions ou besoin d'aide pour commencer,\n n'hésitez pas à répondre à cet e-mail. Nous sommes là pour vous\n aider !\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailES = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `¡Bienvenido a 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 Bienvenido a <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 ¡Estamos emocionados de tenerte a bordo! Comienza iniciando sesión\n en tu cuenta de <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={loginLink}\n >\n Inicia sesión en tu cuenta\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={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Si tienes preguntas o necesitas ayuda para comenzar, no dudes en\n responder a este correo electrónico. ¡Estamos aquí para ayudarte!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailRU = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Добро пожаловать в 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 Добро пожаловать в <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Здравствуйте, {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Мы рады видеть вас в нашей команде! Начните работу, войдя в свой\n аккаунт <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={loginLink}\n >\n Войти в свой аккаунт\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n или скопируйте и вставьте этот URL в ваш браузер:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Если у вас есть вопросы или нужна помощь, не стесняйтесь отвечать\n на это письмо. Мы здесь, чтобы помочь!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailJA = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `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 <strong>Intlayer</strong>へようこそ\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n {username}様、こんにちは\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Intlayerへようこそ!まずは<strong>Intlayer</strong>\n アカウントにログインして始めましょう。\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={loginLink}\n >\n アカウントにログイン\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n または、以下のURLをブラウザにコピー&ペーストしてください:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 ご不明な点やサポートが必要な場合は、このメールに返信してください。私たちがサポートいたします!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailKO = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `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 <strong>Intlayer</strong>에 오신 것을 환영합니다\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n 안녕하세요 {username}님,\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n 가입을 진심으로 환영합니다! <strong>Intlayer</strong> 계정에\n 로그인하여 시작해 보세요.\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={loginLink}\n >\n 계정에 로그인하기\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n 또는 다음 URL을 브라우저에 복사하여 붙여넣으세요:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 궁금한 점이 있거나 도움이 필요하시면 이 이메일에 답장해 주세요.\n 저희가 도와드리겠습니다!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailZH = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `欢迎来到 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 欢迎来到 <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n {username},您好!\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n 我们很高兴您的加入!请登录您的 <strong>Intlayer</strong>{' '}\n 账户开始使用。\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={loginLink}\n >\n 登录您的账户\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n 或者将此 URL 复制并粘贴到您的浏览器中:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 如果您有任何问题或需要帮助,请随时回复此邮件。我们随时为您提供帮助!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailDE = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Willkommen bei 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 Willkommen bei <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Hallo {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Wir freuen uns, Sie an Bord zu haben! Melden Sie sich in Ihrem\n <strong>Intlayer</strong>-Konto an, um loszulegen.\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={loginLink}\n >\n In Ihr Konto einloggen\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n oder kopieren Sie diese URL in Ihren Browser:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Wenn Sie Fragen haben oder Hilfe beim Einstieg benötigen, können\n Sie gerne auf diese E-Mail antworten. Wir sind für Sie da!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailAR = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `مرحباً بك في Intlayer!`;\n\n return (\n <Html dir=\"rtl\">\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 مرحباً بك في <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n أهلاً {username}،\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n نحن متحمسون لانضمامك إلينا! ابدأ بتسجيل الدخول إلى حساب\n <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={loginLink}\n >\n تسجيل الدخول إلى حسابك\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n أو قم بنسخ ولصق هذا الرابط في متصفحك:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 إذا كان لديك أي أسئلة أو كنت بحاجة إلى مساعدة، فلا تتردد في الرد\n على هذا البريد الإلكتروني. نحن هنا للمساعدة!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailIT = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Benvenuto in 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 Benvenuto in <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Ciao {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Siamo entusiasti di averti con noi! Inizia accedendo al tuo\n account <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={loginLink}\n >\n Accedi al tuo account\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n o copia e incolla questo URL nel tuo browser:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Se hai domande o hai bisogno di aiuto per iniziare, non esitare a\n rispondere a questa e-mail. Siamo qui per aiutarti!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailEN_GB = ({\n username,\n loginLink,\n}: WelcomeEmailProps) => {\n const previewText = `Welcome to 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 Welcome to <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 We're excited to have you on board! Get started by logging in to\n your <strong>Intlayer</strong> account.\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={loginLink}\n >\n Log In to Your Account\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={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 If you have any questions or need help getting started, feel free\n to reply to this email. We're here to help!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailPT = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Bem-vindo ao 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 Bem-vindo ao <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Olá {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Estamos felizes em ter você conosco! Comece fazendo login em sua\n conta <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={loginLink}\n >\n Entrar em sua conta\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n ou copie e cole esta URL no seu navegador:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Se você tiver alguma dúvida ou precisar de ajuda para começar,\n sinta-se à vontade para responder a este e-mail. Estamos aqui para\n ajudar!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailHI = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `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 <strong>Intlayer</strong> में आपका स्वागत है\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n नमस्ते {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n हमें आपको अपने साथ जोड़कर खुशी हो रही है! अपने <strong>Intlayer</strong>{' '}\n खाते में लॉग इन करके शुरुआत करें।\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={loginLink}\n >\n अपने खाते में लॉग इन करें\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n या इस URL को कॉपी करके अपने ब्राउज़र में पेस्ट करें:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 यदि आपके कोई प्रश्न हैं या शुरुआत करने में मदद चाहिए, तो बेझिझक इस ईमेल का\n उत्तर दें। हम आपकी मदद के लिए यहाँ हैं!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailTR = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Intlayer'a Hoş Geldiniz!`;\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 <strong>Intlayer</strong>'a Hoş Geldiniz\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Merhaba {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Sizi aramızda görmekten heyecan duyuyoruz!{' '}\n <strong>Intlayer</strong> hesabınıza giriş yaparak başlayın.\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={loginLink}\n >\n Hesabınıza Giriş Yapın\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n veya bu URL'yi kopyalayıp tarayıcınıza yapıştırın:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Herhangi bir sorunuz varsa veya başlamak için yardıma ihtiyacınız\n olursa, bu e-postayı yanıtlamaktan çekinmeyin. Yardım etmek için\n buradayız!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailPL = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Witaj w 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 Witaj w <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Cześć {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Cieszymy się, że jesteś z nami! Zacznij od zalogowania się na\n swoje konto <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={loginLink}\n >\n Zaloguj się do swojego konta\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n lub skopiuj i wklej ten adres URL do swojej przeglądarki:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Jeśli masz jakieś pytania lub potrzebujesz pomocy na początek,\n śmiało odpowiedz na ten e-mail. Jesteśmy tutaj, aby pomóc!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailID = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Selamat datang di 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 Selamat datang di <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Halo {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Kami senang Anda bergabung! Mulailah dengan masuk ke akun\n <strong>Intlayer</strong> Anda.\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={loginLink}\n >\n Masuk ke Akun Anda\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n atau salin dan tempel URL ini ke browser Anda:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Jika Anda memiliki pertanyaan atau butuh bantuan untuk memulai,\n jangan ragu untuk membalas email ini. Kami di sini untuk membantu!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailVI = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Chào mừng bạn đến với 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 Chào mừng bạn đến với <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Xin chào {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Chúng tôi rất vui mừng khi có bạn đồng hành! Hãy bắt đầu bằng cách\n đăng nhập vào tài khoản <strong>Intlayer</strong> của bạn.\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={loginLink}\n >\n Đăng nhập vào tài khoản của bạn\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n hoặc sao chép và dán URL này vào trình duyệt của bạn:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Nếu bạn có bất kỳ câu hỏi nào hoặc cần trợ giúp để bắt đầu, đừng\n ngần ngại trả lời email này. Chúng tôi luôn sẵn sàng hỗ trợ bạn!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nexport const WelcomeEmailUK = ({ username, loginLink }: WelcomeEmailProps) => {\n const previewText = `Ласкаво просимо до 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 Ласкаво просимо до <strong>Intlayer</strong>\n </Heading>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Вітаємо, {username},\n </Text>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n Ми раді бачити вас у нашій команді! Почніть роботу, увійшовши у\n свій аккаунт <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={loginLink}\n >\n Увійти у свій аккаунт\n </Button>\n </Section>\n <Text className=\"text-[14px] text-black leading-[24px]\">\n або скопіюйте та вставте це посилання у ваш браузер:\n </Text>\n <Link\n href={loginLink}\n className=\"text-[#8a8a8a] text-[10px] no-underline\"\n >\n {loginLink}\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 Якщо у вас виникли запитання або потрібна допомога, не соромтеся\n відповідати на цей лист. Ми тут, щоб допомогти!\n </Text>\n </Container>\n </Body>\n </Tailwind>\n </Html>\n );\n};\n\nconst PreviewProps: WelcomeEmailProps = {\n username: 'alanturing',\n loginLink: 'https://intlayer.org/login',\n};\n\nWelcomeEmailEN.PreviewProps = PreviewProps;\nWelcomeEmailFR.PreviewProps = PreviewProps;\nWelcomeEmailES.PreviewProps = PreviewProps;\nWelcomeEmailRU.PreviewProps = PreviewProps;\nWelcomeEmailJA.PreviewProps = PreviewProps;\nWelcomeEmailKO.PreviewProps = PreviewProps;\nWelcomeEmailZH.PreviewProps = PreviewProps;\nWelcomeEmailDE.PreviewProps = PreviewProps;\nWelcomeEmailAR.PreviewProps = PreviewProps;\nWelcomeEmailIT.PreviewProps = PreviewProps;\nWelcomeEmailEN_GB.PreviewProps = PreviewProps;\nWelcomeEmailPT.PreviewProps = PreviewProps;\nWelcomeEmailHI.PreviewProps = PreviewProps;\nWelcomeEmailTR.PreviewProps = PreviewProps;\nWelcomeEmailPL.PreviewProps = PreviewProps;\nWelcomeEmailID.PreviewProps = PreviewProps;\nWelcomeEmailVI.PreviewProps = PreviewProps;\nWelcomeEmailUK.PreviewProps = PreviewProps;\n"],"mappings":"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"}
|
|
@@ -1,8 +1,8 @@
|
|
|
1
|
-
import { InviteUserEmailEN, InviteUserEmailES, InviteUserEmailFR } from "./InviteUserEmail.mjs";
|
|
2
|
-
import { OAuthTokenCreatedEmailEN, OAuthTokenCreatedEmailES, OAuthTokenCreatedEmailFR } from "./OAuthTokenCreatedEmail.mjs";
|
|
3
|
-
import { PasswordChangeConfirmationEmailEN, PasswordChangeConfirmationEmailES, PasswordChangeConfirmationEmailFR } from "./PasswordChangeConfirmation.mjs";
|
|
4
|
-
import { ResetPasswordEmailEN, ResetPasswordEmailES, ResetPasswordEmailFR } from "./ResetUserPassword.mjs";
|
|
5
|
-
import { ValidateUserEmailEN, ValidateUserEmailES, ValidateUserEmailFR } from "./ValidateUserEmail.mjs";
|
|
6
|
-
import { WelcomeEmailEN, WelcomeEmailES, WelcomeEmailFR } from "./Welcome.mjs";
|
|
1
|
+
import { InviteUserEmailAR, InviteUserEmailDE, InviteUserEmailEN, InviteUserEmailEN_GB, InviteUserEmailES, InviteUserEmailFR, InviteUserEmailHI, InviteUserEmailID, InviteUserEmailIT, InviteUserEmailJA, InviteUserEmailKO, InviteUserEmailPL, InviteUserEmailPT, InviteUserEmailRU, InviteUserEmailTR, InviteUserEmailUK, InviteUserEmailVI, InviteUserEmailZH } from "./InviteUserEmail.mjs";
|
|
2
|
+
import { OAuthTokenCreatedEmailAR, OAuthTokenCreatedEmailDE, OAuthTokenCreatedEmailEN, OAuthTokenCreatedEmailEN_GB, OAuthTokenCreatedEmailES, OAuthTokenCreatedEmailFR, OAuthTokenCreatedEmailHI, OAuthTokenCreatedEmailID, OAuthTokenCreatedEmailIT, OAuthTokenCreatedEmailJA, OAuthTokenCreatedEmailKO, OAuthTokenCreatedEmailPL, OAuthTokenCreatedEmailPT, OAuthTokenCreatedEmailRU, OAuthTokenCreatedEmailTR, OAuthTokenCreatedEmailUK, OAuthTokenCreatedEmailVI, OAuthTokenCreatedEmailZH } from "./OAuthTokenCreatedEmail.mjs";
|
|
3
|
+
import { PasswordChangeConfirmationEmailAR, PasswordChangeConfirmationEmailDE, PasswordChangeConfirmationEmailEN, PasswordChangeConfirmationEmailEN_GB, PasswordChangeConfirmationEmailES, PasswordChangeConfirmationEmailFR, PasswordChangeConfirmationEmailHI, PasswordChangeConfirmationEmailID, PasswordChangeConfirmationEmailIT, PasswordChangeConfirmationEmailJA, PasswordChangeConfirmationEmailKO, PasswordChangeConfirmationEmailPL, PasswordChangeConfirmationEmailPT, PasswordChangeConfirmationEmailRU, PasswordChangeConfirmationEmailTR, PasswordChangeConfirmationEmailUK, PasswordChangeConfirmationEmailVI, PasswordChangeConfirmationEmailZH } from "./PasswordChangeConfirmation.mjs";
|
|
4
|
+
import { ResetPasswordEmailAR, ResetPasswordEmailDE, ResetPasswordEmailEN, ResetPasswordEmailEN_GB, ResetPasswordEmailES, ResetPasswordEmailFR, ResetPasswordEmailHI, ResetPasswordEmailID, ResetPasswordEmailIT, ResetPasswordEmailJA, ResetPasswordEmailKO, ResetPasswordEmailPL, ResetPasswordEmailPT, ResetPasswordEmailRU, ResetPasswordEmailTR, ResetPasswordEmailUK, ResetPasswordEmailVI, ResetPasswordEmailZH } from "./ResetUserPassword.mjs";
|
|
5
|
+
import { ValidateUserEmailAR, ValidateUserEmailDE, ValidateUserEmailEN, ValidateUserEmailEN_GB, ValidateUserEmailES, ValidateUserEmailFR, ValidateUserEmailHI, ValidateUserEmailID, ValidateUserEmailIT, ValidateUserEmailJA, ValidateUserEmailKO, ValidateUserEmailPL, ValidateUserEmailPT, ValidateUserEmailRU, ValidateUserEmailTR, ValidateUserEmailUK, ValidateUserEmailVI, ValidateUserEmailZH } from "./ValidateUserEmail.mjs";
|
|
6
|
+
import { WelcomeEmailAR, WelcomeEmailDE, WelcomeEmailEN, WelcomeEmailEN_GB, WelcomeEmailES, WelcomeEmailFR, WelcomeEmailHI, WelcomeEmailID, WelcomeEmailIT, WelcomeEmailJA, WelcomeEmailKO, WelcomeEmailPL, WelcomeEmailPT, WelcomeEmailRU, WelcomeEmailTR, WelcomeEmailUK, WelcomeEmailVI, WelcomeEmailZH } from "./Welcome.mjs";
|
|
7
7
|
|
|
8
|
-
export { InviteUserEmailEN, InviteUserEmailES, InviteUserEmailFR, OAuthTokenCreatedEmailEN, OAuthTokenCreatedEmailES, OAuthTokenCreatedEmailFR, PasswordChangeConfirmationEmailEN, PasswordChangeConfirmationEmailES, PasswordChangeConfirmationEmailFR, ResetPasswordEmailEN, ResetPasswordEmailES, ResetPasswordEmailFR, ValidateUserEmailEN, ValidateUserEmailES, ValidateUserEmailFR, WelcomeEmailEN, WelcomeEmailES, WelcomeEmailFR };
|
|
8
|
+
export { InviteUserEmailAR, InviteUserEmailDE, InviteUserEmailEN, InviteUserEmailEN_GB, InviteUserEmailES, InviteUserEmailFR, InviteUserEmailHI, InviteUserEmailID, InviteUserEmailIT, InviteUserEmailJA, InviteUserEmailKO, InviteUserEmailPL, InviteUserEmailPT, InviteUserEmailRU, InviteUserEmailTR, InviteUserEmailUK, InviteUserEmailVI, InviteUserEmailZH, OAuthTokenCreatedEmailAR, OAuthTokenCreatedEmailDE, OAuthTokenCreatedEmailEN, OAuthTokenCreatedEmailEN_GB, OAuthTokenCreatedEmailES, OAuthTokenCreatedEmailFR, OAuthTokenCreatedEmailHI, OAuthTokenCreatedEmailID, OAuthTokenCreatedEmailIT, OAuthTokenCreatedEmailJA, OAuthTokenCreatedEmailKO, OAuthTokenCreatedEmailPL, OAuthTokenCreatedEmailPT, OAuthTokenCreatedEmailRU, OAuthTokenCreatedEmailTR, OAuthTokenCreatedEmailUK, OAuthTokenCreatedEmailVI, OAuthTokenCreatedEmailZH, PasswordChangeConfirmationEmailAR, PasswordChangeConfirmationEmailDE, PasswordChangeConfirmationEmailEN, PasswordChangeConfirmationEmailEN_GB, PasswordChangeConfirmationEmailES, PasswordChangeConfirmationEmailFR, PasswordChangeConfirmationEmailHI, PasswordChangeConfirmationEmailID, PasswordChangeConfirmationEmailIT, PasswordChangeConfirmationEmailJA, PasswordChangeConfirmationEmailKO, PasswordChangeConfirmationEmailPL, PasswordChangeConfirmationEmailPT, PasswordChangeConfirmationEmailRU, PasswordChangeConfirmationEmailTR, PasswordChangeConfirmationEmailUK, PasswordChangeConfirmationEmailVI, PasswordChangeConfirmationEmailZH, ResetPasswordEmailAR, ResetPasswordEmailDE, ResetPasswordEmailEN, ResetPasswordEmailEN_GB, ResetPasswordEmailES, ResetPasswordEmailFR, ResetPasswordEmailHI, ResetPasswordEmailID, ResetPasswordEmailIT, ResetPasswordEmailJA, ResetPasswordEmailKO, ResetPasswordEmailPL, ResetPasswordEmailPT, ResetPasswordEmailRU, ResetPasswordEmailTR, ResetPasswordEmailUK, ResetPasswordEmailVI, ResetPasswordEmailZH, ValidateUserEmailAR, ValidateUserEmailDE, ValidateUserEmailEN, ValidateUserEmailEN_GB, ValidateUserEmailES, ValidateUserEmailFR, ValidateUserEmailHI, ValidateUserEmailID, ValidateUserEmailIT, ValidateUserEmailJA, ValidateUserEmailKO, ValidateUserEmailPL, ValidateUserEmailPT, ValidateUserEmailRU, ValidateUserEmailTR, ValidateUserEmailUK, ValidateUserEmailVI, ValidateUserEmailZH, WelcomeEmailAR, WelcomeEmailDE, WelcomeEmailEN, WelcomeEmailEN_GB, WelcomeEmailES, WelcomeEmailFR, WelcomeEmailHI, WelcomeEmailID, WelcomeEmailIT, WelcomeEmailJA, WelcomeEmailKO, WelcomeEmailPL, WelcomeEmailPT, WelcomeEmailRU, WelcomeEmailTR, WelcomeEmailUK, WelcomeEmailVI, WelcomeEmailZH };
|
package/dist/esm/index.mjs
CHANGED
|
@@ -16,7 +16,7 @@ import { showcaseProjectRoute, showcaseProjectRouter } from "./routes/showcasePr
|
|
|
16
16
|
import { translateRoute, translationRouter } from "./routes/translate.routes.mjs";
|
|
17
17
|
import { userRoute, userRouter } from "./routes/user.routes.mjs";
|
|
18
18
|
import { getAuth } from "./utils/auth/getAuth.mjs";
|
|
19
|
-
import { getOAuth2AccessToken } from "./controllers/oAuth2.controller.mjs";
|
|
19
|
+
import { extendOAuth2Token, getOAuth2AccessToken } from "./controllers/oAuth2.controller.mjs";
|
|
20
20
|
import { attachOAuthInstance, oAuth2Middleware } from "./middlewares/oAuth2.middleware.mjs";
|
|
21
21
|
import { authMiddleware } from "./middlewares/sessionAuth.middleware.mjs";
|
|
22
22
|
import { eventListenerRoute, eventListenerRouter } from "./routes/eventListener.routes.mjs";
|
|
@@ -111,8 +111,13 @@ const startServer = async () => {
|
|
|
111
111
|
});
|
|
112
112
|
const response = await auth.handler(req);
|
|
113
113
|
reply.status(response.status);
|
|
114
|
+
if (typeof response.headers.getSetCookie === "function") {
|
|
115
|
+
const setCookies = response.headers.getSetCookie();
|
|
116
|
+
if (setCookies.length > 0) reply.header("set-cookie", setCookies);
|
|
117
|
+
}
|
|
114
118
|
response.headers.forEach((value, key) => {
|
|
115
|
-
reply.header(key, value);
|
|
119
|
+
if (key.toLowerCase() !== "set-cookie") reply.header(key, value);
|
|
120
|
+
else if (typeof response.headers.getSetCookie !== "function") reply.header(key, value);
|
|
116
121
|
});
|
|
117
122
|
const responseBody = response.body ? await response.text() : null;
|
|
118
123
|
return reply.send(responseBody);
|
|
@@ -129,6 +134,7 @@ const startServer = async () => {
|
|
|
129
134
|
app.addHook("onRequest", authMiddleware(auth));
|
|
130
135
|
app.addHook("onRequest", attachOAuthInstance);
|
|
131
136
|
app.post("/oauth2/token", getOAuth2AccessToken);
|
|
137
|
+
app.post("/oauth2/token/extend", extendOAuth2Token);
|
|
132
138
|
app.addHook("preHandler", oAuth2Middleware);
|
|
133
139
|
if (env === "development") app.addHook("onRequest", async (request) => {
|
|
134
140
|
const queryDetails = {
|
package/dist/esm/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/index.ts"],"sourcesContent":["/// Controllers\nimport { getOAuth2AccessToken } from '@controllers/oAuth2.controller';\nimport fastifyCompress from '@fastify/compress';\nimport fastifyCookie from '@fastify/cookie';\nimport fastifyCors from '@fastify/cors';\nimport fastifyFormbody from '@fastify/formbody';\nimport fastifyHelmet from '@fastify/helmet';\nimport fastifyRateLimit from '@fastify/rate-limit';\n// Middlewares\nimport {\n attachOAuthInstance,\n oAuth2Middleware,\n} from '@middlewares/oAuth2.middleware';\nimport { authMiddleware } from '@middlewares/sessionAuth.middleware';\n// Routes\nimport { aiRoute, aiRouter } from '@routes/ai.routes';\nimport { auditRoute, auditRouter } from '@routes/audit.routes';\nimport { bitbucketRoute, bitbucketRouter } from '@routes/bitbucket.routes';\nimport { dictionaryRoute, dictionaryRouter } from '@routes/dictionary.routes';\nimport {\n eventListenerRoute,\n eventListenerRouter,\n} from '@routes/eventListener.routes';\nimport { githubRoute, githubRouter } from '@routes/github.routes';\nimport { gitlabRoute, gitlabRouter } from '@routes/gitlab.routes';\nimport { newsletterRoute, newsletterRouter } from '@routes/newsletter.routes';\nimport {\n organizationRoute,\n organizationRouter,\n} from '@routes/organization.routes';\nimport { projectRoute, projectRouter } from '@routes/project.routes';\nimport { searchRoute, searchRouter } from '@routes/search.routes';\nimport {\n showcaseProjectRoute,\n showcaseProjectRouter,\n} from '@routes/showcaseProject.routes';\nimport { stripeRoute, stripeRouter } from '@routes/stripe.routes';\nimport { tagRoute, tagRouter } from '@routes/tags.routes';\nimport { translateRoute, translationRouter } from '@routes/translate.routes';\nimport { userRoute, userRouter } from '@routes/user.routes';\nimport { processAuditJobs } from '@services/audit/recursiveAudit.service';\nimport { startTranslationWorker } from '@services/translationWorker.service';\n// Utils\nimport { getAuth } from '@utils/auth/getAuth';\nimport { corsOptions } from '@utils/cors';\nimport { connectDB } from '@utils/mongoDB/connectDB';\nimport { ipLimiter } from '@utils/rateLimiter';\nimport { connectRedis } from '@utils/redis/connectRedis';\n// Webhooks\nimport { stripeWebhook } from '@webhooks/stripe.webhook';\n// Libraries\nimport dotenv from 'dotenv';\nimport Fastify, { type FastifyInstance } from 'fastify';\nimport { intlayer, t } from 'fastify-intlayer';\n/// Logger\nimport { logger } from './logger/index';\n\nconst startServer = async () => {\n const app: FastifyInstance = Fastify({\n disableRequestLogging: true,\n trustProxy: true,\n routerOptions: {\n ignoreTrailingSlash: true,\n },\n });\n\n // Environment variables\n const env = process.env.NODE_ENV || 'development';\n\n logger.info(`run as ${env}`);\n\n dotenv.config({\n path: [`.env.${env}.local`, `.env.${env}`, '.env.local', '.env'],\n quiet: true,\n });\n\n // Security Headers\n await app.register(fastifyHelmet, {\n contentSecurityPolicy: false,\n global: true,\n });\n\n // CORS\n await app.register(fastifyCors, corsOptions);\n\n // Compression\n await app.register(fastifyCompress);\n\n // Cookie Parser\n await app.register(fastifyCookie);\n\n // Parse application/x-www-form-urlencoded\n await app.register(fastifyFormbody);\n\n // Load internationalization request handler\n await app.register(intlayer);\n\n // Rate limiter\n await app.register(fastifyRateLimit, ipLimiter);\n\n // Connect to MongoDB\n const dbClient = await connectDB();\n\n // Connect to Redis\n await connectRedis();\n\n // Start Translation Worker\n startTranslationWorker();\n\n // Resume any pending recursive audits\n processAuditJobs().catch((err) => logger.error(err));\n\n // Stripe webhook (needs raw body)\n // Register as an async plugin to prevent Fastify load errors\n await app.register(async (stripeScope) => {\n stripeScope.addContentTypeParser(\n 'application/json',\n { parseAs: 'buffer' },\n (request, body, done) => {\n // 1. Attach the raw buffer to the Fastify request for Stripe\n (request as any).rawBody = body;\n\n // 2. Parse the body to JSON so request.body behaves normally\n try {\n done(null, JSON.parse(body.toString()));\n } catch (err) {\n done(err as Error, undefined);\n }\n }\n );\n\n stripeScope.post('/webhook/stripe', async (request, reply) => {\n await stripeWebhook(request, reply);\n });\n });\n\n // Liveness check\n app.get('/', async (_request, reply) => {\n return reply.send(\n t({\n en: 'Ok - locale: en',\n fr: 'Ok - locale: fr',\n es: 'Ok - locale: es',\n })\n );\n });\n\n // Health check endpoint\n app.get('/health', async (_request, reply) => {\n return reply.status(200).send({ status: 'ok' });\n });\n\n // Session Auth\n const auth = getAuth(dbClient as any);\n\n // Better Auth handler - Using Fetch API approach for Fastify compatibility\n app.route({\n method: ['GET', 'POST'],\n url: '/api/auth/*',\n async handler(request, reply) {\n try {\n // This respects the X-Forwarded-Proto header from Coolify\n const protocol = request.protocol;\n const host = request.headers.host;\n\n // Construct request URL using the detected protocol\n const url = new URL(request.url, `${protocol}://${host}`);\n\n const headers = new Headers();\n Object.entries(request.headers).forEach(([key, value]) => {\n if (value) headers.append(key, String(value));\n });\n\n // Create Fetch API-compatible request\n const req = new Request(url.toString(), {\n method: request.method,\n headers,\n ...(request.body ? { body: JSON.stringify(request.body) } : {}),\n });\n\n // Process authentication request\n const response = await auth.handler(req);\n\n // Forward response to client\n reply.status(response.status);\n response.headers.forEach((value, key) => {\n reply.header(key, value);\n });\n\n const responseBody = response.body ? await response.text() : null;\n return reply.send(responseBody);\n } catch (error) {\n logger.error('Authentication Error:', error);\n return reply.status(500).send({\n error: 'Internal authentication error',\n code: 'AUTH_FAILURE',\n });\n }\n },\n });\n\n // Register session decorator so Fastify can pre-shape the request object (V8 optimisation)\n app.decorateRequest('session', null);\n\n // Register auth middleware as a hook\n app.addHook('onRequest', authMiddleware(auth));\n\n // // oAuth2 Auth\n app.addHook('onRequest', attachOAuthInstance);\n app.post('/oauth2/token', getOAuth2AccessToken); // Route to get the token\n app.addHook('preHandler', oAuth2Middleware);\n\n // // debug\n const isDev = env === 'development';\n if (isDev) {\n app.addHook('onRequest', async (request) => {\n const queryDetails = {\n params: request.params,\n query: request.query,\n body: request.body,\n locals: request.session,\n };\n\n logger.info(\n `API Request - ${request.method} - ${request.url} - ${JSON.stringify(queryDetails, null, 2)}`\n );\n });\n }\n\n // Routes\n await app.register(userRouter, { prefix: userRoute });\n await app.register(organizationRouter, { prefix: organizationRoute });\n await app.register(projectRouter, { prefix: projectRoute });\n await app.register(tagRouter, { prefix: tagRoute });\n await app.register(dictionaryRouter, { prefix: dictionaryRoute });\n await app.register(stripeRouter, { prefix: stripeRoute });\n await app.register(aiRouter, { prefix: aiRoute });\n await app.register(eventListenerRouter, { prefix: eventListenerRoute });\n await app.register(searchRouter, { prefix: searchRoute });\n await app.register(newsletterRouter, { prefix: newsletterRoute });\n await app.register(githubRouter, { prefix: githubRoute });\n await app.register(gitlabRouter, { prefix: gitlabRoute });\n await app.register(bitbucketRouter, { prefix: bitbucketRoute });\n await app.register(translationRouter, { prefix: translateRoute });\n await app.register(showcaseProjectRouter, { prefix: showcaseProjectRoute });\n await app.register(auditRouter, { prefix: auditRoute });\n\n // Server\n await app.listen({\n port: Number(process.env.PORT) || 3100,\n host: '0.0.0.0',\n });\n logger.info(`Listening on port ${process.env.PORT || 3100}`);\n};\n\nstartServer();\n"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.mjs","names":[],"sources":["../../src/index.ts"],"sourcesContent":["/// Controllers\nimport {\n extendOAuth2Token,\n getOAuth2AccessToken,\n} from '@controllers/oAuth2.controller';\nimport fastifyCompress from '@fastify/compress';\nimport fastifyCookie from '@fastify/cookie';\nimport fastifyCors from '@fastify/cors';\nimport fastifyFormbody from '@fastify/formbody';\nimport fastifyHelmet from '@fastify/helmet';\nimport fastifyRateLimit from '@fastify/rate-limit';\n// Middlewares\nimport {\n attachOAuthInstance,\n oAuth2Middleware,\n} from '@middlewares/oAuth2.middleware';\nimport { authMiddleware } from '@middlewares/sessionAuth.middleware';\n// Routes\nimport { aiRoute, aiRouter } from '@routes/ai.routes';\nimport { auditRoute, auditRouter } from '@routes/audit.routes';\nimport { bitbucketRoute, bitbucketRouter } from '@routes/bitbucket.routes';\nimport { dictionaryRoute, dictionaryRouter } from '@routes/dictionary.routes';\nimport {\n eventListenerRoute,\n eventListenerRouter,\n} from '@routes/eventListener.routes';\nimport { githubRoute, githubRouter } from '@routes/github.routes';\nimport { gitlabRoute, gitlabRouter } from '@routes/gitlab.routes';\nimport { newsletterRoute, newsletterRouter } from '@routes/newsletter.routes';\nimport {\n organizationRoute,\n organizationRouter,\n} from '@routes/organization.routes';\nimport { projectRoute, projectRouter } from '@routes/project.routes';\nimport { searchRoute, searchRouter } from '@routes/search.routes';\nimport {\n showcaseProjectRoute,\n showcaseProjectRouter,\n} from '@routes/showcaseProject.routes';\nimport { stripeRoute, stripeRouter } from '@routes/stripe.routes';\nimport { tagRoute, tagRouter } from '@routes/tags.routes';\nimport { translateRoute, translationRouter } from '@routes/translate.routes';\nimport { userRoute, userRouter } from '@routes/user.routes';\nimport { processAuditJobs } from '@services/audit/recursiveAudit.service';\nimport { startTranslationWorker } from '@services/translationWorker.service';\n// Utils\nimport { getAuth } from '@utils/auth/getAuth';\nimport { corsOptions } from '@utils/cors';\nimport { connectDB } from '@utils/mongoDB/connectDB';\nimport { ipLimiter } from '@utils/rateLimiter';\nimport { connectRedis } from '@utils/redis/connectRedis';\n// Webhooks\nimport { stripeWebhook } from '@webhooks/stripe.webhook';\n// Libraries\nimport dotenv from 'dotenv';\nimport Fastify, { type FastifyInstance } from 'fastify';\nimport { intlayer, t } from 'fastify-intlayer';\n/// Logger\nimport { logger } from './logger/index';\n\nconst startServer = async () => {\n const app: FastifyInstance = Fastify({\n disableRequestLogging: true,\n trustProxy: true,\n routerOptions: {\n ignoreTrailingSlash: true,\n },\n });\n\n // Environment variables\n const env = process.env.NODE_ENV || 'development';\n\n logger.info(`run as ${env}`);\n\n dotenv.config({\n path: [`.env.${env}.local`, `.env.${env}`, '.env.local', '.env'],\n quiet: true,\n });\n\n // Security Headers\n await app.register(fastifyHelmet, {\n contentSecurityPolicy: false,\n global: true,\n });\n\n // CORS\n await app.register(fastifyCors, corsOptions);\n\n // Compression\n await app.register(fastifyCompress);\n\n // Cookie Parser\n await app.register(fastifyCookie);\n\n // Parse application/x-www-form-urlencoded\n await app.register(fastifyFormbody);\n\n // Load internationalization request handler\n await app.register(intlayer);\n\n // Rate limiter\n await app.register(fastifyRateLimit, ipLimiter);\n\n // Connect to MongoDB\n const dbClient = await connectDB();\n\n // Connect to Redis\n await connectRedis();\n\n // Start Translation Worker\n startTranslationWorker();\n\n // Resume any pending recursive audits\n processAuditJobs().catch((err) => logger.error(err));\n\n // Stripe webhook (needs raw body)\n // Register as an async plugin to prevent Fastify load errors\n await app.register(async (stripeScope) => {\n stripeScope.addContentTypeParser(\n 'application/json',\n { parseAs: 'buffer' },\n (request, body, done) => {\n // 1. Attach the raw buffer to the Fastify request for Stripe\n (request as any).rawBody = body;\n\n // 2. Parse the body to JSON so request.body behaves normally\n try {\n done(null, JSON.parse(body.toString()));\n } catch (err) {\n done(err as Error, undefined);\n }\n }\n );\n\n stripeScope.post('/webhook/stripe', async (request, reply) => {\n await stripeWebhook(request, reply);\n });\n });\n\n // Liveness check\n app.get('/', async (_request, reply) => {\n return reply.send(\n t({\n en: 'Ok - locale: en',\n fr: 'Ok - locale: fr',\n es: 'Ok - locale: es',\n })\n );\n });\n\n // Health check endpoint\n app.get('/health', async (_request, reply) => {\n return reply.status(200).send({ status: 'ok' });\n });\n\n // Session Auth\n const auth = getAuth(dbClient as any);\n\n // Better Auth handler - Using Fetch API approach for Fastify compatibility\n app.route({\n method: ['GET', 'POST'],\n url: '/api/auth/*',\n async handler(request, reply) {\n try {\n // This respects the X-Forwarded-Proto header from Coolify\n const protocol = request.protocol;\n const host = request.headers.host;\n\n // Construct request URL using the detected protocol\n const url = new URL(request.url, `${protocol}://${host}`);\n\n const headers = new Headers();\n Object.entries(request.headers).forEach(([key, value]) => {\n if (value) headers.append(key, String(value));\n });\n\n // Create Fetch API-compatible request\n const req = new Request(url.toString(), {\n method: request.method,\n headers,\n ...(request.body ? { body: JSON.stringify(request.body) } : {}),\n });\n\n // Process authentication request\n const response = await auth.handler(req);\n\n // Forward response to client\n reply.status(response.status);\n\n // Forward headers, specifically handling multiple Set-Cookie headers\n // which response.headers.forEach would otherwise mangle into a single\n // comma-separated string.\n if (typeof response.headers.getSetCookie === 'function') {\n const setCookies = response.headers.getSetCookie();\n if (setCookies.length > 0) {\n reply.header('set-cookie', setCookies);\n }\n }\n\n response.headers.forEach((value, key) => {\n if (key.toLowerCase() !== 'set-cookie') {\n reply.header(key, value);\n } else if (typeof response.headers.getSetCookie !== 'function') {\n // Fallback for environments where getSetCookie is unavailable\n reply.header(key, value);\n }\n });\n\n const responseBody = response.body ? await response.text() : null;\n return reply.send(responseBody);\n } catch (error) {\n logger.error('Authentication Error:', error);\n return reply.status(500).send({\n error: 'Internal authentication error',\n code: 'AUTH_FAILURE',\n });\n }\n },\n });\n\n // Register session decorator so Fastify can pre-shape the request object (V8 optimisation)\n app.decorateRequest('session', null);\n\n // Register auth middleware as a hook\n app.addHook('onRequest', authMiddleware(auth));\n\n // // oAuth2 Auth\n app.addHook('onRequest', attachOAuthInstance);\n app.post('/oauth2/token', getOAuth2AccessToken); // Route to get the token\n app.post('/oauth2/token/extend', extendOAuth2Token); // Route to extend an active token\n app.addHook('preHandler', oAuth2Middleware);\n\n // // debug\n const isDev = env === 'development';\n if (isDev) {\n app.addHook('onRequest', async (request) => {\n const queryDetails = {\n params: request.params,\n query: request.query,\n body: request.body,\n locals: request.session,\n };\n\n logger.info(\n `API Request - ${request.method} - ${request.url} - ${JSON.stringify(queryDetails, null, 2)}`\n );\n });\n }\n\n // Routes\n await app.register(userRouter, { prefix: userRoute });\n await app.register(organizationRouter, { prefix: organizationRoute });\n await app.register(projectRouter, { prefix: projectRoute });\n await app.register(tagRouter, { prefix: tagRoute });\n await app.register(dictionaryRouter, { prefix: dictionaryRoute });\n await app.register(stripeRouter, { prefix: stripeRoute });\n await app.register(aiRouter, { prefix: aiRoute });\n await app.register(eventListenerRouter, { prefix: eventListenerRoute });\n await app.register(searchRouter, { prefix: searchRoute });\n await app.register(newsletterRouter, { prefix: newsletterRoute });\n await app.register(githubRouter, { prefix: githubRoute });\n await app.register(gitlabRouter, { prefix: gitlabRoute });\n await app.register(bitbucketRouter, { prefix: bitbucketRoute });\n await app.register(translationRouter, { prefix: translateRoute });\n await app.register(showcaseProjectRouter, { prefix: showcaseProjectRoute });\n await app.register(auditRouter, { prefix: auditRoute });\n\n // Server\n await app.listen({\n port: Number(process.env.PORT) || 3100,\n host: '0.0.0.0',\n });\n logger.info(`Listening on port ${process.env.PORT || 3100}`);\n};\n\nstartServer();\n"],"mappings":"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"}
|
|
@@ -1,14 +1,14 @@
|
|
|
1
1
|
import { logger } from "../logger/index.mjs";
|
|
2
2
|
import { ErrorHandler } from "../utils/errors/ErrorHandler.mjs";
|
|
3
3
|
import { formatSession } from "../utils/auth/getAuth.mjs";
|
|
4
|
-
import { authenticateOptions, getAuthModel } from "../utils/oAuth2.mjs";
|
|
4
|
+
import { ACCESS_TOKEN_EXPIRES_IN, authenticateOptions, getAuthModel } from "../utils/oAuth2.mjs";
|
|
5
5
|
import { getOAuth2AccessTokenContext, validateOAuth2AccessToken } from "../services/oAuth2.service.mjs";
|
|
6
6
|
import OAuth2Server, { Request, Response } from "oauth2-server";
|
|
7
7
|
|
|
8
8
|
//#region src/middlewares/oAuth2.middleware.ts
|
|
9
9
|
const oauth = new OAuth2Server({
|
|
10
10
|
model: getAuthModel(),
|
|
11
|
-
accessTokenLifetime:
|
|
11
|
+
accessTokenLifetime: ACCESS_TOKEN_EXPIRES_IN,
|
|
12
12
|
allowBearerTokensInQueryString: true
|
|
13
13
|
});
|
|
14
14
|
const attachOAuthInstance = async (request, _reply) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"oAuth2.middleware.mjs","names":["OAuthRequest","OAuthResponse"],"sources":["../../../src/middlewares/oAuth2.middleware.ts"],"sourcesContent":["import { logger } from '@logger';\nimport {\n getOAuth2AccessTokenContext,\n validateOAuth2AccessToken,\n} from '@services/oAuth2.service';\nimport { formatSession } from '@utils/auth/getAuth';\nimport { type AppError, ErrorHandler } from '@utils/errors';\nimport {
|
|
1
|
+
{"version":3,"file":"oAuth2.middleware.mjs","names":["OAuthRequest","OAuthResponse"],"sources":["../../../src/middlewares/oAuth2.middleware.ts"],"sourcesContent":["import { logger } from '@logger';\nimport {\n getOAuth2AccessTokenContext,\n validateOAuth2AccessToken,\n} from '@services/oAuth2.service';\nimport { formatSession } from '@utils/auth/getAuth';\nimport { type AppError, ErrorHandler } from '@utils/errors';\nimport {\n ACCESS_TOKEN_EXPIRES_IN,\n authenticateOptions,\n getAuthModel,\n} from '@utils/oAuth2';\nimport type { FastifyReply, FastifyRequest } from 'fastify';\nimport OAuth2Server, {\n Request as OAuthRequest,\n Response as OAuthResponse,\n} from 'oauth2-server';\n\n// Configuration of the OAuth server\nconst oauth = new OAuth2Server({\n model: getAuthModel(),\n accessTokenLifetime: ACCESS_TOKEN_EXPIRES_IN,\n allowBearerTokensInQueryString: true,\n});\n\n// Extend FastifyRequest to include oauth\ndeclare module 'fastify' {\n interface FastifyRequest {\n oauth?: OAuth2Server;\n }\n}\n\nexport type RequestWithOAuth2Information = FastifyRequest & {\n oauth: OAuth2Server;\n};\n\nexport const attachOAuthInstance = async (\n request: FastifyRequest,\n _reply: FastifyReply\n) => {\n // Attach the instance OAuth to the requests\n (request as RequestWithOAuth2Information).oauth = oauth;\n};\n\n// Middleware to authenticate requests\nexport const oAuth2Middleware = async (\n request: FastifyRequest,\n reply: FastifyReply\n): Promise<void> => {\n if (request.session?.authType) {\n // Skip if user is already authenticated (ex: session)\n return;\n }\n\n try {\n const hasToken = Boolean(request.headers.authorization);\n\n if (!hasToken) {\n // If the request does not have a token, skip the oAuth2 authentication\n // Necessary because the oAuth2 library will throw an error if the token is not present\n return;\n }\n\n // Authenticate the request using OAuth2\n const oauthRequest = new OAuthRequest({\n headers: request.headers,\n method: request.method,\n query: request.query as any,\n body: request.body as any,\n });\n const oauthResponse = new OAuthResponse(reply.raw);\n\n const oAuthToken = await (\n request as RequestWithOAuth2Information\n ).oauth.authenticate(oauthRequest, oauthResponse, authenticateOptions);\n\n const validatedToken = await validateOAuth2AccessToken(\n oAuthToken.accessToken\n );\n\n const result = await getOAuth2AccessTokenContext(validatedToken);\n\n const formattedSession = formatSession(result);\n request.session = {\n ...formattedSession,\n authType: 'oauth2',\n };\n\n logger.info(\n 'OAuth2 bearer token authenticated',\n formattedSession.user.email\n );\n } catch (error) {\n ErrorHandler.handleAppErrorResponse(reply as any, error as AppError);\n return;\n }\n};\n"],"mappings":";;;;;;;;AAmBA,MAAM,QAAQ,IAAI,aAAa;CAC7B,OAAO,cAAc;CACrB,qBAAqB;CACrB,gCAAgC;CACjC,CAAC;AAaF,MAAa,sBAAsB,OACjC,SACA,WACG;AAEH,CAAC,QAAyC,QAAQ;;AAIpD,MAAa,mBAAmB,OAC9B,SACA,UACkB;AAClB,KAAI,QAAQ,SAAS,SAEnB;AAGF,KAAI;AAGF,MAAI,CAFa,QAAQ,QAAQ,QAAQ,cAE5B,CAGX;EAIF,MAAM,eAAe,IAAIA,QAAa;GACpC,SAAS,QAAQ;GACjB,QAAQ,QAAQ;GAChB,OAAO,QAAQ;GACf,MAAM,QAAQ;GACf,CAAC;EACF,MAAM,gBAAgB,IAAIC,SAAc,MAAM,IAAI;EAYlD,MAAM,mBAAmB,cAAc,MAFlB,4BAA4B,MAJpB,2BAC3B,MAJA,QACA,MAAM,aAAa,cAAc,eAAe,oBAAoB,EAGzD,YACZ,CAE+D,CAElB;AAC9C,UAAQ,UAAU;GAChB,GAAG;GACH,UAAU;GACX;AAED,SAAO,KACL,qCACA,iBAAiB,KAAK,MACvB;UACM,OAAO;AACd,eAAa,uBAAuB,OAAc,MAAkB;AACpE"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { auditGetHandler } from "../controllers/audit.controller.mjs";
|
|
2
2
|
import { cancelRecursiveAudit, discoverUrls, getRecursiveAuditStatus, pauseRecursiveAudit, resumeRecursiveAudit, startRecursiveAudit } from "../controllers/recursiveAudit.controller.mjs";
|
|
3
|
+
import { jobIdParamsSchema } from "./paramsSchemas.mjs";
|
|
3
4
|
|
|
4
5
|
//#region src/routes/audit.routes.ts
|
|
5
6
|
const auditRoute = "/api/scan";
|
|
@@ -45,10 +46,10 @@ const auditRouter = async (fastify) => {
|
|
|
45
46
|
fastify.get(getAuditRoutes().scan.urlModel, auditGetHandler);
|
|
46
47
|
fastify.get(getAuditRoutes().discoverUrls.urlModel, discoverUrls);
|
|
47
48
|
fastify.post(getAuditRoutes().startRecursive.urlModel, startRecursiveAudit);
|
|
48
|
-
fastify.get(getAuditRoutes().getRecursiveStatus.urlModel, getRecursiveAuditStatus);
|
|
49
|
-
fastify.post(getAuditRoutes().cancelRecursive.urlModel, cancelRecursiveAudit);
|
|
50
|
-
fastify.post(getAuditRoutes().pauseRecursive.urlModel, pauseRecursiveAudit);
|
|
51
|
-
fastify.post(getAuditRoutes().resumeRecursive.urlModel, resumeRecursiveAudit);
|
|
49
|
+
fastify.get(getAuditRoutes().getRecursiveStatus.urlModel, { schema: { params: jobIdParamsSchema } }, getRecursiveAuditStatus);
|
|
50
|
+
fastify.post(getAuditRoutes().cancelRecursive.urlModel, { schema: { params: jobIdParamsSchema } }, cancelRecursiveAudit);
|
|
51
|
+
fastify.post(getAuditRoutes().pauseRecursive.urlModel, { schema: { params: jobIdParamsSchema } }, pauseRecursiveAudit);
|
|
52
|
+
fastify.post(getAuditRoutes().resumeRecursive.urlModel, { schema: { params: jobIdParamsSchema } }, resumeRecursiveAudit);
|
|
52
53
|
};
|
|
53
54
|
|
|
54
55
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"audit.routes.mjs","names":[],"sources":["../../../src/routes/audit.routes.ts"],"sourcesContent":["import { auditGetHandler } from '@controllers/audit.controller';\nimport {\n cancelRecursiveAudit,\n discoverUrls,\n getRecursiveAuditStatus,\n pauseRecursiveAudit,\n resumeRecursiveAudit,\n startRecursiveAudit,\n} from '@controllers/recursiveAudit.controller';\nimport type { FastifyInstance } from 'fastify';\nimport type { Routes } from '@/types/Routes';\n\nexport const auditRoute = '/api/scan';\n\nconst baseURL = () => `${process.env.BACKEND_URL}${auditRoute}`;\n\nexport const getAuditRoutes = () =>\n ({\n scan: {\n urlModel: '/',\n url: baseURL(),\n method: 'GET',\n },\n discoverUrls: {\n urlModel: '/recursive/discover',\n url: `${baseURL()}/recursive/discover`,\n method: 'GET',\n },\n startRecursive: {\n urlModel: '/recursive/start',\n url: `${baseURL()}/recursive/start`,\n method: 'POST',\n },\n getRecursiveStatus: {\n urlModel: '/recursive/:jobId',\n url: ({ jobId }: { jobId: string }) => `${baseURL()}/recursive/${jobId}`,\n method: 'GET',\n },\n cancelRecursive: {\n urlModel: '/recursive/:jobId/cancel',\n url: ({ jobId }: { jobId: string }) =>\n `${baseURL()}/recursive/${jobId}/cancel`,\n method: 'POST',\n },\n pauseRecursive: {\n urlModel: '/recursive/:jobId/pause',\n url: ({ jobId }: { jobId: string }) =>\n `${baseURL()}/recursive/${jobId}/pause`,\n method: 'POST',\n },\n resumeRecursive: {\n urlModel: '/recursive/:jobId/resume',\n url: ({ jobId }: { jobId: string }) =>\n `${baseURL()}/recursive/${jobId}/resume`,\n method: 'POST',\n },\n }) satisfies Routes;\n\nexport const auditRouter = async (fastify: FastifyInstance) => {\n fastify.get(getAuditRoutes().scan.urlModel, auditGetHandler);\n fastify.get(getAuditRoutes().discoverUrls.urlModel, discoverUrls);\n fastify.post(getAuditRoutes().startRecursive.urlModel, startRecursiveAudit);\n fastify.get(\n getAuditRoutes().getRecursiveStatus.urlModel,\n getRecursiveAuditStatus\n );\n fastify.post(getAuditRoutes().cancelRecursive.urlModel
|
|
1
|
+
{"version":3,"file":"audit.routes.mjs","names":[],"sources":["../../../src/routes/audit.routes.ts"],"sourcesContent":["import { auditGetHandler } from '@controllers/audit.controller';\nimport {\n cancelRecursiveAudit,\n discoverUrls,\n getRecursiveAuditStatus,\n pauseRecursiveAudit,\n resumeRecursiveAudit,\n startRecursiveAudit,\n} from '@controllers/recursiveAudit.controller';\nimport type { FastifyInstance } from 'fastify';\nimport type { Routes } from '@/types/Routes';\nimport { jobIdParamsSchema } from './paramsSchemas';\n\nexport const auditRoute = '/api/scan';\n\nconst baseURL = () => `${process.env.BACKEND_URL}${auditRoute}`;\n\nexport const getAuditRoutes = () =>\n ({\n scan: {\n urlModel: '/',\n url: baseURL(),\n method: 'GET',\n },\n discoverUrls: {\n urlModel: '/recursive/discover',\n url: `${baseURL()}/recursive/discover`,\n method: 'GET',\n },\n startRecursive: {\n urlModel: '/recursive/start',\n url: `${baseURL()}/recursive/start`,\n method: 'POST',\n },\n getRecursiveStatus: {\n urlModel: '/recursive/:jobId',\n url: ({ jobId }: { jobId: string }) => `${baseURL()}/recursive/${jobId}`,\n method: 'GET',\n },\n cancelRecursive: {\n urlModel: '/recursive/:jobId/cancel',\n url: ({ jobId }: { jobId: string }) =>\n `${baseURL()}/recursive/${jobId}/cancel`,\n method: 'POST',\n },\n pauseRecursive: {\n urlModel: '/recursive/:jobId/pause',\n url: ({ jobId }: { jobId: string }) =>\n `${baseURL()}/recursive/${jobId}/pause`,\n method: 'POST',\n },\n resumeRecursive: {\n urlModel: '/recursive/:jobId/resume',\n url: ({ jobId }: { jobId: string }) =>\n `${baseURL()}/recursive/${jobId}/resume`,\n method: 'POST',\n },\n }) satisfies Routes;\n\nexport const auditRouter = async (fastify: FastifyInstance) => {\n fastify.get(getAuditRoutes().scan.urlModel, auditGetHandler);\n fastify.get(getAuditRoutes().discoverUrls.urlModel, discoverUrls);\n fastify.post(getAuditRoutes().startRecursive.urlModel, startRecursiveAudit);\n fastify.get(\n getAuditRoutes().getRecursiveStatus.urlModel,\n { schema: { params: jobIdParamsSchema } },\n getRecursiveAuditStatus\n );\n fastify.post(\n getAuditRoutes().cancelRecursive.urlModel,\n { schema: { params: jobIdParamsSchema } },\n cancelRecursiveAudit\n );\n fastify.post(\n getAuditRoutes().pauseRecursive.urlModel,\n { schema: { params: jobIdParamsSchema } },\n pauseRecursiveAudit\n );\n fastify.post(\n getAuditRoutes().resumeRecursive.urlModel,\n { schema: { params: jobIdParamsSchema } },\n resumeRecursiveAudit\n );\n};\n"],"mappings":";;;;;AAaA,MAAa,aAAa;AAE1B,MAAM,gBAAgB,GAAG,QAAQ,IAAI,cAAc;AAEnD,MAAa,wBACV;CACC,MAAM;EACJ,UAAU;EACV,KAAK,SAAS;EACd,QAAQ;EACT;CACD,cAAc;EACZ,UAAU;EACV,KAAK,GAAG,SAAS,CAAC;EAClB,QAAQ;EACT;CACD,gBAAgB;EACd,UAAU;EACV,KAAK,GAAG,SAAS,CAAC;EAClB,QAAQ;EACT;CACD,oBAAoB;EAClB,UAAU;EACV,MAAM,EAAE,YAA+B,GAAG,SAAS,CAAC,aAAa;EACjE,QAAQ;EACT;CACD,iBAAiB;EACf,UAAU;EACV,MAAM,EAAE,YACN,GAAG,SAAS,CAAC,aAAa,MAAM;EAClC,QAAQ;EACT;CACD,gBAAgB;EACd,UAAU;EACV,MAAM,EAAE,YACN,GAAG,SAAS,CAAC,aAAa,MAAM;EAClC,QAAQ;EACT;CACD,iBAAiB;EACf,UAAU;EACV,MAAM,EAAE,YACN,GAAG,SAAS,CAAC,aAAa,MAAM;EAClC,QAAQ;EACT;CACF;AAEH,MAAa,cAAc,OAAO,YAA6B;AAC7D,SAAQ,IAAI,gBAAgB,CAAC,KAAK,UAAU,gBAAgB;AAC5D,SAAQ,IAAI,gBAAgB,CAAC,aAAa,UAAU,aAAa;AACjE,SAAQ,KAAK,gBAAgB,CAAC,eAAe,UAAU,oBAAoB;AAC3E,SAAQ,IACN,gBAAgB,CAAC,mBAAmB,UACpC,EAAE,QAAQ,EAAE,QAAQ,mBAAmB,EAAE,EACzC,wBACD;AACD,SAAQ,KACN,gBAAgB,CAAC,gBAAgB,UACjC,EAAE,QAAQ,EAAE,QAAQ,mBAAmB,EAAE,EACzC,qBACD;AACD,SAAQ,KACN,gBAAgB,CAAC,eAAe,UAChC,EAAE,QAAQ,EAAE,QAAQ,mBAAmB,EAAE,EACzC,oBACD;AACD,SAAQ,KACN,gBAAgB,CAAC,gBAAgB,UACjC,EAAE,QAAQ,EAAE,QAAQ,mBAAmB,EAAE,EACzC,qBACD"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { dictionaryIdParamsSchema, dictionaryKeyParamsSchema } from "./paramsSchemas.mjs";
|
|
1
2
|
import { addDictionary, deleteDictionary, getDictionaries, getDictionariesKeys, getDictionariesUpdateTimestamp, getDictionaryByKey, pushDictionaries, updateDictionary } from "../controllers/dictionary.controller.mjs";
|
|
2
3
|
|
|
3
4
|
//#region src/routes/dictionary.routes.ts
|
|
@@ -49,11 +50,11 @@ const dictionaryRouter = async (fastify) => {
|
|
|
49
50
|
fastify.get(getDictionaryRoutes().getDictionaries.urlModel, getDictionaries);
|
|
50
51
|
fastify.get(getDictionaryRoutes().getDictionariesKeys.urlModel, getDictionariesKeys);
|
|
51
52
|
fastify.get(getDictionaryRoutes().getDictionariesUpdateTimestamp.urlModel, getDictionariesUpdateTimestamp);
|
|
52
|
-
fastify.get(getDictionaryRoutes().getDictionary.urlModel, getDictionaryByKey);
|
|
53
|
+
fastify.get(getDictionaryRoutes().getDictionary.urlModel, { schema: { params: dictionaryKeyParamsSchema } }, getDictionaryByKey);
|
|
53
54
|
fastify.post(getDictionaryRoutes().addDictionary.urlModel, addDictionary);
|
|
54
55
|
fastify.patch(getDictionaryRoutes().pushDictionaries.urlModel, pushDictionaries);
|
|
55
|
-
fastify.put(getDictionaryRoutes().updateDictionary.urlModel, updateDictionary);
|
|
56
|
-
fastify.delete(getDictionaryRoutes().deleteDictionary.urlModel, deleteDictionary);
|
|
56
|
+
fastify.put(getDictionaryRoutes().updateDictionary.urlModel, { schema: { params: dictionaryIdParamsSchema } }, updateDictionary);
|
|
57
|
+
fastify.delete(getDictionaryRoutes().deleteDictionary.urlModel, { schema: { params: dictionaryIdParamsSchema } }, deleteDictionary);
|
|
57
58
|
};
|
|
58
59
|
|
|
59
60
|
//#endregion
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"dictionary.routes.mjs","names":[],"sources":["../../../src/routes/dictionary.routes.ts"],"sourcesContent":["import {\n addDictionary,\n deleteDictionary,\n getDictionaries,\n getDictionariesKeys,\n getDictionariesUpdateTimestamp,\n getDictionaryByKey,\n pushDictionaries,\n updateDictionary,\n} from '@controllers/dictionary.controller';\nimport type { FastifyInstance } from 'fastify';\nimport type { Routes } from '@/types/Routes';\n\nexport const dictionaryRoute = '/api/dictionary';\n\nconst baseURL = () => `${process.env.BACKEND_URL}${dictionaryRoute}`;\n\nexport const getDictionaryRoutes = () =>\n ({\n getDictionaries: {\n urlModel: '/',\n url: baseURL,\n method: 'GET',\n },\n getDictionariesKeys: {\n urlModel: '/keys',\n url: `${baseURL}/keys`,\n method: 'GET',\n },\n getDictionariesUpdateTimestamp: {\n urlModel: '/update',\n url: `${baseURL}/update`,\n method: 'GET',\n },\n getDictionary: {\n urlModel: '/:dictionaryKey',\n url: ({ dictionaryKey }: { dictionaryKey: string }) =>\n `${baseURL}/${dictionaryKey}`,\n method: 'GET',\n },\n addDictionary: {\n urlModel: '/',\n url: baseURL,\n method: 'POST',\n },\n pushDictionaries: {\n urlModel: '/',\n url: baseURL,\n method: 'PATCH',\n },\n updateDictionary: {\n urlModel: '/:dictionaryId',\n url: ({ dictionaryId }: { dictionaryId: string }) =>\n `${baseURL}/${dictionaryId}`,\n method: 'PUT',\n },\n deleteDictionary: {\n urlModel: '/:dictionaryId',\n url: ({ dictionaryId }: { dictionaryId: string }) =>\n `${baseURL}/${dictionaryId}`,\n method: 'DELETE',\n },\n }) satisfies Routes;\n\nexport const dictionaryRouter = async (fastify: FastifyInstance) => {\n fastify.get(getDictionaryRoutes().getDictionaries.urlModel, getDictionaries);\n fastify.get(\n getDictionaryRoutes().getDictionariesKeys.urlModel,\n getDictionariesKeys\n );\n fastify.get(\n getDictionaryRoutes().getDictionariesUpdateTimestamp.urlModel,\n getDictionariesUpdateTimestamp\n );\n fastify.get(getDictionaryRoutes().getDictionary.urlModel
|
|
1
|
+
{"version":3,"file":"dictionary.routes.mjs","names":[],"sources":["../../../src/routes/dictionary.routes.ts"],"sourcesContent":["import {\n addDictionary,\n deleteDictionary,\n getDictionaries,\n getDictionariesKeys,\n getDictionariesUpdateTimestamp,\n getDictionaryByKey,\n pushDictionaries,\n updateDictionary,\n} from '@controllers/dictionary.controller';\nimport type { FastifyInstance } from 'fastify';\nimport type { Routes } from '@/types/Routes';\nimport {\n dictionaryIdParamsSchema,\n dictionaryKeyParamsSchema,\n} from './paramsSchemas';\n\nexport const dictionaryRoute = '/api/dictionary';\n\nconst baseURL = () => `${process.env.BACKEND_URL}${dictionaryRoute}`;\n\nexport const getDictionaryRoutes = () =>\n ({\n getDictionaries: {\n urlModel: '/',\n url: baseURL,\n method: 'GET',\n },\n getDictionariesKeys: {\n urlModel: '/keys',\n url: `${baseURL}/keys`,\n method: 'GET',\n },\n getDictionariesUpdateTimestamp: {\n urlModel: '/update',\n url: `${baseURL}/update`,\n method: 'GET',\n },\n getDictionary: {\n urlModel: '/:dictionaryKey',\n url: ({ dictionaryKey }: { dictionaryKey: string }) =>\n `${baseURL}/${dictionaryKey}`,\n method: 'GET',\n },\n addDictionary: {\n urlModel: '/',\n url: baseURL,\n method: 'POST',\n },\n pushDictionaries: {\n urlModel: '/',\n url: baseURL,\n method: 'PATCH',\n },\n updateDictionary: {\n urlModel: '/:dictionaryId',\n url: ({ dictionaryId }: { dictionaryId: string }) =>\n `${baseURL}/${dictionaryId}`,\n method: 'PUT',\n },\n deleteDictionary: {\n urlModel: '/:dictionaryId',\n url: ({ dictionaryId }: { dictionaryId: string }) =>\n `${baseURL}/${dictionaryId}`,\n method: 'DELETE',\n },\n }) satisfies Routes;\n\nexport const dictionaryRouter = async (fastify: FastifyInstance) => {\n fastify.get(getDictionaryRoutes().getDictionaries.urlModel, getDictionaries);\n fastify.get(\n getDictionaryRoutes().getDictionariesKeys.urlModel,\n getDictionariesKeys\n );\n fastify.get(\n getDictionaryRoutes().getDictionariesUpdateTimestamp.urlModel,\n getDictionariesUpdateTimestamp\n );\n fastify.get(\n getDictionaryRoutes().getDictionary.urlModel,\n { schema: { params: dictionaryKeyParamsSchema } },\n getDictionaryByKey\n );\n fastify.post(getDictionaryRoutes().addDictionary.urlModel, addDictionary);\n fastify.patch(\n getDictionaryRoutes().pushDictionaries.urlModel,\n pushDictionaries\n );\n fastify.put(\n getDictionaryRoutes().updateDictionary.urlModel,\n { schema: { params: dictionaryIdParamsSchema } },\n updateDictionary\n );\n fastify.delete(\n getDictionaryRoutes().deleteDictionary.urlModel,\n { schema: { params: dictionaryIdParamsSchema } },\n deleteDictionary\n );\n};\n"],"mappings":";;;;AAiBA,MAAa,kBAAkB;AAE/B,MAAM,gBAAgB,GAAG,QAAQ,IAAI,cAAc;AAEnD,MAAa,6BACV;CACC,iBAAiB;EACf,UAAU;EACV,KAAK;EACL,QAAQ;EACT;CACD,qBAAqB;EACnB,UAAU;EACV,KAAK,GAAG,QAAQ;EAChB,QAAQ;EACT;CACD,gCAAgC;EAC9B,UAAU;EACV,KAAK,GAAG,QAAQ;EAChB,QAAQ;EACT;CACD,eAAe;EACb,UAAU;EACV,MAAM,EAAE,oBACN,GAAG,QAAQ,GAAG;EAChB,QAAQ;EACT;CACD,eAAe;EACb,UAAU;EACV,KAAK;EACL,QAAQ;EACT;CACD,kBAAkB;EAChB,UAAU;EACV,KAAK;EACL,QAAQ;EACT;CACD,kBAAkB;EAChB,UAAU;EACV,MAAM,EAAE,mBACN,GAAG,QAAQ,GAAG;EAChB,QAAQ;EACT;CACD,kBAAkB;EAChB,UAAU;EACV,MAAM,EAAE,mBACN,GAAG,QAAQ,GAAG;EAChB,QAAQ;EACT;CACF;AAEH,MAAa,mBAAmB,OAAO,YAA6B;AAClE,SAAQ,IAAI,qBAAqB,CAAC,gBAAgB,UAAU,gBAAgB;AAC5E,SAAQ,IACN,qBAAqB,CAAC,oBAAoB,UAC1C,oBACD;AACD,SAAQ,IACN,qBAAqB,CAAC,+BAA+B,UACrD,+BACD;AACD,SAAQ,IACN,qBAAqB,CAAC,cAAc,UACpC,EAAE,QAAQ,EAAE,QAAQ,2BAA2B,EAAE,EACjD,mBACD;AACD,SAAQ,KAAK,qBAAqB,CAAC,cAAc,UAAU,cAAc;AACzE,SAAQ,MACN,qBAAqB,CAAC,iBAAiB,UACvC,iBACD;AACD,SAAQ,IACN,qBAAqB,CAAC,iBAAiB,UACvC,EAAE,QAAQ,EAAE,QAAQ,0BAA0B,EAAE,EAChD,iBACD;AACD,SAAQ,OACN,qBAAqB,CAAC,iBAAiB,UACvC,EAAE,QAAQ,EAAE,QAAQ,0BAA0B,EAAE,EAChD,iBACD"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { organizationIdParamsSchema } from "./paramsSchemas.mjs";
|
|
1
2
|
import { addOrganization, addOrganizationMember, deleteOrganization, getOrganizations, selectOrganization, unselectOrganization, updateOrganization, updateOrganizationMembers, updateOrganizationMembersById } from "../controllers/organization.controller.mjs";
|
|
2
3
|
|
|
3
4
|
//#region src/routes/organization.routes.ts
|
|
@@ -55,10 +56,10 @@ const organizationRouter = async (fastify) => {
|
|
|
55
56
|
fastify.post(getOrganizationRoutes().addOrganization.urlModel, addOrganization);
|
|
56
57
|
fastify.put(getOrganizationRoutes().updateOrganization.urlModel, updateOrganization);
|
|
57
58
|
fastify.put(getOrganizationRoutes().updateOrganizationMembers.urlModel, updateOrganizationMembers);
|
|
58
|
-
fastify.put(getOrganizationRoutes().updateOrganizationMembersById.urlModel, updateOrganizationMembersById);
|
|
59
|
+
fastify.put(getOrganizationRoutes().updateOrganizationMembersById.urlModel, { schema: { params: organizationIdParamsSchema } }, updateOrganizationMembersById);
|
|
59
60
|
fastify.post(getOrganizationRoutes().addOrganizationMember.urlModel, addOrganizationMember);
|
|
60
61
|
fastify.delete(getOrganizationRoutes().deleteOrganization.urlModel, deleteOrganization);
|
|
61
|
-
fastify.put(getOrganizationRoutes().selectOrganization.urlModel, selectOrganization);
|
|
62
|
+
fastify.put(getOrganizationRoutes().selectOrganization.urlModel, { schema: { params: organizationIdParamsSchema } }, selectOrganization);
|
|
62
63
|
fastify.post(getOrganizationRoutes().unselectOrganization.urlModel, unselectOrganization);
|
|
63
64
|
};
|
|
64
65
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"organization.routes.mjs","names":[],"sources":["../../../src/routes/organization.routes.ts"],"sourcesContent":["import {\n addOrganization,\n addOrganizationMember,\n deleteOrganization,\n getOrganizations,\n selectOrganization,\n unselectOrganization,\n updateOrganization,\n updateOrganizationMembers,\n updateOrganizationMembersById,\n} from '@controllers/organization.controller';\nimport type { FastifyInstance } from 'fastify';\nimport type { Routes } from '@/types/Routes';\n\nexport const organizationRoute = '/api/organization';\n\nconst baseURL = () => `${process.env.BACKEND_URL}${organizationRoute}`;\n\nexport const getOrganizationRoutes = () =>\n ({\n getOrganizations: {\n urlModel: '/',\n url: baseURL(),\n method: 'GET',\n },\n addOrganization: {\n urlModel: '/',\n url: baseURL(),\n method: 'POST',\n },\n updateOrganization: {\n urlModel: '/',\n url: baseURL(),\n\n method: 'PUT',\n },\n updateOrganizationMembers: {\n urlModel: '/members',\n url: `${baseURL()}/members`,\n method: 'PUT',\n },\n updateOrganizationMembersById: {\n urlModel: '/:organizationId/members',\n url: ({ organizationId }: { organizationId: string }) =>\n `${baseURL()}/${organizationId}/members`,\n method: 'PUT',\n },\n addOrganizationMember: {\n urlModel: '/member',\n url: `${baseURL()}/member`,\n method: 'POST',\n },\n deleteOrganization: {\n urlModel: '/',\n url: baseURL(),\n method: 'DELETE',\n },\n selectOrganization: {\n urlModel: '/:organizationId',\n url: ({ organizationId }: { organizationId: string }) =>\n `${baseURL()}/${organizationId}`,\n method: 'PUT',\n },\n unselectOrganization: {\n urlModel: '/logout',\n url: `${baseURL()}/logout`,\n method: 'POST',\n },\n }) satisfies Routes;\n\nexport const organizationRouter = async (fastify: FastifyInstance) => {\n fastify.get(\n getOrganizationRoutes().getOrganizations.urlModel,\n getOrganizations\n );\n fastify.post(\n getOrganizationRoutes().addOrganization.urlModel,\n addOrganization\n );\n fastify.put(\n getOrganizationRoutes().updateOrganization.urlModel,\n updateOrganization\n );\n fastify.put(\n getOrganizationRoutes().updateOrganizationMembers.urlModel,\n updateOrganizationMembers\n );\n fastify.put(\n getOrganizationRoutes().updateOrganizationMembersById.urlModel,\n updateOrganizationMembersById\n );\n fastify.post(\n getOrganizationRoutes().addOrganizationMember.urlModel,\n addOrganizationMember\n );\n fastify.delete(\n getOrganizationRoutes().deleteOrganization.urlModel,\n deleteOrganization\n );\n fastify.put(\n getOrganizationRoutes().selectOrganization.urlModel,\n selectOrganization\n );\n fastify.post(\n getOrganizationRoutes().unselectOrganization.urlModel,\n unselectOrganization\n );\n};\n"],"mappings":"
|
|
1
|
+
{"version":3,"file":"organization.routes.mjs","names":[],"sources":["../../../src/routes/organization.routes.ts"],"sourcesContent":["import {\n addOrganization,\n addOrganizationMember,\n deleteOrganization,\n getOrganizations,\n selectOrganization,\n unselectOrganization,\n updateOrganization,\n updateOrganizationMembers,\n updateOrganizationMembersById,\n} from '@controllers/organization.controller';\nimport type { FastifyInstance } from 'fastify';\nimport type { Routes } from '@/types/Routes';\nimport { organizationIdParamsSchema } from './paramsSchemas';\n\nexport const organizationRoute = '/api/organization';\n\nconst baseURL = () => `${process.env.BACKEND_URL}${organizationRoute}`;\n\nexport const getOrganizationRoutes = () =>\n ({\n getOrganizations: {\n urlModel: '/',\n url: baseURL(),\n method: 'GET',\n },\n addOrganization: {\n urlModel: '/',\n url: baseURL(),\n method: 'POST',\n },\n updateOrganization: {\n urlModel: '/',\n url: baseURL(),\n\n method: 'PUT',\n },\n updateOrganizationMembers: {\n urlModel: '/members',\n url: `${baseURL()}/members`,\n method: 'PUT',\n },\n updateOrganizationMembersById: {\n urlModel: '/:organizationId/members',\n url: ({ organizationId }: { organizationId: string }) =>\n `${baseURL()}/${organizationId}/members`,\n method: 'PUT',\n },\n addOrganizationMember: {\n urlModel: '/member',\n url: `${baseURL()}/member`,\n method: 'POST',\n },\n deleteOrganization: {\n urlModel: '/',\n url: baseURL(),\n method: 'DELETE',\n },\n selectOrganization: {\n urlModel: '/:organizationId',\n url: ({ organizationId }: { organizationId: string }) =>\n `${baseURL()}/${organizationId}`,\n method: 'PUT',\n },\n unselectOrganization: {\n urlModel: '/logout',\n url: `${baseURL()}/logout`,\n method: 'POST',\n },\n }) satisfies Routes;\n\nexport const organizationRouter = async (fastify: FastifyInstance) => {\n fastify.get(\n getOrganizationRoutes().getOrganizations.urlModel,\n getOrganizations\n );\n fastify.post(\n getOrganizationRoutes().addOrganization.urlModel,\n addOrganization\n );\n fastify.put(\n getOrganizationRoutes().updateOrganization.urlModel,\n updateOrganization\n );\n fastify.put(\n getOrganizationRoutes().updateOrganizationMembers.urlModel,\n updateOrganizationMembers\n );\n fastify.put(\n getOrganizationRoutes().updateOrganizationMembersById.urlModel,\n { schema: { params: organizationIdParamsSchema } },\n updateOrganizationMembersById\n );\n fastify.post(\n getOrganizationRoutes().addOrganizationMember.urlModel,\n addOrganizationMember\n );\n fastify.delete(\n getOrganizationRoutes().deleteOrganization.urlModel,\n deleteOrganization\n );\n fastify.put(\n getOrganizationRoutes().selectOrganization.urlModel,\n { schema: { params: organizationIdParamsSchema } },\n selectOrganization\n );\n fastify.post(\n getOrganizationRoutes().unselectOrganization.urlModel,\n unselectOrganization\n );\n};\n"],"mappings":";;;;AAeA,MAAa,oBAAoB;AAEjC,MAAM,gBAAgB,GAAG,QAAQ,IAAI,cAAc;AAEnD,MAAa,+BACV;CACC,kBAAkB;EAChB,UAAU;EACV,KAAK,SAAS;EACd,QAAQ;EACT;CACD,iBAAiB;EACf,UAAU;EACV,KAAK,SAAS;EACd,QAAQ;EACT;CACD,oBAAoB;EAClB,UAAU;EACV,KAAK,SAAS;EAEd,QAAQ;EACT;CACD,2BAA2B;EACzB,UAAU;EACV,KAAK,GAAG,SAAS,CAAC;EAClB,QAAQ;EACT;CACD,+BAA+B;EAC7B,UAAU;EACV,MAAM,EAAE,qBACN,GAAG,SAAS,CAAC,GAAG,eAAe;EACjC,QAAQ;EACT;CACD,uBAAuB;EACrB,UAAU;EACV,KAAK,GAAG,SAAS,CAAC;EAClB,QAAQ;EACT;CACD,oBAAoB;EAClB,UAAU;EACV,KAAK,SAAS;EACd,QAAQ;EACT;CACD,oBAAoB;EAClB,UAAU;EACV,MAAM,EAAE,qBACN,GAAG,SAAS,CAAC,GAAG;EAClB,QAAQ;EACT;CACD,sBAAsB;EACpB,UAAU;EACV,KAAK,GAAG,SAAS,CAAC;EAClB,QAAQ;EACT;CACF;AAEH,MAAa,qBAAqB,OAAO,YAA6B;AACpE,SAAQ,IACN,uBAAuB,CAAC,iBAAiB,UACzC,iBACD;AACD,SAAQ,KACN,uBAAuB,CAAC,gBAAgB,UACxC,gBACD;AACD,SAAQ,IACN,uBAAuB,CAAC,mBAAmB,UAC3C,mBACD;AACD,SAAQ,IACN,uBAAuB,CAAC,0BAA0B,UAClD,0BACD;AACD,SAAQ,IACN,uBAAuB,CAAC,8BAA8B,UACtD,EAAE,QAAQ,EAAE,QAAQ,4BAA4B,EAAE,EAClD,8BACD;AACD,SAAQ,KACN,uBAAuB,CAAC,sBAAsB,UAC9C,sBACD;AACD,SAAQ,OACN,uBAAuB,CAAC,mBAAmB,UAC3C,mBACD;AACD,SAAQ,IACN,uBAAuB,CAAC,mBAAmB,UAC3C,EAAE,QAAQ,EAAE,QAAQ,4BAA4B,EAAE,EAClD,mBACD;AACD,SAAQ,KACN,uBAAuB,CAAC,qBAAqB,UAC7C,qBACD"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
//#region src/routes/paramsSchemas.ts
|
|
2
|
+
const objectIdProperty = {
|
|
3
|
+
type: "string",
|
|
4
|
+
pattern: "^[a-fA-F0-9]{24}$"
|
|
5
|
+
};
|
|
6
|
+
const userIdParamsSchema = {
|
|
7
|
+
type: "object",
|
|
8
|
+
required: ["userId"],
|
|
9
|
+
properties: { userId: objectIdProperty }
|
|
10
|
+
};
|
|
11
|
+
const emailParamsSchema = {
|
|
12
|
+
type: "object",
|
|
13
|
+
required: ["email"],
|
|
14
|
+
properties: { email: {
|
|
15
|
+
type: "string",
|
|
16
|
+
format: "email"
|
|
17
|
+
} }
|
|
18
|
+
};
|
|
19
|
+
const organizationIdParamsSchema = {
|
|
20
|
+
type: "object",
|
|
21
|
+
required: ["organizationId"],
|
|
22
|
+
properties: { organizationId: objectIdProperty }
|
|
23
|
+
};
|
|
24
|
+
const projectIdParamsSchema = {
|
|
25
|
+
type: "object",
|
|
26
|
+
required: ["projectId"],
|
|
27
|
+
properties: { projectId: objectIdProperty }
|
|
28
|
+
};
|
|
29
|
+
const dictionaryIdParamsSchema = {
|
|
30
|
+
type: "object",
|
|
31
|
+
required: ["dictionaryId"],
|
|
32
|
+
properties: { dictionaryId: objectIdProperty }
|
|
33
|
+
};
|
|
34
|
+
const dictionaryKeyParamsSchema = {
|
|
35
|
+
type: "object",
|
|
36
|
+
required: ["dictionaryKey"],
|
|
37
|
+
properties: { dictionaryKey: {
|
|
38
|
+
type: "string",
|
|
39
|
+
minLength: 1,
|
|
40
|
+
maxLength: 255
|
|
41
|
+
} }
|
|
42
|
+
};
|
|
43
|
+
const tagIdParamsSchema = {
|
|
44
|
+
type: "object",
|
|
45
|
+
required: ["tagId"],
|
|
46
|
+
properties: { tagId: objectIdProperty }
|
|
47
|
+
};
|
|
48
|
+
const jobIdParamsSchema = {
|
|
49
|
+
type: "object",
|
|
50
|
+
required: ["jobId"],
|
|
51
|
+
properties: { jobId: {
|
|
52
|
+
type: "string",
|
|
53
|
+
minLength: 1
|
|
54
|
+
} }
|
|
55
|
+
};
|
|
56
|
+
const accessTokenParamsSchema = {
|
|
57
|
+
type: "object",
|
|
58
|
+
required: ["accessToken"],
|
|
59
|
+
properties: { accessToken: {
|
|
60
|
+
type: "string",
|
|
61
|
+
minLength: 1
|
|
62
|
+
} }
|
|
63
|
+
};
|
|
64
|
+
|
|
65
|
+
//#endregion
|
|
66
|
+
export { accessTokenParamsSchema, dictionaryIdParamsSchema, dictionaryKeyParamsSchema, emailParamsSchema, jobIdParamsSchema, organizationIdParamsSchema, projectIdParamsSchema, tagIdParamsSchema, userIdParamsSchema };
|
|
67
|
+
//# sourceMappingURL=paramsSchemas.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"paramsSchemas.mjs","names":[],"sources":["../../../src/routes/paramsSchemas.ts"],"sourcesContent":["/**\n * Shared JSON Schema fragments for URL `params` validation.\n *\n * These are consumed by Fastify's built-in ajv validator via the\n * `{ schema: { params: ... } }` option on route definitions. Invalid\n * requests are rejected with a 400 response before the handler runs.\n */\n\nconst OBJECT_ID_PATTERN = '^[a-fA-F0-9]{24}$';\n\nconst objectIdProperty = {\n type: 'string',\n pattern: OBJECT_ID_PATTERN,\n} as const;\n\nexport const userIdParamsSchema = {\n type: 'object',\n required: ['userId'],\n properties: { userId: objectIdProperty },\n} as const;\n\nexport const emailParamsSchema = {\n type: 'object',\n required: ['email'],\n properties: { email: { type: 'string', format: 'email' } },\n} as const;\n\nexport const organizationIdParamsSchema = {\n type: 'object',\n required: ['organizationId'],\n properties: { organizationId: objectIdProperty },\n} as const;\n\nexport const projectIdParamsSchema = {\n type: 'object',\n required: ['projectId'],\n properties: { projectId: objectIdProperty },\n} as const;\n\nexport const dictionaryIdParamsSchema = {\n type: 'object',\n required: ['dictionaryId'],\n properties: { dictionaryId: objectIdProperty },\n} as const;\n\nexport const dictionaryKeyParamsSchema = {\n type: 'object',\n required: ['dictionaryKey'],\n properties: {\n dictionaryKey: { type: 'string', minLength: 1, maxLength: 255 },\n },\n} as const;\n\nexport const tagIdParamsSchema = {\n type: 'object',\n required: ['tagId'],\n properties: { tagId: objectIdProperty },\n} as const;\n\nexport const jobIdParamsSchema = {\n type: 'object',\n required: ['jobId'],\n properties: { jobId: { type: 'string', minLength: 1 } },\n} as const;\n\nexport const accessTokenParamsSchema = {\n type: 'object',\n required: ['accessToken'],\n properties: { accessToken: { type: 'string', minLength: 1 } },\n} as const;\n"],"mappings":";AAUA,MAAM,mBAAmB;CACvB,MAAM;CACN,SAAS;CACV;AAED,MAAa,qBAAqB;CAChC,MAAM;CACN,UAAU,CAAC,SAAS;CACpB,YAAY,EAAE,QAAQ,kBAAkB;CACzC;AAED,MAAa,oBAAoB;CAC/B,MAAM;CACN,UAAU,CAAC,QAAQ;CACnB,YAAY,EAAE,OAAO;EAAE,MAAM;EAAU,QAAQ;EAAS,EAAE;CAC3D;AAED,MAAa,6BAA6B;CACxC,MAAM;CACN,UAAU,CAAC,iBAAiB;CAC5B,YAAY,EAAE,gBAAgB,kBAAkB;CACjD;AAED,MAAa,wBAAwB;CACnC,MAAM;CACN,UAAU,CAAC,YAAY;CACvB,YAAY,EAAE,WAAW,kBAAkB;CAC5C;AAED,MAAa,2BAA2B;CACtC,MAAM;CACN,UAAU,CAAC,eAAe;CAC1B,YAAY,EAAE,cAAc,kBAAkB;CAC/C;AAED,MAAa,4BAA4B;CACvC,MAAM;CACN,UAAU,CAAC,gBAAgB;CAC3B,YAAY,EACV,eAAe;EAAE,MAAM;EAAU,WAAW;EAAG,WAAW;EAAK,EAChE;CACF;AAED,MAAa,oBAAoB;CAC/B,MAAM;CACN,UAAU,CAAC,QAAQ;CACnB,YAAY,EAAE,OAAO,kBAAkB;CACxC;AAED,MAAa,oBAAoB;CAC/B,MAAM;CACN,UAAU,CAAC,QAAQ;CACnB,YAAY,EAAE,OAAO;EAAE,MAAM;EAAU,WAAW;EAAG,EAAE;CACxD;AAED,MAAa,0BAA0B;CACrC,MAAM;CACN,UAAU,CAAC,cAAc;CACzB,YAAY,EAAE,aAAa;EAAE,MAAM;EAAU,WAAW;EAAG,EAAE;CAC9D"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { projectIdParamsSchema } from "./paramsSchemas.mjs";
|
|
1
2
|
import { addProject, deleteProject, getCIConfiguration, getProjects, pushCIConfiguration, pushProjectConfiguration, selectProject, triggerBuild, triggerWebhook, unselectProject, updateProject, updateProjectMembers } from "../controllers/project.controller.mjs";
|
|
2
3
|
import { addNewAccessKey, deleteAccessKey, refreshAccessKey } from "../controllers/projectAccessKey.controller.mjs";
|
|
3
4
|
|
|
@@ -92,7 +93,7 @@ const projectRouter = async (fastify) => {
|
|
|
92
93
|
fastify.patch(getProjectRoutes().refreshAccessKey.urlModel, refreshAccessKey);
|
|
93
94
|
fastify.delete(getProjectRoutes().deleteAccessKey.urlModel, deleteAccessKey);
|
|
94
95
|
fastify.post(getProjectRoutes().unselectProject.urlModel, unselectProject);
|
|
95
|
-
fastify.put(getProjectRoutes().selectProject.urlModel, selectProject);
|
|
96
|
+
fastify.put(getProjectRoutes().selectProject.urlModel, { schema: { params: projectIdParamsSchema } }, selectProject);
|
|
96
97
|
fastify.post(getProjectRoutes().triggerBuild.urlModel, triggerBuild);
|
|
97
98
|
fastify.post(getProjectRoutes().triggerWebhook.urlModel, triggerWebhook);
|
|
98
99
|
fastify.get(getProjectRoutes().getCIConfiguration.urlModel, getCIConfiguration);
|