import { Request } from "express"; import { inject } from "inversify"; import { controller, httpGet, httpPost, queryParam, request, requestBody } from "inversify-express-utils"; import { AddressService } from "./address.service"; import { HttpStatus } from "../../common"; import { SaveSellerAddressDTO, SaveUserAddressDTO } from "./DTO/userAddress.dto"; import { BaseController } from "../../common/base/controller"; import { ApiAuth, ApiModel, ApiOperation, ApiQuery, ApiResponse, ApiTags } from "../../common/decorator/swggerDocs"; import { Guard } from "../../core/middlewares/guard.middleware"; import { ValidationMiddleware } from "../../core/middlewares/validator.middleware"; import { IOCTYPES } from "../../IOC/ioc.types"; import { ISeller } from "../seller/models/Abstraction/ISeller"; import { IUser } from "../user/models/Abstraction/IUser"; @controller("/address") @ApiTags("Address") class AddressController extends BaseController { @inject(IOCTYPES.AddressService) addressService: AddressService; @ApiOperation("get user location with geo coordinate") @ApiResponse("successful", HttpStatus.Ok) @ApiQuery("lat", "latitude", true) @ApiQuery("lon", "longitude", true) @httpGet("/location/reverse") public async getLocationWithGeo(@queryParam("lat") lat: string, @queryParam("lon") lon: string) { const data = await this.addressService.getLocationWithGeo({ lat, lon }); return this.response(data); } @ApiOperation("set user address of current session user ==> login as user") @ApiResponse("successful", HttpStatus.Created) @ApiModel(SaveUserAddressDTO) @ApiAuth() @httpPost("/user/save", Guard.authUser(), ValidationMiddleware.validateInput(SaveUserAddressDTO)) public async saveUserAddress(@requestBody() addressDto: SaveUserAddressDTO, @request() req: Request) { const user = req.user as IUser; const data = await this.addressService.setUserAddress(user._id.toString(), addressDto); return this.response(data, HttpStatus.Created); } @ApiOperation("set shop address of current session seller ==> login as seller") @ApiResponse("successful", HttpStatus.Created) @ApiModel(SaveSellerAddressDTO) @ApiAuth() @httpPost("/seller/save", Guard.authSeller(), ValidationMiddleware.validateInput(SaveSellerAddressDTO)) public async saveSellerShopAddress(@requestBody() addressDto: SaveSellerAddressDTO, @request() req: Request) { const seller = req.user as ISeller; const data = await this.addressService.setSellerShopAddress(seller._id.toString(), addressDto); return this.response(data, HttpStatus.Created); } } export { AddressController };