@hedhog/admin 0.46.39 → 0.46.40

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.
Files changed (111) hide show
  1. package/README.md +960 -960
  2. package/dist/auth/auth.service.d.ts.map +1 -1
  3. package/dist/auth/auth.service.js +6 -4
  4. package/dist/auth/auth.service.js.map +1 -1
  5. package/dist/auth/consts/body.js +24 -24
  6. package/dist/emails/templates.d.ts.map +1 -1
  7. package/dist/emails/templates.js +48 -48
  8. package/dist/emails/templates.js.map +1 -1
  9. package/frontend/menu/components/create-panel.tsx.ejs +55 -55
  10. package/frontend/menu/components/update-panel.tsx.ejs +67 -67
  11. package/frontend/menu/locales/en/admin.menu.json +11 -11
  12. package/frontend/menu/locales/pt/admin.menu.json +11 -11
  13. package/frontend/menu/react-query/handlers.ts.ejs +28 -28
  14. package/frontend/menu/react-query/requests.ts.ejs +56 -56
  15. package/frontend/menu-locale/locales/en/admin.menu-locale.json +11 -11
  16. package/frontend/menu-locale/locales/pt/admin.menu-locale.json +11 -11
  17. package/frontend/menu-screen/locales/en/admin.menu-screen.json +11 -11
  18. package/frontend/menu-screen/locales/pt/admin.menu-screen.json +11 -11
  19. package/frontend/multifactor/components/create-panel.tsx.ejs +55 -55
  20. package/frontend/multifactor/components/update-panel.tsx.ejs +70 -70
  21. package/frontend/multifactor/locales/en/admin.multifactor.json +11 -11
  22. package/frontend/multifactor/locales/pt/admin.multifactor.json +11 -11
  23. package/frontend/multifactor/react-query/handlers.ts.ejs +28 -28
  24. package/frontend/multifactor/react-query/requests.ts.ejs +59 -59
  25. package/frontend/multifactor-locale/locales/en/admin.multifactor-locale.json +11 -11
  26. package/frontend/multifactor-locale/locales/pt/admin.multifactor-locale.json +11 -11
  27. package/frontend/screen/components/create-panel.tsx.ejs +55 -55
  28. package/frontend/screen/components/update-panel.tsx.ejs +67 -67
  29. package/frontend/screen/locales/en/admin.screen.json +11 -11
  30. package/frontend/screen/locales/pt/admin.screen.json +11 -11
  31. package/frontend/screen/react-query/handlers.ts.ejs +28 -28
  32. package/frontend/screen/react-query/requests.ts.ejs +56 -56
  33. package/frontend/screen-locale/locales/en/admin.screen-locale.json +11 -11
  34. package/frontend/screen-locale/locales/pt/admin.screen-locale.json +11 -11
  35. package/frontend/translation/components/create-panel.tsx.ejs +52 -52
  36. package/frontend/translation/components/update-panel.tsx.ejs +67 -67
  37. package/frontend/translation/locales/en/admin.translation.json +11 -11
  38. package/frontend/translation/locales/pt/admin.translation.json +11 -11
  39. package/frontend/translation/react-query/handlers.ts.ejs +28 -28
  40. package/frontend/translation/react-query/requests.ts.ejs +58 -58
  41. package/frontend/translation-namespace/components/create-panel.tsx.ejs +53 -53
  42. package/frontend/translation-namespace/components/update-panel.tsx.ejs +70 -70
  43. package/frontend/translation-namespace/locales/en/admin.translation-namespace.json +11 -11
  44. package/frontend/translation-namespace/locales/pt/admin.translation-namespace.json +11 -11
  45. package/frontend/translation-namespace/react-query/handlers.ts.ejs +28 -28
  46. package/frontend/translation-namespace/react-query/requests.ts.ejs +60 -60
  47. package/frontend/user/components/create-panel.tsx.ejs +52 -52
  48. package/frontend/user/components/update-panel.tsx.ejs +64 -64
  49. package/frontend/user/locales/en/admin.user.json +11 -11
  50. package/frontend/user/locales/pt/admin.user.json +11 -11
  51. package/frontend/user/react-query/handlers.ts.ejs +28 -28
  52. package/frontend/user/react-query/requests.ts.ejs +55 -55
  53. package/hedhog.yaml +783 -783
  54. package/package.json +45 -45
  55. package/src/admin.module.ts +39 -39
  56. package/src/auth/auth.controller.ts +88 -88
  57. package/src/auth/auth.module.ts +41 -41
  58. package/src/auth/auth.service.spec.ts +196 -196
  59. package/src/auth/auth.service.ts +355 -349
  60. package/src/auth/consts/body.ts +27 -27
  61. package/src/auth/dto/change.dto.ts +19 -19
  62. package/src/auth/dto/email.dto.ts +15 -15
  63. package/src/auth/dto/forget.dto.ts +6 -6
  64. package/src/auth/dto/login.dto.ts +21 -21
  65. package/src/auth/dto/otp.dto.ts +11 -11
  66. package/src/auth/dto/reset.dto.ts +14 -14
  67. package/src/auth/enums/multifactor-type.enum.ts +4 -4
  68. package/src/auth/guards/auth.guard.ts +54 -54
  69. package/src/auth/types/user.type.ts +8 -8
  70. package/src/dto/delete.dto.ts +8 -8
  71. package/src/dto/update-ids.dto.ts +9 -9
  72. package/src/emails/index.ts +2 -2
  73. package/src/emails/lib.ts +40 -40
  74. package/src/emails/templates.ts +62 -60
  75. package/src/index.ts +20 -20
  76. package/src/menu/dto/create.dto.ts +25 -25
  77. package/src/menu/dto/order.dto.ts +8 -8
  78. package/src/menu/dto/update.dto.ts +19 -19
  79. package/src/menu/menu.controller.ts +105 -105
  80. package/src/menu/menu.module.ts +18 -18
  81. package/src/menu/menu.service.spec.ts +247 -247
  82. package/src/menu/menu.service.ts +263 -263
  83. package/src/role/dto/create.dto.ts +7 -7
  84. package/src/role/dto/update.dto.ts +4 -4
  85. package/src/role/guards/role.guard.ts +121 -121
  86. package/src/role/role.controller.ts +126 -126
  87. package/src/role/role.module.ts +28 -28
  88. package/src/role/role.service.spec.ts +417 -417
  89. package/src/role/role.service.ts +289 -289
  90. package/src/route/dto/create.dto.ts +13 -13
  91. package/src/route/dto/update.dto.ts +15 -15
  92. package/src/route/route.controller.ts +91 -91
  93. package/src/route/route.module.ts +18 -18
  94. package/src/route/route.service.spec.ts +300 -300
  95. package/src/route/route.service.ts +164 -164
  96. package/src/screen/dto/create.dto.ts +11 -11
  97. package/src/screen/dto/update.dto.ts +19 -19
  98. package/src/screen/screen.controller.ts +93 -93
  99. package/src/screen/screen.module.ts +18 -18
  100. package/src/screen/screen.service.spec.ts +298 -298
  101. package/src/screen/screen.service.ts +179 -179
  102. package/src/types/http-method.ts +8 -8
  103. package/src/user/constants/user.constants.ts +1 -1
  104. package/src/user/dto/create.dto.ts +24 -24
  105. package/src/user/dto/update.dto.ts +41 -41
  106. package/src/user/user.controller.ts +75 -75
  107. package/src/user/user.module.ts +18 -18
  108. package/src/user/user.service.spec.ts +294 -294
  109. package/src/user/user.service.ts +129 -129
  110. package/tsconfig.lib.json +9 -9
  111. package/tsconfig.production.json +20 -20
