muchos cambios :'v
This commit is contained in:
@@ -1,72 +1,87 @@
|
||||
import { Body, Controller, Delete, Get, Param, ParseIntPipe, Patch, Post, UseGuards } from '@nestjs/common';
|
||||
import {
|
||||
Body,
|
||||
Controller,
|
||||
Delete,
|
||||
Get,
|
||||
Param,
|
||||
ParseIntPipe,
|
||||
Patch,
|
||||
Post,
|
||||
UseGuards,
|
||||
} from '@nestjs/common';
|
||||
import { AdministradorService } from './administrador.service';
|
||||
import { Administrador } from './administrador.entity';
|
||||
import { Administrador } from './entities/administrador.entity';
|
||||
import { CreateAdministradorDto } from './dto/create-administrador.dto';
|
||||
import { UpdateAdministradorDto } from './dto/update.administrador.dto';
|
||||
import { LoginAdministradorDto } from './dto/login-administrador.dto';
|
||||
import { ChangePasswordDto } from './dto/change-password.dto';
|
||||
import { ApiBearerAuth } from '@nestjs/swagger';
|
||||
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
|
||||
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
|
||||
import { AdministradorApiDocumentation } from './administrador.documentation';
|
||||
|
||||
@Controller('administrador')
|
||||
@ApiBearerAuth()
|
||||
@AdministradorApiDocumentation.ApiController
|
||||
@ApiBearerAuth()
|
||||
@Controller('administrador')
|
||||
export class AdministradorController {
|
||||
constructor(private administradorService: AdministradorService) {}
|
||||
|
||||
constructor(private administradorService: AdministradorService) {}
|
||||
@Get()
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@AdministradorApiDocumentation.ApiGetAll
|
||||
getAdministradores(): Promise<Administrador[]> {
|
||||
return this.administradorService.getAdministradores();
|
||||
}
|
||||
|
||||
@Get()
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@AdministradorApiDocumentation.ApiGetAll
|
||||
getAdministradores(): Promise<Administrador[]> {
|
||||
return this.administradorService.getAdministradores();
|
||||
}
|
||||
@Get(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@AdministradorApiDocumentation.ApiGetOne
|
||||
getAdministrador(@Param('id', ParseIntPipe) id: number) {
|
||||
return this.administradorService.getAdministrador(id);
|
||||
}
|
||||
|
||||
@Get(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@AdministradorApiDocumentation.ApiGetOne
|
||||
getAdministrador(@Param('id', ParseIntPipe) id: number) {
|
||||
return this.administradorService.getAdministrador(id);
|
||||
}
|
||||
@Post()
|
||||
@AdministradorApiDocumentation.ApiCreate
|
||||
createAdministrador(@Body() newAdministrador: CreateAdministradorDto) {
|
||||
return this.administradorService.createAdministrador(newAdministrador);
|
||||
}
|
||||
|
||||
@Post()
|
||||
@AdministradorApiDocumentation.ApiCreate
|
||||
createAdministrador(@Body() newAdministrador: CreateAdministradorDto) {
|
||||
return this.administradorService.createAdministrador(newAdministrador);
|
||||
}
|
||||
@Post('login')
|
||||
@AdministradorApiDocumentation.ApiLogin
|
||||
login(@Body() loginData: LoginAdministradorDto) {
|
||||
return this.administradorService.login(
|
||||
loginData.correo,
|
||||
loginData.password,
|
||||
);
|
||||
}
|
||||
|
||||
@Post('login')
|
||||
@AdministradorApiDocumentation.ApiLogin
|
||||
login(@Body() loginData: LoginAdministradorDto) {
|
||||
return this.administradorService.login(loginData.correo, loginData.password);
|
||||
}
|
||||
@Patch(':id/change-password')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@AdministradorApiDocumentation.ApiChangePassword
|
||||
changePassword(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Body() changePasswordDto: ChangePasswordDto,
|
||||
) {
|
||||
return this.administradorService.changePassword(
|
||||
id,
|
||||
changePasswordDto.currentPassword,
|
||||
changePasswordDto.newPassword,
|
||||
);
|
||||
}
|
||||
|
||||
@Patch(':id/change-password')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@AdministradorApiDocumentation.ApiChangePassword
|
||||
changePassword(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Body() changePasswordDto: ChangePasswordDto
|
||||
) {
|
||||
return this.administradorService.changePassword(
|
||||
id,
|
||||
changePasswordDto.currentPassword,
|
||||
changePasswordDto.newPassword
|
||||
);
|
||||
}
|
||||
@Delete(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@AdministradorApiDocumentation.ApiRemove
|
||||
deleteAdministrador(@Param('id', ParseIntPipe) id: number) {
|
||||
return this.administradorService.deleteAdministrador(id);
|
||||
}
|
||||
|
||||
@Delete(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@AdministradorApiDocumentation.ApiRemove
|
||||
deleteAdministrador(@Param('id', ParseIntPipe) id: number) {
|
||||
return this.administradorService.deleteAdministrador(id);
|
||||
}
|
||||
|
||||
@Patch(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@AdministradorApiDocumentation.ApiUpdate
|
||||
updateAdministrador(@Param('id', ParseIntPipe) id: number, @Body() administrador: UpdateAdministradorDto) {
|
||||
return this.administradorService.updateAdministrador(id, administrador);
|
||||
}
|
||||
@Patch(':id')
|
||||
@UseGuards(JwtAuthGuard)
|
||||
@AdministradorApiDocumentation.ApiUpdate
|
||||
updateAdministrador(
|
||||
@Param('id', ParseIntPipe) id: number,
|
||||
@Body() administrador: UpdateAdministradorDto,
|
||||
) {
|
||||
return this.administradorService.updateAdministrador(id, administrador);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,15 +1,24 @@
|
||||
import { ApiBody, ApiOperation, ApiParam, ApiResponse, ApiTags } from '@nestjs/swagger';
|
||||
import {
|
||||
ApiBearerAuth,
|
||||
ApiBody,
|
||||
ApiOperation,
|
||||
ApiParam,
|
||||
ApiResponse,
|
||||
ApiTags,
|
||||
} from '@nestjs/swagger';
|
||||
import { applyDecorators } from '@nestjs/common';
|
||||
|
||||
export class AdministradorApiDocumentation {
|
||||
// Decorador para toda la clase del controlador
|
||||
static ApiController = ApiTags('Administradores');
|
||||
|
||||
static ApiController = applyDecorators(
|
||||
ApiTags('Administrador'),
|
||||
);
|
||||
// Documentación para crear un administrador
|
||||
static ApiCreate = applyDecorators(
|
||||
ApiOperation({
|
||||
summary: 'Registrar un nuevo administrador',
|
||||
description: 'Crea un nuevo administrador con correo, contraseña y tipo de administrador'
|
||||
description:
|
||||
'Crea un nuevo administrador con correo, contraseña y tipo de administrador',
|
||||
}),
|
||||
ApiBody({
|
||||
description: 'Datos del administrador a registrar',
|
||||
@@ -17,47 +26,51 @@ export class AdministradorApiDocumentation {
|
||||
type: 'object',
|
||||
required: ['correo', 'password', 'id_tipo_user'],
|
||||
properties: {
|
||||
correo: {
|
||||
type: 'string',
|
||||
correo: {
|
||||
type: 'string',
|
||||
format: 'email',
|
||||
example: 'admin@ejemplo.com',
|
||||
description: 'Correo electrónico del administrador'
|
||||
description: 'Correo electrónico del administrador',
|
||||
},
|
||||
password: {
|
||||
type: 'string',
|
||||
password: {
|
||||
type: 'string',
|
||||
format: 'password',
|
||||
example: 'Password123',
|
||||
description: 'Contraseña del administrador (mínimo 6 caracteres)'
|
||||
example: 'password',
|
||||
description: 'Contraseña del administrador (mínimo 6 caracteres)',
|
||||
},
|
||||
id_tipo_user: {
|
||||
type: 'integer',
|
||||
id_tipo_user: {
|
||||
type: 'integer',
|
||||
example: 1,
|
||||
description: 'ID del tipo de usuario administrador'
|
||||
}
|
||||
}
|
||||
}
|
||||
description: 'ID del tipo de usuario administrador',
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
ApiResponse({
|
||||
status: 201,
|
||||
ApiResponse({
|
||||
status: 201,
|
||||
description: 'Administrador registrado exitosamente',
|
||||
schema: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id_admnistrador: { type: 'number', example: 1 },
|
||||
correo: { type: 'string', example: 'admin@ejemplo.com' },
|
||||
id_tipo_user: { type: 'number', example: 1 }
|
||||
}
|
||||
}
|
||||
id_tipo_user: { type: 'number', example: 1 },
|
||||
},
|
||||
},
|
||||
}),
|
||||
ApiResponse({ status: 400, description: 'Datos del administrador inválidos' }),
|
||||
ApiResponse({ status: 409, description: 'El correo ya está registrado' })
|
||||
ApiResponse({
|
||||
status: 400,
|
||||
description: 'Datos del administrador inválidos',
|
||||
}),
|
||||
ApiResponse({ status: 409, description: 'El correo ya está registrado' }),
|
||||
);
|
||||
|
||||
// Documentación para iniciar sesión
|
||||
static ApiLogin = applyDecorators(
|
||||
ApiOperation({
|
||||
summary: 'Iniciar sesión como administrador',
|
||||
description: 'Autentica un administrador con correo y contraseña, y devuelve un token JWT'
|
||||
description:
|
||||
'Autentica un administrador con correo y contraseña, y devuelve un token JWT',
|
||||
}),
|
||||
ApiBody({
|
||||
description: 'Credenciales de inicio de sesión',
|
||||
@@ -65,58 +78,59 @@ export class AdministradorApiDocumentation {
|
||||
type: 'object',
|
||||
required: ['correo', 'password'],
|
||||
properties: {
|
||||
correo: {
|
||||
type: 'string',
|
||||
correo: {
|
||||
type: 'string',
|
||||
format: 'email',
|
||||
example: 'admin@ejemplo.com',
|
||||
description: 'Correo electrónico del administrador'
|
||||
description: 'Correo electrónico del administrador',
|
||||
},
|
||||
password: {
|
||||
type: 'string',
|
||||
password: {
|
||||
type: 'string',
|
||||
format: 'password',
|
||||
example: 'Password123',
|
||||
description: 'Contraseña del administrador'
|
||||
}
|
||||
}
|
||||
}
|
||||
example: 'password',
|
||||
description: 'Contraseña del administrador',
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
ApiResponse({
|
||||
status: 200,
|
||||
ApiResponse({
|
||||
status: 200,
|
||||
description: 'Inicio de sesión exitoso',
|
||||
schema: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
access_token: {
|
||||
type: 'string',
|
||||
access_token: {
|
||||
type: 'string',
|
||||
example: 'eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...',
|
||||
description: 'Token JWT para autenticación'
|
||||
description: 'Token JWT para autenticación',
|
||||
},
|
||||
id_administrador: {
|
||||
type: 'number',
|
||||
id_administrador: {
|
||||
type: 'number',
|
||||
example: 1,
|
||||
description: 'ID del administrador autenticado'
|
||||
description: 'ID del administrador autenticado',
|
||||
},
|
||||
correo: {
|
||||
type: 'string',
|
||||
correo: {
|
||||
type: 'string',
|
||||
example: 'admin@ejemplo.com',
|
||||
description: 'Correo del administrador autenticado'
|
||||
description: 'Correo del administrador autenticado',
|
||||
},
|
||||
tipo_user: {
|
||||
type: 'number',
|
||||
tipo_user: {
|
||||
type: 'number',
|
||||
example: 1,
|
||||
description: 'Tipo de usuario del administrador'
|
||||
}
|
||||
}
|
||||
}
|
||||
description: 'Tipo de usuario del administrador',
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
ApiResponse({ status: 401, description: 'Credenciales inválidas' })
|
||||
ApiResponse({ status: 401, description: 'Credenciales inválidas' }),
|
||||
);
|
||||
|
||||
// Documentación para obtener todos los administradores
|
||||
static ApiGetAll = applyDecorators(
|
||||
ApiOperation({
|
||||
summary: 'Obtener todos los administradores',
|
||||
description: 'Retorna una lista de todos los administradores registrados (requiere autenticación)'
|
||||
description:
|
||||
'Retorna una lista de todos los administradores registrados (requiere autenticación)',
|
||||
}),
|
||||
ApiResponse({
|
||||
status: 200,
|
||||
@@ -135,28 +149,32 @@ export class AdministradorApiDocumentation {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id_tipo_user: { type: 'number', example: 1 },
|
||||
tipo_user: { type: 'string', example: 'Administrador General' }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tipo_user: {
|
||||
type: 'string',
|
||||
example: 'Administrador General',
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
ApiResponse({ status: 401, description: 'No autorizado' })
|
||||
ApiResponse({ status: 401, description: 'No autorizado' }),
|
||||
);
|
||||
|
||||
// Documentación para obtener un administrador por ID
|
||||
static ApiGetOne = applyDecorators(
|
||||
ApiOperation({
|
||||
summary: 'Obtener un administrador por ID',
|
||||
description: 'Retorna los datos de un administrador específico según su ID (requiere autenticación)'
|
||||
description:
|
||||
'Retorna los datos de un administrador específico según su ID (requiere autenticación)',
|
||||
}),
|
||||
ApiParam({
|
||||
name: 'id',
|
||||
description: 'ID del administrador',
|
||||
type: 'number',
|
||||
example: 1
|
||||
example: 1,
|
||||
}),
|
||||
ApiResponse({
|
||||
status: 200,
|
||||
@@ -173,53 +191,55 @@ export class AdministradorApiDocumentation {
|
||||
type: 'object',
|
||||
properties: {
|
||||
id_tipo_user: { type: 'number', example: 1 },
|
||||
tipo_user: { type: 'string', example: 'Administrador General' }
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
tipo_user: { type: 'string', example: 'Administrador General' },
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
ApiResponse({ status: 404, description: 'Administrador no encontrado' }),
|
||||
ApiResponse({ status: 401, description: 'No autorizado' })
|
||||
ApiResponse({ status: 401, description: 'No autorizado' }),
|
||||
);
|
||||
|
||||
// Documentación para actualizar un administrador
|
||||
static ApiUpdate = applyDecorators(
|
||||
ApiOperation({
|
||||
summary: 'Actualizar datos de un administrador',
|
||||
description: 'Actualiza la información de un administrador existente (requiere autenticación)'
|
||||
description:
|
||||
'Actualiza la información de un administrador existente (requiere autenticación)',
|
||||
}),
|
||||
ApiParam({
|
||||
name: 'id',
|
||||
description: 'ID del administrador a actualizar',
|
||||
type: 'number',
|
||||
example: 1
|
||||
example: 1,
|
||||
}),
|
||||
ApiBody({
|
||||
description: 'Datos a actualizar del administrador',
|
||||
schema: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
correo: {
|
||||
type: 'string',
|
||||
correo: {
|
||||
type: 'string',
|
||||
format: 'email',
|
||||
example: 'nuevo_admin@ejemplo.com',
|
||||
description: 'Nuevo correo electrónico del administrador'
|
||||
description: 'Nuevo correo electrónico del administrador',
|
||||
},
|
||||
password: {
|
||||
type: 'string',
|
||||
password: {
|
||||
type: 'string',
|
||||
format: 'password',
|
||||
example: 'NuevaPassword123',
|
||||
description: 'Nueva contraseña del administrador (mínimo 6 caracteres)'
|
||||
description:
|
||||
'Nueva contraseña del administrador (mínimo 6 caracteres)',
|
||||
},
|
||||
id_tipo_user: {
|
||||
type: 'integer',
|
||||
id_tipo_user: {
|
||||
type: 'integer',
|
||||
example: 2,
|
||||
description: 'Nuevo tipo de usuario administrador'
|
||||
}
|
||||
}
|
||||
}
|
||||
description: 'Nuevo tipo de usuario administrador',
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
ApiResponse({
|
||||
status: 200,
|
||||
@@ -229,26 +249,30 @@ export class AdministradorApiDocumentation {
|
||||
properties: {
|
||||
id_admnistrador: { type: 'number', example: 1 },
|
||||
correo: { type: 'string', example: 'nuevo_admin@ejemplo.com' },
|
||||
id_tipo_user: { type: 'number', example: 2 }
|
||||
}
|
||||
}
|
||||
id_tipo_user: { type: 'number', example: 2 },
|
||||
},
|
||||
},
|
||||
}),
|
||||
ApiResponse({
|
||||
status: 400,
|
||||
description: 'Datos de actualización inválidos',
|
||||
}),
|
||||
ApiResponse({ status: 400, description: 'Datos de actualización inválidos' }),
|
||||
ApiResponse({ status: 404, description: 'Administrador no encontrado' }),
|
||||
ApiResponse({ status: 401, description: 'No autorizado' })
|
||||
ApiResponse({ status: 401, description: 'No autorizado' }),
|
||||
);
|
||||
|
||||
// Documentación para cambiar contraseña
|
||||
static ApiChangePassword = applyDecorators(
|
||||
ApiOperation({
|
||||
summary: 'Cambiar contraseña de un administrador',
|
||||
description: 'Permite a un administrador cambiar su contraseña verificando primero la contraseña actual (requiere autenticación)'
|
||||
description:
|
||||
'Permite a un administrador cambiar su contraseña verificando primero la contraseña actual (requiere autenticación)',
|
||||
}),
|
||||
ApiParam({
|
||||
name: 'id',
|
||||
description: 'ID del administrador',
|
||||
type: 'number',
|
||||
example: 1
|
||||
example: 1,
|
||||
}),
|
||||
ApiBody({
|
||||
description: 'Datos para cambio de contraseña',
|
||||
@@ -256,20 +280,21 @@ export class AdministradorApiDocumentation {
|
||||
type: 'object',
|
||||
required: ['currentPassword', 'newPassword'],
|
||||
properties: {
|
||||
currentPassword: {
|
||||
type: 'string',
|
||||
currentPassword: {
|
||||
type: 'string',
|
||||
format: 'password',
|
||||
example: 'Password123',
|
||||
description: 'Contraseña actual del administrador'
|
||||
description: 'Contraseña actual del administrador',
|
||||
},
|
||||
newPassword: {
|
||||
type: 'string',
|
||||
newPassword: {
|
||||
type: 'string',
|
||||
format: 'password',
|
||||
example: 'NuevaPassword123',
|
||||
description: 'Nueva contraseña del administrador (mínimo 6 caracteres)'
|
||||
}
|
||||
}
|
||||
}
|
||||
description:
|
||||
'Nueva contraseña del administrador (mínimo 6 caracteres)',
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
ApiResponse({
|
||||
status: 200,
|
||||
@@ -277,26 +302,30 @@ export class AdministradorApiDocumentation {
|
||||
schema: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
message: { type: 'string', example: 'Contraseña actualizada correctamente' }
|
||||
}
|
||||
}
|
||||
message: {
|
||||
type: 'string',
|
||||
example: 'Contraseña actualizada correctamente',
|
||||
},
|
||||
},
|
||||
},
|
||||
}),
|
||||
ApiResponse({ status: 400, description: 'Contraseña actual incorrecta' }),
|
||||
ApiResponse({ status: 404, description: 'Administrador no encontrado' }),
|
||||
ApiResponse({ status: 401, description: 'No autorizado' })
|
||||
ApiResponse({ status: 401, description: 'No autorizado' }),
|
||||
);
|
||||
|
||||
// Documentación para eliminar un administrador
|
||||
static ApiRemove = applyDecorators(
|
||||
ApiOperation({
|
||||
summary: 'Eliminar un administrador',
|
||||
description: 'Elimina permanentemente un administrador por su ID (requiere autenticación)'
|
||||
description:
|
||||
'Elimina permanentemente un administrador por su ID (requiere autenticación)',
|
||||
}),
|
||||
ApiParam({
|
||||
name: 'id',
|
||||
description: 'ID del administrador a eliminar',
|
||||
type: 'number',
|
||||
example: 1
|
||||
example: 1,
|
||||
}),
|
||||
ApiResponse({
|
||||
status: 200,
|
||||
@@ -304,11 +333,11 @@ export class AdministradorApiDocumentation {
|
||||
schema: {
|
||||
type: 'object',
|
||||
properties: {
|
||||
affected: { type: 'number', example: 1 }
|
||||
}
|
||||
}
|
||||
affected: { type: 'number', example: 1 },
|
||||
},
|
||||
},
|
||||
}),
|
||||
ApiResponse({ status: 404, description: 'Administrador no encontrado' }),
|
||||
ApiResponse({ status: 401, description: 'No autorizado' })
|
||||
ApiResponse({ status: 401, description: 'No autorizado' }),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,34 +0,0 @@
|
||||
import { TipoUser } from "src/tipo_user/tipo_user.entity";
|
||||
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from "typeorm";
|
||||
|
||||
@Entity()
|
||||
export class Administrador {
|
||||
@PrimaryGeneratedColumn()
|
||||
id_admnistrador: number
|
||||
|
||||
@Column({ unique: true })
|
||||
correo: string
|
||||
|
||||
@Column()
|
||||
password: string
|
||||
|
||||
/*
|
||||
@ManyToOne(() => TipoUser, (tipoUser) => tipoUser.administradores)
|
||||
@JoinColumn({ name: "id_tipo_user" })
|
||||
tipoUser: TipoUser;
|
||||
*/
|
||||
//Relacion con tipo_user
|
||||
@Column()
|
||||
id_tipo_user: number
|
||||
|
||||
@ManyToOne(() => TipoUser, (tipoUser) => tipoUser.administrador)
|
||||
tipoUser: TipoUser[]
|
||||
|
||||
/*
|
||||
@OneToMany(() => Evento, (evento) => evento.administrador)
|
||||
eventos: Evento[];
|
||||
|
||||
@OneToMany(() => Asistencia, (asistencia) => asistencia.administrador)
|
||||
asistencias: Asistencia[];
|
||||
*/
|
||||
}
|
||||
@@ -2,7 +2,7 @@ import { Module } from '@nestjs/common';
|
||||
import { AdministradorService } from './administrador.service';
|
||||
import { AdministradorController } from './administrador.controller';
|
||||
import { TypeOrmModule } from '@nestjs/typeorm';
|
||||
import { Administrador } from './administrador.entity';
|
||||
import { Administrador } from './entities/administrador.entity';
|
||||
import { AuthModule } from '../auth/auth.module';
|
||||
|
||||
@Module({
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { HttpException, HttpStatus, Injectable } from '@nestjs/common';
|
||||
import { InjectRepository } from '@nestjs/typeorm';
|
||||
import { Administrador } from './administrador.entity';
|
||||
import { Administrador } from './entities/administrador.entity';
|
||||
import { Repository } from 'typeorm';
|
||||
import { CreateAdministradorDto } from './dto/create-administrador.dto';
|
||||
import { UpdateAdministradorDto } from './dto/update.administrador.dto';
|
||||
@@ -9,163 +9,204 @@ import { JwtService } from '@nestjs/jwt';
|
||||
|
||||
@Injectable()
|
||||
export class AdministradorService {
|
||||
|
||||
constructor(
|
||||
@InjectRepository(Administrador) private administradorRepository: Repository<Administrador>,
|
||||
private jwtService: JwtService
|
||||
) {}
|
||||
constructor(
|
||||
@InjectRepository(Administrador)
|
||||
private administradorRepository: Repository<Administrador>,
|
||||
private jwtService: JwtService,
|
||||
) {}
|
||||
|
||||
async createAdministrador(administrador: CreateAdministradorDto) {
|
||||
// Verificar si ya existe un administrador con el mismo correo
|
||||
const administradorFound = await this.administradorRepository.findOne({
|
||||
where: {
|
||||
correo: administrador.correo
|
||||
}
|
||||
});
|
||||
async createAdministrador(administrador: CreateAdministradorDto) {
|
||||
// Verificar si ya existe un administrador con el mismo correo
|
||||
const administradorFound = await this.administradorRepository.findOne({
|
||||
where: {
|
||||
correo: administrador.correo,
|
||||
},
|
||||
});
|
||||
|
||||
if (administradorFound) {
|
||||
throw new HttpException('El correo ya está registrado', HttpStatus.CONFLICT);
|
||||
}
|
||||
|
||||
// Encriptar la contraseña
|
||||
const hashedPassword = await this.hashPassword(administrador.password);
|
||||
|
||||
// Crear y guardar el nuevo administrador
|
||||
const newAdministrador = this.administradorRepository.create({
|
||||
correo: administrador.correo,
|
||||
password: hashedPassword,
|
||||
id_tipo_user: administrador.id_tipo_user
|
||||
});
|
||||
|
||||
const savedAdministrador = await this.administradorRepository.save(newAdministrador);
|
||||
|
||||
// Excluir la contraseña de la respuesta
|
||||
const { password, ...result } = savedAdministrador;
|
||||
return result;
|
||||
if (administradorFound) {
|
||||
throw new HttpException(
|
||||
'El correo ya está registrado',
|
||||
HttpStatus.CONFLICT,
|
||||
);
|
||||
}
|
||||
|
||||
async login(correo: string, password: string) {
|
||||
// Buscar administrador por correo
|
||||
const administrador = await this.administradorRepository.findOne({
|
||||
where: { correo },
|
||||
relations: ['tipoUser']
|
||||
});
|
||||
// Encriptar la contraseña
|
||||
const hashedPassword = await this.hashPassword(administrador.password);
|
||||
|
||||
if (!administrador) {
|
||||
throw new HttpException('Credenciales inválidas', HttpStatus.UNAUTHORIZED);
|
||||
}
|
||||
// Crear y guardar el nuevo administrador
|
||||
const newAdministrador = this.administradorRepository.create({
|
||||
correo: administrador.correo,
|
||||
password: hashedPassword,
|
||||
id_tipo_user: administrador.id_tipo_user,
|
||||
});
|
||||
|
||||
// Verificar contraseña
|
||||
const isPasswordValid = await bcrypt.compare(password, administrador.password);
|
||||
if (!isPasswordValid) {
|
||||
throw new HttpException('Credenciales inválidas', HttpStatus.UNAUTHORIZED);
|
||||
}
|
||||
const savedAdministrador =
|
||||
await this.administradorRepository.save(newAdministrador);
|
||||
|
||||
// Generar token JWT
|
||||
const payload = {
|
||||
sub: administrador.id_admnistrador,
|
||||
correo: administrador.correo,
|
||||
id_tipo_user: administrador.id_tipo_user
|
||||
};
|
||||
|
||||
return {
|
||||
access_token: this.jwtService.sign(payload),
|
||||
id_administrador: administrador.id_admnistrador,
|
||||
correo: administrador.correo,
|
||||
tipo_user: administrador.id_tipo_user
|
||||
};
|
||||
// Excluir la contraseña de la respuesta
|
||||
const { password, ...result } = savedAdministrador;
|
||||
return result;
|
||||
}
|
||||
|
||||
async login(correo: string, password: string) {
|
||||
// Buscar administrador por correo
|
||||
const administrador = await this.administradorRepository.findOne({
|
||||
where: { correo },
|
||||
relations: ['tipoUser'],
|
||||
});
|
||||
|
||||
if (!administrador) {
|
||||
throw new HttpException(
|
||||
'Credenciales inválidas',
|
||||
HttpStatus.UNAUTHORIZED,
|
||||
);
|
||||
}
|
||||
|
||||
async changePassword(id_admnistrador: number, currentPassword: string, newPassword: string) {
|
||||
// Buscar administrador
|
||||
const administrador = await this.administradorRepository.findOne({
|
||||
where: { id_admnistrador }
|
||||
});
|
||||
|
||||
if (!administrador) {
|
||||
throw new HttpException('Administrador no encontrado', HttpStatus.NOT_FOUND);
|
||||
}
|
||||
|
||||
// Verificar contraseña actual
|
||||
const isPasswordValid = await bcrypt.compare(currentPassword, administrador.password);
|
||||
if (!isPasswordValid) {
|
||||
throw new HttpException('Contraseña actual incorrecta', HttpStatus.BAD_REQUEST);
|
||||
}
|
||||
|
||||
// Hashear y actualizar nueva contraseña
|
||||
administrador.password = await this.hashPassword(newPassword);
|
||||
await this.administradorRepository.save(administrador);
|
||||
|
||||
return { message: 'Contraseña actualizada correctamente' };
|
||||
// Verificar contraseña
|
||||
const isPasswordValid = await bcrypt.compare(
|
||||
password,
|
||||
administrador.password,
|
||||
);
|
||||
if (!isPasswordValid) {
|
||||
throw new HttpException(
|
||||
'Credenciales inválidas',
|
||||
HttpStatus.UNAUTHORIZED,
|
||||
);
|
||||
}
|
||||
|
||||
private async hashPassword(password: string): Promise<string> {
|
||||
const salt = await bcrypt.genSalt();
|
||||
return bcrypt.hash(password, salt);
|
||||
// Generar token JWT
|
||||
const payload = {
|
||||
sub: administrador.id_admnistrador,
|
||||
correo: administrador.correo,
|
||||
id_tipo_user: administrador.id_tipo_user,
|
||||
};
|
||||
|
||||
return {
|
||||
token: this.jwtService.sign(payload),
|
||||
};
|
||||
}
|
||||
|
||||
async changePassword(
|
||||
id_admnistrador: number,
|
||||
currentPassword: string,
|
||||
newPassword: string,
|
||||
) {
|
||||
// Buscar administrador
|
||||
const administrador = await this.administradorRepository.findOne({
|
||||
where: { id_admnistrador },
|
||||
});
|
||||
|
||||
if (!administrador) {
|
||||
throw new HttpException(
|
||||
'Administrador no encontrado',
|
||||
HttpStatus.NOT_FOUND,
|
||||
);
|
||||
}
|
||||
|
||||
getAdministradores() {
|
||||
return this.administradorRepository.find({
|
||||
relations: ['tipoUser'],
|
||||
select: {
|
||||
id_admnistrador: true,
|
||||
correo: true,
|
||||
id_tipo_user: true
|
||||
}
|
||||
});
|
||||
// Verificar contraseña actual
|
||||
const isPasswordValid = await bcrypt.compare(
|
||||
currentPassword,
|
||||
administrador.password,
|
||||
);
|
||||
if (!isPasswordValid) {
|
||||
throw new HttpException(
|
||||
'Contraseña actual incorrecta',
|
||||
HttpStatus.BAD_REQUEST,
|
||||
);
|
||||
}
|
||||
|
||||
async getAdministrador(id_admnistrador: number) {
|
||||
const administradorFound = await this.administradorRepository.findOne({
|
||||
where: {
|
||||
id_admnistrador
|
||||
},
|
||||
relations: ['tipoUser'],
|
||||
select: {
|
||||
id_admnistrador: true,
|
||||
correo: true,
|
||||
id_tipo_user: true
|
||||
}
|
||||
});
|
||||
// Hashear y actualizar nueva contraseña
|
||||
administrador.password = await this.hashPassword(newPassword);
|
||||
await this.administradorRepository.save(administrador);
|
||||
|
||||
if (!administradorFound) {
|
||||
throw new HttpException('Administrador no encontrado', HttpStatus.NOT_FOUND);
|
||||
}
|
||||
return { message: 'Contraseña actualizada correctamente' };
|
||||
}
|
||||
|
||||
return administradorFound;
|
||||
private async hashPassword(password: string): Promise<string> {
|
||||
const salt = await bcrypt.genSalt();
|
||||
return bcrypt.hash(password, salt);
|
||||
}
|
||||
|
||||
getAdministradores() {
|
||||
return this.administradorRepository.find({
|
||||
relations: ['tipoUser'],
|
||||
select: {
|
||||
id_admnistrador: true,
|
||||
correo: true,
|
||||
id_tipo_user: true,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
async getAdministrador(id_admnistrador: number) {
|
||||
const administradorFound = await this.administradorRepository.findOne({
|
||||
where: {
|
||||
id_admnistrador,
|
||||
},
|
||||
relations: ['tipoUser'],
|
||||
select: {
|
||||
id_admnistrador: true,
|
||||
correo: true,
|
||||
id_tipo_user: true,
|
||||
},
|
||||
});
|
||||
|
||||
if (!administradorFound) {
|
||||
throw new HttpException(
|
||||
'Administrador no encontrado',
|
||||
HttpStatus.NOT_FOUND,
|
||||
);
|
||||
}
|
||||
|
||||
async deleteAdministrador(id_admnistrador: number) {
|
||||
const result = await this.administradorRepository.delete({ id_admnistrador });
|
||||
return administradorFound;
|
||||
}
|
||||
|
||||
if (result.affected === 0) {
|
||||
throw new HttpException('Administrador no encontrado', HttpStatus.NOT_FOUND);
|
||||
}
|
||||
async deleteAdministrador(id_admnistrador: number) {
|
||||
const result = await this.administradorRepository.delete({
|
||||
id_admnistrador,
|
||||
});
|
||||
|
||||
return result;
|
||||
if (result.affected === 0) {
|
||||
throw new HttpException(
|
||||
'Administrador no encontrado',
|
||||
HttpStatus.NOT_FOUND,
|
||||
);
|
||||
}
|
||||
|
||||
async updateAdministrador(id_admnistrador: number, administrador: UpdateAdministradorDto) {
|
||||
const administradorFound = await this.administradorRepository.findOne({
|
||||
where: {
|
||||
id_admnistrador
|
||||
}
|
||||
});
|
||||
return result;
|
||||
}
|
||||
|
||||
if (!administradorFound) {
|
||||
throw new HttpException('Administrador no encontrado', HttpStatus.NOT_FOUND);
|
||||
}
|
||||
async updateAdministrador(
|
||||
id_admnistrador: number,
|
||||
administrador: UpdateAdministradorDto,
|
||||
) {
|
||||
const administradorFound = await this.administradorRepository.findOne({
|
||||
where: {
|
||||
id_admnistrador,
|
||||
},
|
||||
});
|
||||
|
||||
// Si se incluye una nueva contraseña, hashearla
|
||||
if (administrador.password) {
|
||||
administrador.password = await this.hashPassword(administrador.password);
|
||||
}
|
||||
|
||||
const updateAdministrador = Object.assign(administradorFound, administrador);
|
||||
const savedAdministrador = await this.administradorRepository.save(updateAdministrador);
|
||||
|
||||
// Excluir la contraseña de la respuesta
|
||||
const { password, ...result } = savedAdministrador;
|
||||
return result;
|
||||
if (!administradorFound) {
|
||||
throw new HttpException(
|
||||
'Administrador no encontrado',
|
||||
HttpStatus.NOT_FOUND,
|
||||
);
|
||||
}
|
||||
|
||||
// Si se incluye una nueva contraseña, hashearla
|
||||
if (administrador.password) {
|
||||
administrador.password = await this.hashPassword(administrador.password);
|
||||
}
|
||||
|
||||
const updateAdministrador = Object.assign(
|
||||
administradorFound,
|
||||
administrador,
|
||||
);
|
||||
const savedAdministrador =
|
||||
await this.administradorRepository.save(updateAdministrador);
|
||||
|
||||
// Excluir la contraseña de la respuesta
|
||||
const { password, ...result } = savedAdministrador;
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,20 @@
|
||||
import { TipoUser } from 'src/tipo_user/entities/tipo_user.entity';
|
||||
import { Column, Entity, ManyToOne, PrimaryGeneratedColumn } from 'typeorm';
|
||||
|
||||
@Entity('administrador')
|
||||
export class Administrador {
|
||||
@PrimaryGeneratedColumn()
|
||||
id_admnistrador: number;
|
||||
|
||||
@Column({ unique: true })
|
||||
correo: string;
|
||||
|
||||
@Column()
|
||||
password: string;
|
||||
|
||||
@Column()
|
||||
id_tipo_user: number;
|
||||
|
||||
@ManyToOne(() => TipoUser, (tipoUser) => tipoUser.administrador)
|
||||
tipoUser: TipoUser[];
|
||||
}
|
||||
Reference in New Issue
Block a user