This commit is contained in:
2026-04-04 01:16:36 +03:30
parent 76fd2a29f8
commit ae1bbc126f
5 changed files with 268 additions and 0 deletions
@@ -0,0 +1,75 @@
import { apiClient } from "../client";
export interface AccessMatchedRule {
code: string;
name: string;
effect: "allow" | "deny" | string;
priority: number;
}
export interface AccessSubscriptionPlan {
uuid: string;
code: string;
name: string;
}
export interface FarmAccessProfile {
farm_uuid: string;
subscription_plan?: AccessSubscriptionPlan | null;
matched_rules: AccessMatchedRule[];
resolved_from_profile: boolean;
}
interface AccessProfileEnvelope {
code?: number;
msg?: string;
data?: FarmAccessProfile;
}
const ACCESS_PREFIX = "/api/access-control/farms";
export const accessControlService = {
async getFarmAccessProfile(farmUuid: string): Promise<FarmAccessProfile> {
const response = await apiClient.get<AccessProfileEnvelope | FarmAccessProfile>(
`${ACCESS_PREFIX}/${encodeURIComponent(farmUuid)}/profile/`,
);
const payload =
response && typeof response === "object" && "data" in response
? response.data
: response;
return {
farm_uuid: payload?.farm_uuid ?? farmUuid,
subscription_plan: payload?.subscription_plan ?? null,
matched_rules: Array.isArray(payload?.matched_rules)
? payload.matched_rules
: [],
resolved_from_profile: Boolean(payload?.resolved_from_profile),
};
},
};
export const hasAccessByRule = (
profile: FarmAccessProfile | null,
requiredRuleCode: string,
): boolean => {
if (!profile) return false;
const relevantRules = profile.matched_rules.filter((rule) =>
rule.code === requiredRuleCode,
);
if (!relevantRules.length) return false;
const sortedRules = [...relevantRules].sort((left, right) => {
if (right.priority !== left.priority) {
return right.priority - left.priority;
}
if (left.effect === right.effect) return 0;
return left.effect === "deny" ? -1 : 1;
});
return sortedRules[0].effect === "allow";
};