67 lines
2.0 KiB
TypeScript
67 lines
2.0 KiB
TypeScript
|
|
/**
|
||
|
|
* Subscription Service - Mirror backend subscription endpoints
|
||
|
|
*/
|
||
|
|
import { apiClient } from '../client';
|
||
|
|
import {
|
||
|
|
SubscriptionLimits,
|
||
|
|
FeatureCheckRequest,
|
||
|
|
FeatureCheckResponse,
|
||
|
|
UsageCheckRequest,
|
||
|
|
UsageCheckResponse
|
||
|
|
} from '../types/subscription';
|
||
|
|
|
||
|
|
export class SubscriptionService {
|
||
|
|
private readonly baseUrl = '/subscriptions';
|
||
|
|
|
||
|
|
async getSubscriptionLimits(tenantId: string): Promise<SubscriptionLimits> {
|
||
|
|
return apiClient.get<SubscriptionLimits>(`${this.baseUrl}/${tenantId}/limits`);
|
||
|
|
}
|
||
|
|
|
||
|
|
async checkFeatureAccess(
|
||
|
|
tenantId: string,
|
||
|
|
featureName: string
|
||
|
|
): Promise<FeatureCheckResponse> {
|
||
|
|
return apiClient.get<FeatureCheckResponse>(
|
||
|
|
`${this.baseUrl}/${tenantId}/features/${featureName}/check`
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
async checkUsageLimit(
|
||
|
|
tenantId: string,
|
||
|
|
resourceType: 'users' | 'sales_records' | 'inventory_items' | 'api_requests',
|
||
|
|
requestedAmount?: number
|
||
|
|
): Promise<UsageCheckResponse> {
|
||
|
|
const queryParams = new URLSearchParams();
|
||
|
|
if (requestedAmount !== undefined) {
|
||
|
|
queryParams.append('requested_amount', requestedAmount.toString());
|
||
|
|
}
|
||
|
|
|
||
|
|
const url = queryParams.toString()
|
||
|
|
? `${this.baseUrl}/${tenantId}/usage/${resourceType}/check?${queryParams.toString()}`
|
||
|
|
: `${this.baseUrl}/${tenantId}/usage/${resourceType}/check`;
|
||
|
|
|
||
|
|
return apiClient.get<UsageCheckResponse>(url);
|
||
|
|
}
|
||
|
|
|
||
|
|
async recordUsage(
|
||
|
|
tenantId: string,
|
||
|
|
resourceType: 'users' | 'sales_records' | 'inventory_items' | 'api_requests',
|
||
|
|
amount: number = 1
|
||
|
|
): Promise<{ success: boolean; message: string }> {
|
||
|
|
return apiClient.post<{ success: boolean; message: string }>(
|
||
|
|
`${this.baseUrl}/${tenantId}/usage/${resourceType}/record`,
|
||
|
|
{ amount }
|
||
|
|
);
|
||
|
|
}
|
||
|
|
|
||
|
|
async getCurrentUsage(tenantId: string): Promise<{
|
||
|
|
users: number;
|
||
|
|
sales_records: number;
|
||
|
|
inventory_items: number;
|
||
|
|
api_requests_this_hour: number;
|
||
|
|
}> {
|
||
|
|
return apiClient.get(`${this.baseUrl}/${tenantId}/usage/current`);
|
||
|
|
}
|
||
|
|
}
|
||
|
|
|
||
|
|
export const subscriptionService = new SubscriptionService();
|