Files
jiapuapp/utils/genealogy/access-policy.js
T

69 lines
2.2 KiB
JavaScript

// 当前两个产品选项同时决定 OpenAPI GenealogyCreate/UpdateBody 的
// visibility 与 joinMode,因此它们是“访问预设”,不是单一可见范围。
export const GENEALOGY_ACCESS_PRESET = Object.freeze({
MEMBER_ONLY: "MEMBER_ONLY",
PUBLIC_APPLY: "PUBLIC_APPLY",
});
export const GENEALOGY_VISIBILITY = Object.freeze({
PRIVATE: "0",
PUBLIC: "1",
MEMBER_ONLY: "2",
});
export const GENEALOGY_JOIN_MODE = Object.freeze({
CLOSED: "0",
REVIEW: "1",
INVITATION: "2",
});
export const GENEALOGY_ACCESS_PRESET_OPTIONS = Object.freeze([
Object.freeze({
value: GENEALOGY_ACCESS_PRESET.MEMBER_ONLY,
label: "仅成员可见",
}),
Object.freeze({
value: GENEALOGY_ACCESS_PRESET.PUBLIC_APPLY,
label: "公开可申请",
}),
]);
export const isGenealogyAccessPreset = (preset) =>
Object.values(GENEALOGY_ACCESS_PRESET).includes(preset);
export const isGenealogyVisibility = (value) =>
Object.values(GENEALOGY_VISIBILITY).includes(value);
export const isGenealogyJoinMode = (value) =>
Object.values(GENEALOGY_JOIN_MODE).includes(value);
// OpenAPI 为两个字段分别声明了 0/1/2,但当前产品只提供以下两个完整预设。
// 其他合法组合不能被悄悄改写成相近选项,页面应明确显示“访问规则待确认”。
const apiAccessByPreset = Object.freeze({
[GENEALOGY_ACCESS_PRESET.MEMBER_ONLY]: Object.freeze({
visibility: GENEALOGY_VISIBILITY.MEMBER_ONLY,
joinMode: GENEALOGY_JOIN_MODE.CLOSED,
}),
[GENEALOGY_ACCESS_PRESET.PUBLIC_APPLY]: Object.freeze({
visibility: GENEALOGY_VISIBILITY.PUBLIC,
joinMode: GENEALOGY_JOIN_MODE.REVIEW,
}),
});
export const getGenealogyAccessPresetLabel = (preset) =>
GENEALOGY_ACCESS_PRESET_OPTIONS.find((item) => item.value === preset)
?.label || "访问规则待确认";
export const toApiGenealogyAccess = (preset) => {
const access = apiAccessByPreset[preset];
return access ? { ...access } : null;
};
export const fromApiGenealogyAccess = ({ visibility, joinMode } = {}) => {
const match = Object.entries(apiAccessByPreset).find(
([, access]) =>
access.visibility === visibility && access.joinMode === joinMode,
);
return match?.[0] || null;
};