Files
Cibello-app/packages/validation/src/subscriptions.ts
T
2026-08-05 19:21:11 +07:00

41 lines
1.3 KiB
TypeScript

import { z } from "zod";
import { SUBSCRIPTION_PLANS } from "@app/shared-types";
/**
* Klienten skickar kvitto/token efter köp; backend verifierar mot butiken
* och är source of truth (spec §47, §61.14).
*/
export const verifyPurchaseInputSchema = z.discriminatedUnion("provider", [
z.object({
provider: z.literal("apple"),
/** App Store Server API: signerad transaktion från StoreKit 2. */
signedTransaction: z.string().min(10),
}),
z.object({
provider: z.literal("google"),
packageName: z.string().min(3),
productId: z.string().min(1),
purchaseToken: z.string().min(10),
}),
]);
export type VerifyPurchaseInput = z.infer<typeof verifyPurchaseInputSchema>;
export const restorePurchasesInputSchema = z.object({
provider: z.enum(["apple", "google"]),
payload: z.string().min(1),
});
export type RestorePurchasesInput = z.infer<typeof restorePurchasesInputSchema>;
/** Store-notiser tas emot rå, signaturverifieras och läggs på kö (spec §47). */
export const storeNotificationSchema = z.object({
raw: z.unknown(),
});
export const adminGrantInputSchema = z.object({
userId: z.uuid(),
plan: z.enum(SUBSCRIPTION_PLANS),
days: z.number().int().min(1).max(3650),
reason: z.string().min(3).max(300),
});
export type AdminGrantInput = z.infer<typeof adminGrantInputSchema>;