diff --git a/apps/api/src/common/guards/jwt-refresh.guard.ts b/apps/api/src/common/guards/jwt-refresh.guard.ts index 2a31486..b0612db 100644 --- a/apps/api/src/common/guards/jwt-refresh.guard.ts +++ b/apps/api/src/common/guards/jwt-refresh.guard.ts @@ -43,7 +43,14 @@ export class JwtRefreshGuard implements CanActivate { } private extractTokenFromHeader(request: Request): string | undefined { - const [type, token] = request.headers.authorization?.split(' ') ?? []; - return type === 'Bearer' ? token : undefined; + const token = request.body.token + console.log(token); + + if (token) { + return token; + } + // console.log(request.headers.authorization); + // const [type, token] = request.headers.authorization?.split(' ') ?? []; + // return type === 'Bearer' ? token : undefined; } } diff --git a/apps/api/src/features/auth/auth.controller.ts b/apps/api/src/features/auth/auth.controller.ts index 55de095..abe1c0e 100644 --- a/apps/api/src/features/auth/auth.controller.ts +++ b/apps/api/src/features/auth/auth.controller.ts @@ -11,6 +11,7 @@ import { HttpCode, Patch, Post, + Req, UseGuards, } from '@nestjs/common'; import { AuthService } from './auth.service'; @@ -51,13 +52,18 @@ export class AuthController { // } @UseGuards(JwtRefreshGuard) - @Patch('refresh-token') + @Public() + @HttpCode(200) + @Patch('refresh') //@RequirePermissions('auth:refresh-token') - async refreshToken(@Body() refreshTokenDto: RefreshTokenDto) { - console.log("Refrescando token..."); - console.log(refreshTokenDto); + async refreshToken(@Req() req: Request,@Body() refreshTokenDto: RefreshTokenDto) { + console.log("Pepe"); + console.log(req['user']); + //console.log(refreshTokenDto); - return await this.authService.refreshToken(refreshTokenDto); + return null + + // return await this.authService.refreshToken(refreshTokenDto); } // @Public() diff --git a/apps/api/src/features/auth/dto/refresh-token.dto.ts b/apps/api/src/features/auth/dto/refresh-token.dto.ts index dd2e8c1..6c3e5c8 100644 --- a/apps/api/src/features/auth/dto/refresh-token.dto.ts +++ b/apps/api/src/features/auth/dto/refresh-token.dto.ts @@ -8,7 +8,7 @@ export class RefreshTokenDto { }) refresh_token: string; - @ApiProperty() - @IsNumber() - user_id: number; + // @ApiProperty() + // @IsNumber() + // user_id: number; } diff --git a/apps/uploads/inventory/1/1-ibuki-douji-sign-noise-sd.jpg b/apps/uploads/inventory/1/1-ibuki-douji-sign-noise-sd.jpg deleted file mode 100644 index 0dd96ce..0000000 Binary files a/apps/uploads/inventory/1/1-ibuki-douji-sign-noise-sd.jpg and /dev/null differ diff --git a/apps/web/app/dashboard/productos/[id]/page.tsx b/apps/web/app/dashboard/productos/[id]/page.tsx index 7f0fb09..7e553ab 100644 --- a/apps/web/app/dashboard/productos/[id]/page.tsx +++ b/apps/web/app/dashboard/productos/[id]/page.tsx @@ -34,50 +34,61 @@ export default async function SurveyResponsePage({ const product = data.data - const lorem = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolore placeat est corporis minus exercitationem impedit ab architecto dolorum nihil nam facilis suscipit porro, iure et quidem illo mollitia officia amet?" + // const lorem = "Lorem ipsum dolor sit amet, consectetur adipisicing elit. Dolore placeat est corporis minus exercitationem impedit ab architecto dolorum nihil nam facilis suscipit porro, iure et quidem illo mollitia officia amet?" // console.log(data.data); return ( // -
+
+
+ - - - - {product.title.charAt(0).toUpperCase() + product.title.slice(1)} - -

$ {product.price}

- {product.status === 'AGOTADO' ? ( -

AGOTADO

- ): ('')} -
- -
-

Descripción

-

{product.description}

- {/*

{lorem+lorem+lorem+lorem}

*/} -
-
-

Dirección

-

{product.address}

-
-
- - -
-

Información del vendedor

-

{product.fullname}

-

{product.phone}

-

{product.email}

-
-
-
-
+
+ +
+ + + + + {product.title.charAt(0).toUpperCase() + product.title.slice(1)} + +

$ {product.price}

+ {product.status === 'AGOTADO' ? ( +

AGOTADO

+ ) : ('')} +
+ +
+

Descripción

+

{product.description}

+ {/*

{lorem+lorem+lorem+lorem}

*/} +
+ +
+

Dirección

+

{product.address}

+
+
+ + +
+

Información del vendedor

+

{product.fullname}

+

{product.phone}

+

{product.email}

+
+
+
+
); } \ No newline at end of file diff --git a/apps/web/feactures/auth/actions/login-action.ts b/apps/web/feactures/auth/actions/login-action.ts index 9799b80..24102f6 100644 --- a/apps/web/feactures/auth/actions/login-action.ts +++ b/apps/web/feactures/auth/actions/login-action.ts @@ -2,9 +2,6 @@ import { safeFetchApi } from '@/lib'; import { loginResponseSchema, UserFormValue } from '../schemas/login'; - - - type LoginActionSuccess = { message: string; user: { diff --git a/apps/web/feactures/auth/actions/refresh-token-action.ts b/apps/web/feactures/auth/actions/refresh-token-action.ts index 34ef204..707274b 100644 --- a/apps/web/feactures/auth/actions/refresh-token-action.ts +++ b/apps/web/feactures/auth/actions/refresh-token-action.ts @@ -1,21 +1,32 @@ 'use server'; -import { safeFetchApi } from '@/lib'; +import { refreshApi } from '@/lib/refreshApi'; // Importa la nueva instancia import { RefreshTokenResponseSchema, RefreshTokenValue, } from '../schemas/refreshToken'; export const resfreshTokenAction = async (refreshToken: RefreshTokenValue) => { - // return null // Descomentar esto evita que se tenga que borrar cache al navegador - const [error, data] = await safeFetchApi( - RefreshTokenResponseSchema, - '/auth/refreshToken', - 'POST', - refreshToken, - ); - if (error) { - console.error('Error:', error); - } else { - return data; + try { + const body = { + token: refreshToken.token, + } + + // Usa la nueva instancia `refreshApi` + const response = await refreshApi.patch('/auth/refresh', body); + + const parsed = RefreshTokenResponseSchema.safeParse(response.data); + + if (!parsed.success) { + console.error('Error de validación en la respuesta de refresh token:', { + errors: parsed.error.errors, + receivedData: response.data, + }); + return null; + } + + return parsed.data; + } catch (error: any) { // Captura el error para acceso a error.response + console.error('Error al renovar el token:', error.response?.data || error.message); + return null; } -}; +}; \ No newline at end of file diff --git a/apps/web/feactures/inventory/actions/actions.ts b/apps/web/feactures/inventory/actions/actions.ts index c17b446..d6146f0 100644 --- a/apps/web/feactures/inventory/actions/actions.ts +++ b/apps/web/feactures/inventory/actions/actions.ts @@ -117,18 +117,19 @@ export const getProductById = async (id: number) => { return data; }; -export const createProductAction = async (payload: InventoryTable) => { +export const createProductAction = async (payload: FormData) => { const session = await auth() const userId = session?.user?.id - const { id, ...payloadWithoutId } = payload; - - payloadWithoutId.userId = userId + + if (userId) { + payload.append('userId', String(userId)); + } const [error, data] = await safeFetchApi( productMutate, '/products', 'POST', - payloadWithoutId, + payload, ); if (error) { @@ -136,7 +137,7 @@ export const createProductAction = async (payload: InventoryTable) => { throw new Error('Error al crear el producto'); } - return payloadWithoutId; + return data; }; export const updateUserAction2 = async (payload: InventoryTable) => { diff --git a/apps/web/feactures/inventory/components/inventory/create-product-form.tsx b/apps/web/feactures/inventory/components/inventory/create-product-form.tsx index 596687c..d6554c5 100644 --- a/apps/web/feactures/inventory/components/inventory/create-product-form.tsx +++ b/apps/web/feactures/inventory/components/inventory/create-product-form.tsx @@ -16,56 +16,83 @@ import { SelectTrigger, SelectValue, } from '@repo/shadcn/select'; -import { Textarea } from '@repo/shadcn/textarea'; import { Input } from '@repo/shadcn/input'; import { useForm } from 'react-hook-form'; import { useCreateUser } from "@/feactures/inventory/hooks/use-mutation"; -import { EditInventory, editInventory } from '@/feactures/inventory/schemas/inventory'; -import {STATUS} from '@/constants/status' +import { editInventory, EditInventory } from '@/feactures/inventory/schemas/inventory'; +import { Textarea } from '@repo/shadcn/textarea'; +import { STATUS } from '@/constants/status' +import { useState, useEffect } from 'react'; +import { sizeFormate } from "@/feactures/inventory/utils/sizeFormate" interface CreateFormProps { onSuccess?: () => void; onCancel?: () => void; - defaultValues?: Partial; } export function CreateForm({ onSuccess, - onCancel + onCancel, }: CreateFormProps) { const { - mutate: saveAccountingAccounts, + mutate: saveProduct, isPending: isSaving, - isError, } = useCreateUser(); - const defaultformValues = { + const [sizeFile, setSizeFile] = useState('0 bytes'); + const [previewUrls, setPreviewUrls] = useState([]); + + useEffect(() => { + return () => { + previewUrls.forEach(url => URL.revokeObjectURL(url)); + }; + }, [previewUrls]); + + const defaultformValues: EditInventory = { title: '', description: '', - address: '', price: '', + address: '', + status: 'BORRADOR', stock: 0, - urlImg: '', - status: '' - } + urlImg: undefined, + }; const form = useForm({ resolver: zodResolver(editInventory), defaultValues: defaultformValues, - mode: 'onChange', // Enable real-time validation + mode: 'onChange', }); const onSubmit = async (data: EditInventory) => { + const formData = new FormData(); - saveAccountingAccounts(data, { + formData.append('title', data.title); + formData.append('description', data.description); + formData.append('price', String(data.price)); + formData.append('address', data.address); + formData.append('status', data.status); + formData.append('stock', String(data.stock)); + + if (data.urlImg) { + for (let i = 0; i < data.urlImg.length; i++) { + const file = data.urlImg[i]; + if (file) { + formData.append('urlImg', file); + } + } + } + + saveProduct(formData as any, { onSuccess: () => { form.reset(); onSuccess?.(); }, - onError: (e) => { + onError: (error) => { + console.error("Error al guardar el producto:", error); form.setError('root', { type: 'manual', - message: e.message, + message: error.message || 'Error al guardar el producto', }); }, }); @@ -101,9 +128,7 @@ export function CreateForm({ Precio - + @@ -131,7 +156,7 @@ export function CreateForm({ Descripción -