@@ -1,27 +1,27 @@
1
- export const getBody = (url: string): string => {
2
- return `
3
- <body style="font-family: Arial, sans-serif; background-color: #eef2f7; color: #333; margin: 0; padding: 0;">
4
- <div style="max-width: 600px; margin: 40px auto; background-color: #ffffff; border: 1px solid #dcdfe6; border-radius: 10px; padding: 40px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);">
5
- <div style="text-align: center; margin-bottom: 30px;">
6
- <img style="margin-bottom: 16px" src="https://coinbitclub.vip/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcoinbitclub-logo.b29de722.png&w=640&q=75" alt="Coinbitclub Logo" />
7
- <h1 style="color: #2c3e50; font-size: 26px; margin: 0;">Recuperação de Senha - CoinBitClub</h1>
8
- </div>
9
- <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
10
- <p>Olá,</p>
11
- <p>Recebemos uma solicitação para redefinir sua senha em nossa plataforma. Para garantir que você é o proprietário desta conta, criamos um link exclusivo para redefinir sua senha.</p>
12
- <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
13
- <p>Para redefinir sua senha, clique no botão abaixo:</p>
14
- </div>
15
- <div style="text-align: center; margin: 30px 0;">
16
- <a href="${url}" style="display: inline-block; padding: 15px 30px; background-color: #3498db; color: #ffffff; text-decoration: none; font-size: 16px; font-weight: bold; border-radius: 8px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);">Redefinir Senha</a>
17
- </div>
18
- <div style="font-size: 14px; line-height: 1.7; color: #666;">
19
- <p>Por razões de segurança, evite compartilhar suas informações de login ou clicar em links suspeitos.</p>
20
- <p>Agradecemos por escolher nossa plataforma!</p>
21
- </div>
22
- <div style="text-align: center; font-size: 13px; color: #95a5a6; margin-top: 40px; border-top: 1px solid #ecf0f1; padding-top: 20px;">
23
- <p>Este email foi enviado automaticamente. Por favor, não responda.</p>
24
- </div>
25
- </div>
26
- </body>`;
27
- };
1
+ export const getBody = (url: string): string => {
2
+ return `
3
+ <body style="font-family: Arial, sans-serif; background-color: #eef2f7; color: #333; margin: 0; padding: 0;">
4
+ <div style="max-width: 600px; margin: 40px auto; background-color: #ffffff; border: 1px solid #dcdfe6; border-radius: 10px; padding: 40px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);">
5
+ <div style="text-align: center; margin-bottom: 30px;">
6
+ <img style="margin-bottom: 16px" src="https://coinbitclub.vip/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcoinbitclub-logo.b29de722.png&w=640&q=75" alt="Coinbitclub Logo" />
7
+ <h1 style="color: #2c3e50; font-size: 26px; margin: 0;">Recuperação de Senha - CoinBitClub</h1>
8
+ </div>
9
+ <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
10
+ <p>Olá,</p>
11
+ <p>Recebemos uma solicitação para redefinir sua senha em nossa plataforma. Para garantir que você é o proprietário desta conta, criamos um link exclusivo para redefinir sua senha.</p>
12
+ <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
13
+ <p>Para redefinir sua senha, clique no botão abaixo:</p>
14
+ </div>
15
+ <div style="text-align: center; margin: 30px 0;">
16
+ <a href="${url}" style="display: inline-block; padding: 15px 30px; background-color: #3498db; color: #ffffff; text-decoration: none; font-size: 16px; font-weight: bold; border-radius: 8px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);">Redefinir Senha</a>
17
+ </div>
18
+ <div style="font-size: 14px; line-height: 1.7; color: #666;">
19
+ <p>Por razões de segurança, evite compartilhar suas informações de login ou clicar em links suspeitos.</p>
20
+ <p>Agradecemos por escolher nossa plataforma!</p>
21
+ </div>
22
+ <div style="text-align: center; font-size: 13px; color: #95a5a6; margin-top: 40px; border-top: 1px solid #ecf0f1; padding-top: 20px;">
23
+ <p>Este email foi enviado automaticamente. Por favor, não responda.</p>
24
+ </div>
25
+ </div>
26
+ </body>`;
27
+ };
@@ -1,19 +1,19 @@
1
- import { IsEmail, IsNotEmpty, MinLength } from 'class-validator';
2
-
3
- export class ChangeDTO {
4
- @IsNotEmpty()
5
- @MinLength(8)
6
- newPassword: string;
7
-
8
- @IsNotEmpty()
9
- @MinLength(8)
10
- confirmNewPassword: string;
11
-
12
- @IsNotEmpty()
13
- @MinLength(8)
14
- currentPassword: string;
15
-
16
- @IsNotEmpty()
17
- @IsEmail()
18
- email: string;
19
- }
1
+ import { IsEmail, IsNotEmpty, MinLength } from 'class-validator';
2
+
3
+ export class ChangeDTO {
4
+ @IsNotEmpty()
5
+ @MinLength(8)
6
+ newPassword: string;
7
+
8
+ @IsNotEmpty()
9
+ @MinLength(8)
10
+ confirmNewPassword: string;
11
+
12
+ @IsNotEmpty()
13
+ @MinLength(8)
14
+ currentPassword: string;
15
+
16
+ @IsNotEmpty()
17
+ @IsEmail()
18
+ email: string;
19
+ }
@@ -1,15 +1,15 @@
1
- import { IsEmail, IsNotEmpty, MinLength } from 'class-validator';
2
-
3
- export class EmailDTO {
4
- @IsNotEmpty()
5
- @IsEmail()
6
- currentEmail: string;
7
-
8
- @IsNotEmpty()
9
- @MinLength(8)
10
- password: string;
11
-
12
- @IsNotEmpty()
13
- @IsEmail()
14
- newEmail: string;
15
- }
1
+ import { IsEmail, IsNotEmpty, MinLength } from 'class-validator';
2
+
3
+ export class EmailDTO {
4
+ @IsNotEmpty()
5
+ @IsEmail()
6
+ currentEmail: string;
7
+
8
+ @IsNotEmpty()
9
+ @MinLength(8)
10
+ password: string;
11
+
12
+ @IsNotEmpty()
13
+ @IsEmail()
14
+ newEmail: string;
15
+ }
@@ -1,6 +1,6 @@
1
- import { IsEmail } from 'class-validator';
2
-
3
- export class ForgetDTO {
4
- @IsEmail()
5
- email: string;
6
- }
1
+ import { IsEmail } from 'class-validator';
2
+
3
+ export class ForgetDTO {
4
+ @IsEmail()
5
+ email: string;
6
+ }
@@ -1,21 +1,21 @@
1
- import { IsEmail, IsStrongPassword } from 'class-validator';
2
-
3
- export class LoginDTO {
4
- @IsEmail({}, { message: 'O e-mail informado não é válido.' })
5
- email: string;
6
-
7
- @IsStrongPassword(
8
- {
9
- minLength: 6,
10
- minLowercase: 1,
11
- minUppercase: 0,
12
- minNumbers: 0,
13
- minSymbols: 0,
14
- },
15
- {
16
- message:
17
- 'A senha deve ter pelo menos 6 caracteres e conter pelo menos 1 letra minúscula.',
18
- },
19
- )
20
- password: string;
21
- }
1
+ import { IsEmail, IsStrongPassword } from 'class-validator';
2
+
3
+ export class LoginDTO {
4
+ @IsEmail({}, { message: 'O e-mail informado não é válido.' })
5
+ email: string;
6
+
7
+ @IsStrongPassword(
8
+ {
9
+ minLength: 6,
10
+ minLowercase: 1,
11
+ minUppercase: 0,
12
+ minNumbers: 0,
13
+ minSymbols: 0,
14
+ },
15
+ {
16
+ message:
17
+ 'A senha deve ter pelo menos 6 caracteres e conter pelo menos 1 letra minúscula.',
18
+ },
19
+ )
20
+ password: string;
21
+ }
@@ -1,11 +1,11 @@
1
- import { IsInt, IsJWT, Max, Min } from 'class-validator';
2
-
3
- export class OtpDTO {
4
- @Min(0)
5
- @Max(999999)
6
- @IsInt()
7
- code: number;
8
-
9
- @IsJWT()
10
- token: string;
11
- }
1
+ import { IsInt, IsJWT, Max, Min } from 'class-validator';
2
+
3
+ export class OtpDTO {
4
+ @Min(0)
5
+ @Max(999999)
6
+ @IsInt()
7
+ code: number;
8
+
9
+ @IsJWT()
10
+ token: string;
11
+ }
@@ -1,14 +1,14 @@
1
- import { IsNotEmpty, MinLength } from 'class-validator';
2
-
3
- export class ResetDTO {
4
- @IsNotEmpty()
5
- @MinLength(8)
6
- newPassword: string;
7
-
8
- @IsNotEmpty()
9
- @MinLength(8)
10
- confirmNewPassword: string;
11
-
12
- @IsNotEmpty()
13
- code: string;
14
- }
1
+ import { IsNotEmpty, MinLength } from 'class-validator';
2
+
3
+ export class ResetDTO {
4
+ @IsNotEmpty()
5
+ @MinLength(8)
6
+ newPassword: string;
7
+
8
+ @IsNotEmpty()
9
+ @MinLength(8)
10
+ confirmNewPassword: string;
11
+
12
+ @IsNotEmpty()
13
+ code: string;
14
+ }
@@ -1,4 +1,4 @@
1
- export enum MultifactorType {
2
- EMAIL = 1,
3
- APP = 2,
4
- }
1
+ export enum MultifactorType {
2
+ EMAIL = 1,
3
+ APP = 2,
4
+ }
@@ -1,54 +1,54 @@
1
- import { IS_PUBLIC_KEY } from '@hedhog/core';
2
- import {
3
- CanActivate,
4
- ExecutionContext,
5
- Injectable,
6
- UnauthorizedException,
7
- } from '@nestjs/common';
8
- import { Reflector } from '@nestjs/core';
9
- import { Request } from 'express';
10
- import { AuthService } from '../auth.service';
11
-
12
- @Injectable()
13
- export class AuthGuard implements CanActivate {
14
- constructor(
15
- private auth: AuthService,
16
- private reflector: Reflector,
17
- ) {}
18
-
19
- async canActivate(context: ExecutionContext): Promise<boolean> {
20
- const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
21
- context.getHandler(),
22
- context.getClass(),
23
- ]);
24
-
25
- const request = context.switchToHttp().getRequest();
26
- const token = this.extractTokenFromHeader(request);
27
-
28
- if (!token) {
29
- if (isPublic) {
30
- return true;
31
- } else {
32
- throw new UnauthorizedException();
33
- }
34
- }
35
- try {
36
- const payload = await this.auth.verifyToken(token);
37
-
38
- request['auth'] = payload;
39
- } catch (error) {
40
- if (isPublic) {
41
- return true;
42
- } else {
43
- throw new UnauthorizedException(error);
44
- }
45
- }
46
- return true;
47
- }
48
-
49
- private extractTokenFromHeader(request: Request): string | undefined {
50
- const [type, token] = request.headers.authorization?.split(' ') ?? [];
51
-
52
- return type === 'Bearer' ? token : undefined;
53
- }
54
- }
1
+ import { IS_PUBLIC_KEY } from '@hedhog/core';
2
+ import {
3
+ CanActivate,
4
+ ExecutionContext,
5
+ Injectable,
6
+ UnauthorizedException,
7
+ } from '@nestjs/common';
8
+ import { Reflector } from '@nestjs/core';
9
+ import { Request } from 'express';
10
+ import { AuthService } from '../auth.service';
11
+
12
+ @Injectable()
13
+ export class AuthGuard implements CanActivate {
14
+ constructor(
15
+ private auth: AuthService,
16
+ private reflector: Reflector,
17
+ ) {}
18
+
19
+ async canActivate(context: ExecutionContext): Promise<boolean> {
20
+ const isPublic = this.reflector.getAllAndOverride<boolean>(IS_PUBLIC_KEY, [
21
+ context.getHandler(),
22
+ context.getClass(),
23
+ ]);
24
+
25
+ const request = context.switchToHttp().getRequest();
26
+ const token = this.extractTokenFromHeader(request);
27
+
28
+ if (!token) {
29
+ if (isPublic) {
30
+ return true;
31
+ } else {
32
+ throw new UnauthorizedException();
33
+ }
34
+ }
35
+ try {
36
+ const payload = await this.auth.verifyToken(token);
37
+
38
+ request['auth'] = payload;
39
+ } catch (error) {
40
+ if (isPublic) {
41
+ return true;
42
+ } else {
43
+ throw new UnauthorizedException(error);
44
+ }
45
+ }
46
+ return true;
47
+ }
48
+
49
+ private extractTokenFromHeader(request: Request): string | undefined {
50
+ const [type, token] = request.headers.authorization?.split(' ') ?? [];
51
+
52
+ return type === 'Bearer' ? token : undefined;
53
+ }
54
+ }
@@ -1,8 +1,8 @@
1
- export type User = {
2
- id: number;
3
- name: string;
4
- email: string;
5
- password: string;
6
- created_at: string;
7
- updated_at: string;
8
- };
1
+ export type User = {
2
+ id: number;
3
+ name: string;
4
+ email: string;
5
+ password: string;
6
+ created_at: string;
7
+ updated_at: string;
8
+ };
@@ -1,8 +1,8 @@
1
- import { ArrayMinSize, IsArray, IsInt } from 'class-validator';
2
-
3
- export class DeleteDTO {
4
- @IsArray()
5
- @ArrayMinSize(1)
6
- @IsInt({ each: true })
7
- ids: number[];
8
- }
1
+ import { ArrayMinSize, IsArray, IsInt } from 'class-validator';
2
+
3
+ export class DeleteDTO {
4
+ @IsArray()
5
+ @ArrayMinSize(1)
6
+ @IsInt({ each: true })
7
+ ids: number[];
8
+ }
@@ -1,9 +1,9 @@
1
- import { IsArray, IsInt } from 'class-validator';
2
-
3
- export class UpdateIdsDTO {
4
- @IsInt({
5
- each: true,
6
- })
7
- @IsArray()
8
- ids: number[];
9
- }
1
+ import { IsArray, IsInt } from 'class-validator';
2
+
3
+ export class UpdateIdsDTO {
4
+ @IsInt({
5
+ each: true,
6
+ })
7
+ @IsArray()
8
+ ids: number[];
9
+ }
@@ -1,2 +1,2 @@
1
- export * from './lib'
2
- export * from './templates'
1
+ export * from './lib'
2
+ export * from './templates'
package/src/emails/lib.ts CHANGED
@@ -1,40 +1,40 @@
1
- import { bodies, defaults } from "./templates";
2
-
3
- const getBodyWrapper = (content: string[]) => {
4
- return defaults.default_body(content)
5
- }
6
-
7
- // auth/login
8
- export const getUserLoginEmail = () => {
9
- const body = bodies['user_login'];
10
- const content = [defaults.header('Novo login no CoinBitClub'), body(), defaults.footer()]
11
- return getBodyWrapper(content);
12
- }
13
-
14
- // auth/forget
15
- export const getForgetPasswordEmail = (url: string) => {
16
- const body = bodies['user_forget_password'];
17
- const content = [defaults.header('Recuperação de senha'), body(url), defaults.footer()]
18
- return getBodyWrapper(content);
19
- }
20
-
21
- // auth/change-password
22
- export const getChangePasswordEmail = () => {
23
- const body = bodies['user_change_password'];
24
- const content = [defaults.header('Senha alterada'), body(), defaults.footer()]
25
- return getBodyWrapper(content);
26
- }
27
-
28
- // auth/change-email
29
- export const getChangeEmailEmail = () => {
30
- const body = bodies['user_change_email'];
31
- const content = [defaults.header('Email alterado'), body(), defaults.footer()]
32
- return getBodyWrapper(content);
33
- }
34
-
35
- // auth/reset
36
- export const getResetPasswordEmail = () => {
37
- const body = bodies['user_reset_password'];
38
- const content = [defaults.header('Senha recuperada'), body(), defaults.footer()]
39
- return getBodyWrapper(content);
40
- }
1
+ import { bodies, defaults } from "./templates";
2
+
3
+ const getBodyWrapper = (content: string[]) => {
4
+ return defaults.default_body(content)
5
+ }
6
+
7
+ // auth/login
8
+ export const getUserLoginEmail = () => {
9
+ const body = bodies['user_login'];
10
+ const content = [defaults.header('Novo login no CoinBitClub'), body(), defaults.footer()]
11
+ return getBodyWrapper(content);
12
+ }
13
+
14
+ // auth/forget
15
+ export const getForgetPasswordEmail = (url: string) => {
16
+ const body = bodies['user_forget_password'];
17
+ const content = [defaults.header('Recuperação de senha'), body(url), defaults.footer()]
18
+ return getBodyWrapper(content);
19
+ }
20
+
21
+ // auth/change-password
22
+ export const getChangePasswordEmail = () => {
23
+ const body = bodies['user_change_password'];
24
+ const content = [defaults.header('Senha alterada'), body(), defaults.footer()]
25
+ return getBodyWrapper(content);
26
+ }
27
+
28
+ // auth/change-email
29
+ export const getChangeEmailEmail = () => {
30
+ const body = bodies['user_change_email'];
31
+ const content = [defaults.header('Email alterado'), body(), defaults.footer()]
32
+ return getBodyWrapper(content);
33
+ }
34
+
35
+ // auth/reset
36
+ export const getResetPasswordEmail = () => {
37
+ const body = bodies['user_reset_password'];
38
+ const content = [defaults.header('Senha recuperada'), body(), defaults.footer()]
39
+ return getBodyWrapper(content);
40
+ }
@@ -1,60 +1,62 @@
1
- export const defaults = {
2
- header: (title: string) => `
3
- <div style="text-align: center; margin-bottom: 30px;">
4
- <img style="margin-bottom: 16px" src="https://coinbitclub.vip/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcoinbitclub-logo.b29de722.png&w=640&q=75" alt="Coinbitclub Logo" />
5
- <h1 style="color: #2c3e50; font-size: 26px; margin: 0;">${title}</h1>
6
- </div>
7
- `,
8
- default_body: (content: string[]) => `<body style="font-family: Arial, sans-serif; background-color: #eef2f7; color: #333; margin: 0; padding: 0;">
9
- <div style="max-width: 600px; margin: 40px auto; background-color: #ffffff; border: 1px solid #dcdfe6; border-radius: 10px; padding: 40px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);">
10
- ${content.join("")}
11
- </div>
12
- </body>`,
13
- footer: () => `
14
- <div style="text-align: center; font-size: 13px; color: #95a5a6; margin-top: 40px; border-top: 1px solid #ecf0f1; padding-top: 20px;">
15
- <p>Este email foi enviado automaticamente. Por favor, não responda.</p>
16
- </div>
17
- `
18
- }
19
-
20
- export const bodies = {
21
- user_forget_password: (url: string) => `
22
- <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
23
- <p>Olá,</p>
24
- <p>Recebemos uma solicitação para redefinir sua senha em nossa plataforma. Para garantir que você é o proprietário desta conta, criamos um link exclusivo para redefinir sua senha.</p>
25
- <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
26
- <p>Para redefinir sua senha, clique no botão abaixo:</p>
27
- </div>
28
- <div style="text-align: center; margin: 30px 0;">
29
- <a href="${url}" style="display: inline-block; padding: 15px 30px; background-color: #3498db; color: #ffffff; text-decoration: none; font-size: 16px; font-weight: bold; border-radius: 8px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);">Redefinir Senha</a>
30
- </div>
31
- <div style="font-size: 14px; line-height: 1.7; color: #666;">
32
- <p>Por razões de segurança, evite compartilhar suas informações de login ou clicar em links suspeitos.</p>
33
- <p>Agradecemos por escolher nossa plataforma!</p>
34
- </div>
35
- `,
36
- user_change_password: () => `
37
- <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
38
- <p>Sua senha no CoinBitClub foi alterada recentemente.</p>
39
- <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
40
- </div>
41
- `,
42
- user_change_email: () => `
43
- <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
44
- <p>Seu endereço de e-mail foi alterado com sucesso. Se você realizou essa alteração, nenhuma ação adicional é necessária.</p>
45
- <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
46
- </div>
47
- `,
48
- user_reset_password: () => `
49
- <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
50
- <p>Sua senha foi redefinida com sucesso. Agora você já pode acessar sua conta normalmente utilizando a nova senha.</p>
51
- <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
52
- </div>
53
- `,
54
- user_login: () => `
55
- <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
56
- <p>Um novo login foi realizado recentemente na sua conta do CoinBitClub.</p>
57
- <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
58
- </div>
59
- `,
60
- }
1
+ export const defaults = {
2
+ header: (title: string) => `
3
+ <div style="text-align: center; margin-bottom: 30px;">
4
+ <img style="margin-bottom: 16px" src="https://coinbitclub.vip/_next/image?url=%2F_next%2Fstatic%2Fmedia%2Fcoinbitclub-logo.b29de722.png&w=640&q=75" alt="Coinbitclub Logo" />
5
+ <h1 style="color: #2c3e50; font-size: 26px; margin: 0;">${title}</h1>
6
+ </div>
7
+ `,
8
+ default_body: (
9
+ content: string[],
10
+ ) => `<body style="font-family: Arial, sans-serif; background-color: #eef2f7; color: #333; margin: 0; padding: 0;">
11
+ <div style="max-width: 600px; margin: 40px auto; background-color: #ffffff; border: 1px solid #dcdfe6; border-radius: 10px; padding: 40px; box-shadow: 0 4px 12px rgba(0, 0, 0, 0.15);">
12
+ ${content.join('')}
13
+ </div>
14
+ </body>`,
15
+ footer: () => `
16
+ <div style="text-align: center; font-size: 13px; color: #95a5a6; margin-top: 40px; border-top: 1px solid #ecf0f1; padding-top: 20px;">
17
+ <p>Este email foi enviado automaticamente. Por favor, não responda.</p>
18
+ </div>
19
+ `,
20
+ };
21
+
22
+ export const bodies = {
23
+ user_forget_password: (url: string) => `
24
+ <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
25
+ <p>Olá,</p>
26
+ <p>Recebemos uma solicitação para redefinir sua senha em nossa plataforma. Para garantir que você é o proprietário desta conta, criamos um link exclusivo para redefinir sua senha.</p>
27
+ <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
28
+ <p>Para redefinir sua senha, clique no botão abaixo:</p>
29
+ </div>
30
+ <div style="text-align: center; margin: 30px 0;">
31
+ <a href="${url}" style="display: inline-block; padding: 15px 30px; background-color: #3498db; color: #ffffff; text-decoration: none; font-size: 16px; font-weight: bold; border-radius: 8px; box-shadow: 0 2px 5px rgba(0, 0, 0, 0.2);">Redefinir Senha</a>
32
+ </div>
33
+ <div style="font-size: 14px; line-height: 1.7; color: #666;">
34
+ <p>Por razões de segurança, evite compartilhar suas informações de login ou clicar em links suspeitos.</p>
35
+ <p>Agradecemos por escolher nossa plataforma!</p>
36
+ </div>
37
+ `,
38
+ user_change_password: () => `
39
+ <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
40
+ <p>Sua senha no CoinBitClub foi alterada recentemente.</p>
41
+ <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
42
+ </div>
43
+ `,
44
+ user_change_email: () => `
45
+ <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
46
+ <p>Seu endereço de e-mail foi alterado com sucesso. Se você realizou essa alteração, nenhuma ação adicional é necessária.</p>
47
+ <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
48
+ </div>
49
+ `,
50
+ user_reset_password: () => `
51
+ <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
52
+ <p>Sua senha foi redefinida com sucesso. Agora você já pode acessar sua conta normalmente utilizando a nova senha.</p>
53
+ <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
54
+ </div>
55
+ `,
56
+ user_login: () => `
57
+ <div style="line-height: 1.8; font-size: 16px; color: #555; text-align: justify;">
58
+ <p>Um novo login foi realizado recentemente na sua conta do CoinBitClub.</p>
59
+ <p>Se você não fez essa solicitação, entre em contato conosco imediatamente para garantir a segurança de sua conta.</p>
60
+ </div>
61
+ `,
62
+ };