mirror of
https://github.com/scm-manager/scm-manager.git
synced 2025-11-11 16:05:44 +01:00
add delete functionality
This commit is contained in:
@@ -34,12 +34,22 @@ export const CREATE_PERMISSION = "scm/permissions/CREATE_PERMISSION";
|
|||||||
export const CREATE_PERMISSION_PENDING = `${CREATE_PERMISSION}_${
|
export const CREATE_PERMISSION_PENDING = `${CREATE_PERMISSION}_${
|
||||||
types.PENDING_SUFFIX
|
types.PENDING_SUFFIX
|
||||||
}`;
|
}`;
|
||||||
export const CREATE_PERMISSION_SUCCESS = `$CREATE_PERMISSION}_${
|
export const CREATE_PERMISSION_SUCCESS = `${CREATE_PERMISSION}_${
|
||||||
types.SUCCESS_SUFFIX
|
types.SUCCESS_SUFFIX
|
||||||
}`;
|
}`;
|
||||||
export const CREATE_PERMISSION_FAILURE = `${CREATE_PERMISSION}_${
|
export const CREATE_PERMISSION_FAILURE = `${CREATE_PERMISSION}_${
|
||||||
types.FAILURE_SUFFIX
|
types.FAILURE_SUFFIX
|
||||||
}`;
|
}`;
|
||||||
|
export const DELETE_PERMISSION = "scm/permissions/DELETE_PERMISSION";
|
||||||
|
export const DELETE_PERMISSION_PENDING = `${DELETE_PERMISSION}_${
|
||||||
|
types.PENDING_SUFFIX
|
||||||
|
}`;
|
||||||
|
export const DELETE_PERMISSION_SUCCESS = `${DELETE_PERMISSION}_${
|
||||||
|
types.SUCCESS_SUFFIX
|
||||||
|
}`;
|
||||||
|
export const DELETE_PERMISSION_FAILURE = `${DELETE_PERMISSION}_${
|
||||||
|
types.FAILURE_SUFFIX
|
||||||
|
}`;
|
||||||
|
|
||||||
const REPOS_URL = "repositories";
|
const REPOS_URL = "repositories";
|
||||||
const PERMISSIONS_URL = "permissions";
|
const PERMISSIONS_URL = "permissions";
|
||||||
@@ -263,6 +273,88 @@ export function createPermissionFailure(
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// delete permission
|
||||||
|
|
||||||
|
export function deletePermission(
|
||||||
|
permission: Permission,
|
||||||
|
namespace: string,
|
||||||
|
name: string,
|
||||||
|
callback?: () => void
|
||||||
|
) {
|
||||||
|
return function(dispatch: any) {
|
||||||
|
dispatch(deletePermissionPending(permission, namespace, name));
|
||||||
|
return apiClient
|
||||||
|
.delete(permission._links.delete.href)
|
||||||
|
.then(() => {
|
||||||
|
dispatch(deletePermissionSuccess(permission, namespace, name));
|
||||||
|
if (callback) {
|
||||||
|
callback();
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(cause => {
|
||||||
|
const error = new Error(
|
||||||
|
`could not delete permission ${permission.name}: ${cause.message}`
|
||||||
|
);
|
||||||
|
dispatch(deletePermissionFailure(permission, namespace, name, error));
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deletePermissionPending(
|
||||||
|
permission: Permission,
|
||||||
|
namespace: string,
|
||||||
|
name: string
|
||||||
|
): Action {
|
||||||
|
return {
|
||||||
|
type: DELETE_PERMISSION_PENDING,
|
||||||
|
payload: permission,
|
||||||
|
itemId: namespace + "/" + name + "/" + permission.name
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deletePermissionSuccess(
|
||||||
|
permission: Permission,
|
||||||
|
namespace: string,
|
||||||
|
name: string
|
||||||
|
): Action {
|
||||||
|
return {
|
||||||
|
type: DELETE_PERMISSION_SUCCESS,
|
||||||
|
payload: {
|
||||||
|
permission,
|
||||||
|
position: namespace + "/" + name
|
||||||
|
},
|
||||||
|
itemId: namespace + "/" + name + "/" + permission.name
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function deletePermissionFailure(
|
||||||
|
permission: Permission,
|
||||||
|
namespace: string,
|
||||||
|
name: string,
|
||||||
|
error: Error
|
||||||
|
): Action {
|
||||||
|
return {
|
||||||
|
type: DELETE_PERMISSION_FAILURE,
|
||||||
|
payload: {
|
||||||
|
error,
|
||||||
|
permission
|
||||||
|
},
|
||||||
|
itemId: namespace + "/" + name + "/" + permission.name
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function deletePermissionFromState(
|
||||||
|
oldPermissions: PermissionCollection,
|
||||||
|
permission: Permission
|
||||||
|
) {
|
||||||
|
for (let i = 0; i < oldPermissions.length; i++) {
|
||||||
|
if (oldPermissions[i] === permission) {
|
||||||
|
oldPermissions.splice(i, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return oldPermissions;
|
||||||
|
}
|
||||||
|
|
||||||
// reducer
|
// reducer
|
||||||
export default function reducer(
|
export default function reducer(
|
||||||
state: Object = {},
|
state: Object = {},
|
||||||
@@ -294,6 +386,19 @@ export default function reducer(
|
|||||||
entries: newPermission
|
entries: newPermission
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
case DELETE_PERMISSION_SUCCESS:
|
||||||
|
const permissionPosition = action.payload.position;
|
||||||
|
const new_Permissions = deletePermissionFromState(
|
||||||
|
state[action.payload.position].entries,
|
||||||
|
action.payload.permission
|
||||||
|
);
|
||||||
|
return {
|
||||||
|
...state,
|
||||||
|
[permissionPosition]: {
|
||||||
|
...state[permissionPosition],
|
||||||
|
entries: new_Permissions
|
||||||
|
}
|
||||||
|
};
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ import reducer, {
|
|||||||
isModifyPermissionPending,
|
isModifyPermissionPending,
|
||||||
createPermission,
|
createPermission,
|
||||||
hasCreatePermission,
|
hasCreatePermission,
|
||||||
|
deletePermission,
|
||||||
|
deletePermissionSuccess,
|
||||||
MODIFY_PERMISSION_FAILURE,
|
MODIFY_PERMISSION_FAILURE,
|
||||||
MODIFY_PERMISSION_PENDING,
|
MODIFY_PERMISSION_PENDING,
|
||||||
FETCH_PERMISSIONS,
|
FETCH_PERMISSIONS,
|
||||||
@@ -22,11 +24,12 @@ import reducer, {
|
|||||||
FETCH_PERMISSIONS_FAILURE,
|
FETCH_PERMISSIONS_FAILURE,
|
||||||
MODIFY_PERMISSION_SUCCESS,
|
MODIFY_PERMISSION_SUCCESS,
|
||||||
MODIFY_PERMISSION,
|
MODIFY_PERMISSION,
|
||||||
CREATE_PERMISSION,
|
|
||||||
CREATE_PERMISSION_PENDING,
|
CREATE_PERMISSION_PENDING,
|
||||||
CREATE_PERMISSION_SUCCESS,
|
CREATE_PERMISSION_SUCCESS,
|
||||||
CREATE_PERMISSION_FAILURE,
|
CREATE_PERMISSION_FAILURE,
|
||||||
createPermissionSuccess
|
DELETE_PERMISSION_PENDING,
|
||||||
|
DELETE_PERMISSION_SUCCESS,
|
||||||
|
DELETE_PERMISSION_FAILURE
|
||||||
} from "./permissions";
|
} from "./permissions";
|
||||||
import type { Permission, PermissionCollection } from "../types/Permissions";
|
import type { Permission, PermissionCollection } from "../types/Permissions";
|
||||||
|
|
||||||
@@ -292,6 +295,89 @@ describe("permission fetch", () => {
|
|||||||
expect(callMe).toBe("yeah");
|
expect(callMe).toBe("yeah");
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
it("should delete successfully permission user_eins", () => {
|
||||||
|
fetchMock.deleteOnce(
|
||||||
|
hitchhiker_puzzle42Permission_user_eins._links.delete.href,
|
||||||
|
{
|
||||||
|
status: 204
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const store = mockStore({});
|
||||||
|
return store
|
||||||
|
.dispatch(
|
||||||
|
deletePermission(
|
||||||
|
hitchhiker_puzzle42Permission_user_eins,
|
||||||
|
"hitchhiker",
|
||||||
|
"puzzle42"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.then(() => {
|
||||||
|
const actions = store.getActions();
|
||||||
|
expect(actions.length).toBe(2);
|
||||||
|
expect(actions[0].type).toEqual(DELETE_PERMISSION_PENDING);
|
||||||
|
expect(actions[0].payload).toBe(
|
||||||
|
hitchhiker_puzzle42Permission_user_eins
|
||||||
|
);
|
||||||
|
expect(actions[1].type).toEqual(DELETE_PERMISSION_SUCCESS);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should call the callback, after successful delete", () => {
|
||||||
|
fetchMock.deleteOnce(
|
||||||
|
hitchhiker_puzzle42Permission_user_eins._links.delete.href,
|
||||||
|
{
|
||||||
|
status: 204
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
let called = false;
|
||||||
|
const callMe = () => {
|
||||||
|
called = true;
|
||||||
|
};
|
||||||
|
|
||||||
|
const store = mockStore({});
|
||||||
|
return store
|
||||||
|
.dispatch(
|
||||||
|
deletePermission(
|
||||||
|
hitchhiker_puzzle42Permission_user_eins,
|
||||||
|
"hitchhiker",
|
||||||
|
"puzzle42",
|
||||||
|
callMe
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.then(() => {
|
||||||
|
expect(called).toBeTruthy();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it("should fail to delete permission", () => {
|
||||||
|
fetchMock.deleteOnce(
|
||||||
|
hitchhiker_puzzle42Permission_user_eins._links.delete.href,
|
||||||
|
{
|
||||||
|
status: 500
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
const store = mockStore({});
|
||||||
|
return store
|
||||||
|
.dispatch(
|
||||||
|
deletePermission(
|
||||||
|
hitchhiker_puzzle42Permission_user_eins,
|
||||||
|
"hitchhiker",
|
||||||
|
"puzzle42"
|
||||||
|
)
|
||||||
|
)
|
||||||
|
.then(() => {
|
||||||
|
const actions = store.getActions();
|
||||||
|
expect(actions[0].type).toEqual(DELETE_PERMISSION_PENDING);
|
||||||
|
expect(actions[0].payload).toBe(
|
||||||
|
hitchhiker_puzzle42Permission_user_eins
|
||||||
|
);
|
||||||
|
expect(actions[1].type).toEqual(DELETE_PERMISSION_FAILURE);
|
||||||
|
expect(actions[1].payload).toBeDefined();
|
||||||
|
});
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("permissions reducer", () => {
|
describe("permissions reducer", () => {
|
||||||
@@ -345,6 +431,35 @@ describe("permissions reducer", () => {
|
|||||||
expectedState["hitchhiker/puzzle42"]
|
expectedState["hitchhiker/puzzle42"]
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
it("should remove permission from state when delete succeeds", () => {
|
||||||
|
const state = {
|
||||||
|
"hitchhiker/puzzle42": {
|
||||||
|
entries: [
|
||||||
|
hitchhiker_puzzle42Permission_user_eins,
|
||||||
|
hitchhiker_puzzle42Permission_user_zwei
|
||||||
|
]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const expectedState = {
|
||||||
|
"hitchhiker/puzzle42": {
|
||||||
|
entries: [hitchhiker_puzzle42Permission_user_zwei]
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const newState = reducer(
|
||||||
|
state,
|
||||||
|
deletePermissionSuccess(
|
||||||
|
hitchhiker_puzzle42Permission_user_eins,
|
||||||
|
"hitchhiker",
|
||||||
|
"puzzle42"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
expect(newState["hitchhiker/puzzle42"]).toEqual(
|
||||||
|
expectedState["hitchhiker/puzzle42"]
|
||||||
|
);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
describe("permissions selectors", () => {
|
describe("permissions selectors", () => {
|
||||||
|
|||||||
Reference in New Issue
Block a user