Skip to content
Open
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
@@ -0,0 +1,56 @@
package com.project.poorlex.api.controller;

import com.project.poorlex.api.service.GoalService;
import com.project.poorlex.dto.goal.*;
import com.project.poorlex.exception.ApiResponse;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/goal")
@RequiredArgsConstructor
public class GoalController {

private final GoalService goalService;

@PostMapping
public ApiResponse<GoalCreateResponse> createGoal(
@RequestBody GoalCreateRequest request) {

return ApiResponse.ok(goalService.createGoal(request));
}

@GetMapping
public ApiResponse<List<GoalListResponse>> getAllGoals(@RequestParam String oauthId) {

return ApiResponse.ok(goalService.getAllGoals(oauthId));
}

@GetMapping("/completedList")
public ApiResponse<List<GoalListResponse>> getAllCompletedGoals(@RequestParam String oauthId) {

return ApiResponse.ok(goalService.getAllCompletedGoals(oauthId));
}

@PutMapping("/{id}")
public ApiResponse<GoalUpdateResponse> updateGoal(
@PathVariable Long id,
@RequestBody GoalUpdateRequest request) {

return ApiResponse.ok(goalService.updateGoal(request, id));
}

@PutMapping("/complete/{id}")
public ApiResponse<GoalUpdateResponse> completeGoal(@PathVariable Long id, @RequestBody GoalUpdateRequest request) {

return ApiResponse.ok(goalService.goalCompleted(id, request));
}

@DeleteMapping("/{id}")
public ApiResponse<?> deleteGoal(@PathVariable Long id) {

return ApiResponse.ok(goalService.deleteGoal(id));
}
}
106 changes: 106 additions & 0 deletions src/main/java/com/project/poorlex/api/service/GoalService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,106 @@
package com.project.poorlex.api.service;

