66 lines
1.8 KiB
TypeScript
66 lines
1.8 KiB
TypeScript
|
import pMap from 'p-map';
|
||
|
import { prisma } from '../_client.js';
|
||
|
import { WorkspaceSubscriptionTier } from '@prisma/client';
|
||
|
import { logger } from '../../utils/logger.js';
|
||
|
import { getTierLimit } from './limit.js';
|
||
|
import { getWorkspaceUsage, pauseWorkspace } from './workspace.js';
|
||
|
import dayjs from 'dayjs';
|
||
|
import { getWorkspaceServiceCount } from '../workspace.js';
|
||
|
|
||
|
/**
|
||
|
* Check workspace usage
|
||
|
* if over limit, pause workspace
|
||
|
*/
|
||
|
export async function checkWorkspaceUsage() {
|
||
|
logger.info('[checkWorkspaceUsage] Start run checkWorkspaceUsage');
|
||
|
|
||
|
const workspaces = await prisma.workspace.findMany({
|
||
|
where: {
|
||
|
paused: false,
|
||
|
},
|
||
|
include: {
|
||
|
subscription: true,
|
||
|
},
|
||
|
});
|
||
|
|
||
|
await pMap(
|
||
|
workspaces,
|
||
|
async (workspace) => {
|
||
|
const tier =
|
||
|
workspace.subscription?.tier ?? WorkspaceSubscriptionTier.FREE;
|
||
|
|
||
|
if (tier === WorkspaceSubscriptionTier.UNLIMITED) {
|
||
|
return;
|
||
|
}
|
||
|
|
||
|
const [usage, serviceCount] = await Promise.all([
|
||
|
getWorkspaceUsage(
|
||
|
workspace.id,
|
||
|
dayjs().startOf('month').valueOf(),
|
||
|
dayjs().valueOf()
|
||
|
),
|
||
|
getWorkspaceServiceCount(workspace.id),
|
||
|
]);
|
||
|
|
||
|
const limit = getTierLimit(tier);
|
||
|
|
||
|
const overUsage =
|
||
|
serviceCount.website > limit.maxWebsiteCount ||
|
||
|
usage.websiteEventCount > limit.maxWebsiteEventCount ||
|
||
|
usage.monitorExecutionCount > limit.maxMonitorExecutionCount ||
|
||
|
usage.websiteEventCount > limit.maxWebsiteEventCount ||
|
||
|
usage.surveyCount > limit.maxSurveyCount ||
|
||
|
serviceCount.feed > limit.maxFeedChannelCount ||
|
||
|
usage.feedEventCount > limit.maxFeedEventCount;
|
||
|
|
||
|
if (overUsage) {
|
||
|
// pause workspace
|
||
|
await pauseWorkspace(workspace.id);
|
||
|
}
|
||
|
},
|
||
|
{
|
||
|
concurrency: 5,
|
||
|
}
|
||
|
);
|
||
|
}
|