UPDATE
This commit is contained in:
@@ -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";
|
||||
};
|
||||
Reference in New Issue
Block a user