always create new subscription

This commit is contained in:
m5r 2021-10-02 00:19:06 +02:00
parent 0d7e0ba1b4
commit dd9d15d042
7 changed files with 169 additions and 143 deletions

View File

@ -1,7 +1,7 @@
import type { BlitzApiHandler } from "blitz"; import type { BlitzApiHandler } from "blitz";
import { cancelPaddleSubscription } from "../../../integrations/paddle"; import { cancelPaddleSubscription } from "integrations/paddle";
import appLogger from "../../../integrations/logger"; import appLogger from "integrations/logger";
const logger = appLogger.child({ route: "/api/debug/cancel-subscription" }); const logger = appLogger.child({ route: "/api/debug/cancel-subscription" });

View File

@ -0,0 +1,29 @@
import type { BlitzApiHandler } from "blitz";
import { getPayments } from "integrations/paddle";
import appLogger from "integrations/logger";
import db from "db";
const logger = appLogger.child({ route: "/api/debug/cancel-subscription" });
const cancelSubscriptionHandler: BlitzApiHandler = async (req, res) => {
const { organizationId } = req.body;
logger.debug(`fetching payments for organizationId="${organizationId}"`);
const subscriptions = await db.subscription.findMany({ where: { organizationId } });
if (subscriptions.length === 0) {
res.status(200).send([]);
}
console.log("subscriptions", subscriptions);
const paymentsBySubscription = await Promise.all(
subscriptions.map((subscription) => getPayments({ subscriptionId: subscription.paddleSubscriptionId })),
);
const payments = paymentsBySubscription.flat();
const result = Array.from(payments).sort((a, b) => b.payout_date.localeCompare(a.payout_date));
logger.debug(result);
res.status(200).send(result);
};
export default cancelSubscriptionHandler;

View File

@ -0,0 +1,18 @@
import type { BlitzApiHandler } from "blitz";
import db from "db";
import appLogger from "integrations/logger";
const logger = appLogger.child({ route: "/api/debug/get-subscription" });
const cancelSubscriptionHandler: BlitzApiHandler = async (req, res) => {
const { organizationId } = req.body;
logger.debug(`fetching subscription for organizationId="${organizationId}"`);
const subscription = await db.subscription.findFirst({ where: { organizationId } });
console.debug(subscription);
res.status(200).send(subscription);
};
export default cancelSubscriptionHandler;

View File

