- Updated the product query builder to accept a dynamic category field, improving flexibility in SOQL queries. - Introduced a new utility function to validate SOQL field names, ensuring safe inclusion in queries. - Refactored catalog service queries to utilize the new category field validation. - Enhanced the SIM catalog controller to return structured data, improving response consistency. - Updated various components to reflect changes in pricing display logic, ensuring accurate representation of plan costs.
97 lines
3.0 KiB
TypeScript
97 lines
3.0 KiB
TypeScript
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<InternetAddonCatalogItem[]> {
|
|
return this.internetCatalog.getAddons();
|
|
}
|
|
|
|
@Get("internet/installations")
|
|
async getInternetInstallations(): Promise<InternetInstallationCatalogItem[]> {
|
|
return this.internetCatalog.getInstallations();
|
|
}
|
|
|
|
@Get("sim/plans")
|
|
async getSimCatalogData(@Request() req: RequestWithUser): Promise<SimCatalogCollection> {
|
|
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<SimActivationFeeCatalogItem[]> {
|
|
return this.simCatalog.getActivationFees();
|
|
}
|
|
|
|
@Get("sim/addons")
|
|
async getSimAddons(): Promise<SimCatalogProduct[]> {
|
|
return this.simCatalog.getAddons();
|
|
}
|
|
|
|
@Get("vpn/plans")
|
|
async getVpnPlans(): Promise<VpnCatalogProduct[]> {
|
|
return this.vpnCatalog.getPlans();
|
|
}
|
|
|
|
@Get("vpn/activation-fees")
|
|
async getVpnActivationFees(): Promise<VpnCatalogProduct[]> {
|
|
return this.vpnCatalog.getActivationFees();
|
|
}
|
|
}
|