diff --git a/account/src/lib/couch-db.ts b/account/src/lib/couch-db.ts index 830552d..ebc81f0 100644 --- a/account/src/lib/couch-db.ts +++ b/account/src/lib/couch-db.ts @@ -107,6 +107,12 @@ export async function updateLingdocsUser(uuid: T.UUID, toUpdate: couchDbPassword: T.UserDbPassword, upgradeToStudentRequest: undefined, } | + { + level: "basic", + wordlistDbName: undefined, + couchDbPassword: undefined, + upgradeToStudentRequest: undefined, + } | { upgradeToStudentRequest: "waiting" } | { upgradeToStudentRequest: "denied" } | { tests: T.TestResult[] } diff --git a/account/src/lib/user-utils.ts b/account/src/lib/user-utils.ts index ab29664..8754cf7 100644 --- a/account/src/lib/user-utils.ts +++ b/account/src/lib/user-utils.ts @@ -3,6 +3,7 @@ import { insertLingdocsUser, addCouchDbAuthUser, updateLingdocsUser, + deleteCouchDbAuthUser, } from "../lib/couch-db"; import { getHash, @@ -71,6 +72,25 @@ export async function upgradeUser(userId: T.UUID): Promise { + await deleteCouchDbAuthUser(userId); + const user = await updateLingdocsUser(userId, { + level: "basic", + wordlistDbName: undefined, + couchDbPassword: undefined, + upgradeToStudentRequest: undefined, + }); + if (user.email) { + // TODO + // sendAccountDowngradeMessage(user).catch(console.error); + } + return { + ok: true, + message: "user downgraded to basic", + user, + }; +} + export async function denyUserUpgradeRequest(userId: T.UUID): Promise { await updateLingdocsUser(userId, { upgradeToStudentRequest: "denied", diff --git a/account/src/routers/payment-router.ts b/account/src/routers/payment-router.ts index ac6146b..86d85f2 100644 --- a/account/src/routers/payment-router.ts +++ b/account/src/routers/payment-router.ts @@ -2,7 +2,7 @@ import express from "express"; import * as T from "../../../website/src/types/account-types"; import env from "../lib/env-vars"; import Stripe from "stripe"; -import { upgradeUser } from "../lib/user-utils"; +import { downgradeUser, upgradeUser } from "../lib/user-utils"; const stripe = new Stripe(env.stripeSecretKey, { apiVersion: "2022-08-01", @@ -39,18 +39,20 @@ paymentRouter.post( let subscription: Stripe.Subscription; let status: Stripe.Subscription.Status; // Handle the event + const userId = event.data.object.subscription.metadata.userId as T.UUID; switch (event.type) { case 'customer.subscription.deleted': subscription = event.data.object; status = subscription.status; console.log(`Subscription status is ${status}.`); + console.log(`Downgrading user ${userId}.`); + await downgradeUser(userId); // Then define and call a method to handle the subscription deleted. // handleSubscriptionDeleted(subscriptionDeleted); break; case 'customer.subscription.created': subscription = event.data.object; status = subscription.status; - const userId = subscription.metadata.userId as T.UUID; console.log(`Upgrading user ${userId}.`); await upgradeUser(userId); // TODO: save subscription to db diff --git a/website/src/types/account-types.ts b/website/src/types/account-types.ts index afa420f..fb582b1 100644 --- a/website/src/types/account-types.ts +++ b/website/src/types/account-types.ts @@ -75,6 +75,12 @@ export type UpgradeUserResponse = { user: LingdocsUser, }; +export type DowngradeUserResponse = { + ok: true, + message: "user downgraded to basic", + user: LingdocsUser, +}; + export type PostTestResultsBody = { tests: TestResult[] }; export type PostTestResultsResponse = { ok: true,