FEATURE: Reset and block users

This commit is contained in:
Rafael Moraes
2025-03-13 14:44:54 -03:00
parent e316bd1a7b
commit 2aec60a354
7 changed files with 2013 additions and 1416 deletions
+79
View File
@@ -52,6 +52,9 @@ import jwt from 'jsonwebtoken';
import { LanguageEnum } from 'src/utils/languages.enum';
import { Language } from 'src/decorators/language.decorator';
import { ApiInternalOnlyEndpoint } from 'src/decorators/swagger.decorator';
import { Metadata } from '@grpc/grpc-js';
import { lastValueFrom } from 'rxjs';
import { UserOneResponse } from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/messages';
@ApiTags('Auth')
@ApiHeaders([{ name: 'dadosfera-lang', enum: LanguageEnum, required: false }])
@@ -61,6 +64,7 @@ export class AuthController {
logger: DadosferaLogger;
redirectUrl: string;
constructor(
@Inject(DadosferaLogger)
dadosferaLogger: DadosferaLogger,
@@ -344,4 +348,79 @@ export class AuthController {
return { token, email, url, language };
}
@ApiInternalOnlyEndpoint()
@Post('users/block')
@RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN)
@HttpCode(HttpStatus.OK)
async blockUsers(
@Body() body: { userIds: string[] },
@Language() language: LanguageEnum,
@User() user: RequestUser,
) {
this.logger.info('blockUsers - Starting request', { userIds: body.userIds });
try {
const metadata = PackTheMetadata({
access_token: user.access_token,
language,
});
this.logger.debug('Calling blockUsers service', {
userIds: body.userIds,
metadata: {
access_token: metadata.get('access_token'),
language: metadata.get('language')
}
});
const result = await this.authClient.blockUsers(body.userIds, metadata);
this.logger.info('blockUsers - Success', { result });
return result;
} catch (error) {
this.logger.error('blockUsers - Error', {
error: error.message,
stack: error.stack,
userIds: body.userIds
});
throw error;
}
}
@ApiInternalOnlyEndpoint()
@Post('users/unblock')
@RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN)
@HttpCode(HttpStatus.OK)
async unblockUsers(
@Body() body: { userIds: string[] },
@Language() language: LanguageEnum,
@User() user: RequestUser,
) {
this.logger.info('unblockUsers');
const metadata = PackTheMetadata({
access_token: user.access_token,
language,
});
return this.authClient.unblockUsers(body.userIds, metadata);
}
@ApiInternalOnlyEndpoint()
@Post('users/reset')
@RequireAllPermissions(PERMISSIONS_GROUPS.USERS.permissions.ADMIN)
@HttpCode(HttpStatus.OK)
async resetUsers(
@Body() body: { userIds: string[] },
@Language() language: LanguageEnum,
@User() user: RequestUser,
) {
this.logger.info('resetUsers');
const metadata = PackTheMetadata({
access_token: user.access_token,
language,
});
const defaultPassword = 'SenhaPadrão123';
return this.authClient.resetUsers(body.userIds, metadata, defaultPassword);
}
}
+67
View File
@@ -20,6 +20,7 @@ import {
} from '@dadosfera/protospack-v2/dist/lib/Duc/interfaces/messages';
import { DucClient } from '../duc/client.config';
import { Metadata } from '@grpc/grpc-js';
import { UserActionRequest, UserActionResponse } from './dtos/login';
@Injectable()
export class AuthClientService implements OnModuleInit {
@@ -168,4 +169,70 @@ export class AuthClientService implements OnModuleInit {
this.authService.AuthOauthSignIn({ token, username, refreshToken: '' }),
);
}
async blockUsers(userIds: string[], metadata: Metadata): Promise<UserActionResponse> {
this.logger.info('blockUsers - Service starting', { userIds });
try {
this.logger.debug('Calling BlockUser gRPC method', {
request: { users: { userIds } },
metadata: {
access_token: metadata.get('access_token'),
language: metadata.get('language')
}
});
const response = await lastValueFrom<UserActionResponse>(
(this.authService as any).BlockUser({ users: { userIds } }, metadata),
);
this.logger.info('blockUsers - Service success', { response });
return response;
} catch (error) {
this.logger.error('blockUsers - Service error', {
error: error.message,
stack: error.stack,
request: { users: { userIds } }
});
throw error;
}
}
async unblockUsers(userIds: string[], metadata: Metadata): Promise<UserActionResponse> {
this.logger.info('unblockUsers');
return lastValueFrom(
(this.authService as any).UnblockUser({ users: { userIds } }, metadata),
);
}
async resetUsers(userIds: string[], metadata: Metadata, defaultPassword: string): Promise<UserActionResponse> {
this.logger.info('resetUsers');
try {
this.logger.debug('Calling ResetUser gRPC method', {
request: { users: { userIds }, defaultPassword },
metadata: {
access_token: metadata.get('access_token'),
language: metadata.get('language')
}
});
const response = await lastValueFrom<UserActionResponse>(
(this.authService as any).ResetUser({
users: { userIds },
defaultPassword
}, metadata)
);
this.logger.info('resetUsers - Success', { response });
return response;
} catch (error) {
this.logger.error('resetUsers - Error', {
error: error.message,
stack: error.stack,
request: { users: { userIds }, defaultPassword }
});
throw error;
}
}
}
+24
View File
@@ -67,16 +67,27 @@ export class AuthUser {
export class AuthCustomer {
@ApiProperty()
modules: string[];
@ApiProperty()
id: string;
@ApiProperty()
name: string;
@ApiProperty()
tier: string;
@ApiProperty()
scheduleLimit: string;
@ApiProperty()
links: Link[];
@ApiProperty()
displayName: string;
@ApiProperty()
themeEnabled: boolean;
}
export class AuthSignInReq implements AuthSignInRequest {
@@ -118,3 +129,16 @@ export class AuthRefreshAccessTokenRes {
@ApiProperty()
accessToken: string;
}
export interface UserActionRequest {
users: {
userIds: string[];
};
defaultPassword?: string;
}
export interface UserActionResponse {
message: string;
successfulUsers: string[];
failedUsers: string[];
}