Skip to content

Commit a5aefeb

Browse files
authored
Merge branch 'develop' into feature-2596/send-email-mjml
2 parents f781f7c + 13f1f27 commit a5aefeb

File tree

72 files changed

+894
-247
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

72 files changed

+894
-247
lines changed

README.md

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,21 @@ Note: Be sure that the target Google Drive folder has edit access granted to the
108108
3. Open the browser to run the application at `http://localhost:8080`
109109
4. Access swagger-UI at - `http://localhost:8080/swagger-ui`
110110

111+
# Testing
112+
113+
1. To run the server tests, run the following:
114+
```sh
115+
$ ./gradlew :server:check
116+
```
117+
2. To run the UI tests, run the following:
118+
```sh
119+
$ ./gradlew :web-ui:check
120+
```
121+
3. To update snapshots, run the following:
122+
```sh
123+
$ cd web-ui && yarn test -u
124+
```
125+
111126
# Contributing
112127

113128
Please see [Contributing](./CONTRIBUTING.md) for details on how to contribute to this project.

server/src/main/java/com/objectcomputing/checkins/services/email/EmailController.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,8 @@
11
package com.objectcomputing.checkins.services.email;
22

3+
import com.objectcomputing.checkins.services.permissions.Permission;
4+
import com.objectcomputing.checkins.services.permissions.RequiredPermission;
5+
36
import io.micronaut.http.HttpStatus;
47
import io.micronaut.http.annotation.Controller;
58
import io.micronaut.http.annotation.Post;
@@ -24,6 +27,7 @@ public EmailController(EmailServices emailServices) {
2427

2528
@Post
2629
@Status(HttpStatus.CREATED)
30+
@RequiredPermission(Permission.CAN_SEND_EMAIL)
2731
public List<Email> sendEmail(String subject, String content, boolean html, String... recipients) {
2832
return emailServices.sendAndSaveEmail(subject, content, html, recipients);
2933
}

server/src/main/java/com/objectcomputing/checkins/services/email/EmailServicesImpl.java

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -48,10 +48,6 @@ public List<Email> sendAndSaveEmail(String subject, String content, boolean html
4848

4949
List<Email> sentEmails = new ArrayList<>();
5050

51-
if (!currentUserServices.isAdmin()) {
52-
throw new PermissionException(NOT_AUTHORIZED_MSG);
53-
}
54-
5551
MemberProfile currentUser = currentUserServices.getCurrentUser();
5652
String fromName = currentUser.getFirstName() + " " + currentUser.getLastName();
5753
LocalDateTime sendDate = LocalDateTime.now();

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public enum Permission {
1313
CAN_CREATE_KUDOS("Create kudos", "Feedback"),
1414
CAN_ADMINISTER_KUDOS("Administer kudos", "Feedback"),
1515
CAN_VIEW_FEEDBACK_ANSWER("View feedback answers", "Feedback"),
16+
CAN_SEND_EMAIL("Send email", "Feedback"),
1617
CAN_DELETE_ORGANIZATION_MEMBERS("Delete organization members", "User Management"),
1718
CAN_CREATE_ORGANIZATION_MEMBERS("Create organization members", "User Management"),
1819
CAN_IMPERSONATE_MEMBERS("Impersonate organization members", "Security"),

server/src/main/resources/db/dev/R__Load_testing_data.sql

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -888,6 +888,11 @@ insert into role_permissions
888888
values
889889
('e8a4fff8-e984-4e59-be84-a713c9fa8d23', 'CAN_CREATE_MERIT_REPORT');
890890

891+
insert into role_permissions
892+
(roleid, permission)
893+
values
894+
('e8a4fff8-e984-4e59-be84-a713c9fa8d23', 'CAN_SEND_EMAIL');
895+
891896
-- PDL Permissions
892897
insert into role_permissions
893898
(roleid, permission)

server/src/test/java/com/objectcomputing/checkins/services/email/EmailControllerTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -172,6 +172,6 @@ void testSendAndSaveEmailUnauthorized() {
172172
client.toBlocking().exchange(request, Argument.listOf(Email.class)));
173173

174174
assertEquals(HttpStatus.FORBIDDEN, responseException.getStatus());
175-
assertEquals(NOT_AUTHORIZED_MSG, responseException.getMessage());
175+
assertEquals("Forbidden", responseException.getMessage());
176176
}
177177
}

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -97,6 +97,7 @@ public interface PermissionFixture extends RolePermissionFixture {
9797
Permission.CAN_ADMINISTER_KUDOS,
9898
Permission.CAN_CREATE_KUDOS,
9999
Permission.CAN_IMPERSONATE_MEMBERS,
100+
Permission.CAN_SEND_EMAIL,
100101
Permission.CAN_CREATE_MERIT_REPORT
101102
);
102103

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

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ default Role createRole(Role role) {
1414
}
1515

1616
default Role createAndAssignAdminRole(MemberProfile memberProfile) {
17-
return createAndAssignRole(RoleType.ADMIN, memberProfile);
17+
Role role = createAndAssignRole(RoleType.ADMIN, memberProfile);
18+
setPermissionsForAdmin(role.getId());
19+
return role;
1820
}
1921

2022
// TODO phase out RoleType

web-ui/src/components/admin/roles/Roles.jsx

Lines changed: 12 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,10 @@ import {
1212
removeUserFromRole,
1313
updateRole
1414
} from '../../../api/roles';
15-
15+
import {
16+
selectHasRoleAssignmentPermission,
17+
noPermission,
18+
} from '../../../context/selectors';
1619
import RoleUserCards from './RoleUserCards';
1720

1821
import {
@@ -64,7 +67,7 @@ const Roles = () => {
6467
memberProfiles?.sort((a, b) => a.name.localeCompare(b.name));
6568

6669
if (!roles) console.error('Roles.jsx: state.roles is not set!');
67-
const allRoles = roles.map(r => r.role).sort();
70+
const allRoles = roles?.map(r => r.role).sort() ?? [];
6871
useQueryParameters([
6972
{
7073
name: 'roles',
@@ -74,7 +77,7 @@ const Roles = () => {
7477
setSelectedRoles(isArrayPresent(value) ? value.sort() : allRoles);
7578
},
7679
toQP() {
77-
return selectedRoles.join(',');
80+
return selectedRoles?.join(',');
7881
}
7982
},
8083
{
@@ -212,7 +215,7 @@ const Roles = () => {
212215
setEditedRole({ ...editedRole, description: event?.target?.value });
213216
};
214217

215-
return (
218+
return selectHasRoleAssignmentPermission(state) ? (
216219
<div className="roles-content">
217220
<div className="roles">
218221
<div className="roles-top">
@@ -234,13 +237,13 @@ const Roles = () => {
234237
{roles?.map(roleObj => (
235238
<MenuItem key={roleObj.role} value={roleObj.role}>
236239
<Checkbox
237-
checked={selectedRoles.indexOf(roleObj.role) > -1}
240+
checked={selectedRoles?.indexOf(roleObj.role) > -1}
238241
/>
239242
<ListItemText primary={roleObj.role} />
240243
</MenuItem>
241244
))}
242245
</Select>
243-
<FormHelperText>{`Showing ${selectedRoles.length}/${roles?.length} roles`}</FormHelperText>
246+
<FormHelperText>{`Showing ${selectedRoles?.length}/${roles?.length} roles`}</FormHelperText>
244247
</FormControl>
245248
<TextField
246249
className="member-role-search"
@@ -303,7 +306,7 @@ const Roles = () => {
303306
</Modal>
304307
<div className="roles-bot">
305308
{roles?.map(roleObj =>
306-
selectedRoles.includes(roleObj.role) ? (
309+
selectedRoles?.includes(roleObj.role) ? (
307310
<Card className="role" key={`${roleObj.role}-card`}>
308311
<CardContent className="role-card">
309312
<List style={{ paddingTop: 0 }}>
@@ -398,6 +401,8 @@ const Roles = () => {
398401
</div>
399402
</div>
400403
</div>
404+
) : (
405+
<h3>{noPermission}</h3>
401406
);
402407
};
403408

web-ui/src/components/admin/roles/Roles.test.jsx

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,12 @@ const initialState = {
1212
roles: [
1313
{ id: 1, role: 'ADMIN', memberid: 1 },
1414
{ id: 2, role: 'PDL', memberid: 2 }
15-
]
15+
],
16+
userProfile: {
17+
name: 'Current User',
18+
role: ['MEMBER'],
19+
permissions: [{ permission: 'CAN_ASSIGN_ROLE_PERMISSIONS' }],
20+
},
1621
}
1722
};
1823

@@ -23,3 +28,11 @@ it('renders correctly', () => {
2328
</AppContextProvider>
2429
);
2530
});
31+
32+
it('renders an error if user does not have appropriate permission', () => {
33+
snapshot(
34+
<AppContextProvider>
35+
<Roles />
36+
</AppContextProvider>
37+
);
38+
});

0 commit comments

Comments
 (0)