import { Controller, Get, Request } from "@nestjs/common"; import type { RequestWithUser } from "@bff/modules/auth/auth.types"; import { parseInternetCatalog, parseSimCatalog, type InternetAddonCatalogItem, type InternetInstallationCatalogItem, type InternetPlanCatalogItem, type SimActivationFeeCatalogItem, type SimCatalogCollection, type SimCatalogProduct, type VpnCatalogProduct, } from "@customer-portal/domain/catalog"; import { InternetCatalogService } from "./services/internet-catalog.service"; import { SimCatalogService } from "./services/sim-catalog.service"; import { VpnCatalogService } from "./services/vpn-catalog.service"; @Controller("catalog") export class CatalogController { constructor( private internetCatalog: InternetCatalogService, private simCatalog: SimCatalogService, private vpnCatalog: VpnCatalogService ) {} @Get("internet/plans") async getInternetPlans(@Request() req: RequestWithUser): Promise<{ plans: InternetPlanCatalogItem[]; installations: InternetInstallationCatalogItem[]; addons: InternetAddonCatalogItem[]; }> { const userId = req.user?.id; if (!userId) { const catalog = await this.internetCatalog.getCatalogData(); return parseInternetCatalog(catalog); } const [plans, installations, addons] = await Promise.all([ this.internetCatalog.getPlansForUser(userId), this.internetCatalog.getInstallations(), this.internetCatalog.getAddons(), ]); return parseInternetCatalog({ plans, installations, addons }); } @Get("internet/addons") async getInternetAddons(): Promise { return this.internetCatalog.getAddons(); } @Get("internet/installations") async getInternetInstallations(): Promise { return this.internetCatalog.getInstallations(); } @Get("sim/plans") async getSimCatalogData(@Request() req: RequestWithUser): Promise { const userId = req.user?.id; if (!userId) { const catalog = await this.simCatalog.getCatalogData(); return parseSimCatalog({ ...catalog, plans: catalog.plans.filter(plan => !plan.simHasFamilyDiscount), }); } const [plans, activationFees, addons] = await Promise.all([ this.simCatalog.getPlansForUser(userId), this.simCatalog.getActivationFees(), this.simCatalog.getAddons(), ]); return parseSimCatalog({ plans, activationFees, addons }); } @Get("sim/activation-fees") async getSimActivationFees(): Promise { return this.simCatalog.getActivationFees(); } @Get("sim/addons") async getSimAddons(): Promise { return this.simCatalog.getAddons(); } @Get("vpn/plans") async getVpnPlans(): Promise { return this.vpnCatalog.getPlans(); } @Get("vpn/activation-fees") async getVpnActivationFees(): Promise { return this.vpnCatalog.getActivationFees(); } }