67 lines
1.2 KiB
TypeScript
67 lines
1.2 KiB
TypeScript
import { IsOptional, IsDateString, IsEnum } from 'class-validator';
|
|
|
|
export enum DashboardPeriod {
|
|
DAY = 'day',
|
|
WEEK = 'week',
|
|
MONTH = 'month',
|
|
YEAR = 'year',
|
|
}
|
|
|
|
export class DashboardQueryDto {
|
|
@IsOptional()
|
|
@IsDateString()
|
|
startDate?: string;
|
|
|
|
@IsOptional()
|
|
@IsDateString()
|
|
endDate?: string;
|
|
|
|
@IsOptional()
|
|
@IsEnum(DashboardPeriod)
|
|
period?: DashboardPeriod;
|
|
}
|
|
|
|
export interface DashboardMetrics {
|
|
users: {
|
|
total: number;
|
|
mau: number;
|
|
dau: number;
|
|
newThisPeriod: number;
|
|
};
|
|
stores: {
|
|
total: number;
|
|
activeThisPeriod: number;
|
|
};
|
|
videos: {
|
|
total: number;
|
|
processedThisPeriod: number;
|
|
averageProcessingTime: number;
|
|
};
|
|
revenue: {
|
|
total: number;
|
|
thisPeriod: number;
|
|
byPackage: { packageId: string; name: string; amount: number }[];
|
|
};
|
|
cogs: {
|
|
total: number;
|
|
thisPeriod: number;
|
|
byProvider: { providerId: string; name: string; cost: number }[];
|
|
};
|
|
margin: {
|
|
gross: number;
|
|
percentage: number;
|
|
};
|
|
credits: {
|
|
purchased: number;
|
|
used: number;
|
|
gifted: number;
|
|
};
|
|
}
|
|
|
|
export interface RevenueSeriesPoint {
|
|
date: string;
|
|
revenue: number;
|
|
cogs: number;
|
|
margin: number;
|
|
}
|