From f050db4359e44ee0878fd3fd7f8c32e5c2ae8570 Mon Sep 17 00:00:00 2001 From: Sergio Ramirez Date: Thu, 21 Aug 2025 15:11:00 -0400 Subject: [PATCH] Cambios de nombres de variables y esquema --- .../inventory/inventory.controller.ts | 28 ++++---- .../web/app/dashboard/productos/[id]/page.tsx | 61 +----------------- .../feactures/inventory/actions/actions.ts | 45 ++----------- .../feactures/inventory/hooks/use-mutation.ts | 6 +- .../feactures/inventory/schemas/inventory.ts | 6 +- ..._NQ_NP_989621-MLV81067179982_122024-O.webp | Bin 10128 -> 0 bytes 6 files changed, 25 insertions(+), 121 deletions(-) delete mode 100644 apps/web/public/uploads/inventory/1/7/1-D_NQ_NP_989621-MLV81067179982_122024-O.webp diff --git a/apps/api/src/features/inventory/inventory.controller.ts b/apps/api/src/features/inventory/inventory.controller.ts index 2865279..98f7400 100644 --- a/apps/api/src/features/inventory/inventory.controller.ts +++ b/apps/api/src/features/inventory/inventory.controller.ts @@ -68,20 +68,20 @@ export class UsersController { } @Patch('/upload') - @ApiOperation({ summary: 'Update a product' }) - @ApiResponse({ status: 200, description: 'Product uploaded successfully.'}) - @ApiResponse({ status: 404, description: 'Product not found.' }) - @ApiResponse({ status: 500, description: 'Internal server error.' }) - @UseInterceptors(FilesInterceptor('urlImg')) - async uploadFile( - @Req() req: Request, - @UploadedFiles() files: Express.Multer.File[], - @Body() body: any - ) { - const id = Number(req['user'].id); - const result = await this.inventoryService.saveImages(files,body,id); - return { data: result }; - } + @ApiOperation({ summary: 'Update a product' }) + @ApiResponse({ status: 200, description: 'Product uploaded successfully.'}) + @ApiResponse({ status: 404, description: 'Product not found.' }) + @ApiResponse({ status: 500, description: 'Internal server error.' }) + @UseInterceptors(FilesInterceptor('urlImg')) + async uploadFile( + @Req() req: Request, + @UploadedFiles() files: Express.Multer.File[], + @Body() body: any + ) { + const id = Number(req['user'].id); + const result = await this.inventoryService.saveImages(files,body,id); + return { data: result }; + } diff --git a/apps/web/app/dashboard/productos/[id]/page.tsx b/apps/web/app/dashboard/productos/[id]/page.tsx index 53ac9bd..aa0bcd4 100644 --- a/apps/web/app/dashboard/productos/[id]/page.tsx +++ b/apps/web/app/dashboard/productos/[id]/page.tsx @@ -30,65 +30,8 @@ export default async function SurveyResponsePage({ if (!data?.data) { return
Encuesta no encontrada
; } - - 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?" - - // 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}

- //
- //
- //
- //
+ ); } \ 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 960ce53..914034a 100644 --- a/apps/web/feactures/inventory/actions/actions.ts +++ b/apps/web/feactures/inventory/actions/actions.ts @@ -118,15 +118,8 @@ export const getProductById = async (id: number) => { }; export const createProductAction = async (payload: FormData) => { - // const session = await auth() - // const userId = session?.user?.id - - // if (userId) { - // payload.append('userId', String(userId)); - // } - const [error, data] = await safeFetchApi( - test, + productMutate, '/products', 'POST', payload, @@ -140,19 +133,10 @@ export const createProductAction = async (payload: FormData) => { return data; }; -export const updateUserAction2 = async (payload: InventoryTable) => { - try { - // const { id, urlImg, ...payloadWithoutId } = payload; - - // const formData = new FormData(); - // formData.append('file', urlImg); - - - // console.log(formData); - - +export const updateProductAction = async (payload: InventoryTable) => { + try { const [error, data] = await safeFetchApi( - test, + productMutate, `/products/upload`, 'PATCH', payload, @@ -170,27 +154,6 @@ export const updateUserAction2 = async (payload: InventoryTable) => { } } -export const updateUserAction = async (payload: InventoryTable) => { - try { - const { id, ...payloadWithoutId } = payload; - - const [error, data] = await safeFetchApi( - productMutate, - `/products/${id}`, - 'PATCH', - payloadWithoutId, - ); - - if (error) { - console.error(error); - throw new Error(error?.message || 'Error al actualizar el producto'); - } - return data; - } catch (error) { - console.error(error); - } -} - export const deleteProductAction = async (id: Number) => { const [error] = await safeFetchApi( productMutate, diff --git a/apps/web/feactures/inventory/hooks/use-mutation.ts b/apps/web/feactures/inventory/hooks/use-mutation.ts index e5fa84b..98e9797 100644 --- a/apps/web/feactures/inventory/hooks/use-mutation.ts +++ b/apps/web/feactures/inventory/hooks/use-mutation.ts @@ -1,6 +1,6 @@ import { useMutation, useQueryClient } from "@tanstack/react-query"; -import { EditInventory } from "../schemas/inventory"; -import { updateUserAction, createProductAction, updateUserAction2 } from "../actions/actions"; +// import { EditInventory } from "../schemas/inventory"; +import { updateProductAction, createProductAction, } from "../actions/actions"; // Create mutation export function useCreateProduct() { @@ -17,7 +17,7 @@ export function useUpdateProduct() { const queryClient = useQueryClient(); const mutation = useMutation({ // mutationFn: (data: EditInventory) => updateUserAction(data), - mutationFn: (data: any) => updateUserAction2(data), + mutationFn: (data: any) => updateProductAction(data), onSuccess: () => queryClient.invalidateQueries({ queryKey: ['product'] }), onError: (e) => console.error('Error:', e) }) diff --git a/apps/web/feactures/inventory/schemas/inventory.ts b/apps/web/feactures/inventory/schemas/inventory.ts index 094676e..0d02265 100644 --- a/apps/web/feactures/inventory/schemas/inventory.ts +++ b/apps/web/feactures/inventory/schemas/inventory.ts @@ -3,7 +3,7 @@ import { url } from 'inspector'; import { z } from 'zod'; -export type InventoryTable = z.infer; +export type InventoryTable = z.infer; export type EditInventory = z.infer; export type ProductApiResponseSchema = z.infer; export type allProducts = z.infer; @@ -17,12 +17,10 @@ export const product = z.object({ title: z.string(), description: z.string(), address: z.string(), - // category: z.string(), stock: z.number(), price: z.string(), urlImg: z.custom().optional(), gallery: z.array(z.string()).optional(), - // urlImg: z.string(), status: z.string(), userId: z.number().optional() }) @@ -98,7 +96,7 @@ export const test = z.object({ export const productMutate = z.object({ message: z.string(), - data: product, + data: seeProduct, }) export const getProduct = z.object({ diff --git a/apps/web/public/uploads/inventory/1/7/1-D_NQ_NP_989621-MLV81067179982_122024-O.webp b/apps/web/public/uploads/inventory/1/7/1-D_NQ_NP_989621-MLV81067179982_122024-O.webp deleted file mode 100644 index 5f45489e1ab92372465c315a09a2c7967b6a7b11..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10128 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