diff --git a/scm-ui/src/repos/modules/repos.js b/scm-ui/src/repos/modules/repos.js index 6f9f4a0e4d..b5016bbb43 100644 --- a/scm-ui/src/repos/modules/repos.js +++ b/scm-ui/src/repos/modules/repos.js @@ -153,7 +153,11 @@ export function fetchRepoFailure( // create repo -export function createRepo(link: string, repository: Repository, callback?: () => void) { +export function createRepo( + link: string, + repository: Repository, + callback?: () => void +) { return function(dispatch: any) { dispatch(createRepoPending()); return apiClient @@ -447,3 +451,12 @@ export function getDeleteRepoFailure( ) { return getFailure(state, DELETE_REPO, namespace + "/" + name); } + +export function getPermissionsLink( + state: Object, + namespace: string, + name: string +) { + const repo = getRepository(state, namespace, name); + return repo && repo._links ? repo._links.permissions.href : undefined; +} diff --git a/scm-ui/src/repos/modules/repos.test.js b/scm-ui/src/repos/modules/repos.test.js index 8dd78b7645..9411ac37e5 100644 --- a/scm-ui/src/repos/modules/repos.test.js +++ b/scm-ui/src/repos/modules/repos.test.js @@ -45,7 +45,8 @@ import reducer, { MODIFY_REPO, isModifyRepoPending, getModifyRepoFailure, - modifyRepoSuccess + modifyRepoSuccess, + getPermissionsLink } from "./repos"; import type { Repository, RepositoryCollection } from "@scm-manager/ui-types"; @@ -645,6 +646,21 @@ describe("repos selectors", () => { expect(repository).toEqual(slartiFjords); }); + it("should return permissions link", () => { + const state = { + repos: { + byNames: { + "slarti/fjords": slartiFjords + } + } + }; + + const link = getPermissionsLink(state, "slarti", "fjords"); + expect(link).toEqual( + "http://localhost:8081/api/v2/repositories/slarti/fjords/permissions/" + ); + }); + it("should return true, when fetch repo is pending", () => { const state = { pending: { diff --git a/scm-ui/src/repos/permissions/containers/Permissions.js b/scm-ui/src/repos/permissions/containers/Permissions.js index d29359ed0b..c5a4a1ecf8 100644 --- a/scm-ui/src/repos/permissions/containers/Permissions.js +++ b/scm-ui/src/repos/permissions/containers/Permissions.js @@ -26,6 +26,7 @@ import type { import SinglePermission from "./SinglePermission"; import CreatePermissionForm from "../components/CreatePermissionForm"; import type { History } from "history"; +import { getPermissionsLink } from "../../modules/repos"; type Props = { namespace: string, @@ -35,10 +36,12 @@ type Props = { permissions: PermissionCollection, hasPermissionToCreate: boolean, loadingCreatePermission: boolean, + permissionsLink: string, //dispatch functions - fetchPermissions: (namespace: string, repoName: string) => void, + fetchPermissions: (link: string, namespace: string, repoName: string) => void, createPermission: ( + link: string, permission: PermissionEntry, namespace: string, repoName: string, @@ -61,17 +64,19 @@ class Permissions extends React.Component { repoName, modifyPermissionReset, createPermissionReset, - deletePermissionReset + deletePermissionReset, + permissionsLink } = this.props; createPermissionReset(namespace, repoName); modifyPermissionReset(namespace, repoName); deletePermissionReset(namespace, repoName); - fetchPermissions(namespace, repoName); + fetchPermissions(permissionsLink, namespace, repoName); } createPermission = (permission: Permission) => { this.props.createPermission( + this.props.permissionsLink, permission, this.props.namespace, this.props.repoName @@ -158,6 +163,7 @@ const mapStateToProps = (state, ownProps) => { repoName ); const hasPermissionToCreate = hasCreatePermission(state, namespace, repoName); + const permissionsLink = getPermissionsLink(state, namespace, repoName); return { namespace, repoName, @@ -165,22 +171,24 @@ const mapStateToProps = (state, ownProps) => { loading, permissions, hasPermissionToCreate, - loadingCreatePermission + loadingCreatePermission, + permissionsLink }; }; const mapDispatchToProps = dispatch => { return { - fetchPermissions: (namespace: string, repoName: string) => { - dispatch(fetchPermissions(namespace, repoName)); + fetchPermissions: (link: string, namespace: string, repoName: string) => { + dispatch(fetchPermissions(link, namespace, repoName)); }, createPermission: ( + link: string, permission: PermissionEntry, namespace: string, repoName: string, callback?: () => void ) => { - dispatch(createPermission(permission, namespace, repoName, callback)); + dispatch(createPermission(link, permission, namespace, repoName, callback)); }, createPermissionReset: (namespace: string, repoName: string) => { dispatch(createPermissionReset(namespace, repoName)); diff --git a/scm-ui/src/repos/permissions/modules/permissions.js b/scm-ui/src/repos/permissions/modules/permissions.js index 86d78e7ae9..ff0e242e4c 100644 --- a/scm-ui/src/repos/permissions/modules/permissions.js +++ b/scm-ui/src/repos/permissions/modules/permissions.js @@ -62,17 +62,19 @@ export const DELETE_PERMISSION_RESET = `${DELETE_PERMISSION}_${ types.RESET_SUFFIX }`; -const REPOS_URL = "repositories"; -const PERMISSIONS_URL = "permissions"; const CONTENT_TYPE = "application/vnd.scmm-permission+json"; // fetch permissions -export function fetchPermissions(namespace: string, repoName: string) { +export function fetchPermissions( + link: string, + namespace: string, + repoName: string +) { return function(dispatch: any) { dispatch(fetchPermissionsPending(namespace, repoName)); return apiClient - .get(`${REPOS_URL}/${namespace}/${repoName}/${PERMISSIONS_URL}`) + .get(link) .then(response => response.json()) .then(permissions => { dispatch(fetchPermissionsSuccess(permissions, namespace, repoName)); @@ -219,6 +221,7 @@ export function modifyPermissionReset(namespace: string, repoName: string) { // create permission export function createPermission( + link: string, permission: PermissionEntry, namespace: string, repoName: string, @@ -227,11 +230,7 @@ export function createPermission( return function(dispatch: Dispatch) { dispatch(createPermissionPending(permission, namespace, repoName)); return apiClient - .post( - `${REPOS_URL}/${namespace}/${repoName}/${PERMISSIONS_URL}`, - permission, - CONTENT_TYPE - ) + .post(link, permission, CONTENT_TYPE) .then(response => { const location = response.headers.get("Location"); return apiClient.get(location); diff --git a/scm-ui/src/repos/permissions/modules/permissions.test.js b/scm-ui/src/repos/permissions/modules/permissions.test.js index e546f6cb00..98f545d53e 100644 --- a/scm-ui/src/repos/permissions/modules/permissions.test.js +++ b/scm-ui/src/repos/permissions/modules/permissions.test.js @@ -101,6 +101,7 @@ const hitchhiker_puzzle42RepoPermissions = { describe("permission fetch", () => { const REPOS_URL = "/api/v2/repositories"; + const URL = "repositories"; const mockStore = configureMockStore([thunk]); afterEach(() => { @@ -132,7 +133,13 @@ describe("permission fetch", () => { const store = mockStore({}); return store - .dispatch(fetchPermissions("hitchhiker", "puzzle42")) + .dispatch( + fetchPermissions( + URL + "/hitchhiker/puzzle42/permissions", + "hitchhiker", + "puzzle42" + ) + ) .then(() => { expect(store.getActions()).toEqual(expectedActions); }); @@ -145,7 +152,13 @@ describe("permission fetch", () => { const store = mockStore({}); return store - .dispatch(fetchPermissions("hitchhiker", "puzzle42")) + .dispatch( + fetchPermissions( + URL + "/hitchhiker/puzzle42/permissions", + "hitchhiker", + "puzzle42" + ) + ) .then(() => { const actions = store.getActions(); expect(actions[0].type).toEqual(FETCH_PERMISSIONS_PENDING); @@ -247,6 +260,7 @@ describe("permission fetch", () => { return store .dispatch( createPermission( + URL + "/hitchhiker/puzzle42/permissions", hitchhiker_puzzle42Permission_user_eins, "hitchhiker", "puzzle42" @@ -268,6 +282,7 @@ describe("permission fetch", () => { return store .dispatch( createPermission( + URL + "/hitchhiker/puzzle42/permissions", hitchhiker_puzzle42Permission_user_eins, "hitchhiker", "puzzle42" @@ -304,6 +319,7 @@ describe("permission fetch", () => { return store .dispatch( createPermission( + URL + "/hitchhiker/puzzle42/permissions", hitchhiker_puzzle42Permission_user_eins, "hitchhiker", "puzzle42",