From 949d54e59020aa4fdb354f4dc045211460056290 Mon Sep 17 00:00:00 2001 From: Sergio Ramirez Date: Mon, 15 Dec 2025 10:04:38 -0400 Subject: [PATCH] correciones de compilacion --- apps/api/src/features/auth/auth.service.ts | 220 ++++++++++-------- .../inventory/product-inventory-list.tsx | 7 +- 2 files changed, 121 insertions(+), 106 deletions(-) diff --git a/apps/api/src/features/auth/auth.service.ts b/apps/api/src/features/auth/auth.service.ts index 3957ad3..8bccedd 100644 --- a/apps/api/src/features/auth/auth.service.ts +++ b/apps/api/src/features/auth/auth.service.ts @@ -4,8 +4,8 @@ import { Env, validateString } from '@/common/utils'; import { DRIZZLE_PROVIDER } from '@/database/drizzle-provider'; import { RefreshTokenDto } from '@/features/auth/dto/refresh-token.dto'; import { SignInUserDto } from '@/features/auth/dto/signIn-user.dto'; -import { SingUpUserDto } from '@/features/auth/dto/signUp-user.dto'; import { SignOutUserDto } from '@/features/auth/dto/signOut-user.dto'; +import { SingUpUserDto } from '@/features/auth/dto/signUp-user.dto'; import { ValidateUserDto } from '@/features/auth/dto/validate-user.dto'; import AuthTokensInterface from '@/features/auth/interfaces/auth-tokens.interface'; import { @@ -24,14 +24,14 @@ import { UnauthorizedException, } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; -import { JwtService } from '@nestjs/jwt'; +import { JwtService, JwtSignOptions } from '@nestjs/jwt'; +import * as bcrypt from 'bcryptjs'; import crypto from 'crypto'; import { and, eq, or } from 'drizzle-orm'; import { NodePgDatabase } from 'drizzle-orm/node-postgres'; import * as schema from 'src/database/index'; -import { sessions, users, roles, usersRole } from 'src/database/index'; +import { roles, sessions, users, usersRole } from 'src/database/index'; import { Session } from './interfaces/session.interface'; -import * as bcrypt from 'bcryptjs'; @Injectable() export class AuthService { @@ -81,33 +81,43 @@ export class AuthService { //Generate Tokens async generateTokens(user: User): Promise { + const accessTokenSecret = envs.access_token_secret ?? ''; + const accessTokenExp = envs.access_token_expiration ?? ''; + const refreshTokenSecret = envs.refresh_token_secret ?? ''; + const refreshTokenExp = envs.refresh_token_expiration ?? ''; + + if ( + !accessTokenSecret || + !accessTokenExp || + !refreshTokenSecret || + !refreshTokenExp + ) { + throw new Error('JWT environment variables are missing or invalid'); + } + + interface JwtPayload { + sub: number; + username: string; + } + + const payload: JwtPayload = { + sub: Number(user?.id), + username: user.username ?? '', + }; + const [access_token, refresh_token] = await Promise.all([ - this.jwtService.signAsync( - { - sub: user.id, - username: user.username, - }, - { - secret: envs.access_token_secret, - expiresIn: envs.access_token_expiration, - }, - ), - this.jwtService.signAsync( - { - sub: user.id, - username: user.username, - }, - { - secret: envs.refresh_token_secret, - expiresIn: envs.refresh_token_expiration, - }, - ), + this.jwtService.signAsync(payload, { + secret: accessTokenSecret, + expiresIn: accessTokenExp, + } as JwtSignOptions), + + this.jwtService.signAsync(payload, { + secret: refreshTokenSecret, + expiresIn: refreshTokenExp, + } as JwtSignOptions), ]); - return { - access_token, - refresh_token, - }; + return { access_token, refresh_token }; } //Generate OTP Code For Email Confirmation @@ -138,7 +148,8 @@ export class AuthService { userId: parseInt(userId), expiresAt: sessionInput.expiresAt, }); - if (session.rowCount === 0) throw new HttpException('Failed to create session', HttpStatus.NOT_FOUND); + if (session.rowCount === 0) + throw new HttpException('Failed to create session', HttpStatus.NOT_FOUND); return 'Session created successfully'; } @@ -197,7 +208,6 @@ export class AuthService { //Sign In User Account async signIn(dto: SignInUserDto): Promise { - const user = await this.validateUser(dto); const tokens = await this.generateTokens(user); const decodeAccess = this.decodeToken(tokens.access_token); @@ -265,12 +275,12 @@ export class AuthService { async refreshToken(dto: RefreshTokenDto): Promise { const secret = envs.refresh_token_secret; const { user_id, token } = dto; - + console.log('secret', secret); console.log('refresh_token', token); const validation = await this.jwtService.verifyAsync(token, { - secret + secret, }); if (!validation) throw new UnauthorizedException('Invalid refresh token'); @@ -279,23 +289,20 @@ export class AuthService { .select() .from(sessions) .where( - and( - eq(sessions.userId, user_id), - eq(sessions.sessionToken, token) - ) + and(eq(sessions.userId, user_id), eq(sessions.sessionToken, token)), ); // console.log(session.length); - + if (session.length === 0) throw new NotFoundException('session not found'); const user = await this.findUserById(user_id); if (!user) throw new NotFoundException('User not found'); - + // Genera token const tokens = await this.generateTokens(user); const decodeAccess = this.decodeToken(tokens.access_token); const decodeRefresh = this.decodeToken(tokens.refresh_token); - + // Actualiza session await this.drizzle .update(sessions) @@ -311,75 +318,82 @@ export class AuthService { } async singUp(createUserDto: SingUpUserDto): Promise { - // Check if username or email exists - const data = await this.drizzle + // Check if username or email exists + const data = await this.drizzle + .select({ + id: users.id, + username: users.username, + email: users.email, + }) + .from(users) + .where( + or( + eq(users.username, createUserDto.username), + eq(users.email, createUserDto.email), + ), + ); + + if (data.length > 0) { + if (data[0].username === createUserDto.username) { + throw new HttpException( + 'Username already exists', + HttpStatus.BAD_REQUEST, + ); + } + if (data[0].email === createUserDto.email) { + throw new HttpException('Email already exists', HttpStatus.BAD_REQUEST); + } + } + + // Hash the password + const hashedPassword = await bcrypt.hash(createUserDto.password, 10); + + // Start a transaction + return await this.drizzle.transaction(async (tx) => { + // Create the user + const [newUser] = await tx + .insert(users) + .values({ + username: createUserDto.username, + email: createUserDto.email, + password: hashedPassword, + fullname: createUserDto.fullname, + isActive: true, + state: createUserDto.state, + municipality: createUserDto.municipality, + parish: createUserDto.parish, + phone: createUserDto.phone, + isEmailVerified: false, + isTwoFactorEnabled: false, + }) + .returning(); + + // check if user role is admin + const role = createUserDto.role <= 2 ? 5 : createUserDto.role; + + // Assign role to user + await tx.insert(usersRole).values({ + userId: newUser.id, + roleId: role, + }); + + // Return the created user with role + const [userWithRole] = await tx .select({ id: users.id, username: users.username, - email: users.email + email: users.email, + fullname: users.fullname, + phone: users.phone, + isActive: users.isActive, + role: roles.name, }) .from(users) - .where(or(eq(users.username, createUserDto.username), eq(users.email, createUserDto.email))); - - if (data.length > 0) { - if (data[0].username === createUserDto.username) { - throw new HttpException('Username already exists', HttpStatus.BAD_REQUEST); - } - if (data[0].email === createUserDto.email) { - throw new HttpException('Email already exists', HttpStatus.BAD_REQUEST); - } - } + .leftJoin(usersRole, eq(usersRole.userId, users.id)) + .leftJoin(roles, eq(roles.id, usersRole.roleId)) + .where(eq(users.id, newUser.id)); - // Hash the password - const hashedPassword = await bcrypt.hash(createUserDto.password, 10); - - // Start a transaction - return await this.drizzle.transaction(async (tx) => { - // Create the user - const [newUser] = await tx - .insert(users) - .values({ - username: createUserDto.username, - email: createUserDto.email, - password: hashedPassword, - fullname: createUserDto.fullname, - isActive: true, - state: createUserDto.state, - municipality: createUserDto.municipality, - parish: createUserDto.parish, - phone: createUserDto.phone, - isEmailVerified: false, - isTwoFactorEnabled: false, - }) - .returning(); - - // check if user role is admin - const role = createUserDto.role <= 2 ? 5 : createUserDto.role; - - // Assign role to user - await tx.insert(usersRole).values({ - userId: newUser.id, - roleId: role, - }); - - // Return the created user with role - const [userWithRole] = await tx - .select({ - id: users.id, - username: users.username, - email: users.email, - fullname: users.fullname, - phone: users.phone, - isActive: users.isActive, - role: roles.name, - }) - .from(users) - .leftJoin(usersRole, eq(usersRole.userId, users.id)) - .leftJoin(roles, eq(roles.id, usersRole.roleId)) - .where(eq(users.id, newUser.id)); - - return userWithRole; - }) - + return userWithRole; + }); } } diff --git a/apps/web/feactures/inventory/components/inventory/product-inventory-list.tsx b/apps/web/feactures/inventory/components/inventory/product-inventory-list.tsx index 13fa199..85567df 100644 --- a/apps/web/feactures/inventory/components/inventory/product-inventory-list.tsx +++ b/apps/web/feactures/inventory/components/inventory/product-inventory-list.tsx @@ -1,13 +1,14 @@ 'use client'; import { DataTable } from '@repo/shadcn/table/data-table'; import { DataTableSkeleton } from '@repo/shadcn/table/data-table-skeleton'; -import { columns } from './product-tables/columns'; import { useProductQuery } from '../../hooks/use-query-products'; +import { columns } from './product-tables/columns'; interface dataListProps { initialPage: number; initialSearch?: string | null; initialLimit: number; + initialType?: string | null; } export default function UsersAdminList({ @@ -19,9 +20,9 @@ export default function UsersAdminList({ page: initialPage, limit: initialLimit, ...(initialSearch && { search: initialSearch }), - } + }; - const {data, isLoading} = useProductQuery(filters) + const { data, isLoading } = useProductQuery(filters); // console.log(data?.data);