feat(platform-service): add user plan update to auth module for Stripe webhooks
- Added auth repository updatePlan(userId, productId, plan) helper - Stripe webhook handlers now sync plan changes into auth users container - Handles checkout completion and cancellation downgrade paths - Keeps existing backend sync behavior intact - Verified: tsc --noEmit clean, 19 test files / 178 tests passing
This commit is contained in:
parent
a264538c5e
commit
84681cbf75
@ -37,6 +37,28 @@ export async function create(user: UserDoc): Promise<UserDoc> {
|
|||||||
return resource as UserDoc;
|
return resource as UserDoc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export async function updatePlan(
|
||||||
|
id: string,
|
||||||
|
productId: string,
|
||||||
|
plan: UserDoc['plan']
|
||||||
|
): Promise<UserDoc | null> {
|
||||||
|
try {
|
||||||
|
const { resource } = await container().item(id, id).read<UserDoc>();
|
||||||
|
if (!resource || resource.productId !== productId) return null;
|
||||||
|
const { resource: updated } = await container()
|
||||||
|
.item(id, id)
|
||||||
|
.replace<UserDoc>({
|
||||||
|
...resource,
|
||||||
|
plan,
|
||||||
|
updatedAt: new Date().toISOString(),
|
||||||
|
});
|
||||||
|
if (!updated) return null;
|
||||||
|
return updated;
|
||||||
|
} catch {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
export async function updateLastLogin(id: string): Promise<void> {
|
export async function updateLastLogin(id: string): Promise<void> {
|
||||||
try {
|
try {
|
||||||
const { resource } = await container().item(id, id).read<UserDoc>();
|
const { resource } = await container().item(id, id).read<UserDoc>();
|
||||||
|
|||||||
@ -16,6 +16,7 @@ import { DEFAULT_PRODUCT_ID } from '../../lib/product-config.js';
|
|||||||
import { getRequestProductId } from '../../lib/request-context.js';
|
import { getRequestProductId } from '../../lib/request-context.js';
|
||||||
import { getStripeForProduct, getPriceIds } from '../../lib/stripe.js';
|
import { getStripeForProduct, getPriceIds } from '../../lib/stripe.js';
|
||||||
import { BadRequestError } from '../../lib/errors.js';
|
import { BadRequestError } from '../../lib/errors.js';
|
||||||
|
import * as authRepo from '../auth/repository.js';
|
||||||
import * as subRepo from '../subscriptions/repository.js';
|
import * as subRepo from '../subscriptions/repository.js';
|
||||||
import type { SubscriptionDoc } from '../subscriptions/types.js';
|
import type { SubscriptionDoc } from '../subscriptions/types.js';
|
||||||
|
|
||||||
@ -134,6 +135,7 @@ export async function stripeRoutes(app: FastifyInstance) {
|
|||||||
currentPeriodStart: now.toISOString(),
|
currentPeriodStart: now.toISOString(),
|
||||||
currentPeriodEnd: periodEnd.toISOString(),
|
currentPeriodEnd: periodEnd.toISOString(),
|
||||||
});
|
});
|
||||||
|
await authRepo.updatePlan(userId, eventProductId, plan as SubscriptionDoc['plan']);
|
||||||
} else {
|
} else {
|
||||||
await subRepo.createSubscription({
|
await subRepo.createSubscription({
|
||||||
id: `sub_${userId}_${Date.now()}`,
|
id: `sub_${userId}_${Date.now()}`,
|
||||||
@ -152,6 +154,7 @@ export async function stripeRoutes(app: FastifyInstance) {
|
|||||||
createdAt: now.toISOString(),
|
createdAt: now.toISOString(),
|
||||||
updatedAt: now.toISOString(),
|
updatedAt: now.toISOString(),
|
||||||
});
|
});
|
||||||
|
await authRepo.updatePlan(userId, eventProductId, plan as SubscriptionDoc['plan']);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Sync plan to backend users container
|
// Sync plan to backend users container
|
||||||
@ -190,6 +193,7 @@ export async function stripeRoutes(app: FastifyInstance) {
|
|||||||
cancelAtPeriodEnd: sub.cancel_at_period_end,
|
cancelAtPeriodEnd: sub.cancel_at_period_end,
|
||||||
currentPeriodEnd: new Date(sub.current_period_end * 1000).toISOString(),
|
currentPeriodEnd: new Date(sub.current_period_end * 1000).toISOString(),
|
||||||
});
|
});
|
||||||
|
await authRepo.updatePlan(existing.userId, eventProductId, existing.plan);
|
||||||
// Sync plan to backend users container
|
// Sync plan to backend users container
|
||||||
await syncUserPlan(existing.userId, existing.plan, app.log);
|
await syncUserPlan(existing.userId, existing.plan, app.log);
|
||||||
}
|
}
|
||||||
@ -206,6 +210,7 @@ export async function stripeRoutes(app: FastifyInstance) {
|
|||||||
plan: 'free',
|
plan: 'free',
|
||||||
cancelAtPeriodEnd: false,
|
cancelAtPeriodEnd: false,
|
||||||
});
|
});
|
||||||
|
await authRepo.updatePlan(existing.userId, eventProductId, 'free');
|
||||||
// Sync plan downgrade to backend users container
|
// Sync plan downgrade to backend users container
|
||||||
await syncUserPlan(existing.userId, 'free', app.log);
|
await syncUserPlan(existing.userId, 'free', app.log);
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user