Loading backend/src/admin/admin.controller.ts +17 −3 Original line number Diff line number Diff line import { Controller, Get, Req, UseGuards } from '@nestjs/common'; import { Controller, Get, Param, Req, UseGuards } from '@nestjs/common'; import { AdminService } from './admin.service'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { ADMIN_ROLES } from 'src/shared/enum/admin-role.enum'; import { ApiBearerAuth, ApiParam, ApiTags } from '@nestjs/swagger'; import { ADMIN_ROLES, SUPERADMIN_ROLES } from 'src/shared/enum/admin-role.enum'; import { Roles } from 'src/auth/role.decorator'; import { CustomAdminRequest } from 'src/auth/admin/interface/customAdminReq'; import { AuthAdminGuard } from 'src/auth/admin/authAdmin.guard'; Loading @@ -24,4 +24,18 @@ export class AdminController { idTown: req.admin?.idTown?.townId || null, }; } @UseGuards(AuthAdminGuard) @Roles(SUPERADMIN_ROLES) @ApiParam({ name: 'idTown', type: Number }) @Get('admin/:idTown') @ApiBearerAuth('jwt') async findAllByTown(@Param('idTown') idTown: number) { try { const admins = await this.adminService.findAllByTown(idTown); return admins; } catch (e) { return e; } } } backend/src/admin/admin.service.ts +19 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ import { Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { Town } from 'src/town/entities/town.entity'; import { ADMIN_ROLE } from 'src/shared/enum/admin-role.enum'; import { GetAdminDto } from './dto/get-admin.dto'; @Injectable() export class AdminService { Loading @@ -31,4 +32,22 @@ export class AdminService { async updatePassword(email: string, password: string) { await this.adminRepository.update({ email }, { password }); } async findAllByTown(idTown : number) : Promise<GetAdminDto[]> { const res: any[] = await this.adminRepository .createQueryBuilder('admin') .leftJoinAndSelect('admin.idTown', 'town') .where('admin.idTown = :idTown', { idTown: idTown }) .getMany(); const admins: GetAdminDto[] = res.map((admin) :GetAdminDto => { return { email: admin.email, idTown: admin.idTown.townId, name: admin.name, lastName: admin.lastName, status: admin.status }; }); return admins; } } backend/src/admin/dto/get-admin.dto.ts 0 → 100644 +18 −0 Original line number Diff line number Diff line import { ApiProperty } from "@nestjs/swagger"; export class GetAdminDto { @ApiProperty() email: string; @ApiProperty() idTown: number; @ApiProperty() name: string; @ApiProperty() lastName: string; @ApiProperty() status: string; } No newline at end of file backend/src/auth/user/authUserservice.ts +1 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ export class AuthUserService { } async getResetPasswordCode(email: string) { console.log(`Email: ${email}`); const user: User = await this.userService.findOne(email); if (!user) throw new UnauthorizedException('Invalid email'); const resetCode = randomInt(100000, 999999).toString(); Loading backend/src/route/index.html 0 → 100644 +52 −0 Original line number Diff line number Diff line <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .container{ display: flex; justify-content: center; flex-direction: row; height: 100px; width: 200px; } .container img{ flex-grow: 1; max-width: 100%; object-fit: cover; } .pueblos { position: absolute; bottom: 10; right: 10; width: 30px; height: 30px; } .pueblo-text-container{ } .pueblo-text{ } </style> </head> <body> <div class="container"> <div class="pueblo-text-container"> <h1 class="pueblo-text"> </h1> </div> <div class="image"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/1200px-Altja_j%C3%B5gi_Lahemaal.jpg" alt=""></div> <div class="image"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/1200px-Altja_j%C3%B5gi_Lahemaal.jpg" alt=""></div> <div class="image"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/1200px-Altja_j%C3%B5gi_Lahemaal.jpg" alt=""></div> <div class="image"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/1200px-Altja_j%C3%B5gi_Lahemaal.jpg" alt=""></div> <div class="image"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/1200px-Altja_j%C3%B5gi_Lahemaal.jpg" alt=""></div> <div class="pueblos"> <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQnr08Avq1Nkhwh36sTNwiUicOkXhdeASiHuA&s" alt=""> </div> </div> </body> </html> No newline at end of file Loading
backend/src/admin/admin.controller.ts +17 −3 Original line number Diff line number Diff line import { Controller, Get, Req, UseGuards } from '@nestjs/common'; import { Controller, Get, Param, Req, UseGuards } from '@nestjs/common'; import { AdminService } from './admin.service'; import { ApiBearerAuth, ApiTags } from '@nestjs/swagger'; import { ADMIN_ROLES } from 'src/shared/enum/admin-role.enum'; import { ApiBearerAuth, ApiParam, ApiTags } from '@nestjs/swagger'; import { ADMIN_ROLES, SUPERADMIN_ROLES } from 'src/shared/enum/admin-role.enum'; import { Roles } from 'src/auth/role.decorator'; import { CustomAdminRequest } from 'src/auth/admin/interface/customAdminReq'; import { AuthAdminGuard } from 'src/auth/admin/authAdmin.guard'; Loading @@ -24,4 +24,18 @@ export class AdminController { idTown: req.admin?.idTown?.townId || null, }; } @UseGuards(AuthAdminGuard) @Roles(SUPERADMIN_ROLES) @ApiParam({ name: 'idTown', type: Number }) @Get('admin/:idTown') @ApiBearerAuth('jwt') async findAllByTown(@Param('idTown') idTown: number) { try { const admins = await this.adminService.findAllByTown(idTown); return admins; } catch (e) { return e; } } }
backend/src/admin/admin.service.ts +19 −0 Original line number Diff line number Diff line Loading @@ -5,6 +5,7 @@ import { Repository } from 'typeorm'; import { InjectRepository } from '@nestjs/typeorm'; import { Town } from 'src/town/entities/town.entity'; import { ADMIN_ROLE } from 'src/shared/enum/admin-role.enum'; import { GetAdminDto } from './dto/get-admin.dto'; @Injectable() export class AdminService { Loading @@ -31,4 +32,22 @@ export class AdminService { async updatePassword(email: string, password: string) { await this.adminRepository.update({ email }, { password }); } async findAllByTown(idTown : number) : Promise<GetAdminDto[]> { const res: any[] = await this.adminRepository .createQueryBuilder('admin') .leftJoinAndSelect('admin.idTown', 'town') .where('admin.idTown = :idTown', { idTown: idTown }) .getMany(); const admins: GetAdminDto[] = res.map((admin) :GetAdminDto => { return { email: admin.email, idTown: admin.idTown.townId, name: admin.name, lastName: admin.lastName, status: admin.status }; }); return admins; } }
backend/src/admin/dto/get-admin.dto.ts 0 → 100644 +18 −0 Original line number Diff line number Diff line import { ApiProperty } from "@nestjs/swagger"; export class GetAdminDto { @ApiProperty() email: string; @ApiProperty() idTown: number; @ApiProperty() name: string; @ApiProperty() lastName: string; @ApiProperty() status: string; } No newline at end of file
backend/src/auth/user/authUserservice.ts +1 −0 Original line number Diff line number Diff line Loading @@ -83,6 +83,7 @@ export class AuthUserService { } async getResetPasswordCode(email: string) { console.log(`Email: ${email}`); const user: User = await this.userService.findOne(email); if (!user) throw new UnauthorizedException('Invalid email'); const resetCode = randomInt(100000, 999999).toString(); Loading
backend/src/route/index.html 0 → 100644 +52 −0 Original line number Diff line number Diff line <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <style> .container{ display: flex; justify-content: center; flex-direction: row; height: 100px; width: 200px; } .container img{ flex-grow: 1; max-width: 100%; object-fit: cover; } .pueblos { position: absolute; bottom: 10; right: 10; width: 30px; height: 30px; } .pueblo-text-container{ } .pueblo-text{ } </style> </head> <body> <div class="container"> <div class="pueblo-text-container"> <h1 class="pueblo-text"> </h1> </div> <div class="image"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/1200px-Altja_j%C3%B5gi_Lahemaal.jpg" alt=""></div> <div class="image"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/1200px-Altja_j%C3%B5gi_Lahemaal.jpg" alt=""></div> <div class="image"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/1200px-Altja_j%C3%B5gi_Lahemaal.jpg" alt=""></div> <div class="image"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/1200px-Altja_j%C3%B5gi_Lahemaal.jpg" alt=""></div> <div class="image"><img src="https://upload.wikimedia.org/wikipedia/commons/thumb/c/c8/Altja_j%C3%B5gi_Lahemaal.jpg/1200px-Altja_j%C3%B5gi_Lahemaal.jpg" alt=""></div> <div class="pueblos"> <img src="https://encrypted-tbn0.gstatic.com/images?q=tbn:ANd9GcQnr08Avq1Nkhwh36sTNwiUicOkXhdeASiHuA&s" alt=""> </div> </div> </body> </html> No newline at end of file