feat(v2.4): 完成领域主写迁移
This commit is contained in:
@@ -9,6 +9,12 @@ import {
|
||||
ensureSystemAdminMember,
|
||||
sanitizeSystemAdminPatch,
|
||||
} from '@/lib/member-system';
|
||||
import {
|
||||
createMemberDomain,
|
||||
deleteMemberDomain,
|
||||
listMembersDomain,
|
||||
updateMemberDomain,
|
||||
} from '@/lib/domain-api';
|
||||
import { scheduleSaveWithOptimisticRollback } from '@/lib/optimistic-persistence';
|
||||
import { DEFAULT_ROLE_PERMISSIONS, DEFAULT_ROLE_PRESETS } from '@/lib/permissions';
|
||||
import { mergePresetRolePermissions } from '@/lib/role-permission-migration';
|
||||
@@ -72,7 +78,10 @@ export const useMemberStore = create<MemberState>((set, get) => ({
|
||||
|
||||
fetchMembers: async (options) => {
|
||||
if (!options?.force && get().loaded && Date.now() - lastMembersFetchAt < SERVER_DATA_CACHE_MS) return;
|
||||
const cached = await loadStored();
|
||||
const [cached, domainMembers] = await Promise.all([
|
||||
loadStored(),
|
||||
listMembersDomain().catch(() => null),
|
||||
]);
|
||||
if (!options?.force && get().loaded && Date.now() - lastMembersFetchAt < SERVER_DATA_CACHE_MS) return;
|
||||
lastMembersFetchAt = Date.now();
|
||||
if (cached) {
|
||||
@@ -93,7 +102,8 @@ export const useMemberStore = create<MemberState>((set, get) => ({
|
||||
permissionMerged.changed ||
|
||||
roles.length !== rolesWithNewDefaults.length ||
|
||||
roles.some((role, index) => JSON.stringify(role) !== JSON.stringify(rolesWithNewDefaults[index]));
|
||||
const ensured = ensureSystemAdminMember(cached.members);
|
||||
const sourceMembers = domainMembers && domainMembers.length > 0 ? domainMembers : cached.members;
|
||||
const ensured = ensureSystemAdminMember(sourceMembers);
|
||||
const usernameEnsured = ensureMemberUsernames(ensured.members);
|
||||
const next = {
|
||||
departments: cached.departments,
|
||||
@@ -104,7 +114,7 @@ export const useMemberStore = create<MemberState>((set, get) => ({
|
||||
set({ ...next, loaded: true });
|
||||
if (ensured.changed || usernameEnsured.changed || rolesChanged) void saveStored(next).catch(() => {});
|
||||
} else {
|
||||
set({ loaded: true });
|
||||
set({ members: domainMembers && domainMembers.length > 0 ? domainMembers : get().members, loaded: true });
|
||||
}
|
||||
},
|
||||
|
||||
@@ -166,7 +176,16 @@ export const useMemberStore = create<MemberState>((set, get) => ({
|
||||
const members = [...previous, member];
|
||||
set({ members });
|
||||
scheduleSaveWithOptimisticRollback({
|
||||
save: () => saveStored({ departments: get().departments, members, roles: get().roles, passwordRule: get().passwordRule }),
|
||||
save: async () => {
|
||||
try {
|
||||
const created = await createMemberDomain(member, previous);
|
||||
set({
|
||||
members: get().members.map((item) => (item.id === member.id ? { ...member, ...created } : item)),
|
||||
});
|
||||
} catch {
|
||||
await saveStored({ departments: get().departments, members, roles: get().roles, passwordRule: get().passwordRule });
|
||||
}
|
||||
},
|
||||
expected: members,
|
||||
getCurrent: () => get().members,
|
||||
rollback: () => set({ members: previous }),
|
||||
@@ -179,10 +198,14 @@ export const useMemberStore = create<MemberState>((set, get) => ({
|
||||
const ensured = ensureSystemAdminMember(updatedMembers);
|
||||
set({ members: ensured.members });
|
||||
try {
|
||||
await saveStored({ departments: get().departments, members: ensured.members, roles: get().roles, passwordRule: get().passwordRule });
|
||||
await updateMemberDomain(id, safeData);
|
||||
} catch (error) {
|
||||
set({ members: previousMembers });
|
||||
throw error;
|
||||
try {
|
||||
await saveStored({ departments: get().departments, members: ensured.members, roles: get().roles, passwordRule: get().passwordRule });
|
||||
} catch {
|
||||
set({ members: previousMembers });
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
},
|
||||
deleteMember: (id) => {
|
||||
@@ -191,7 +214,13 @@ export const useMemberStore = create<MemberState>((set, get) => ({
|
||||
const members = previous.filter((m) => m.id !== id);
|
||||
set({ members });
|
||||
scheduleSaveWithOptimisticRollback({
|
||||
save: () => saveStored({ departments: get().departments, members, roles: get().roles, passwordRule: get().passwordRule }),
|
||||
save: async () => {
|
||||
try {
|
||||
await deleteMemberDomain(id);
|
||||
} catch {
|
||||
await saveStored({ departments: get().departments, members, roles: get().roles, passwordRule: get().passwordRule });
|
||||
}
|
||||
},
|
||||
expected: members,
|
||||
getCurrent: () => get().members,
|
||||
rollback: () => set({ members: previous }),
|
||||
|
||||
Reference in New Issue
Block a user