Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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<String> 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<String> assignees) {
Task task;
if (inputData.getDueDate() != null && !inputData.getDueDate().isEmpty()) {
try {
LocalDateTime due = LocalDateTime.parse(inputData.getDueDate(),
Expand All @@ -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<String> assignees, Task task) {
if (assignees != null) {
for (String username : assignees) {
User u = userDataAccess.get(username);
Expand All @@ -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();
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -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();
Expand All @@ -66,48 +57,38 @@ public void execute(EditGroupTasksInputData inputData) {
task.markIncomplete();
}
}

List<String> newUsernames = inputData.getNewAssigneeUsernames();

List<String> oldAssignees = new ArrayList<>(task.getAssignees());

task.setAssignees(newUsernames);
updateAssignees(newUsernames, oldAssignees, task);
presenter.present(new EditGroupTasksOutputData(true, "Task updated successfully."));
}

private void updateAssignees(List<String> newUsernames, List<String> oldAssignees, Task task) {
if (newUsernames != null) {

for (String oldId : oldAssignees) {
User u = userDataAccess.get(oldId);
if (u != null) {
u.getTasks().remove(task.getID());
userDataAccess.save(u);
}
}

for (String username : newUsernames) {
User u = userDataAccess.get(username);
if (u != null) {
u.getTasks().add(task.getID());
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) {
Expand Down
9 changes: 1 addition & 8 deletions src/main/java/view/CreateTaskView.java
Original file line number Diff line number Diff line change
Expand Up @@ -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()) {
Expand All @@ -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);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
// ----------------------------------------------------------------------
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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
// ---------------------------------------------------------------------
Expand Down