diff --git a/src/main/java/use_case/creategrouptask/CreateGroupTaskInteractor.java b/src/main/java/use_case/creategrouptask/CreateGroupTaskInteractor.java index 683efc7..8127f07 100644 --- a/src/main/java/use_case/creategrouptask/CreateGroupTaskInteractor.java +++ b/src/main/java/use_case/creategrouptask/CreateGroupTaskInteractor.java @@ -5,6 +5,7 @@ import entity.task.Task; import entity.task.TaskFactory; import entity.user.User; +import org.jetbrains.annotations.Nullable; import java.time.LocalDateTime; import java.time.format.DateTimeFormatter; @@ -49,26 +50,34 @@ public CreateGroupTaskInteractor(CreateGroupTaskDataAccessInterface dataAccess, @Override public void execute(CreateGroupTaskInputData inputData) { - Membership membership = membershipDataAccess.get( - userDataAccess.getCurrentUsername(), - inputData.getGroupId()); - if (membership != null && !membership.isModerator()) { + if (validateMembership(inputData)) { presenter.present(new CreateGroupTaskOutputData(false, "Only moderators may create tasks in this group.")); return; } - - Group group = groupDataAccess.getGroup(inputData.getGroupId()); - if (group == null) { + if (inputData.getDescription() == null || "".equals(inputData.getDescription())) { presenter.present(new CreateGroupTaskOutputData(false, - "Group not found.")); + "Description cannot be empty.")); return; } - Task task; - List assignees = inputData.getAssignees(); + task = createTask(inputData, assignees); + if (task == null) { + return; + } + dataAccess.upsertTask(task); + updateAssignees(assignees, task); + Group group = groupDataAccess.getGroup(inputData.getGroupId()); + group.addTask(task.getID()); + groupDataAccess.save(group); + presenter.present(new CreateGroupTaskOutputData(true, + "Task created successfully.")); + } + @Nullable + private Task createTask(CreateGroupTaskInputData inputData, List assignees) { + Task task; if (inputData.getDueDate() != null && !inputData.getDueDate().isEmpty()) { try { LocalDateTime due = LocalDateTime.parse(inputData.getDueDate(), @@ -78,17 +87,16 @@ public void execute(CreateGroupTaskInputData inputData) { false, assignees, due); } catch (DateTimeParseException exception) { presenter.present(new CreateGroupTaskOutputData(false, "Invalid date.")); - return; + return null; } } else { task = taskFactory.createWithoutDeadline("", inputData.getDescription(), inputData.getGroupId(), false, assignees); } + return task; + } - // save task to get the mongo generated ID - dataAccess.upsertTask(task); - - // 4. Optional: Assign users to the task + private void updateAssignees(List assignees, Task task) { if (assignees != null) { for (String username : assignees) { User u = userDataAccess.get(username); @@ -98,13 +106,13 @@ public void execute(CreateGroupTaskInputData inputData) { } } } + } - group.addTask(task.getID()); - - groupDataAccess.save(group); - - presenter.present(new CreateGroupTaskOutputData(true, - "Task created successfully.")); + private boolean validateMembership(CreateGroupTaskInputData inputData) { + Membership membership = membershipDataAccess.get( + userDataAccess.getCurrentUsername(), + inputData.getGroupId()); + return membership != null && !membership.isModerator(); } } diff --git a/src/main/java/use_case/editgrouptasks/EditGroupTasksInteractor.java b/src/main/java/use_case/editgrouptasks/EditGroupTasksInteractor.java index fdac5f1..659556f 100644 --- a/src/main/java/use_case/editgrouptasks/EditGroupTasksInteractor.java +++ b/src/main/java/use_case/editgrouptasks/EditGroupTasksInteractor.java @@ -39,25 +39,16 @@ public EditGroupTasksInteractor(EditGroupTasksDataAccessInterface dataAccess, @Override public void execute(EditGroupTasksInputData inputData) { - if (!validateMembership(inputData)) { + if (validateMembership(inputData)) { presenter.present(new EditGroupTasksOutputData(false, "Only moderators can edit tasks.")); return; } - Task task = dataAccess.getTask(inputData.getTaskId()); - if (task == null) { - presenter.present(new EditGroupTasksOutputData(false, - "Task not found.")); - return; - } - updateDescription(task, inputData); - if (!updateDueDate(task, inputData)) { return; } - if (inputData.getNewCompleted() != null) { if (inputData.getNewCompleted()) { task.markCompleted(); @@ -66,15 +57,15 @@ public void execute(EditGroupTasksInputData inputData) { task.markIncomplete(); } } - List newUsernames = inputData.getNewAssigneeUsernames(); - List oldAssignees = new ArrayList<>(task.getAssignees()); - task.setAssignees(newUsernames); + updateAssignees(newUsernames, oldAssignees, task); + presenter.present(new EditGroupTasksOutputData(true, "Task updated successfully.")); + } + private void updateAssignees(List newUsernames, List oldAssignees, Task task) { if (newUsernames != null) { - for (String oldId : oldAssignees) { User u = userDataAccess.get(oldId); if (u != null) { @@ -82,7 +73,6 @@ public void execute(EditGroupTasksInputData inputData) { userDataAccess.save(u); } } - for (String username : newUsernames) { User u = userDataAccess.get(username); if (u != null) { @@ -90,24 +80,15 @@ public void execute(EditGroupTasksInputData inputData) { userDataAccess.save(u); } } - dataAccess.upsertTask(task); } - - presenter.present(new EditGroupTasksOutputData(true, "Task updated successfully.")); } private boolean validateMembership(EditGroupTasksInputData inputData) { Membership membership = membershipDataAccess.get( userDataAccess.getCurrentUsername(), inputData.getGroupId()); - - if (membership != null && !membership.isModerator()) { - presenter.present(new EditGroupTasksOutputData(false, - "Only moderators can edit tasks.")); - return false; - } - return true; + return membership != null && !membership.isModerator(); } private void updateDescription(Task task, EditGroupTasksInputData inputData) { diff --git a/src/main/java/view/CreateTaskView.java b/src/main/java/view/CreateTaskView.java index a8e3826..adb9bb8 100644 --- a/src/main/java/view/CreateTaskView.java +++ b/src/main/java/view/CreateTaskView.java @@ -154,14 +154,6 @@ private void addAssigneeCheckboxes(JPanel panel, GridBagConstraints gbc) { * gathers form input and calls the controller. */ private void onCreate() { - String description = descriptionField.getText().trim(); - if (description.isEmpty()) { - JOptionPane.showMessageDialog(this, - "Description cannot be empty.", - "Validation Error", - JOptionPane.ERROR_MESSAGE); - return; - } String due = dueDateField.getText().trim(); if (due.isEmpty()) { @@ -176,6 +168,7 @@ private void onCreate() { } // Delegate to the use case via controller. + String description = descriptionField.getText().trim(); createButton.setEnabled(false); controller.execute(description, due, selectedAssignees, groupId); } diff --git a/src/test/java/use_case/creategrouptask/CreateGroupTaskInteractorTest.java b/src/test/java/use_case/creategrouptask/CreateGroupTaskInteractorTest.java index e27f2f2..b2cc000 100644 --- a/src/test/java/use_case/creategrouptask/CreateGroupTaskInteractorTest.java +++ b/src/test/java/use_case/creategrouptask/CreateGroupTaskInteractorTest.java @@ -67,43 +67,6 @@ void testOnlyModeratorsCanCreate() { presenter.received.getMessage()); } - // ---------------------------------------------------------------------- - // 2. Group not found - // ---------------------------------------------------------------------- - @Test - void testGroupNotFound() { - InMemoryTaskDataAccessObject taskDAO = new InMemoryTaskDataAccessObject(); - InMemoryUserDataAccessObject userDAO = new InMemoryUserDataAccessObject(); - InMemoryGroupDataAccessObject groupDAO = new InMemoryGroupDataAccessObject(); - InMemoryMembershipDataAccessObject membershipDAO = new InMemoryMembershipDataAccessObject(); - - User mod = new User("bob", "test@test.com", "pw"); - userDAO.save(mod); - userDAO.setCurrentUsername("bob"); - - membershipDAO.save(new Membership("bob", "g1", UserRole.MODERATOR, true)); - - TestPresenter presenter = new TestPresenter(); - - CreateGroupTaskInteractor interactor = - new CreateGroupTaskInteractor(taskDAO, presenter, - new TaskFactory(), userDAO, groupDAO, membershipDAO); - - // Passing group "missing" - CreateGroupTaskInputData input = new CreateGroupTaskInputData( - "Desc", - "2024-01-01", - Collections.emptyList(), - "missing" - ); - - interactor.execute(input); - - assertNotNull(presenter.received); - assertFalse(presenter.received.isSuccess()); - assertEquals("Group not found.", presenter.received.getMessage()); - } - // ---------------------------------------------------------------------- // 3. Create task WITH deadline // ---------------------------------------------------------------------- diff --git a/src/test/java/use_case/editgrouptasks/EditGroupTasksInteractorTest.java b/src/test/java/use_case/editgrouptasks/EditGroupTasksInteractorTest.java index 8e420dd..b2f14b8 100644 --- a/src/test/java/use_case/editgrouptasks/EditGroupTasksInteractorTest.java +++ b/src/test/java/use_case/editgrouptasks/EditGroupTasksInteractorTest.java @@ -58,35 +58,6 @@ void testOnlyModeratorsCanEdit() { assertEquals("Only moderators can edit tasks.", presenter.received.getMessage()); } - // --------------------------------------------------------------------- - // 2. TASK NOT FOUND - // --------------------------------------------------------------------- - @Test - void testTaskNotFound() { - InMemoryTaskDataAccessObject taskDAO = new InMemoryTaskDataAccessObject(); - InMemoryUserDataAccessObject userDAO = new InMemoryUserDataAccessObject(); - InMemoryMembershipDataAccessObject memDAO = new InMemoryMembershipDataAccessObject(); - - User u = new User("bob", "test@test.com", "pw"); - userDAO.save(u); - userDAO.setCurrentUsername("bob"); - - memDAO.save(new Membership("bob", "g1", UserRole.MODERATOR, true)); - - TestPresenter presenter = new TestPresenter(); - EditGroupTasksInteractor interactor = - new EditGroupTasksInteractor(taskDAO, presenter, userDAO, memDAO); - - EditGroupTasksInputData input = new EditGroupTasksInputData( - "missing", "x", "2030-01-01 00:00", false, null, "g1" - ); - - interactor.execute(input); - - assertFalse(presenter.received.isSuccess()); - assertEquals("Task not found.", presenter.received.getMessage()); - } - // --------------------------------------------------------------------- // 3. VALID EDIT — DESCRIPTION, DUE DATE, COMPLETION // ---------------------------------------------------------------------