mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-13 00:45:44 +01:00
Refactor fetching permissions
This commit is contained in:
@@ -8,7 +8,6 @@ import {
|
||||
} from "@scm-manager/ui-components";
|
||||
import { translate } from "react-i18next";
|
||||
import {
|
||||
loadAvailablePermissions,
|
||||
loadPermissionsForEntity,
|
||||
setPermissions
|
||||
} from "./handlePermissions";
|
||||
@@ -68,34 +67,18 @@ class SetPermissions extends React.Component<Props, State> {
|
||||
};
|
||||
|
||||
componentDidMount(): void {
|
||||
loadAvailablePermissions(this.props.availablePermissionLink).then(
|
||||
response => {
|
||||
const availablePermissions = response.permissions;
|
||||
const permissions = {};
|
||||
availablePermissions.forEach(p => {
|
||||
permissions[p] = false;
|
||||
});
|
||||
this.setState({ permissions }, this.loadPermissionsForEntity);
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
loadPermissionsForEntity = () => {
|
||||
loadPermissionsForEntity(this.props.selectedPermissionsLink.href).then(
|
||||
response => {
|
||||
const checkedPermissions = response.permissions;
|
||||
this.setState(state => {
|
||||
const newPermissions = state.permissions;
|
||||
checkedPermissions.forEach(name => (newPermissions[name] = true));
|
||||
return {
|
||||
loadPermissionsForEntity(
|
||||
this.props.availablePermissionLink,
|
||||
this.props.selectedPermissionsLink.href
|
||||
).then(response => {
|
||||
const { permissions, overwriteLink } = response;
|
||||
this.setState({
|
||||
permissions: permissions,
|
||||
loading: false,
|
||||
permissions: newPermissions,
|
||||
overwritePermissionsLink: response._links.overwrite
|
||||
};
|
||||
overwritePermissionsLink: overwriteLink
|
||||
});
|
||||
});
|
||||
}
|
||||
);
|
||||
};
|
||||
|
||||
submit = (event: Event) => {
|
||||
event.preventDefault();
|
||||
|
||||
@@ -12,14 +12,22 @@ export function setPermissions(url: string, permissions: string[]) {
|
||||
});
|
||||
}
|
||||
|
||||
export function loadPermissionsForEntity(url: string) {
|
||||
return apiClient.get(url).then(response => {
|
||||
return response.json();
|
||||
});
|
||||
}
|
||||
|
||||
export function loadAvailablePermissions(url: string) {
|
||||
return apiClient.get(url).then(response => {
|
||||
export function loadPermissionsForEntity(
|
||||
availableUrl: string,
|
||||
userUrl: string
|
||||
) {
|
||||
return Promise.all([
|
||||
apiClient.get(availableUrl).then(response => {
|
||||
return response.json();
|
||||
}),
|
||||
apiClient.get(userUrl).then(response => {
|
||||
return response.json();
|
||||
})
|
||||
]).then(values => {
|
||||
const [availablePermissions, checkedPermissions] = values;
|
||||
const permissions = {};
|
||||
availablePermissions.permissions.forEach(p => (permissions[p] = false));
|
||||
checkedPermissions.permissions.forEach(p => (permissions[p] = true));
|
||||
return { permissions, overwriteLink: checkedPermissions._links.overwrite };
|
||||
});
|
||||
}
|
||||
|
||||
67
scm-ui/src/permissions/components/handlePermissions.test.js
Normal file
67
scm-ui/src/permissions/components/handlePermissions.test.js
Normal file
@@ -0,0 +1,67 @@
|
||||
//@flow
|
||||
import fetchMock from "fetch-mock";
|
||||
import { loadPermissionsForEntity } from "./handlePermissions";
|
||||
|
||||
describe("load permissions for entity", () => {
|
||||
const AVAILABLE_PERMISSIONS_URL = "/permissions";
|
||||
const USER_PERMISSIONS_URL = "/user/scmadmin/permissions";
|
||||
|
||||
const availablePermissions = `{
|
||||
"permissions": [
|
||||
"repository:read,pull:*",
|
||||
"repository:read,pull,push:*",
|
||||
"repository:*:*"
|
||||
]
|
||||
}`;
|
||||
const userPermissions = `{
|
||||
"permissions": [
|
||||
"repository:read,pull:*"
|
||||
],
|
||||
"_links": {
|
||||
"self": {
|
||||
"href": "/api/v2/users/rene/permissions"
|
||||
},
|
||||
"overwrite": {
|
||||
"href": "/api/v2/users/rene/permissions"
|
||||
}
|
||||
}
|
||||
}`;
|
||||
|
||||
beforeEach(() => {
|
||||
fetchMock.getOnce(
|
||||
"/api/v2" + AVAILABLE_PERMISSIONS_URL,
|
||||
availablePermissions
|
||||
);
|
||||
fetchMock.getOnce("/api/v2" + USER_PERMISSIONS_URL, userPermissions);
|
||||
});
|
||||
|
||||
afterEach(() => {
|
||||
fetchMock.reset();
|
||||
fetchMock.restore();
|
||||
});
|
||||
|
||||
it("should return permissions array", done => {
|
||||
loadPermissionsForEntity(
|
||||
AVAILABLE_PERMISSIONS_URL,
|
||||
USER_PERMISSIONS_URL
|
||||
).then(result => {
|
||||
const { permissions } = result;
|
||||
expect(Object.entries(permissions).length).toBe(3);
|
||||
expect(permissions["repository:read,pull:*"]).toBe(true);
|
||||
expect(permissions["repository:read,pull,push:*"]).toBe(false);
|
||||
expect(permissions["repository:*:*"]).toBe(false);
|
||||
done();
|
||||
});
|
||||
});
|
||||
|
||||
it("should return overwrite link", done => {
|
||||
loadPermissionsForEntity(
|
||||
AVAILABLE_PERMISSIONS_URL,
|
||||
USER_PERMISSIONS_URL
|
||||
).then(result => {
|
||||
const { overwriteLink } = result;
|
||||
expect(overwriteLink.href).toBe("/api/v2/users/rene/permissions");
|
||||
done();
|
||||
});
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user