@hedhog/admin 0.46.35 → 0.46.39
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 +960 -960
- package/dist/auth/auth.service.d.ts.map +1 -1
- package/dist/auth/auth.service.js +30 -4
- package/dist/auth/auth.service.js.map +1 -1
- package/dist/auth/consts/body.js +24 -24
- package/dist/emails/index.d.ts +3 -0
- package/dist/emails/index.d.ts.map +1 -0
- package/dist/emails/index.js +19 -0
- package/dist/emails/index.js.map +1 -0
- package/dist/emails/lib.d.ts +6 -0
- package/dist/emails/lib.d.ts.map +1 -0
- package/dist/emails/lib.js +43 -0
- package/dist/emails/lib.js.map +1 -0
- package/dist/emails/templates.d.ts +13 -0
- package/dist/emails/templates.d.ts.map +1 -0
- package/dist/emails/templates.js +63 -0
- package/dist/emails/templates.js.map +1 -0
- package/frontend/menu/components/create-panel.tsx.ejs +55 -55
- package/frontend/menu/components/update-panel.tsx.ejs +67 -67
- package/frontend/menu/locales/en/admin.menu.json +11 -11
- package/frontend/menu/locales/pt/admin.menu.json +11 -11
- package/frontend/menu/react-query/handlers.ts.ejs +28 -28
- package/frontend/menu/react-query/requests.ts.ejs +56 -56
- package/frontend/menu-locale/locales/en/admin.menu-locale.json +11 -11
- package/frontend/menu-locale/locales/pt/admin.menu-locale.json +11 -11
- package/frontend/menu-screen/locales/en/admin.menu-screen.json +11 -11
- package/frontend/menu-screen/locales/pt/admin.menu-screen.json +11 -11
- package/frontend/multifactor/components/create-panel.tsx.ejs +55 -55
- package/frontend/multifactor/components/update-panel.tsx.ejs +70 -70
- package/frontend/multifactor/locales/en/admin.multifactor.json +11 -11
- package/frontend/multifactor/locales/pt/admin.multifactor.json +11 -11
- package/frontend/multifactor/react-query/handlers.ts.ejs +28 -28
- package/frontend/multifactor/react-query/requests.ts.ejs +59 -59
- package/frontend/multifactor-locale/locales/en/admin.multifactor-locale.json +11 -11
- package/frontend/multifactor-locale/locales/pt/admin.multifactor-locale.json +11 -11
- package/frontend/screen/components/create-panel.tsx.ejs +55 -55
- package/frontend/screen/components/update-panel.tsx.ejs +67 -67
- package/frontend/screen/locales/en/admin.screen.json +11 -11
- package/frontend/screen/locales/pt/admin.screen.json +11 -11
- package/frontend/screen/react-query/handlers.ts.ejs +28 -28
- package/frontend/screen/react-query/requests.ts.ejs +56 -56
- package/frontend/screen-locale/locales/en/admin.screen-locale.json +11 -11
- package/frontend/screen-locale/locales/pt/admin.screen-locale.json +11 -11
- package/frontend/translation/components/create-panel.tsx.ejs +52 -52
- package/frontend/translation/components/update-panel.tsx.ejs +67 -67
- package/frontend/translation/locales/en/admin.translation.json +11 -11
- package/frontend/translation/locales/pt/admin.translation.json +11 -11
- package/frontend/translation/react-query/handlers.ts.ejs +28 -28
- package/frontend/translation/react-query/requests.ts.ejs +58 -58
- package/frontend/translation-namespace/components/create-panel.tsx.ejs +53 -53
- package/frontend/translation-namespace/components/update-panel.tsx.ejs +70 -70
- package/frontend/translation-namespace/locales/en/admin.translation-namespace.json +11 -11
- package/frontend/translation-namespace/locales/pt/admin.translation-namespace.json +11 -11
- package/frontend/translation-namespace/react-query/handlers.ts.ejs +28 -28
- package/frontend/translation-namespace/react-query/requests.ts.ejs +60 -60
- package/frontend/user/components/create-panel.tsx.ejs +52 -52
- package/frontend/user/components/update-panel.tsx.ejs +64 -64
- package/frontend/user/locales/en/admin.user.json +11 -11
- package/frontend/user/locales/pt/admin.user.json +11 -11
- package/frontend/user/react-query/handlers.ts.ejs +28 -28
- package/frontend/user/react-query/requests.ts.ejs +55 -55
- package/hedhog.yaml +783 -783
- package/package.json +45 -43
- package/src/admin.module.ts +39 -39
- package/src/auth/auth.controller.ts +88 -88
- package/src/auth/auth.module.ts +41 -41
- package/src/auth/auth.service.spec.ts +196 -196
- package/src/auth/auth.service.ts +349 -316
- package/src/auth/consts/body.ts +27 -27
- package/src/auth/dto/change.dto.ts +19 -19
- package/src/auth/dto/email.dto.ts +15 -15
- package/src/auth/dto/forget.dto.ts +6 -6
- package/src/auth/dto/login.dto.ts +21 -21
- package/src/auth/dto/otp.dto.ts +11 -11
- package/src/auth/dto/reset.dto.ts +14 -14
- package/src/auth/enums/multifactor-type.enum.ts +4 -4
- package/src/auth/guards/auth.guard.ts +54 -54
- package/src/auth/types/user.type.ts +8 -8
- package/src/dto/delete.dto.ts +8 -8
- package/src/dto/update-ids.dto.ts +9 -9
- package/src/emails/index.ts +2 -0
- package/src/emails/lib.ts +40 -0
- package/src/emails/templates.ts +60 -0
- package/src/index.ts +20 -20
- package/src/menu/dto/create.dto.ts +25 -25
- package/src/menu/dto/order.dto.ts +8 -8
- package/src/menu/dto/update.dto.ts +19 -19
- package/src/menu/menu.controller.ts +105 -105
- package/src/menu/menu.module.ts +18 -18
- package/src/menu/menu.service.spec.ts +247 -247
- package/src/menu/menu.service.ts +263 -263
- package/src/role/dto/create.dto.ts +7 -7
- package/src/role/dto/update.dto.ts +4 -4
- package/src/role/guards/role.guard.ts +121 -121
- package/src/role/role.controller.ts +126 -126
- package/src/role/role.module.ts +28 -28
- package/src/role/role.service.spec.ts +417 -417
- package/src/role/role.service.ts +289 -289
- package/src/route/dto/create.dto.ts +13 -13
- package/src/route/dto/update.dto.ts +15 -15
- package/src/route/route.controller.ts +91 -91
- package/src/route/route.module.ts +18 -18
- package/src/route/route.service.spec.ts +300 -300
- package/src/route/route.service.ts +164 -164
- package/src/screen/dto/create.dto.ts +11 -11
- package/src/screen/dto/update.dto.ts +19 -19
- package/src/screen/screen.controller.ts +93 -93
- package/src/screen/screen.module.ts +18 -18
- package/src/screen/screen.service.spec.ts +298 -298
- package/src/screen/screen.service.ts +179 -179
- package/src/types/http-method.ts +8 -8
- package/src/user/constants/user.constants.ts +1 -1
- package/src/user/dto/create.dto.ts +24 -24
- package/src/user/dto/update.dto.ts +41 -41
- package/src/user/user.controller.ts +75 -75
- package/src/user/user.module.ts +18 -18
- package/src/user/user.service.spec.ts +294 -294
- package/src/user/user.service.ts +129 -129
- package/tsconfig.lib.json +9 -9
- package/tsconfig.production.json +20 -20
package/src/auth/consts/body.ts
CHANGED
@@ -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
|
+
}
|
package/src/auth/dto/otp.dto.ts
CHANGED
@@ -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
|
+
};
|
package/src/dto/delete.dto.ts
CHANGED
@@ -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
|
+
}
|
@@ -0,0 +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
|
+
}
|
@@ -0,0 +1,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: (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
|
+
}
|
package/src/index.ts
CHANGED
@@ -1,20 +1,20 @@
|
|
1
|
-
// Admin Module
|
2
|
-
export * from './admin.module';
|
3
|
-
|
4
|
-
// Auth Module
|
5
|
-
export * from './auth/auth.service';
|
6
|
-
export * from './auth/guards/auth.guard';
|
7
|
-
|
8
|
-
// Menu Module
|
9
|
-
export * from './menu/menu.service';
|
10
|
-
|
11
|
-
// Permission Module
|
12
|
-
export * from './role/guards/role.guard';
|
13
|
-
export * from './role/role.service';
|
14
|
-
|
15
|
-
// Screen Module
|
16
|
-
export * from './screen/screen.service';
|
17
|
-
|
18
|
-
// User Module
|
19
|
-
export * from './user/constants/user.constants';
|
20
|
-
export * from './user/user.service';
|
1
|
+
// Admin Module
|
2
|
+
export * from './admin.module';
|
3
|
+
|
4
|
+
// Auth Module
|
5
|
+
export * from './auth/auth.service';
|
6
|
+
export * from './auth/guards/auth.guard';
|
7
|
+
|
8
|
+
// Menu Module
|
9
|
+
export * from './menu/menu.service';
|
10
|
+
|
11
|
+
// Permission Module
|
12
|
+
export * from './role/guards/role.guard';
|
13
|
+
export * from './role/role.service';
|
14
|
+
|
15
|
+
// Screen Module
|
16
|
+
export * from './screen/screen.service';
|
17
|
+
|
18
|
+
// User Module
|
19
|
+
export * from './user/constants/user.constants';
|
20
|
+
export * from './user/user.service';
|
@@ -1,25 +1,25 @@
|
|
1
|
-
import { IsInt, IsNotEmpty, IsOptional, IsString, Min } from 'class-validator';
|
2
|
-
|
3
|
-
export class CreateDTO {
|
4
|
-
@IsString({ message: 'O slug deve ser uma string' })
|
5
|
-
@IsNotEmpty({ message: 'O slug é obrigatório.' })
|
6
|
-
slug: string;
|
7
|
-
|
8
|
-
@IsString({ message: 'A url deve ser uma string' })
|
9
|
-
@IsNotEmpty({ message: 'A url é obrigatório.' })
|
10
|
-
url: string;
|
11
|
-
|
12
|
-
@IsInt({ message: 'Order deve ser um número.' })
|
13
|
-
@Min(1)
|
14
|
-
@IsOptional()
|
15
|
-
order?: number;
|
16
|
-
|
17
|
-
@IsString({ message: 'O ícone deve ser uma string' })
|
18
|
-
@IsOptional()
|
19
|
-
icon?: string;
|
20
|
-
|
21
|
-
@IsInt({ message: 'MenuID deve ser um número.' })
|
22
|
-
@Min(1)
|
23
|
-
@IsOptional()
|
24
|
-
menuId?: number;
|
25
|
-
}
|
1
|
+
import { IsInt, IsNotEmpty, IsOptional, IsString, Min } from 'class-validator';
|
2
|
+
|
3
|
+
export class CreateDTO {
|
4
|
+
@IsString({ message: 'O slug deve ser uma string' })
|
5
|
+
@IsNotEmpty({ message: 'O slug é obrigatório.' })
|
6
|
+
slug: string;
|
7
|
+
|
8
|
+
@IsString({ message: 'A url deve ser uma string' })
|
9
|
+
@IsNotEmpty({ message: 'A url é obrigatório.' })
|
10
|
+
url: string;
|
11
|
+
|
12
|
+
@IsInt({ message: 'Order deve ser um número.' })
|
13
|
+
@Min(1)
|
14
|
+
@IsOptional()
|
15
|
+
order?: number;
|
16
|
+
|
17
|
+
@IsString({ message: 'O ícone deve ser uma string' })
|
18
|
+
@IsOptional()
|
19
|
+
icon?: string;
|
20
|
+
|
21
|
+
@IsInt({ message: 'MenuID deve ser um número.' })
|
22
|
+
@Min(1)
|
23
|
+
@IsOptional()
|
24
|
+
menuId?: number;
|
25
|
+
}
|
@@ -1,8 +1,8 @@
|
|
1
|
-
import { ArrayMinSize, IsArray, IsInt } from 'class-validator';
|
2
|
-
|
3
|
-
export class OrderDTO {
|
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 OrderDTO {
|
4
|
+
@IsArray()
|
5
|
+
@ArrayMinSize(1)
|
6
|
+
@IsInt({ each: true })
|
7
|
+
ids: number[];
|
8
|
+
}
|