Files
HiveGrid-Wireframes/hivegrid-cloud/apps/web/app/utils/services/adminDashboardService.ts
T

63 lines
2.4 KiB
TypeScript

import { getAdminActiveUserKpiCounts, getAdminTenantKpiCounts } from "@toolctrl/db/kpi.server";
import { Stat } from "~/application/dtos/stats/Stat";
import currencies from "~/application/pricing/currencies";
import { getStatChangeType } from "../app/DashboardUtils";
import NumberUtils from "../shared/NumberUtils";
import { getMrr } from "./.server/subscriptionService";
import { promiseHash } from "../promises/promiseHash";
import { adminPath } from "~/utils/app/CanonicalUrlUtils";
type AdminDashboardStatsOptions = {
t: (key: string) => string;
gte?: Date;
};
export async function getAdminDashboardStats({ t, gte }: AdminDashboardStatsOptions): Promise<Stat[]> {
const { tenantStat, mrrStat, activeUsersStat } = await promiseHash({
tenantStat: getTenantStat({ t, gte }),
mrrStat: getMMRStat(t),
activeUsersStat: getActiveUsersStat({ t, gte }),
});
return [tenantStat, mrrStat, activeUsersStat];
}
async function getTenantStat({ t, gte }: AdminDashboardStatsOptions) {
const { added, total } = await getAdminTenantKpiCounts({ gte });
const tenantStat: Stat = {
name: t("admin.kpi.accounts.name"),
hint: t("admin.kpi.accounts.hint"),
stat: total.toString(),
previousStat: (total - added).toString(),
change: "+" + added.toString(),
changeType: getStatChangeType(added, total),
path: adminPath("accounts", { mode: "host-aware" }),
};
return tenantStat;
}
async function getMMRStat(t: AdminDashboardStatsOptions["t"]) {
const defaultCurrency = currencies.find((f) => f.default);
const currency = defaultCurrency ?? { value: "usd", symbol: "$" };
const mrr = await getMrr(currency.value);
const tenantStat: Stat = {
name: t("admin.kpi.mrr.name"),
hint: t("admin.kpi.mrr.hint"),
stat: currency.symbol + NumberUtils.decimalFormat(mrr.total),
previousStat: t("admin.kpi.mrr.previousStat").replace("{{0}}", NumberUtils.intFormat(mrr.count)),
};
return tenantStat;
}
async function getActiveUsersStat({ t, gte }: AdminDashboardStatsOptions) {
const { added, total } = await getAdminActiveUserKpiCounts({ gte });
const activeUsersStat: Stat = {
name: t("admin.kpi.activeUsers.name"),
hint: t("admin.kpi.activeUsers.hint"),
stat: total.toString(),
previousStat: (total - added).toString(),
change: "+" + added.toString(),
changeType: getStatChangeType(added, total),
};
return activeUsersStat;
}