63 lines
2.4 KiB
TypeScript
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;
|
|
}
|