This commit is contained in:
Tomas Dvorak
2026-05-05 09:48:07 +02:00
parent d854614a87
commit 48c3e15a38
295 changed files with 178381 additions and 1039 deletions
+177 -13
View File
@@ -31,6 +31,22 @@ export interface paths {
patch?: never;
trace?: never;
};
"/v1/billing/portal": {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
get?: never;
put?: never;
post: operations["createBillingPortalSession"];
delete?: never;
options?: never;
head?: never;
patch?: never;
trace?: never;
};
"/v1/billing/refresh": {
parameters: {
query?: never;
@@ -175,7 +191,7 @@ export interface paths {
patch?: never;
trace?: never;
};
"/v1/webhooks/stripe": {
"/v1/webhooks/paddle": {
parameters: {
query?: never;
header?: never;
@@ -184,7 +200,7 @@ export interface paths {
};
get?: never;
put?: never;
post: operations["handleStripeWebhook"];
post: operations["handlePaddleWebhook"];
delete?: never;
options?: never;
head?: never;
@@ -195,13 +211,45 @@ export interface paths {
export type webhooks = Record<string, never>;
export interface components {
schemas: {
AvailabilityBlockRequest: {
busy?: boolean;
dayOfWeek: number;
/** @example 17:00 */
endsLocal: string;
/** @example 09:00 */
startsLocal: string;
};
BookingDefaultsRequest: {
bufferAfterMinutes?: number;
bufferBeforeMinutes?: number;
cancelWindowHours?: number;
durationMinutes?: number;
serviceName?: string;
};
BrandProfile: {
logoUrl?: string;
name?: string;
primaryColor?: string;
siteUrl?: string;
};
CheckoutLaunchResponse: {
/** Format: uri */
cancelRedirectUrl: string;
customData: {
[key: string]: string;
};
/** Format: email */
customerEmail?: string;
customerId?: string;
priceId: string;
/** Format: uri */
successRedirectUrl: string;
};
CheckoutSessionRequest: {
/** @enum {string} */
planCode: "starter" | "growth" | "multi-location";
};
CheckoutSessionResponse: {
/** Format: uri */
url: string;
currency?: "czk" | "usd";
/** @enum {string} */
planCode: "starter" | "pro" | "business";
};
CreateBookingRequest: {
/** @enum {string} */
@@ -240,8 +288,14 @@ export interface components {
kpis: components["schemas"]["DashboardKPI"][];
locale: string;
planCode: string;
publicBookingUrl: string;
setupCompletion: number;
tenantName: string;
tenantSlug: string;
timezone: string;
tracking?: components["schemas"]["TrackingStatus"];
upcomingBookings?: components["schemas"]["UpcomingBooking"][];
widgetSnippets?: components["schemas"]["WidgetSnippet"][];
};
DispatchReminderJobsRequest: {
limit?: number;
@@ -259,19 +313,36 @@ export interface components {
status: string;
};
OnboardTenantRequest: {
availabilityBlocks?: components["schemas"]["AvailabilityBlockRequest"][];
bookingDefaults?: components["schemas"]["BookingDefaultsRequest"];
brand?: components["schemas"]["BrandProfile"];
/** @enum {string} */
locale: "cs" | "en";
locationName?: string;
name: string;
/** @enum {string} */
preset: "salon" | "clinic" | "massage" | "repair" | "studio";
slug: string;
teamInvites?: components["schemas"]["TeamInviteRequest"][];
timezone: string;
};
PlanDisplayPrice: {
amountCents: number;
/** @enum {string} */
currency: "czk" | "usd";
formatted: string;
};
PlanEntitlements: {
advancedReporting: boolean;
emailReminders: boolean;
maxLocations: number;
maxStaff: number;
smsAddonAvailable: boolean;
umamiTracking: boolean;
widgetEmbedding: boolean;
};
PortalSessionResponse: {
/** Format: uri */
url: string;
};
PublicAvailabilityResponse: {
/** @enum {string} */
@@ -282,31 +353,46 @@ export interface components {
};
PublicConfig: {
/** Format: uri */
apiUrl?: string;
apiUrl: string;
demoMode: boolean;
environment: string;
neonAuthEnabled: boolean;
};
SubscriptionSnapshot: {
cancelAtPeriodEnd: boolean;
checkoutUrlAvailable?: boolean;
checkoutUrlAvailable: boolean;
/** @enum {string} */
currency: "czk" | "usd" | "eur";
/** Format: date-time */
currentPeriodEnd?: string | null;
/** Format: date-time */
currentPeriodStart?: string | null;
customerId: string;
displayPrices: components["schemas"]["PlanDisplayPrice"][];
entitlements: components["schemas"]["PlanEntitlements"];
/** Format: date-time */
lastSyncedAt?: string | null;
paymentMethodBrand?: string;
paymentMethodLast4?: string;
planCode: string;
portalAvailable: boolean;
priceId: string;
/** @example paddle */
provider: string;
status: string;
subscriptionId: string;
syncAvailable: boolean;
/** Format: uuid */
tenantId: string;
trialDays: number;
};
TeamInviteRequest: {
/** Format: email */
email: string;
role?: string;
};
TenantBootstrap: {
brand?: components["schemas"]["BrandProfile"];
currentUser: {
/** Format: email */
email?: string;
@@ -315,11 +401,13 @@ export interface components {
subject: string;
};
locale: string;
onboardingCompleted?: boolean;
planCode?: string;
preset: string;
/** Format: uuid */
tenantId: string;
tenantName: string;
tenantSlug?: string;
timezone: string;
};
TimeSlot: {
@@ -340,6 +428,27 @@ export interface components {
/** Format: date-time */
startsAt: string;
};
TrackingStatus: {
connected?: boolean;
message?: string;
provider?: string;
siteId?: string;
};
UpcomingBooking: {
customerEmail?: string;
customerName?: string;
/** Format: date-time */
endsAt?: string;
label?: string;
reference?: string;
/** Format: date-time */
startsAt?: string;
status?: string;
};
WidgetSnippet: {
code?: string;
kind?: string;
};
};
responses: never;
parameters: never;
@@ -382,13 +491,13 @@ export interface operations {
};
};
responses: {
/** @description Hosted Stripe checkout session */
/** @description Paddle checkout launch payload */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["CheckoutSessionResponse"];
"application/json": components["schemas"]["CheckoutLaunchResponse"];
};
};
/** @description Invalid request */
@@ -405,6 +514,54 @@ export interface operations {
};
content?: never;
};
/** @description Billing provider unavailable */
503: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
createBillingPortalSession: {
parameters: {
query?: never;
header?: never;
path?: never;
cookie?: never;
};
requestBody?: never;
responses: {
/** @description Paddle customer portal session */
200: {
headers: {
[name: string]: unknown;
};
content: {
"application/json": components["schemas"]["PortalSessionResponse"];
};
};
/** @description Billing customer missing */
400: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Unauthorized */
401: {
headers: {
[name: string]: unknown;
};
content?: never;
};
/** @description Billing provider unavailable */
503: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
refreshSubscriptionSnapshot: {
@@ -432,6 +589,13 @@ export interface operations {
};
content?: never;
};
/** @description Billing provider unavailable */
503: {
headers: {
[name: string]: unknown;
};
content?: never;
};
};
};
getSubscriptionSnapshot: {
@@ -657,7 +821,7 @@ export interface operations {
};
};
};
handleStripeWebhook: {
handlePaddleWebhook: {
parameters: {
query?: never;
header?: never;
+29 -1
View File
@@ -11,6 +11,34 @@ export const tenantPresets = [
] as const;
export type TenantPreset = (typeof tenantPresets)[number];
export const planCodes = ["starter", "growth", "multi-location"] as const;
export const planCodes = ["starter", "pro", "business"] as const;
export type PlanCode = (typeof planCodes)[number];
export const planCurrencies = ["czk", "usd"] as const;
export type PlanCurrency = (typeof planCurrencies)[number];
export const planCatalog = {
starter: {
name: "Starter",
monthlyUsd: 5,
monthlyCzk: 119,
trialDays: 30,
},
pro: {
name: "Pro",
monthlyUsd: 20,
monthlyCzk: 499,
trialDays: 30,
},
business: {
name: "Business",
monthlyUsd: 50,
monthlyCzk: 1199,
trialDays: 30,
},
} as const satisfies Record<PlanCode, {
name: string;
monthlyUsd: number;
monthlyCzk: number;
trialDays: number;
}>;