diff --git a/src/main/java/no/ntnu/idi/stud/savingsapp/service/GoalService.java b/src/main/java/no/ntnu/idi/stud/savingsapp/service/GoalService.java index 04a8cbba28c539ba2bd93347109928671ad90f6b..d4ca02e5d75f26b04c6f9977046be4591320d3b8 100644 --- a/src/main/java/no/ntnu/idi/stud/savingsapp/service/GoalService.java +++ b/src/main/java/no/ntnu/idi/stud/savingsapp/service/GoalService.java @@ -1,6 +1,8 @@ package no.ntnu.idi.stud.savingsapp.service; +import no.ntnu.idi.stud.savingsapp.dto.goal.GroupUserDTO; import no.ntnu.idi.stud.savingsapp.model.goal.Goal; +import no.ntnu.idi.stud.savingsapp.model.goal.Group; import org.springframework.stereotype.Service; import java.util.List; @@ -20,7 +22,7 @@ public interface GoalService { * @param userId The ID of the user for whom the goal is being created. * @return The newly created and persisted Goal object. */ - Goal createGoal(Goal goal, long userId); + Goal createGoal(Goal goal, List<GroupUserDTO> GroupUsers, long userId); /** * Retrieves all goals associated with a specific user. @@ -39,4 +41,12 @@ public interface GoalService { * @return A goal object associated with the specified user. */ Goal getGoal(long goalId); + + /** + * Retrieves a group associated with a specific goal + * + * @param goalId the goal that the group contains + * @return A group object associated with the specified goal + */ + Group getGroup(Long goalId); } diff --git a/src/main/java/no/ntnu/idi/stud/savingsapp/service/impl/GoalServiceImpl.java b/src/main/java/no/ntnu/idi/stud/savingsapp/service/impl/GoalServiceImpl.java index 5ef5a96a498dcbfe8680480bfb2f2997a6590a17..57f769e946c45b80093afa4bd10a5429ca8c9f28 100644 --- a/src/main/java/no/ntnu/idi/stud/savingsapp/service/impl/GoalServiceImpl.java +++ b/src/main/java/no/ntnu/idi/stud/savingsapp/service/impl/GoalServiceImpl.java @@ -2,15 +2,20 @@ package no.ntnu.idi.stud.savingsapp.service.impl; import java.sql.Timestamp; import java.time.Instant; +import java.util.ArrayList; import java.util.List; import java.util.Optional; import lombok.extern.slf4j.Slf4j; +import no.ntnu.idi.stud.savingsapp.dto.goal.GroupUserDTO; import no.ntnu.idi.stud.savingsapp.exception.goal.GoalNotFoundException; +import no.ntnu.idi.stud.savingsapp.exception.goal.GroupNotFoundException; import no.ntnu.idi.stud.savingsapp.model.goal.Challenge; import no.ntnu.idi.stud.savingsapp.model.goal.Goal; +import no.ntnu.idi.stud.savingsapp.model.goal.Group; import no.ntnu.idi.stud.savingsapp.model.user.User; import no.ntnu.idi.stud.savingsapp.repository.GoalRepository; +import no.ntnu.idi.stud.savingsapp.repository.GroupRepository; import no.ntnu.idi.stud.savingsapp.service.ChallengeService; import no.ntnu.idi.stud.savingsapp.service.GoalService; import no.ntnu.idi.stud.savingsapp.service.UserService; @@ -33,6 +38,9 @@ public class GoalServiceImpl implements GoalService { @Autowired private ChallengeService challengeService; + @Autowired + private GroupRepository groupRepository; + /** * Creates a new goal for a specific user and generates associated challenges. * @@ -41,12 +49,33 @@ public class GoalServiceImpl implements GoalService { * @return The newly created Goal, now populated with generated challenges and persisted in the database. */ @Override - public Goal createGoal(Goal goal, long userId) { + public Goal createGoal(Goal goal, List<GroupUserDTO> GroupUsers, long userId) { User user = userService.findById(userId); goal.setCreatedAt(Timestamp.from(Instant.now())); goal.setUser(user); List<Challenge> challenges = challengeService.generateChallenges(goal, user); goal.setChallenges(challenges); + + //Create group goal if GroupUsers were added + if(GroupUsers != null && !GroupUsers.isEmpty()) { + List<Goal> groupGoalList = new ArrayList<>(); + for (GroupUserDTO groupUserDTO : GroupUsers) { + Goal groupGoal = new Goal(); + User groupUser = userService.findById(groupUserDTO.getUserId()); + groupGoal.setCreatedAt(Timestamp.from(Instant.now())); + groupGoal.setUser(groupUser); + List<Challenge> challengeList = challengeService.generateChallenges(groupGoal, groupUser); + groupGoal.setChallenges(challengeList); + goalRepository.save(groupGoal); + groupGoalList.add(groupGoal); + } + + Group group = new Group(); + group.setCreator(user); + group.setGoals(groupGoalList); + groupRepository.save(group); + } + return goalRepository.save(goal); } @@ -61,6 +90,12 @@ public class GoalServiceImpl implements GoalService { return goalRepository.findByUser_Id(userId); } + /** + * Retrieves goal associated with a given goal ID. + * + * @param goalId The ID of the user whose goals are to be retrieved. + * @return The goal associated with the given goal ID. + */ @Override public Goal getGoal(long goalId) { Optional<Goal> optionalGoal = goalRepository.findById(goalId); @@ -71,4 +106,21 @@ public class GoalServiceImpl implements GoalService { throw new GoalNotFoundException(); } } + + /** + * + * + * @param goalId the goal that the group contains + * @return The group containing the goal + */ + @Override + public Group getGroup(Long goalId) { + Optional<Group> optionalGroup = groupRepository.findBygGoals_Id(goalId); + if (optionalGroup.isPresent()) { + return optionalGroup.get(); + } else { + log.error("[GoalServiceImpl:getGoal] Group is not found from goal, id: {}", goalId); + throw new GroupNotFoundException(); + } + } }