mirror of
https://github.com/linkwarden/linkwarden.git
synced 2026-06-29 23:37:04 +00:00
110 lines
2.8 KiB
TypeScript
110 lines
2.8 KiB
TypeScript
import { prisma } from "@linkwarden/prisma";
|
|
|
|
const MAX_LINKS_PER_USER = Number(process.env.MAX_LINKS_PER_USER) || 30000;
|
|
const stripeEnabled = process.env.STRIPE_SECRET_KEY;
|
|
const TRIAL_PERIOD_DAYS = process.env.NEXT_PUBLIC_TRIAL_PERIOD_DAYS || 14;
|
|
const REQUIRE_CC = process.env.NEXT_PUBLIC_REQUIRE_CC === "true";
|
|
|
|
export const hasPassedLimit = async (
|
|
userId: number,
|
|
numberOfImports: number
|
|
) => {
|
|
const user = await prisma.user.findUnique({
|
|
where: { id: userId },
|
|
select: {
|
|
parentSubscriptionId: true,
|
|
subscriptions: { select: { id: true, quantity: true, provider: true } },
|
|
createdAt: true,
|
|
},
|
|
});
|
|
|
|
if (!stripeEnabled && user?.subscriptions?.provider !== "STRIPE") {
|
|
const totalLinks = await prisma.link.count({
|
|
where: {
|
|
createdById: userId,
|
|
},
|
|
});
|
|
|
|
return MAX_LINKS_PER_USER - (numberOfImports + totalLinks) < 0;
|
|
}
|
|
|
|
if (!user) {
|
|
return true;
|
|
}
|
|
|
|
const trialEndTime =
|
|
new Date(user.createdAt).getTime() +
|
|
(1 + Number(TRIAL_PERIOD_DAYS)) * 86400000; // Add 1 to account for the current day
|
|
|
|
const daysLeft = Math.floor((trialEndTime - Date.now()) / 86400000);
|
|
|
|
if (!REQUIRE_CC && daysLeft > 0) {
|
|
const totalLinks = await prisma.link.count({
|
|
where: {
|
|
createdById: userId,
|
|
},
|
|
});
|
|
|
|
return MAX_LINKS_PER_USER - (numberOfImports + totalLinks) < 0;
|
|
}
|
|
|
|
const subscriptionId = user?.parentSubscriptionId ?? user?.subscriptions?.id;
|
|
let quantity = user?.subscriptions?.quantity;
|
|
|
|
if (!quantity) {
|
|
quantity = (
|
|
await prisma.subscription.findUnique({
|
|
where: { id: subscriptionId },
|
|
select: { quantity: true },
|
|
})
|
|
)?.quantity;
|
|
}
|
|
|
|
if (!subscriptionId || !quantity) return true;
|
|
|
|
if (user.parentSubscriptionId) {
|
|
const childCount = await prisma.user.count({
|
|
where: { parentSubscriptionId: subscriptionId },
|
|
});
|
|
|
|
if (!childCount || childCount + 1 > quantity) {
|
|
return true;
|
|
}
|
|
}
|
|
|
|
if (
|
|
user.parentSubscriptionId ||
|
|
(user.subscriptions && user.subscriptions?.quantity > 1)
|
|
) {
|
|
// Calculate the total allowed links for the organization
|
|
const totalCapacity = quantity * MAX_LINKS_PER_USER;
|
|
|
|
const totalLinks = await prisma.link.count({
|
|
where: {
|
|
createdBy: {
|
|
OR: [
|
|
{
|
|
parentSubscriptionId: subscriptionId || undefined,
|
|
},
|
|
{
|
|
subscriptions: {
|
|
id: subscriptionId || undefined,
|
|
},
|
|
},
|
|
],
|
|
},
|
|
},
|
|
});
|
|
|
|
return totalCapacity - (numberOfImports + totalLinks) < 0;
|
|
} else {
|
|
const totalLinks = await prisma.link.count({
|
|
where: {
|
|
createdById: userId,
|
|
},
|
|
});
|
|
|
|
return MAX_LINKS_PER_USER - (numberOfImports + totalLinks) < 0;
|
|
}
|
|
};
|