Skip to content
Snippets Groups Projects
Commit f764ca87 authored by Andreas Kluge Svendsrud's avatar Andreas Kluge Svendsrud
Browse files

Merge branch 'feat/group_saving' into 'master'

Feat/group saving

See merge request !95
parents 3c8d6a37 aa35f07b
No related branches found
No related tags found
1 merge request!95Feat/group saving
Pipeline #285207 passed
...@@ -7,13 +7,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse; ...@@ -7,13 +7,11 @@ import io.swagger.v3.oas.annotations.responses.ApiResponse;
import io.swagger.v3.oas.annotations.responses.ApiResponses; import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag; import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import no.ntnu.idi.stud.savingsapp.dto.goal.ChallengeDTO; import no.ntnu.idi.stud.savingsapp.dto.goal.*;
import no.ntnu.idi.stud.savingsapp.dto.goal.MarkChallengeDTO;
import no.ntnu.idi.stud.savingsapp.dto.goal.CreateGoalDTO;
import no.ntnu.idi.stud.savingsapp.dto.goal.GoalDTO;
import no.ntnu.idi.stud.savingsapp.exception.ExceptionResponse; import no.ntnu.idi.stud.savingsapp.exception.ExceptionResponse;
import no.ntnu.idi.stud.savingsapp.model.goal.Challenge; 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.Goal;
import no.ntnu.idi.stud.savingsapp.model.goal.Group;
import no.ntnu.idi.stud.savingsapp.security.AuthIdentity; import no.ntnu.idi.stud.savingsapp.security.AuthIdentity;
import no.ntnu.idi.stud.savingsapp.service.ChallengeService; import no.ntnu.idi.stud.savingsapp.service.ChallengeService;
import no.ntnu.idi.stud.savingsapp.service.GoalService; import no.ntnu.idi.stud.savingsapp.service.GoalService;
...@@ -63,7 +61,7 @@ public class GoalController { ...@@ -63,7 +61,7 @@ public class GoalController {
public ResponseEntity<GoalDTO> createGoal(@AuthenticationPrincipal AuthIdentity identity, public ResponseEntity<GoalDTO> createGoal(@AuthenticationPrincipal AuthIdentity identity,
@RequestBody CreateGoalDTO request) { @RequestBody CreateGoalDTO request) {
Goal createGoal = modelMapper.map(request, Goal.class); Goal createGoal = modelMapper.map(request, Goal.class);
Goal goal = goalService.createGoal(createGoal, identity.getId()); Goal goal = goalService.createGoal(createGoal, request.getDistribution(), identity.getId());
GoalDTO goalDTO = modelMapper.map(goal, GoalDTO.class); GoalDTO goalDTO = modelMapper.map(goal, GoalDTO.class);
log.info("[GoalController:createGoal] goal: {}", goalDTO.getId()); log.info("[GoalController:createGoal] goal: {}", goalDTO.getId());
return ResponseEntity.status(HttpStatus.CREATED).body(goalDTO); return ResponseEntity.status(HttpStatus.CREATED).body(goalDTO);
...@@ -152,4 +150,11 @@ public class GoalController { ...@@ -152,4 +150,11 @@ public class GoalController {
ChallengeDTO challengeDTO = modelMapper.map(challenge, ChallengeDTO.class); ChallengeDTO challengeDTO = modelMapper.map(challenge, ChallengeDTO.class);
return ResponseEntity.ok(challengeDTO); return ResponseEntity.ok(challengeDTO);
} }
@GetMapping(value ="/group/{goalId}", produces = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity<List<GoalDTO>> getGroupInfo(@PathVariable Long goalId) {
Group group = goalService.getGroup(goalId);
List<GoalDTO> goals = group.getGoals().stream().map(g -> modelMapper.map(g, GoalDTO.class)).toList();
return ResponseEntity.ok(goals);
}
} }
...@@ -4,6 +4,7 @@ import lombok.Data; ...@@ -4,6 +4,7 @@ import lombok.Data;
import lombok.NonNull; import lombok.NonNull;
import java.math.BigDecimal; import java.math.BigDecimal;
import java.util.List;
@Data @Data
public final class CreateGoalDTO { public final class CreateGoalDTO {
...@@ -19,4 +20,6 @@ public final class CreateGoalDTO { ...@@ -19,4 +20,6 @@ public final class CreateGoalDTO {
@NonNull @NonNull
private String targetDate; private String targetDate;
private List<GroupUserDTO> distribution;
} }
package no.ntnu.idi.stud.savingsapp.dto.goal;
import lombok.Data;
import lombok.NonNull;
import java.math.BigDecimal;
@Data
public final class GroupUserDTO {
private Long userId;
private BigDecimal amount;
}
package no.ntnu.idi.stud.savingsapp.exception.goal;
public final class GroupNotFoundException extends RuntimeException{
/**
* Constructs a GroupNotFoundException with default message.
*/
public GroupNotFoundException() { super("Group not found");}
/**
* Constructs a GroupNotFoundException with custom message.
*
* @param string the custom exception message
*/
public GroupNotFoundException(String string) {super(string);}
}
package no.ntnu.idi.stud.savingsapp.model.goal;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.NonNull;
import no.ntnu.idi.stud.savingsapp.model.user.User;
import java.math.BigDecimal;
import java.util.List;
@Data
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name = "group")
public class Group {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "group_id")
private Long id;
@OneToMany
@Column(name = "goals")
private List<Goal> goals;
@ManyToOne
@JoinColumn(name = "user_id")
private User creator;
}
package no.ntnu.idi.stud.savingsapp.repository;
import no.ntnu.idi.stud.savingsapp.model.goal.Goal;
import no.ntnu.idi.stud.savingsapp.model.goal.Group;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
import java.util.Optional;
@Repository
public interface GroupRepository extends JpaRepository<Group, Long> {
Optional<Group> findByGoals_Id(long id);
}
package no.ntnu.idi.stud.savingsapp.service; 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.Goal;
import no.ntnu.idi.stud.savingsapp.model.goal.Group;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
import java.util.List; import java.util.List;
...@@ -20,7 +22,7 @@ public interface GoalService { ...@@ -20,7 +22,7 @@ public interface GoalService {
* @param userId The ID of the user for whom the goal is being created. * @param userId The ID of the user for whom the goal is being created.
* @return The newly created and persisted Goal object. * @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. * Retrieves all goals associated with a specific user.
...@@ -39,4 +41,12 @@ public interface GoalService { ...@@ -39,4 +41,12 @@ public interface GoalService {
* @return A goal object associated with the specified user. * @return A goal object associated with the specified user.
*/ */
Goal getGoal(long goalId); 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);
} }
...@@ -2,15 +2,20 @@ package no.ntnu.idi.stud.savingsapp.service.impl; ...@@ -2,15 +2,20 @@ package no.ntnu.idi.stud.savingsapp.service.impl;
import java.sql.Timestamp; import java.sql.Timestamp;
import java.time.Instant; import java.time.Instant;
import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Optional; import java.util.Optional;
import lombok.extern.slf4j.Slf4j; 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.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.Challenge;
import no.ntnu.idi.stud.savingsapp.model.goal.Goal; 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.model.user.User;
import no.ntnu.idi.stud.savingsapp.repository.GoalRepository; 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.ChallengeService;
import no.ntnu.idi.stud.savingsapp.service.GoalService; import no.ntnu.idi.stud.savingsapp.service.GoalService;
import no.ntnu.idi.stud.savingsapp.service.UserService; import no.ntnu.idi.stud.savingsapp.service.UserService;
...@@ -33,6 +38,9 @@ public class GoalServiceImpl implements GoalService { ...@@ -33,6 +38,9 @@ public class GoalServiceImpl implements GoalService {
@Autowired @Autowired
private ChallengeService challengeService; private ChallengeService challengeService;
@Autowired
private GroupRepository groupRepository;
/** /**
* Creates a new goal for a specific user and generates associated challenges. * Creates a new goal for a specific user and generates associated challenges.
* *
...@@ -41,12 +49,33 @@ public class GoalServiceImpl implements GoalService { ...@@ -41,12 +49,33 @@ public class GoalServiceImpl implements GoalService {
* @return The newly created Goal, now populated with generated challenges and persisted in the database. * @return The newly created Goal, now populated with generated challenges and persisted in the database.
*/ */
@Override @Override
public Goal createGoal(Goal goal, long userId) { public Goal createGoal(Goal goal, List<GroupUserDTO> GroupUsers, long userId) {
User user = userService.findById(userId); User user = userService.findById(userId);
goal.setCreatedAt(Timestamp.from(Instant.now())); goal.setCreatedAt(Timestamp.from(Instant.now()));
goal.setUser(user); goal.setUser(user);
List<Challenge> challenges = challengeService.generateChallenges(goal, user); List<Challenge> challenges = challengeService.generateChallenges(goal, user);
goal.setChallenges(challenges); 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); return goalRepository.save(goal);
} }
...@@ -61,6 +90,12 @@ public class GoalServiceImpl implements GoalService { ...@@ -61,6 +90,12 @@ public class GoalServiceImpl implements GoalService {
return goalRepository.findByUser_Id(userId); 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 @Override
public Goal getGoal(long goalId) { public Goal getGoal(long goalId) {
Optional<Goal> optionalGoal = goalRepository.findById(goalId); Optional<Goal> optionalGoal = goalRepository.findById(goalId);
...@@ -71,4 +106,21 @@ public class GoalServiceImpl implements GoalService { ...@@ -71,4 +106,21 @@ public class GoalServiceImpl implements GoalService {
throw new GoalNotFoundException(); 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.findByGoals_Id(goalId);
if (optionalGroup.isPresent()) {
return optionalGroup.get();
} else {
log.error("[GoalServiceImpl:getGoal] Group is not found from goal, id: {}", goalId);
throw new GroupNotFoundException();
}
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment