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;
import io.swagger.v3.oas.annotations.responses.ApiResponses;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.extern.slf4j.Slf4j;
import no.ntnu.idi.stud.savingsapp.dto.goal.ChallengeDTO;
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.dto.goal.*;
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.Goal;
import no.ntnu.idi.stud.savingsapp.model.goal.Group;
import no.ntnu.idi.stud.savingsapp.security.AuthIdentity;
import no.ntnu.idi.stud.savingsapp.service.ChallengeService;
import no.ntnu.idi.stud.savingsapp.service.GoalService;
......@@ -63,7 +61,7 @@ public class GoalController {
public ResponseEntity<GoalDTO> createGoal(@AuthenticationPrincipal AuthIdentity identity,
@RequestBody CreateGoalDTO request) {
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);
log.info("[GoalController:createGoal] goal: {}", goalDTO.getId());
return ResponseEntity.status(HttpStatus.CREATED).body(goalDTO);
......@@ -152,4 +150,11 @@ public class GoalController {
ChallengeDTO challengeDTO = modelMapper.map(challenge, ChallengeDTO.class);
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;
import lombok.NonNull;
import java.math.BigDecimal;
import java.util.List;
@Data
public final class CreateGoalDTO {
......@@ -19,4 +20,6 @@ public final class CreateGoalDTO {
@NonNull
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;
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);
}
......@@ -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.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