import com.project.poorlex.domain.goal.Goal;
import com.project.poorlex.domain.goal.GoalRepository;
import com.project.poorlex.domain.member.Member;
import com.project.poorlex.dto.goal.*;
import com.project.poorlex.exception.goal.GoalCustomException;
import com.project.poorlex.exception.goal.GoalErrorCode;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
@RequiredArgsConstructor
public class GoalService {

private final GoalRepository goalRepository;

private final AuthService authService;

public GoalCreateResponse createGoal(GoalCreateRequest request) {

Member member = authService.findMemberFromToken();

Goal goal = Goal.builder()
.member(member)
.name(request.getName())
.amount(request.getAmount())
.currentAmount(request.getCurrentAmount())
.startDate(request.getStartDate())
.endDate(request.getEndDate())
.isCompleted(request.isCompleted())
.build();

goalRepository.save(goal);

return GoalCreateResponse.of(goal);
}

public List<GoalListResponse> getAllGoals(String oauthId) {


List<Goal> goalList = goalRepository.findAllByMemberId_OauthIdAndIsCompletedFalse(oauthId);
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

goalRepository 변경부분이 없어 에러가 뜨네요!
커밋 확인해보셔야할거 같아요!


return GoalListResponse.of(goalList);
}

public List<GoalListResponse> getAllCompletedGoals(String oauthId) {

List<Goal> goalList = goalRepository.findAllByMemberId_OauthIdAndIsCompletedTrue(oauthId);

return GoalListResponse.of(goalList);
}

public GoalUpdateResponse updateGoal(GoalUpdateRequest request, Long id) {

Member member = authService.findMemberFromToken();
Goal existingGoalId = goalRepository.findById(id)
.orElseThrow(() -> new GoalCustomException(GoalErrorCode.GOAL_NOT_FOUND));

Goal updatedGoal = Goal.builder()
.id(existingGoalId.getId())
.member(member)
.amount(request.getAmount())
.currentAmount(request.getCurrentAmount())
.name(request.getName())
.startDate(request.getStartDate())
.endDate(request.getEndDate())
.isCompleted(false)
.build();

goalRepository.save(updatedGoal);

return GoalUpdateResponse.of(updatedGoal);
}

public GoalUpdateResponse goalCompleted(Long id, GoalUpdateRequest request) {

Goal existingGoalId = goalRepository.findById(id)
.orElseThrow(() -> new GoalCustomException(GoalErrorCode.GOAL_NOT_FOUND));
Goal completedGoal = Goal.builder()
.id(existingGoalId.getId())
.amount(request.getAmount())
.currentAmount(request.getCurrentAmount())
.name(request.getName())
.startDate(request.getStartDate())
.endDate(request.getEndDate())
.isCompleted(true)
.build();

goalRepository.save(completedGoal);

return GoalUpdateResponse.of(completedGoal);
}

public boolean deleteGoal(Long id) {
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

  1. 삭제 처리도 예외가 있으면 어떨까요?
  2. 삭제 실패하고 return true 되는 케이스가 있을수도 있을까요...?


Goal existingGoalId = goalRepository.findById(id)
.orElseThrow(() -> new GoalCustomException(GoalErrorCode.GOAL_NOT_FOUND));

goalRepository.deleteById(existingGoalId.getId());

return true;
}
}
3 changes: 2 additions & 1 deletion src/main/java/com/project/poorlex/domain/goal/Goal.java
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,9 @@ public class Goal extends BaseEntity {
private boolean isCompleted;

@Builder
private Goal(Member member, String name, String photoUrl, int amount, int currentAmount,
private Goal(Long id, Member member, String name, String photoUrl, int amount, int currentAmount,
LocalDateTime startDate, LocalDateTime endDate, boolean isCompleted) {
this.id = id;
this.member = member;
this.name = name;
this.photoUrl = photoUrl;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,5 +2,10 @@

import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;

public interface GoalRepository extends JpaRepository<Goal, Long> {
List<Goal> findAllByMemberId_OauthIdAndIsCompletedFalse(String oauthId);

List<Goal> findAllByMemberId_OauthIdAndIsCompletedTrue(String oauthId);
}
26 changes: 26 additions & 0 deletions src/main/java/com/project/poorlex/dto/goal/GoalCreateRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.project.poorlex.dto.goal;

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@AllArgsConstructor
@NoArgsConstructor
@Getter
@Builder
public class GoalCreateRequest {

private String oauthId;
private String name;
private int amount;
private int currentAmount;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

목표 입력 및 수정할 때 받는 Time이 사용되는 곳이 있나요?!

Copy link
Copy Markdown
Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

목표 시작일, 종료일 수정하는 경우가 있다고 생각해서 사용했습니다 ..! 수정이 필요할까요 ? !

private LocalDateTime startDate;
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime endDate;
private boolean isCompleted;

}
26 changes: 26 additions & 0 deletions src/main/java/com/project/poorlex/dto/goal/GoalCreateResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.project.poorlex.dto.goal;

import com.project.poorlex.domain.goal.Goal;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Builder
public class GoalCreateResponse {

Long id;

String message;

public static GoalCreateResponse of(Goal goal) {

return GoalCreateResponse.builder()
.id(goal.getId())
.message("목표가 생성되었습니다.")
.build();
}
}
58 changes: 58 additions & 0 deletions src/main/java/com/project/poorlex/dto/goal/GoalListResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
package com.project.poorlex.dto.goal;

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.List;

import com.project.poorlex.domain.goal.Goal;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Builder
public class GoalListResponse {

private Long id;

String name;

String message;

private int amount;

private int currentAmount;

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime startDate;

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime endDate;

private boolean isCompleted;

public static List<GoalListResponse> of(List<Goal> goals) {

List<GoalListResponse> goalListResponseList = new ArrayList<>();

if (goals != null) {
for (Goal goal : goals) {
goalListResponseList.add(GoalListResponse.builder()
.id(goal.getId())
.name(goal.getName())
.amount(goal.getAmount())
.currentAmount(goal.getCurrentAmount())
.startDate(goal.getStartDate())
.endDate(goal.getEndDate())
.isCompleted(goal.isCompleted())
.message("리스트가 조회되었습니다.")
.build());
}
}
return goalListResponseList;
}
}
31 changes: 31 additions & 0 deletions src/main/java/com/project/poorlex/dto/goal/GoalUpdateRequest.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.project.poorlex.dto.goal;

import com.fasterxml.jackson.annotation.JsonFormat;
import java.time.LocalDateTime;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Builder
public class GoalUpdateRequest {

private String oauthId;

private Long id;

private String name;

private int amount;

private int currentAmount;

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime startDate;

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss")
private LocalDateTime endDate;
}
25 changes: 25 additions & 0 deletions src/main/java/com/project/poorlex/dto/goal/GoalUpdateResponse.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
package com.project.poorlex.dto.goal;

import com.project.poorlex.domain.goal.Goal;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@NoArgsConstructor
@AllArgsConstructor
@Getter
@Builder
public class GoalUpdateResponse {

Long id;
String message;

public static GoalUpdateResponse of(Goal goal) {

return GoalUpdateResponse.builder()
.id(goal.getId())
.message("목표가 수정되었습니다.")
.build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.project.poorlex.exception.goal;


import lombok.Getter;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;

@Getter
public class GoalCustomException extends RuntimeException {

private final GoalErrorCode goalErrorCode;
public GoalCustomException(GoalErrorCode goalErrorCode) {
super(goalErrorCode.getDescription());
this.goalErrorCode = goalErrorCode;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.project.poorlex.exception.goal;

import lombok.Getter;
import lombok.RequiredArgsConstructor;

@Getter
@RequiredArgsConstructor
public enum GoalErrorCode {

GOAL_NOT_FOUND("목표명이 존재하지 않습니다.");

private final String description;
}
Loading