Skip to content

Commit f24d263

Browse files
authored
Merge pull request #2135 from objectcomputing/feature-2134/add-categories-to-permissions
Swag at permissions changes
2 parents 03bd3cd + 74ba469 commit f24d263

File tree

19 files changed

+2234
-23
lines changed

19 files changed

+2234
-23
lines changed
Lines changed: 34 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,21 +1,37 @@
11
package com.objectcomputing.checkins.security.permissions;
22

33
public enum Permissions {
4-
CAN_VIEW_FEEDBACK_REQUEST,
5-
CAN_CREATE_FEEDBACK_REQUEST,
6-
CAN_DELETE_FEEDBACK_REQUEST,
7-
CAN_VIEW_FEEDBACK_ANSWER,
8-
CAN_DELETE_ORGANIZATION_MEMBERS,
9-
CAN_CREATE_ORGANIZATION_MEMBERS,
10-
CAN_VIEW_ROLE_PERMISSIONS,
11-
CAN_ASSIGN_ROLE_PERMISSIONS,
12-
CAN_VIEW_PERMISSIONS,
13-
CAN_VIEW_SKILLS_REPORT,
14-
CAN_VIEW_RETENTION_REPORT,
15-
CAN_VIEW_ANNIVERSARY_REPORT,
16-
CAN_VIEW_BIRTHDAY_REPORT,
17-
CAN_VIEW_PROFILE_REPORT,
18-
CAN_CREATE_CHECKINS,
19-
CAN_VIEW_CHECKINS,
20-
CAN_UPDATE_CHECKINS,
21-
}
4+
CAN_VIEW_FEEDBACK_REQUEST("View feedback requests", "Feedback"),
5+
CAN_CREATE_FEEDBACK_REQUEST("Create feedback requests", "Feedback"),
6+
CAN_DELETE_FEEDBACK_REQUEST("Delete feedback requests", "Feedback"),
7+
CAN_VIEW_FEEDBACK_ANSWER("View feedback answers", "Feedback"),
8+
CAN_DELETE_ORGANIZATION_MEMBERS("Delete organization members", "User Management"),
9+
CAN_CREATE_ORGANIZATION_MEMBERS("Create organization members", "User Management"),
10+
CAN_VIEW_ROLE_PERMISSIONS("View role permissions", "Security"),
11+
CAN_ASSIGN_ROLE_PERMISSIONS("Assign role permissions", "Security"),
12+
CAN_VIEW_PERMISSIONS("View all permissions", "Security"),
13+
CAN_VIEW_SKILLS_REPORT("View skills report", "Reporting"),
14+
CAN_VIEW_RETENTION_REPORT("View retention report", "Reporting"),
15+
CAN_VIEW_ANNIVERSARY_REPORT("View anniversary report", "Reporting"),
16+
CAN_VIEW_BIRTHDAY_REPORT("View birthday report", "Reporting"),
17+
CAN_VIEW_PROFILE_REPORT("View profile report", "Reporting"),
18+
CAN_CREATE_CHECKINS("Create check-ins", "Check-ins"),
19+
CAN_VIEW_CHECKINS("View check-ins", "Check-ins"),
20+
CAN_UPDATE_CHECKINS("Update check-ins", "Check-ins");
21+
22+
private final String description;
23+
private final String category;
24+
25+
Permissions(String description, String category) {
26+
this.description = description;
27+
this.category = category;
28+
}
29+
30+
public String getDescription() {
31+
return description;
32+
}
33+
34+
public String getCategory() {
35+
return category;
36+
}
37+
}

server/src/main/java/com/objectcomputing/checkins/services/permissions/Permission.java

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.objectcomputing.checkins.services.permissions;
22

