fix(roles): handle errors properly in edit role API
This commit is contained in:
@@ -216,9 +216,15 @@ export const rolesAPI = {
|
||||
// prevent global 401 redirect for optional fetch
|
||||
skipAuthRedirect: true,
|
||||
});
|
||||
const data = res?.data;
|
||||
// Try common shapes: { items: Role[], total: number } or Role[]
|
||||
const items = Array.isArray(data) ? data : (Array.isArray(data?.items) ? data.items : []);
|
||||
const raw = res?.data;
|
||||
// Backend shape example:
|
||||
// { data: { filterSummary: {...}, data: Role[] }, isSuccess: true, ... }
|
||||
const apiItems = Array.isArray(raw?.data?.data) ? raw.data.data : undefined;
|
||||
// Fallbacks for other shapes we may encounter
|
||||
const items = apiItems
|
||||
|| (Array.isArray(raw) ? raw : undefined)
|
||||
|| (Array.isArray(raw?.items) ? raw.items : [])
|
||||
|| [];
|
||||
// Sync a snapshot to local storage for offline UX
|
||||
writeRolesToStorage(items.map(r => ({ id: r.id || crypto.randomUUID(), ...r })));
|
||||
return items;
|
||||
@@ -236,7 +242,7 @@ export const rolesAPI = {
|
||||
const payload = {
|
||||
name: String(role?.name || '').trim(),
|
||||
permissions: Array.isArray(role?.permissions) ? role.permissions : [],
|
||||
userType: String(role?.userType || '').trim(),
|
||||
// userType: String(role?.userType || '').trim(),
|
||||
};
|
||||
let created = null;
|
||||
try {
|
||||
@@ -269,16 +275,31 @@ export const rolesAPI = {
|
||||
},
|
||||
|
||||
async update(id, role) {
|
||||
const existingLocal = readRolesFromStorage().find(r => r.id === id) || {};
|
||||
const payload = {
|
||||
name: String(role?.name || '').trim(),
|
||||
permissions: Array.isArray(role?.permissions) ? role.permissions : [],
|
||||
userType: String(role?.userType || '').trim(),
|
||||
...(role?.userType !== undefined
|
||||
? { userType: String(role?.userType || '').trim() }
|
||||
: (existingLocal.userType ? { userType: existingLocal.userType } : {})),
|
||||
};
|
||||
|
||||
try {
|
||||
await api.put(`/api/v1/Role/${encodeURIComponent(id)}`, payload, { skipAuthRedirect: true });
|
||||
} catch (_) {
|
||||
// ignore; apply optimistic local update
|
||||
} catch (err) {
|
||||
const status = err?.statusCode || err?.status || err?.response?.status;
|
||||
if (status === 404 || status === 405 || status === 400) {
|
||||
try {
|
||||
await api.put('/api/v1/Role', { id, ...payload }, { skipAuthRedirect: true });
|
||||
} catch (e2) {
|
||||
const s2 = e2?.statusCode || e2?.status || e2?.response?.status;
|
||||
if (s2 === 401 || s2 === 403) {
|
||||
throw { message: 'Unauthorized to edit roles (401/403). Check permissions/login.', status: s2 };
|
||||
}
|
||||
}
|
||||
} else if (status === 401 || status === 403) {
|
||||
throw { message: 'Unauthorized to edit roles (401/403). Check permissions/login.', status };
|
||||
}
|
||||
}
|
||||
|
||||
const roles = readRolesFromStorage();
|
||||
@@ -296,3 +317,46 @@ export const rolesAPI = {
|
||||
return updated;
|
||||
},
|
||||
};
|
||||
|
||||
// -----------------------------
|
||||
// Permissions API
|
||||
// -----------------------------
|
||||
export async function listPermissions() {
|
||||
try {
|
||||
const res = await api.get('/api/v1/General/Permission', { skipAuthRedirect: true });
|
||||
const raw = res?.data;
|
||||
// Expected shape: { data: Permission[] }
|
||||
const items = Array.isArray(raw?.data) ? raw.data : [];
|
||||
// Prefer returning structured objects with name and description
|
||||
const objs = items
|
||||
.map((p) => {
|
||||
const name = typeof p?.name === 'string' ? p.name : (typeof p?.displayName === 'string' ? p.displayName : null);
|
||||
if (!name) return null;
|
||||
const description = typeof p?.description === 'string' && p.description
|
||||
? p.description
|
||||
: (typeof p?.displayName === 'string' ? p.displayName : name);
|
||||
return { name, description };
|
||||
})
|
||||
.filter(Boolean);
|
||||
if (objs.length > 0) return objs;
|
||||
// Fallback to simple names if server returned unexpected shape
|
||||
const names = items
|
||||
.map((p) => (typeof p?.name === 'string' ? p.name : (typeof p?.displayName === 'string' ? p.displayName : null)))
|
||||
.filter(Boolean);
|
||||
return names.map((n) => ({ name: n, description: n }));
|
||||
} catch (_) {
|
||||
// Fallback to a minimal static list to keep UI usable
|
||||
return [
|
||||
{ name: 'Administrator', description: 'Full access to administrative features' },
|
||||
{ name: 'UserManagement', description: 'Manage users and their profiles' },
|
||||
{ name: 'AddUser', description: 'Create new user accounts' },
|
||||
{ name: 'EditUser', description: 'Edit existing user accounts' },
|
||||
{ name: 'UserPasswordManagement', description: 'Reset or change user passwords' },
|
||||
{ name: 'UserRoleManagement', description: 'Assign or modify user roles' },
|
||||
{ name: 'RoleManagement', description: 'Manage roles and permissions' },
|
||||
{ name: 'AddRole', description: 'Create new roles' },
|
||||
{ name: 'EditRole', description: 'Edit existing roles' },
|
||||
{ name: 'DeleteRole', description: 'Remove roles from the system' },
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user