enforce membership feature access in api and surface plans in admin

This commit is contained in:
dimitar committed 2026-03-29 16:22:45 +02:00
1 parent 1f4800c055
commit ebfd633a11
14 files changed
+573 -5

No files matched your search

+87
View File
@@ -0,0 +1,87 @@
import { apiClient, withAuth } from "./client";
import { API_ENDPOINTS } from "../config/api";
export type MembershipType = "basic" | "premium" | "vip";
export interface MembershipFeatures {
recommendationsPerMonth: number;
hydrationTracking: boolean;
nutritionTracking: boolean;
advancedStatistics: boolean;
}
const MEMBERSHIP_FEATURES: Record<MembershipType, MembershipFeatures> = {
basic: {
recommendationsPerMonth: 1,
hydrationTracking: false,
nutritionTracking: false,
advancedStatistics: false,
},
premium: {
recommendationsPerMonth: -1,
hydrationTracking: true,
nutritionTracking: true,
advancedStatistics: true,
},
vip: {
recommendationsPerMonth: -1,
hydrationTracking: true,
nutritionTracking: true,
advancedStatistics: true,
},
};
interface UsersListResponse {
success?: boolean;
data?: {
users?: Array<{
id: string;
role: string;
client?: {
membershipType?: MembershipType;
} | null;
}>;
};
users?: Array<{
id: string;
role: string;
client?: {
membershipType?: MembershipType;
} | null;
}>;
}
function isMembershipType(value: unknown): value is MembershipType {
return value === "basic" || value === "premium" || value === "vip";
}
export async function getCurrentMembershipType(
userId: string,
token: string | null,
): Promise<MembershipType> {
if (!token || !userId) {
return "basic";
}
const response = await apiClient.get<UsersListResponse>(
API_ENDPOINTS.USERS.LIST,
withAuth(token),
);
const payload = response.data;
const users = payload.data?.users ?? payload.users ?? [];
const currentUser = users.find((user) => user.id === userId);
if (!currentUser || currentUser.role !== "client") {
return "vip";
}
const membershipType = currentUser.client?.membershipType;
return isMembershipType(membershipType) ? membershipType : "basic";
}
export function getMembershipFeatures(
membershipType: MembershipType,
): MembershipFeatures {
return MEMBERSHIP_FEATURES[membershipType];
}