archetecture security fix
This commit is contained in:
@@ -0,0 +1,301 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.findByCompany = findByCompany;
|
||||
exports.findById = findById;
|
||||
exports.findInvoices = findInvoices;
|
||||
exports.findInvoiceByAmanpay = findInvoiceByAmanpay;
|
||||
exports.findInvoiceByPaypal = findInvoiceByPaypal;
|
||||
exports.findInvoiceByPaypalForCompany = findInvoiceByPaypalForCompany;
|
||||
exports.findInvoiceById = findInvoiceById;
|
||||
exports.findOrCreateSubscription = findOrCreateSubscription;
|
||||
exports.activateSubscription = activateSubscription;
|
||||
exports.startTrial = startTrial;
|
||||
exports.setPaymentPending = setPaymentPending;
|
||||
exports.setPastDue = setPastDue;
|
||||
exports.setSuspended = setSuspended;
|
||||
exports.setExpired = setExpired;
|
||||
exports.setCancelled = setCancelled;
|
||||
exports.setCancelAtPeriodEnd = setCancelAtPeriodEnd;
|
||||
exports.incrementRetryCount = incrementRetryCount;
|
||||
exports.updatePlan = updatePlan;
|
||||
exports.createInvoice = createInvoice;
|
||||
exports.markInvoicePaid = markInvoicePaid;
|
||||
exports.markInvoiceFailed = markInvoiceFailed;
|
||||
exports.markInvoiceVoided = markInvoiceVoided;
|
||||
exports.updateInvoicePaypal = updateInvoicePaypal;
|
||||
exports.createPaymentAttempt = createPaymentAttempt;
|
||||
exports.getPaymentAttempts = getPaymentAttempts;
|
||||
exports.createEvent = createEvent;
|
||||
exports.getEvents = getEvents;
|
||||
exports.findPaymentPendingTimedOut = findPaymentPendingTimedOut;
|
||||
exports.findPastDueTimedOut = findPastDueTimedOut;
|
||||
exports.findSuspendedTimedOut = findSuspendedTimedOut;
|
||||
exports.findTrialsEndedWithoutConversion = findTrialsEndedWithoutConversion;
|
||||
exports.findSubscriptionsToExpireAtPeriodEnd = findSubscriptionsToExpireAtPeriodEnd;
|
||||
const prisma_1 = require("../../lib/prisma");
|
||||
// ─── Subscription queries ─────────────────────────────────────
|
||||
function findByCompany(companyId) {
|
||||
return prisma_1.prisma.subscription.findUnique({
|
||||
where: { companyId },
|
||||
include: {
|
||||
invoices: { orderBy: { createdAt: 'desc' }, take: 12 },
|
||||
events: { orderBy: { occurredAt: 'desc' }, take: 20 },
|
||||
},
|
||||
});
|
||||
}
|
||||
function findById(id) {
|
||||
return prisma_1.prisma.subscription.findUnique({
|
||||
where: { id },
|
||||
include: { company: true },
|
||||
});
|
||||
}
|
||||
function findInvoices(companyId) {
|
||||
return prisma_1.prisma.subscriptionInvoice.findMany({
|
||||
where: { companyId },
|
||||
orderBy: { createdAt: 'desc' },
|
||||
take: 50,
|
||||
});
|
||||
}
|
||||
function findInvoiceByAmanpay(transactionId) {
|
||||
return prisma_1.prisma.subscriptionInvoice.findFirst({
|
||||
where: { amanpayTransactionId: transactionId },
|
||||
include: { subscription: true },
|
||||
});
|
||||
}
|
||||
function findInvoiceByPaypal(captureId) {
|
||||
return prisma_1.prisma.subscriptionInvoice.findFirst({
|
||||
where: { paypalCaptureId: captureId },
|
||||
include: { subscription: true },
|
||||
});
|
||||
}
|
||||
function findInvoiceByPaypalForCompany(paypalOrderId, companyId) {
|
||||
return prisma_1.prisma.subscriptionInvoice.findFirstOrThrow({
|
||||
where: { paypalCaptureId: paypalOrderId, companyId },
|
||||
include: { subscription: true },
|
||||
});
|
||||
}
|
||||
function findInvoiceById(id) {
|
||||
return prisma_1.prisma.subscriptionInvoice.findUniqueOrThrow({
|
||||
where: { id },
|
||||
include: { subscription: true },
|
||||
});
|
||||
}
|
||||
// ─── Subscription mutations ───────────────────────────────────
|
||||
async function findOrCreateSubscription(companyId, plan, billingPeriod, currency) {
|
||||
const existing = await prisma_1.prisma.subscription.findUnique({ where: { companyId } });
|
||||
if (existing)
|
||||
return existing;
|
||||
return prisma_1.prisma.subscription.create({
|
||||
data: { companyId, plan: plan, billingPeriod: billingPeriod, currency, status: 'PAYMENT_PENDING' },
|
||||
});
|
||||
}
|
||||
function activateSubscription(id, periodEnd) {
|
||||
return prisma_1.prisma.subscription.update({
|
||||
where: { id },
|
||||
data: {
|
||||
status: 'ACTIVE',
|
||||
currentPeriodStart: new Date(),
|
||||
currentPeriodEnd: periodEnd,
|
||||
paymentPendingSince: null,
|
||||
paymentDueAt: null,
|
||||
pastDueSince: null,
|
||||
suspendedAt: null,
|
||||
retryCount: 0,
|
||||
},
|
||||
});
|
||||
}
|
||||
function startTrial(companyId, plan, billingPeriod, currency, trialEndAt) {
|
||||
return prisma_1.prisma.subscription.upsert({
|
||||
where: { companyId },
|
||||
update: {
|
||||
plan: plan,
|
||||
billingPeriod: billingPeriod,
|
||||
currency,
|
||||
status: 'TRIALING',
|
||||
trialStartAt: new Date(),
|
||||
trialEndAt,
|
||||
trialUsed: true,
|
||||
},
|
||||
create: {
|
||||
companyId,
|
||||
plan: plan,
|
||||
billingPeriod: billingPeriod,
|
||||
currency,
|
||||
status: 'TRIALING',
|
||||
trialStartAt: new Date(),
|
||||
trialEndAt,
|
||||
trialUsed: true,
|
||||
},
|
||||
});
|
||||
}
|
||||
function setPaymentPending(id) {
|
||||
const now = new Date();
|
||||
const dueAt = new Date(now.getTime() + 7 * 24 * 60 * 60 * 1000);
|
||||
return prisma_1.prisma.subscription.update({
|
||||
where: { id },
|
||||
data: {
|
||||
status: 'PAYMENT_PENDING',
|
||||
paymentPendingSince: now,
|
||||
paymentDueAt: dueAt,
|
||||
},
|
||||
});
|
||||
}
|
||||
function setPastDue(id) {
|
||||
return prisma_1.prisma.subscription.update({
|
||||
where: { id },
|
||||
data: {
|
||||
status: 'PAST_DUE',
|
||||
pastDueSince: new Date(),
|
||||
},
|
||||
});
|
||||
}
|
||||
function setSuspended(id) {
|
||||
return prisma_1.prisma.subscription.update({
|
||||
where: { id },
|
||||
data: {
|
||||
status: 'SUSPENDED',
|
||||
suspendedAt: new Date(),
|
||||
},
|
||||
});
|
||||
}
|
||||
function setExpired(id) {
|
||||
return prisma_1.prisma.subscription.update({
|
||||
where: { id },
|
||||
data: { status: 'EXPIRED', endedAt: new Date() },
|
||||
});
|
||||
}
|
||||
function setCancelled(id, immediate) {
|
||||
if (immediate) {
|
||||
return prisma_1.prisma.subscription.update({
|
||||
where: { id },
|
||||
data: { status: 'CANCELLED', cancelledAt: new Date(), endedAt: new Date() },
|
||||
});
|
||||
}
|
||||
return prisma_1.prisma.subscription.update({
|
||||
where: { id },
|
||||
data: { cancelAtPeriodEnd: true },
|
||||
});
|
||||
}
|
||||
function setCancelAtPeriodEnd(companyId, value) {
|
||||
return prisma_1.prisma.subscription.update({
|
||||
where: { companyId },
|
||||
data: { cancelAtPeriodEnd: value },
|
||||
});
|
||||
}
|
||||
function incrementRetryCount(id) {
|
||||
return prisma_1.prisma.subscription.update({
|
||||
where: { id },
|
||||
data: { retryCount: { increment: 1 } },
|
||||
});
|
||||
}
|
||||
function updatePlan(companyId, data) {
|
||||
return prisma_1.prisma.subscription.update({ where: { companyId }, data });
|
||||
}
|
||||
// ─── Invoice mutations ────────────────────────────────────────
|
||||
function createInvoice(data) {
|
||||
return prisma_1.prisma.subscriptionInvoice.create({
|
||||
data: { ...data, status: 'PENDING', paymentProvider: data.paymentProvider },
|
||||
});
|
||||
}
|
||||
function markInvoicePaid(id) {
|
||||
return prisma_1.prisma.subscriptionInvoice.update({
|
||||
where: { id },
|
||||
data: { status: 'PAID', paidAt: new Date(), failedAt: null },
|
||||
});
|
||||
}
|
||||
function markInvoiceFailed(id) {
|
||||
return prisma_1.prisma.subscriptionInvoice.update({
|
||||
where: { id },
|
||||
data: { status: 'FAILED', failedAt: new Date() },
|
||||
});
|
||||
}
|
||||
function markInvoiceVoided(id) {
|
||||
return prisma_1.prisma.subscriptionInvoice.update({
|
||||
where: { id },
|
||||
data: { status: 'VOIDED', voidedAt: new Date() },
|
||||
});
|
||||
}
|
||||
function updateInvoicePaypal(id, captureId) {
|
||||
return prisma_1.prisma.subscriptionInvoice.update({
|
||||
where: { id },
|
||||
data: { status: 'PAID', paidAt: new Date(), paypalCaptureId: captureId, failedAt: null },
|
||||
});
|
||||
}
|
||||
// ─── Payment attempts ─────────────────────────────────────────
|
||||
function createPaymentAttempt(data) {
|
||||
return prisma_1.prisma.paymentAttempt.create({
|
||||
data: { ...data, attemptedAt: new Date() },
|
||||
});
|
||||
}
|
||||
function getPaymentAttempts(invoiceId) {
|
||||
return prisma_1.prisma.paymentAttempt.findMany({
|
||||
where: { invoiceId },
|
||||
orderBy: { attemptedAt: 'desc' },
|
||||
});
|
||||
}
|
||||
// ─── Subscription events ──────────────────────────────────────
|
||||
function createEvent(data) {
|
||||
return prisma_1.prisma.subscriptionEvent.create({
|
||||
data: {
|
||||
...data,
|
||||
source: data.source ?? 'system',
|
||||
payload: (data.payload ?? {}),
|
||||
occurredAt: new Date(),
|
||||
},
|
||||
});
|
||||
}
|
||||
function getEvents(subscriptionId) {
|
||||
return prisma_1.prisma.subscriptionEvent.findMany({
|
||||
where: { subscriptionId },
|
||||
orderBy: { occurredAt: 'desc' },
|
||||
take: 50,
|
||||
});
|
||||
}
|
||||
// ─── Scheduled job helpers ────────────────────────────────────
|
||||
function findPaymentPendingTimedOut(cutoffDate) {
|
||||
return prisma_1.prisma.subscription.findMany({
|
||||
where: {
|
||||
status: 'PAYMENT_PENDING',
|
||||
paymentPendingSince: { lte: cutoffDate },
|
||||
},
|
||||
include: { company: true },
|
||||
});
|
||||
}
|
||||
function findPastDueTimedOut(cutoffDate) {
|
||||
return prisma_1.prisma.subscription.findMany({
|
||||
where: {
|
||||
status: 'PAST_DUE',
|
||||
pastDueSince: { lte: cutoffDate },
|
||||
},
|
||||
include: { company: true },
|
||||
});
|
||||
}
|
||||
function findSuspendedTimedOut(cutoffDate) {
|
||||
return prisma_1.prisma.subscription.findMany({
|
||||
where: {
|
||||
status: 'SUSPENDED',
|
||||
suspendedAt: { lte: cutoffDate },
|
||||
},
|
||||
include: { company: true },
|
||||
});
|
||||
}
|
||||
function findTrialsEndedWithoutConversion() {
|
||||
return prisma_1.prisma.subscription.findMany({
|
||||
where: {
|
||||
status: 'TRIALING',
|
||||
trialEndAt: { lte: new Date() },
|
||||
},
|
||||
include: { company: { include: { employees: { where: { role: 'OWNER' }, take: 1 } } } },
|
||||
});
|
||||
}
|
||||
function findSubscriptionsToExpireAtPeriodEnd() {
|
||||
return prisma_1.prisma.subscription.findMany({
|
||||
where: {
|
||||
status: 'ACTIVE',
|
||||
cancelAtPeriodEnd: true,
|
||||
currentPeriodEnd: { lte: new Date() },
|
||||
},
|
||||
include: { company: true },
|
||||
});
|
||||
}
|
||||
//# sourceMappingURL=subscription.repo.js.map
|
||||
Reference in New Issue
Block a user