From 9e4a22a9c5e2f6ed9e1794a0e5e3001f3fff17ca Mon Sep 17 00:00:00 2001 From: Weiqi Gao Date: Wed, 31 Jul 2024 14:13:51 -0500 Subject: [PATCH 1/3] added is_active column to the team table. updated the server-side and ui code to allow the user to make a team active or inactive. --- .../checkins/services/team/Team.java | 9 +++++++-- .../checkins/services/team/TeamCreateDTO.java | 7 ++++++- .../checkins/services/team/TeamRepository.java | 2 +- .../services/team/TeamResponseDTO.java | 11 ++++++++--- .../services/team/TeamServicesImpl.java | 6 +++--- .../checkins/services/team/TeamUpdateDTO.java | 11 ++++++++--- .../db/common/V109__alter_team_table.sql | 1 + .../resources/db/dev/R__Load_testing_data.sql | 18 +++++++++--------- .../checkins/services/fixture/TeamFixture.java | 12 ++++++------ .../services/team/TeamControllerTest.java | 4 ++-- .../components/team-results/EditTeamModal.jsx | 9 +++++++++ .../team-results/TeamSummaryCard.jsx | 2 +- 12 files changed, 61 insertions(+), 31 deletions(-) create mode 100644 server/src/main/resources/db/common/V109__alter_team_table.sql diff --git a/server/src/main/java/com/objectcomputing/checkins/services/team/Team.java b/server/src/main/java/com/objectcomputing/checkins/services/team/Team.java index 1db65f35a8..1b4ad12142 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/team/Team.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/team/Team.java @@ -49,14 +49,19 @@ public class Team { @Schema(description = "description of the team", nullable = true) private String description; + @Column(name = "is_active") + @Schema(description = "whether the team is active") + private boolean active = true; + public Team(String name, @Nullable String description) { - this(null, name, description); + this(null, name, description, true); } - public Team(UUID id, String name, @Nullable String description) { + public Team(UUID id, String name, @Nullable String description, boolean active) { this.id = id; this.name = name; this.description = description; + this.active = active; } @Override diff --git a/server/src/main/java/com/objectcomputing/checkins/services/team/TeamCreateDTO.java b/server/src/main/java/com/objectcomputing/checkins/services/team/TeamCreateDTO.java index d219805209..77b06271d1 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/team/TeamCreateDTO.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/team/TeamCreateDTO.java @@ -23,12 +23,17 @@ public class TeamCreateDTO { @Schema(description = "description of the team") private String description; + @NotNull + @Schema(description = "whether the team is active") + private boolean active; + @Schema(description = "members of this team") private List teamMembers; - public TeamCreateDTO(String name, @Nullable String description) { + public TeamCreateDTO(String name, @Nullable String description, boolean active) { this.name = name; this.description = description; + this.active = active; } @Data diff --git a/server/src/main/java/com/objectcomputing/checkins/services/team/TeamRepository.java b/server/src/main/java/com/objectcomputing/checkins/services/team/TeamRepository.java index 6de242d69b..058d5e8ca2 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/team/TeamRepository.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/team/TeamRepository.java @@ -27,7 +27,7 @@ public interface TeamRepository extends CrudRepository { @Override S save(@Valid @NotNull @NonNull S entity); - @Query(value = "SELECT t_.id, PGP_SYM_DECRYPT(cast(t_.name as bytea),'${aes.key}') as name, PGP_SYM_DECRYPT(cast(description as bytea),'${aes.key}') as description " + + @Query(value = "SELECT t_.id, PGP_SYM_DECRYPT(cast(t_.name as bytea),'${aes.key}') as name, PGP_SYM_DECRYPT(cast(description as bytea),'${aes.key}') as description, is_active " + "FROM team t_ " + "LEFT JOIN team_member tm_ " + " ON t_.id = tm_.teamid " + diff --git a/server/src/main/java/com/objectcomputing/checkins/services/team/TeamResponseDTO.java b/server/src/main/java/com/objectcomputing/checkins/services/team/TeamResponseDTO.java index 2efeba0714..fbe1d7937c 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/team/TeamResponseDTO.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/team/TeamResponseDTO.java @@ -26,16 +26,21 @@ public class TeamResponseDTO { @Schema(description = "description of the team") private String description; + @NotNull + @Schema(description = "whether the team is active") + private boolean active; + List teamMembers; - public TeamResponseDTO(UUID id, String name, @Nullable String description) { + public TeamResponseDTO(UUID id, String name, @Nullable String description, boolean active) { this.id = id; this.name = name; this.description = description; + this.active = active; } - public TeamResponseDTO(String id, String name, @Nullable String description) { - this(UUID.fromString(id), name, description); + public TeamResponseDTO(String id, String name, @Nullable String description, boolean active) { + this(UUID.fromString(id), name, description, active); } public TeamResponseDTO() { diff --git a/server/src/main/java/com/objectcomputing/checkins/services/team/TeamServicesImpl.java b/server/src/main/java/com/objectcomputing/checkins/services/team/TeamServicesImpl.java index cca0920f42..08f3b0eb2c 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/team/TeamServicesImpl.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/team/TeamServicesImpl.java @@ -164,7 +164,7 @@ private Team fromDTO(TeamUpdateDTO dto) { if (dto == null) { return null; } - return new Team(dto.getId(), dto.getName(), dto.getDescription()); + return new Team(dto.getId(), dto.getName(), dto.getDescription(), dto.isActive()); } private TeamMember fromMemberDTO(TeamCreateDTO.TeamMemberCreateDTO memberDTO, UUID teamId) { @@ -183,7 +183,7 @@ private TeamResponseDTO fromEntity(Team entity, List memb if (entity == null) { return null; } - TeamResponseDTO dto = new TeamResponseDTO(entity.getId(), entity.getName(), entity.getDescription()); + TeamResponseDTO dto = new TeamResponseDTO(entity.getId(), entity.getName(), entity.getDescription(), entity.isActive()); dto.setTeamMembers(memberEntities); return dto; } @@ -192,7 +192,7 @@ private Team fromDTO(TeamCreateDTO dto) { if (dto == null) { return null; } - return new Team(null, dto.getName(), dto.getDescription()); + return new Team(null, dto.getName(), dto.getDescription(), dto.isActive()); } private TeamMemberResponseDTO fromMemberEntity(TeamMember teamMember, MemberProfile memberProfile) { diff --git a/server/src/main/java/com/objectcomputing/checkins/services/team/TeamUpdateDTO.java b/server/src/main/java/com/objectcomputing/checkins/services/team/TeamUpdateDTO.java index 24ce1f1a09..e1647edad6 100644 --- a/server/src/main/java/com/objectcomputing/checkins/services/team/TeamUpdateDTO.java +++ b/server/src/main/java/com/objectcomputing/checkins/services/team/TeamUpdateDTO.java @@ -27,17 +27,22 @@ public class TeamUpdateDTO { @Schema(description = "description of the team") private String description; + @NotNull + @Schema(description = "whether the team is active") + private boolean active; + @Schema(description = "members of this team") private List teamMembers; - public TeamUpdateDTO(UUID id, String name, @Nullable String description) { + public TeamUpdateDTO(UUID id, String name, @Nullable String description, boolean active) { this.id = id; this.name = name; this.description = description; + this.active = active; } - public TeamUpdateDTO(String id, String name, String description) { - this(nullSafeUUIDFromString(id), name, description); + public TeamUpdateDTO(String id, String name, String description, boolean active) { + this(nullSafeUUIDFromString(id), name, description, active); } public TeamUpdateDTO() { diff --git a/server/src/main/resources/db/common/V109__alter_team_table.sql b/server/src/main/resources/db/common/V109__alter_team_table.sql new file mode 100644 index 0000000000..33fcb7d535 --- /dev/null +++ b/server/src/main/resources/db/common/V109__alter_team_table.sql @@ -0,0 +1 @@ +ALTER TABLE team ADD COLUMN is_active BOOLEAN DEFAULT TRUE; diff --git a/server/src/main/resources/db/dev/R__Load_testing_data.sql b/server/src/main/resources/db/dev/R__Load_testing_data.sql index 76f0836527..09e5d88182 100644 --- a/server/src/main/resources/db/dev/R__Load_testing_data.sql +++ b/server/src/main/resources/db/dev/R__Load_testing_data.sql @@ -318,24 +318,24 @@ VALUES -- Teams INSERT INTO team -- Checkins Experts -(id, name, description) +(id, name, description, is_active) VALUES -('a8733740-cf4c-4c16-a8cf-4f928c409acc', PGP_SYM_ENCRYPT('Checkins Experts','${aeskey}'), PGP_SYM_ENCRYPT('Checkins Engineers of superior knowledge','${aeskey}')); +('a8733740-cf4c-4c16-a8cf-4f928c409acc', PGP_SYM_ENCRYPT('Checkins Experts','${aeskey}'), PGP_SYM_ENCRYPT('Checkins Engineers of superior knowledge','${aeskey}'), true); INSERT INTO team -- JavaScript Gurus -(id, name, description) +(id, name, description, is_active) VALUES -('e8f052a8-40b5-4fb4-9bab-8b16ed36adc7', PGP_SYM_ENCRYPT('JavaScript Gurus','${aeskey}'), PGP_SYM_ENCRYPT('JavaScript Engineers of Outstanding Skill','${aeskey}')); +('e8f052a8-40b5-4fb4-9bab-8b16ed36adc7', PGP_SYM_ENCRYPT('JavaScript Gurus','${aeskey}'), PGP_SYM_ENCRYPT('JavaScript Engineers of Outstanding Skill','${aeskey}'), true); INSERT INTO team -- Micronaut Genii -(id, name, description) +(id, name, description, is_active) VALUES -('036b95a5-357c-45bd-b60e-e8e2e1afec83', PGP_SYM_ENCRYPT('Micronaut Genii','${aeskey}'), PGP_SYM_ENCRYPT('Micronaut Engineers of Genius Caliber','${aeskey}')); +('036b95a5-357c-45bd-b60e-e8e2e1afec83', PGP_SYM_ENCRYPT('Micronaut Genii','${aeskey}'), PGP_SYM_ENCRYPT('Micronaut Engineers of Genius Caliber','${aeskey}'), true); INSERT INTO team -- PMO Superness -(id, name, description) +(id, name, description, is_active) VALUES -('e545dfa1-a07d-4099-9a5b-ed14f07b87cc', PGP_SYM_ENCRYPT('PMO Superness','${aeskey}'), PGP_SYM_ENCRYPT('Excellent PMO Artists','${aeskey}')); +('e545dfa1-a07d-4099-9a5b-ed14f07b87cc', PGP_SYM_ENCRYPT('PMO Superness','${aeskey}'), PGP_SYM_ENCRYPT('Excellent PMO Artists','${aeskey}'), true); -- Team Members @@ -1716,4 +1716,4 @@ VALUES INSERT INTO role_documentation (role_id, document_id, display_order) VALUES - ('d03f5f0b-e29c-4cf4-9ea4-6baa09405c56', 'b553d4c0-9b7a-4691-8fe0-e3bdda4f67ae', 3); \ No newline at end of file + ('d03f5f0b-e29c-4cf4-9ea4-6baa09405c56', 'b553d4c0-9b7a-4691-8fe0-e3bdda4f67ae', 3); diff --git a/server/src/test/java/com/objectcomputing/checkins/services/fixture/TeamFixture.java b/server/src/test/java/com/objectcomputing/checkins/services/fixture/TeamFixture.java index 79b341c5d1..e380b81ffc 100644 --- a/server/src/test/java/com/objectcomputing/checkins/services/fixture/TeamFixture.java +++ b/server/src/test/java/com/objectcomputing/checkins/services/fixture/TeamFixture.java @@ -10,26 +10,26 @@ public interface TeamFixture extends MemberProfileFixture, RepositoryFixture { default Team createDefaultTeam() { - return getTeamRepository().save(new Team(UUID.randomUUID(), "Ninja", "Warriors")); + return getTeamRepository().save(new Team(UUID.randomUUID(), "Ninja", "Warriors", true)); } default Team createAnotherDefaultTeam() { - return getTeamRepository().save(new Team(UUID.randomUUID(), "Coding", "Warriors")); + return getTeamRepository().save(new Team(UUID.randomUUID(), "Coding", "Warriors", true)); } default TeamCreateDTO createFromEntity(Team entity) { - return new TeamCreateDTO(entity.getName(), entity.getDescription()); + return new TeamCreateDTO(entity.getName(), entity.getDescription(), entity.isActive()); } default TeamUpdateDTO updateFromEntity(Team entity) { - return new TeamUpdateDTO(entity.getId(), entity.getName(), entity.getDescription()); + return new TeamUpdateDTO(entity.getId(), entity.getName(), entity.getDescription(), entity.isActive()); } default TeamResponseDTO responseFromEntity(Team entity) { - return new TeamResponseDTO(entity.getId(), entity.getName(), entity.getDescription()); + return new TeamResponseDTO(entity.getId(), entity.getName(), entity.getDescription(), entity.isActive()); } default Team entityFromDTO(TeamUpdateDTO dto) { - return new Team(dto.getId(), dto.getName(), dto.getDescription()); + return new Team(dto.getId(), dto.getName(), dto.getDescription(), dto.isActive()); } } diff --git a/server/src/test/java/com/objectcomputing/checkins/services/team/TeamControllerTest.java b/server/src/test/java/com/objectcomputing/checkins/services/team/TeamControllerTest.java index d88c6143e1..6b2ece528c 100644 --- a/server/src/test/java/com/objectcomputing/checkins/services/team/TeamControllerTest.java +++ b/server/src/test/java/com/objectcomputing/checkins/services/team/TeamControllerTest.java @@ -250,7 +250,7 @@ void testUpdateTeamSuccess() { void testUpdateTeamNullName() { Team teamEntity = createDefaultTeam(); - TeamUpdateDTO requestBody = new TeamUpdateDTO(teamEntity.getId(), null, null); + TeamUpdateDTO requestBody = new TeamUpdateDTO(teamEntity.getId(), null, null, true); requestBody.setTeamMembers(new ArrayList<>()); final HttpRequest request = HttpRequest.PUT("", requestBody) @@ -288,7 +288,7 @@ void testUpdateTeamNotExist() { Team teamEntity = createDefaultTeam(); UUID requestId = UUID.randomUUID(); - TeamUpdateDTO requestBody = new TeamUpdateDTO(requestId.toString(), teamEntity.getName(), teamEntity.getDescription()); + TeamUpdateDTO requestBody = new TeamUpdateDTO(requestId.toString(), teamEntity.getName(), teamEntity.getDescription(), teamEntity.isActive()); requestBody.setTeamMembers(new ArrayList<>()); final MutableHttpRequest request = HttpRequest.PUT("", requestBody) diff --git a/web-ui/src/components/team-results/EditTeamModal.jsx b/web-ui/src/components/team-results/EditTeamModal.jsx index cb943c9994..199205c0cb 100644 --- a/web-ui/src/components/team-results/EditTeamModal.jsx +++ b/web-ui/src/components/team-results/EditTeamModal.jsx @@ -9,6 +9,7 @@ import { import { Button } from '@mui/material'; import Modal from '@mui/material/Modal'; import TextField from '@mui/material/TextField'; +import Checkbox from '@mui/material/Checkbox'; import Autocomplete from '@mui/material/Autocomplete'; import './EditTeamModal.css'; @@ -173,6 +174,14 @@ const EditTeamModal = ({ team = {}, open, onSave, onClose, headerText }) => { value={editedTeam.name ? editedTeam.name : ''} onChange={e => setTeam({ ...editedTeam, name: e.target.value })} /> + setTeam({ ...editedTeam, active: e.target.checked })} + /> Active { title: classes.title, subheader: classes.title }} - title={team.name} + title={team.name + (team.active ? ' (Active)' : ' (Inactive)')} subheader={ Date: Wed, 31 Jul 2024 14:31:02 -0500 Subject: [PATCH 2/3] fixed migration script name. --- .../{V109__alter_team_table.sql => V110__alter_team_table.sql} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename server/src/main/resources/db/common/{V109__alter_team_table.sql => V110__alter_team_table.sql} (100%) diff --git a/server/src/main/resources/db/common/V109__alter_team_table.sql b/server/src/main/resources/db/common/V110__alter_team_table.sql similarity index 100% rename from server/src/main/resources/db/common/V109__alter_team_table.sql rename to server/src/main/resources/db/common/V110__alter_team_table.sql From 9473b02aaf2874acdc1b2ab989336c99cf8b805b Mon Sep 17 00:00:00 2001 From: Weiqi Gao Date: Wed, 31 Jul 2024 14:56:54 -0500 Subject: [PATCH 3/3] updated snapshot. --- .../__snapshots__/TeamSummaryCard.test.jsx.snap | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/web-ui/src/components/team-results/__snapshots__/TeamSummaryCard.test.jsx.snap b/web-ui/src/components/team-results/__snapshots__/TeamSummaryCard.test.jsx.snap index c113bacbc9..be253e7eb9 100644 --- a/web-ui/src/components/team-results/__snapshots__/TeamSummaryCard.test.jsx.snap +++ b/web-ui/src/components/team-results/__snapshots__/TeamSummaryCard.test.jsx.snap @@ -14,7 +14,7 @@ exports[`renders correctly 1`] = ` - string + string (Inactive) - string + string (Inactive) - stuff + stuff (Inactive)