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 @@ -7,10 +7,10 @@

import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import moneybuddy.fr.moneybuddy.dtos.AuthResponse;
import moneybuddy.fr.moneybuddy.dtos.CreateGoalRequest;
import moneybuddy.fr.moneybuddy.dtos.GoalMoneyRequest;
import moneybuddy.fr.moneybuddy.dtos.GoalRequest;
import moneybuddy.fr.moneybuddy.dtos.ResponseDto;
import moneybuddy.fr.moneybuddy.model.Goal;
import moneybuddy.fr.moneybuddy.model.enums.GoalStatus;
import moneybuddy.fr.moneybuddy.service.GoalService;
Expand All @@ -34,7 +34,7 @@ public class GoalController {
private final GoalService service;

@PostMapping("")
public ResponseEntity<AuthResponse> createGoal(
public ResponseEntity<ResponseDto> createGoal(
@Valid @RequestBody CreateGoalRequest request,
@RequestHeader("Authorization") String authHeader) {

Expand All @@ -54,8 +54,10 @@ public ResponseEntity<List<Goal>> getGoals(
}

@GetMapping("/{id}")
public ResponseEntity<Goal> getGoal(@PathVariable String id) {
return service.getGoal(id);
public ResponseEntity<Goal> getGoal(
@RequestHeader("Authorization") String authHeader, @PathVariable String id) {
String token = authHeader.substring(7);
return service.getGoal(token, id);
}

@DeleteMapping("/{id}")
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,9 +11,9 @@
import moneybuddy.fr.moneybuddy.dtos.TaskComplete;
import moneybuddy.fr.moneybuddy.dtos.TaskRequest;
import moneybuddy.fr.moneybuddy.dtos.TaskUpdate;
import moneybuddy.fr.moneybuddy.dtos.TaskWithSubAccountsDto;
import moneybuddy.fr.moneybuddy.model.Task;
import moneybuddy.fr.moneybuddy.model.TaskHistory;
import moneybuddy.fr.moneybuddy.model.TaskWithHistory;
import moneybuddy.fr.moneybuddy.model.enums.TaskStatus;
import moneybuddy.fr.moneybuddy.model.enums.TaskType;
import moneybuddy.fr.moneybuddy.service.TaskHistoryService;
Expand Down Expand Up @@ -57,7 +57,7 @@ public ResponseEntity<List<Task>> getTasks(
}

@GetMapping("/{id}")
public ResponseEntity<TaskWithHistory> getTask(@PathVariable String id) {
public ResponseEntity<TaskWithSubAccountsDto> getTask(@PathVariable String id) {
return service.getTask(id);
}

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
/*
* Copyright moneybuddy.fr moneybuddy
*/
package moneybuddy.fr.moneybuddy.dtos;

import java.math.BigDecimal;
import java.time.DayOfWeek;
import java.time.LocalDateTime;
import java.util.List;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import moneybuddy.fr.moneybuddy.model.Income;
import moneybuddy.fr.moneybuddy.model.SubAccount;
import moneybuddy.fr.moneybuddy.model.TaskHistory;
import moneybuddy.fr.moneybuddy.model.enums.TaskStatus;
import moneybuddy.fr.moneybuddy.model.enums.TaskType;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class TaskWithSubAccountsDto {

// Champs Task de base
private String id;
private String subaccountIdParent;
private String subaccountIdChild;
private String accountId;
private String description;
private TaskType type;
private TaskStatus status;
private boolean preValidate;
private boolean disable;
private Income income;
private List<DayOfWeek> weeklyDays;
private int monthlyDay;
private BigDecimal moneyReward;
private int coinReward;
private LocalDateTime dateLimit;
private LocalDateTime createdAt;
private LocalDateTime updatedAt;

// Historique de la tâche
private List<TaskHistory> taskHistory;

// Données enrichies des sous-comptes
private SubAccount childSubAccount;
private SubAccount parentSubAccount;
}
21 changes: 12 additions & 9 deletions src/main/java/moneybuddy/fr/moneybuddy/service/GoalService.java
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,10 @@
import java.util.Optional;

import lombok.RequiredArgsConstructor;
import moneybuddy.fr.moneybuddy.dtos.AuthResponse;
import moneybuddy.fr.moneybuddy.dtos.CreateGoalRequest;
import moneybuddy.fr.moneybuddy.dtos.GoalMoneyRequest;
import moneybuddy.fr.moneybuddy.dtos.GoalRequest;
import moneybuddy.fr.moneybuddy.dtos.ResponseDto;
import moneybuddy.fr.moneybuddy.exception.GoalAlreadyCompletedException;
import moneybuddy.fr.moneybuddy.exception.GoalAlreadyUsedException;
import moneybuddy.fr.moneybuddy.exception.GoalAmountExceededException;
Expand Down Expand Up @@ -47,23 +47,27 @@ public class GoalService {
private final JwtService jwtService;
private final Operations operations;

public ResponseEntity<AuthResponse> createGoal(CreateGoalRequest request, String token) {
public ResponseEntity<ResponseDto> createGoal(CreateGoalRequest request, String token) {
String subAccountId = jwtService.extractSubAccountId(token);
String accountId = jwtService.extractSubAccountAccountId(token);

Goal goal =
Goal.builder()
.name(request.getName())
.amount(request.getAmount())
.emoji(request.getEmoji() != null ? request.getEmoji() : null)
.emoji(request.getEmoji())
.subaccountIdChild(subAccountId)
.accountId(accountId)
.createdAt(LocalDateTime.now())
.build();

goalRepository.save(goal);
return ResponseEntity.status(HttpStatus.CREATED)
.body(AuthResponse.builder().error("Objectif d'épargne créé avec succès").build());
.body(
ResponseDto.builder()
.message("Objectif d'épargne créé avec succès")
.status(HttpStatus.CREATED)
.build());
}

public ResponseEntity<Goal> modifyGoal(GoalRequest request, String token, String goalId) {
Expand All @@ -88,14 +92,13 @@ public ResponseEntity<Goal> modifyGoal(GoalRequest request, String token, String
return ResponseEntity.status(HttpStatus.OK).body(updatedGoal);
}

public ResponseEntity<Goal> getGoal(String id) {
public ResponseEntity<Goal> getGoal(String token, String id) {
Goal goal = goalRepository.findById(id).orElseThrow(() -> new GoalNotFoundException(id));

return ResponseEntity.status(HttpStatus.OK).body(goal);
}

public ResponseEntity<String> deleteGoal(String token, String goalId) {
String subAccountId = jwtService.extractSubAccountAccountId(token);
String subAccountId = jwtService.extractSubAccountId(token);

goalRepository.findById(goalId).orElseThrow(() -> new GoalNotFoundException(goalId));

Expand Down Expand Up @@ -273,8 +276,8 @@ public ResponseEntity<String> confirmSavingMoneyTransfer(String token, String go

// Effectuer le transfert
if (GoalStatus.DONE.equals(goal.getGoalStatus())
&& goal.getDepositStatement().doubleValue() == goal.getAmount().doubleValue()
&& goal.getProgression().intValue() == 100) {
&& goal.getDepositStatement().compareTo(goal.getAmount()) == 0
&& goal.getProgression().intValue() >= 100) {
operations.updateGoalTransactionHistory(
goal, TransactionType.DEBIT, goal.getAmount(), goal.getAmount());
operations.updateAccountBalanceMoney(
Expand Down
44 changes: 42 additions & 2 deletions src/main/java/moneybuddy/fr/moneybuddy/service/TaskService.java
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,18 @@
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.function.Function;
import java.util.stream.Collectors;
import java.util.stream.Stream;

import lombok.RequiredArgsConstructor;
import moneybuddy.fr.moneybuddy.dtos.AuthResponse;
import moneybuddy.fr.moneybuddy.dtos.TaskComplete;
import moneybuddy.fr.moneybuddy.dtos.TaskRequest;
import moneybuddy.fr.moneybuddy.dtos.TaskUpdate;
import moneybuddy.fr.moneybuddy.dtos.TaskWithSubAccountsDto;
import moneybuddy.fr.moneybuddy.exception.NoRight;
import moneybuddy.fr.moneybuddy.exception.SubAccountNotFoundException;
import moneybuddy.fr.moneybuddy.exception.TaskNotFoundException;
Expand Down Expand Up @@ -127,11 +132,46 @@ public ResponseEntity<List<Task>> getTasks(
return ResponseEntity.status(HttpStatus.ACCEPTED).body(tasks);
}

public ResponseEntity<TaskWithHistory> getTask(String id) {
public ResponseEntity<TaskWithSubAccountsDto> getTask(String id) {
TaskWithHistory task =
taskWithHistoryRepository.findById(id).orElseThrow(() -> new TaskNotFoundException(id));

return ResponseEntity.status(HttpStatus.ACCEPTED).body(task);
// Chargement batch des deux sous-comptes en une seule requête pour éviter le N+1
List<String> subAccountIds =
Stream.of(task.getSubaccountIdChild(), task.getSubaccountIdParent())
.filter(sid -> sid != null && !sid.isEmpty())
.distinct()
.collect(Collectors.toList());

Map<String, SubAccount> subAccountMap =
subAccountRepository.findAllById(subAccountIds).stream()
.collect(Collectors.toMap(SubAccount::getId, Function.identity()));

TaskWithSubAccountsDto dto =
TaskWithSubAccountsDto.builder()
.id(task.getId())
.subaccountIdParent(task.getSubaccountIdParent())
.subaccountIdChild(task.getSubaccountIdChild())
.accountId(task.getAccountId())
.description(task.getDescription())
.type(task.getType())
.status(task.getStatus())
.preValidate(task.isPreValidate())
.disable(task.isDisable())
.income(task.getIncome())
.weeklyDays(task.getWeeklyDays())
.monthlyDay(task.getMonthlyDay())
.moneyReward(task.getMoneyReward())
.coinReward(task.getCoinReward())
.dateLimit(task.getDateLimit())
.createdAt(task.getCreatedAt())
.updatedAt(task.getUpdatedAt())
.taskHistory(task.getTaskHistory())
.childSubAccount(subAccountMap.get(task.getSubaccountIdChild()))
.parentSubAccount(subAccountMap.get(task.getSubaccountIdParent()))
.build();

return ResponseEntity.status(HttpStatus.ACCEPTED).body(dto);
}

public ResponseEntity<AuthResponse> deleteTask(String token, String taskId) {
Expand Down
Loading