@ -30,34 +30,27 @@ export const subscriptionCreatedQueue = Queue<Payload>("api/queue/subscription-c
const orgOwner = organization.memberships.find((membership) => membership.role === MembershipRole.OWNER); const orgOwner = organization.memberships.find((membership) => membership.role === MembershipRole.OWNER);
const email = orgOwner!.user!.email; const email = orgOwner!.user!.email;
const paddleCheckoutId = event.checkoutId; await db.organization.update({
const paddleSubscriptionId = event.subscriptionId; where: { id: organizationId },
const planId = event.productId;
const nextBillDate = event.nextPaymentDate;
const status = translateSubscriptionStatus(event.status);
const lastEventTime = event.eventTime;
const updateUrl = event.updateUrl;
const cancelUrl = event.cancelUrl;
const currency = event.currency;
const unitPrice = event.unitPrice;
if (!!organization.subscription) {
await db.subscription.update({
where: { paddleSubscriptionId: organization.subscription.paddleSubscriptionId },
data: { data: {
paddleSubscriptionId, subscription: {
paddlePlanId: planId, create: {
paddleCheckoutId, paddleSubscriptionId: event.subscriptionId,
nextBillDate, paddlePlanId: event.productId,
status, paddleCheckoutId: event.checkoutId,
lastEventTime, nextBillDate: event.nextPaymentDate,
updateUrl, status: translateSubscriptionStatus(event.status),
cancelUrl, lastEventTime: event.eventTime,
currency, updateUrl: event.updateUrl,
unitPrice, cancelUrl: event.cancelUrl,
currency: event.currency,
unitPrice: event.unitPrice,
},
},
}, },
}); });
if (!!organization.subscription) {
sendEmail({ sendEmail({
subject: "Welcome back to Shellphone", subject: "Welcome back to Shellphone",
body: "Welcome back to Shellphone", body: "Welcome back to Shellphone",
@ -66,26 +59,6 @@ export const subscriptionCreatedQueue = Queue<Payload>("api/queue/subscription-c
logger.error(error); logger.error(error);
}); });
} else { } else {
await db.organization.update({
where: { id: organizationId },
data: {
subscription: {
create: {
paddleSubscriptionId,
paddlePlanId: planId,
paddleCheckoutId,
nextBillDate,
status,
lastEventTime,
updateUrl,
cancelUrl,
currency,
unitPrice,
},
},
},
});
sendEmail({ sendEmail({
subject: "Welcome to Shellphone", subject: "Welcome to Shellphone",
body: `Welcome to Shellphone`, body: `Welcome to Shellphone`,

View File

@ -3,9 +3,12 @@ import useSubscription from "../../hooks/use-subscription";
export default function BillingHistory() { export default function BillingHistory() {
const { payments } = useSubscription(); const { payments } = useSubscription();
if (payments.length === 0) {
return null;
}
return ( return (
<section> <section className="bg-white pt-6 shadow sm:rounded-md sm:overflow-hidden">
<div className="bg-white pt-6 shadow sm:rounded-md sm:overflow-hidden">
<div className="px-4 sm:px-6"> <div className="px-4 sm:px-6">
<h2 className="text-lg leading-6 font-medium text-gray-900">Billing history</h2> <h2 className="text-lg leading-6 font-medium text-gray-900">Billing history</h2>
</div> </div>
@ -76,7 +79,6 @@ export default function BillingHistory() {
</div> </div>
</div> </div>
</div> </div>
</div>
</section> </section>
); );
} }

View File

@ -31,22 +31,16 @@ const Billing: BlitzPage<Props> = (props) => {
*/ */
useRequireOnboarding(); useRequireOnboarding();
const { subscription, cancelSubscription, updatePaymentMethod } = useSubscription({ const { subscription, cancelSubscription, updatePaymentMethod, payments } = useSubscription({
initialData: props.subscription, initialData: props.subscription,
}); });
if (!subscription) {
return (
<>
<Plans />
<p className="text-sm text-gray-500">Prices include all applicable sales taxes.</p>
</>
);
}
return ( return (
<> <>
{subscription ? (
<SettingsSection> <SettingsSection>
<p>Current plan: {subscription.paddlePlanId}</p>
<PaddleLink <PaddleLink
onClick={() => updatePaymentMethod({ updateUrl: subscription.updateUrl })} onClick={() => updatePaymentMethod({ updateUrl: subscription.updateUrl })}
text="Update payment method" text="Update payment method"
@ -56,12 +50,17 @@ const Billing: BlitzPage<Props> = (props) => {
text="Cancel subscription" text="Cancel subscription"
/> />
</SettingsSection> </SettingsSection>
) : null}
{payments.length > 0 ? (
<>
<BillingHistory /> <BillingHistory />
<div className="hidden lg:block lg:py-3"> <div className="hidden lg:block lg:py-3">
<Divider /> <Divider />
</div> </div>
</>
) : null}
<Plans /> <Plans />
<p className="text-sm text-gray-500">Prices include all applicable sales taxes.</p> <p className="text-sm text-gray-500">Prices include all applicable sales taxes.</p>

View File

@ -1,9 +1,14 @@
import { resolver } from "blitz"; import { resolver } from "blitz";
import db from "db"; import db, { SubscriptionStatus } from "db";
export default resolver.pipe(resolver.authorize(), async (_ = null, { session }) => { export default resolver.pipe(resolver.authorize(), async (_ = null, { session }) => {
if (!session.orgId) return null; if (!session.orgId) return null;
return db.subscription.findFirst({ where: { organizationId: session.orgId } }); return db.subscription.findFirst({
where: {
organizationId: session.orgId,
status: { not: SubscriptionStatus.deleted },
},
});
}); });