import { Controller, Get, Patch, Body, Req, UseInterceptors, ClassSerializerInterceptor, UsePipes, } from "@nestjs/common"; import { UsersService } from "./users.service"; import { ZodValidationPipe } from "@bff/core/validation"; import { updateProfileRequestSchema, updateAddressRequestSchema, type UpdateProfileRequest, type UpdateAddressRequest, } from "@customer-portal/domain/auth"; import type { RequestWithUser } from "@bff/modules/auth/auth.types"; @Controller("me") @UseInterceptors(ClassSerializerInterceptor) export class UsersController { constructor(private usersService: UsersService) {} @Get() async getProfile(@Req() req: RequestWithUser) { return this.usersService.findById(req.user.id); } @Get("summary") async getSummary(@Req() req: RequestWithUser) { return this.usersService.getUserSummary(req.user.id); } @Patch() @UsePipes(new ZodValidationPipe(updateProfileRequestSchema)) async updateProfile(@Req() req: RequestWithUser, @Body() updateData: UpdateProfileRequest) { return this.usersService.updateProfile(req.user.id, updateData); } @Get("address") async getAddress(@Req() req: RequestWithUser) { return this.usersService.getAddress(req.user.id); } // Removed PATCH /me/billing in favor of PATCH /me/address to keep address updates explicit. @Patch("address") @UsePipes(new ZodValidationPipe(updateAddressRequestSchema)) async updateAddress(@Req() req: RequestWithUser, @Body() address: UpdateAddressRequest) { await this.usersService.updateAddress(req.user.id, address); // Return fresh address snapshot return this.usersService.getAddress(req.user.id); } }