Refactor fetching permissions

This commit is contained in:
René Pfeuffer
2019-01-21 13:05:05 +01:00
parent 746061d879
commit db57a49738
3 changed files with 95 additions and 37 deletions

View File

@@ -8,7 +8,6 @@ import {
} from "@scm-manager/ui-components"; } from "@scm-manager/ui-components";
import { translate } from "react-i18next"; import { translate } from "react-i18next";
import { import {
loadAvailablePermissions,
loadPermissionsForEntity, loadPermissionsForEntity,
setPermissions setPermissions
} from "./handlePermissions"; } from "./handlePermissions";
@@ -68,34 +67,18 @@ class SetPermissions extends React.Component<Props, State> {
}; };
componentDidMount(): void { componentDidMount(): void {
loadAvailablePermissions(this.props.availablePermissionLink).then( loadPermissionsForEntity(
response => { this.props.availablePermissionLink,
const availablePermissions = response.permissions; this.props.selectedPermissionsLink.href
const permissions = {}; ).then(response => {
availablePermissions.forEach(p => { const { permissions, overwriteLink } = response;
permissions[p] = false; this.setState({
}); permissions: permissions,
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 {
loading: false, loading: false,
permissions: newPermissions, overwritePermissionsLink: overwriteLink
overwritePermissionsLink: response._links.overwrite });
};
}); });
} }
);
};
submit = (event: Event) => { submit = (event: Event) => {
event.preventDefault(); event.preventDefault();

View File

@@ -12,14 +12,22 @@ export function setPermissions(url: string, permissions: string[]) {
}); });
} }
export function loadPermissionsForEntity(url: string) { export function loadPermissionsForEntity(
return apiClient.get(url).then(response => { availableUrl: string,
return response.json(); userUrl: string
}); ) {
} return Promise.all([
apiClient.get(availableUrl).then(response => {
export function loadAvailablePermissions(url: string) {
return apiClient.get(url).then(response => {
return response.json(); 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 };
}); });
} }

View 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();
});
});
});