3+
import com.objectcomputing.checkins.security.permissions.Permissions;
34
import io.micronaut.core.annotation.Introspected;
45
import io.micronaut.core.annotation.Nullable;
56
import io.micronaut.data.annotation.AutoPopulated;
@@ -11,6 +12,7 @@
1112
import javax.persistence.Entity;
1213
import javax.persistence.Id;
1314
import javax.persistence.Table;
15+
import javax.persistence.Transient;
1416
import javax.validation.constraints.NotBlank;
1517
import java.util.Objects;
1618
import java.util.UUID;
@@ -36,6 +38,8 @@ public class Permission {
3638
@Schema(description = "A more verbose description of the permission to be displayed on UI")
3739
private String description;
3840

41+
public Permission() {}
42+
3943
public Permission(UUID id, String permission, @Nullable String description) {
4044
this.id = id;
4145
this.permission = permission;
@@ -59,13 +63,18 @@ public void setPermission(String permission) {
5963
}
6064

6165
public String getDescription() {
62-
return description;
66+
return Permissions.valueOf(permission).getDescription(); //ignoring the database for now...
6367
}
6468

65-
public void setDescription(String description) {
69+
public void setDescription(@Nullable String description) {
6670
this.description = description;
6771
}
6872

73+
@Transient
74+
public String getCategory() {
75+
return Permissions.valueOf(permission).getCategory();
76+
}
77+
6978
@Override
7079
public boolean equals(Object o) {
7180
if (this == o) return true;

server/src/test/java/com/objectcomputing/checkins/services/fixture/PermissionFixture.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,12 +55,12 @@ public interface PermissionFixture extends RepositoryFixture, RolePermissionFixt
5555
);
5656

5757
default Permission createACustomPermission(Permissions perm) {
58-
return getPermissionRepository().save(new Permission(null, perm.name(), null));
58+
return getPermissionRepository().save(new Permission(null, perm.name(), perm.getDescription()));
5959
}
6060

6161
default void saveAllPermissions() {
6262
for(Permissions permissions : Permissions.values()) {
63-
getPermissionRepository().save(new Permission(null, permissions.name(), null));
63+
getPermissionRepository().save(new Permission(null, permissions.name(), permissions.getDescription()));
6464
}
6565
}
6666

web-ui/src/api/memberroles.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { resolve } from "./api.js";
2+
3+
const memberRolesUrl = "/services/roles/members"
4+
5+
export const getMemberRolesList = async (cookie) => {
6+
return resolve({
7+
url: memberRolesUrl,
8+
responseType: "json",
9+
headers: { "X-CSRF-Header": cookie },
10+
});
11+
};

web-ui/src/api/permissions.js

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,11 @@
1+
import { resolve } from "./api.js";
2+
3+
const permissionsListUrl = "/services/permissions"
4+
5+
export const getPermissionsList = async (cookie) => {
6+
return resolve({
7+
url: permissionsListUrl,
8+
responseType: "json",
9+
headers: { "X-CSRF-Header": cookie },
10+
});
11+
};

web-ui/src/api/rolepermissions.js

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
import { resolve } from "./api.js";
2+
3+
const rolePermissionsListUrl = "/services/roles/role-permissions";
4+
5+
export const getRolePermissionsList = async (cookie) => {
6+
return resolve({
7+
url: rolePermissionsListUrl,
8+
responseType: "json",
9+
headers: { "X-CSRF-Header": cookie },
10+
});
11+
};
12+
13+
export const postRolePermission = async (roleData, cookie) => {
14+
return resolve({
15+
method: "post",
16+
url: rolePermissionsListUrl,
17+
responseType: "json",
18+
data: roleData,
19+
headers: { "X-CSRF-Header": cookie },
20+
});
21+
};
22+
23+
export const deleteRolePermission = async (roleData, cookie) => {
24+
return resolve({
25+
method: "delete",
26+
url: rolePermissionsListUrl,
27+
responseType: "json",
28+
data: roleData,
29+
headers: { "X-CSRF-Header": cookie },
30+
});
31+
};

web-ui/src/components/menu/Menu.jsx

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ const Root = styled('div')(({theme}) => ({
9595
}));
9696

9797
const adminLinks = [
98-
// ["/admin/permissions", "Permissions"],
98+
["/admin/permissions", "Permissions"],
9999
["/admin/roles", "Roles"],
100100
["/admin/users", "Users"],
101101
["/admin/email", "Send Email"],

web-ui/src/components/routes/Routes.jsx

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import BirthdayAnniversaryReportPage from "../../pages/BirthdayAnniversaryReport
77
import CheckinsPage from "../../pages/CheckinsPage";
88
import CheckinsReportPage from "../../pages/CheckinsReportPage";
99
import EditSkillsPage from "../../pages/EditSkillsPage";
10+
import EditPermissionsPage from "../../pages/PermissionsPage";
1011
import GroupIcon from "@mui/icons-material/Group";
1112
import GuildsPage from "../../pages/GuildsPage";
1213
import Header from "../header/Header";
@@ -101,6 +102,10 @@ export default function Routes() {
101102
<Header title="Skills" />
102103
<EditSkillsPage />
103104
</Route>
105+
<Route path="/admin/permissions">
106+
<Header title="Permissions" />
107+
<EditPermissionsPage />
108+
</Route>
104109
<Route path="/checkins-reports">
105110
<Header title="Check-in Report" />
106111
<CheckinsReportPage />

web-ui/src/context/selectors.js

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ export const selectTeams = (state) => state.teams;
1414
export const selectGuilds = (state) => state.guilds;
1515
export const selectLoading = (state) => state.loading;
1616
export const selectReviewPeriods = (state) => state.reviewPeriods;
17+
export const selectPermissions = (state) => state.permissions;
1718

1819
export const selectTeamsLoading = createSelector (
1920
selectLoading,
@@ -40,6 +41,12 @@ export const selectIsAdmin = createSelector(
4041
userProfile && userProfile.role && userProfile.role.includes("ADMIN")
4142
);
4243

44+
export const selectHasPermissionAssignmentPermission = createSelector(
45+
selectUserProfile,
46+
(userProfile) =>
47+
userProfile && userProfile.role && userProfile.permissions.some((p) => p?.permission?.includes("CAN_ASSIGN_ROLE_PERMISSIONS"))
48+
);
49+
4350
export const selectHasReportPermission = createSelector(
4451
selectUserProfile,
4552
(userProfile) =>

web-ui/src/helpers/checks.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
/**
2+
* Full check for whether an array actually exists or is empty, etc
3+
* @param arr - an array
4+
* @returns a boolean
5+
*/
6+
7+
export const isArrayPresent = (arr) => Array.isArray(arr) && arr.length;
8+
9+
/**
10+
* If a parameter is found in an object within an array, return the array with just that object.
11+
* @param arr - an array
12+
* @param value - a value
13+
* @param key - an optional key with which to search
14+
* @returns an array
15+
*/
16+
17+
export function filterObjectByValOrKey(arr, value, key) {
18+
return arr.filter(
19+
key
20+
? (a) => a[key].indexOf(value) > -1
21+
: (a) => Object.keys(a).some((k) => a[k] === value)
22+
);
23+
}

0 commit comments

Comments
 (0)