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 @@ -33,7 +33,11 @@ public enum ErrorStatus implements BaseErrorCode {
_NOT_USER_COMMENT(HttpStatus.NOT_FOUND, "COMMENT402", "해당 유저의 댓글이 아닙니다."),

//스터디룸 관련 에러
_NOT_FOUND_ROOM(HttpStatus.NOT_FOUND, "ROOM401", "해당 방의 이름을 찾을 수 없습니다.");
_NOT_FOUND_ROOM(HttpStatus.NOT_FOUND, "ROOM401", "해당 방의 이름을 찾을 수 없습니다."),

//디데이 관련 에러
_NOT_USER_DDAY(HttpStatus.BAD_REQUEST, "DDAY401", "해당 유저의 디데이가 아닙니다."),
_NOT_FOUND_DDAY(HttpStatus.NOT_FOUND, "DDAY402", "해당 디데이를 찾을 수 없습니다.");

private final HttpStatus httpStatus;
private final String code;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package com.example.be.apiPayload.exception.handler;

import com.example.be.apiPayload.code.BaseErrorCode;
import com.example.be.apiPayload.exception.GeneralException;

public class DDayHandler extends GeneralException {
public DDayHandler(BaseErrorCode code) {
super(code);
}
}
28 changes: 28 additions & 0 deletions src/main/java/com/example/be/domain/DDay.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package com.example.be.domain;

import com.example.be.domain.enums.Role;
import jakarta.persistence.*;
import lombok.*;

import java.time.LocalDate;

@Entity
@Getter
@Setter
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class DDay {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;

private String name;

private LocalDate day;

@ManyToOne(fetch = FetchType.LAZY)
@JoinColumn(name = "user_id")
private User user;
}
3 changes: 3 additions & 0 deletions src/main/java/com/example/be/domain/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,9 @@ public class User {
@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<Post> posts;

@OneToMany(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private List<DDay> dDays;

@OneToOne(mappedBy = "user", cascade = CascadeType.ALL, orphanRemoval = true)
private Participant participant;

Expand Down
16 changes: 16 additions & 0 deletions src/main/java/com/example/be/repository/DDayRepository.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
package com.example.be.repository;

import com.example.be.domain.DDay;
import com.example.be.domain.User;
import org.springframework.data.jpa.repository.JpaRepository;

import java.util.List;
import java.util.Optional;


public interface DDayRepository extends JpaRepository<DDay, Long> {

List<DDay> findDDayByUser(User user);

Optional<DDay> findByIdAndUser(Long id, User user);
}
94 changes: 94 additions & 0 deletions src/main/java/com/example/be/service/DDayServiceImpl.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
package com.example.be.service;

import com.example.be.apiPayload.code.status.ErrorStatus;
import com.example.be.apiPayload.exception.handler.DDayHandler;
import com.example.be.apiPayload.exception.handler.UserHandler;
import com.example.be.domain.DDay;
import com.example.be.domain.User;
import com.example.be.repository.DDayRepository;
import com.example.be.repository.UserRepository;
import com.example.be.web.dto.CommonDTO;
import com.example.be.web.dto.DDayDTO;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;
import java.util.stream.Collectors;

@Service
@RequiredArgsConstructor
public class DDayServiceImpl {
private final UserRepository userRepository;
private final JwtUtilServiceImpl jwtUtilService;
private final DDayRepository dayRepository;

private User getUserFromRequest(HttpServletRequest request) {
try {
String accessToken = jwtUtilService.extractTokenFromCookie(request, "accessToken");
if (accessToken != null) {
String userId = jwtUtilService.getUserIdFromToken(accessToken);
return userRepository.findByUserId(UUID.fromString(userId)).orElse(null);
}
} catch (Exception e) {
throw new UserHandler(ErrorStatus._NOT_FOUND_COOKIE);
}
return null;
}

public CommonDTO.IsSuccessDTO createDDay(HttpServletRequest request, DDayDTO.DDayRequestDto requestDto) {
User user = getUserFromRequest(request);

DDay dDay = DDay.builder()
.name(requestDto.getName())
.day(requestDto.getDay())
.user(user)
.build();

dayRepository.save(dDay);

return CommonDTO.IsSuccessDTO.builder().isSuccess(true).build();
}

public List<DDayDTO.DDayResponseDto> getDDays(HttpServletRequest request) {
User user = getUserFromRequest(request);
List<DDay> dDayList = dayRepository.findDDayByUser(user);

return dDayList.stream()
.map(day -> DDayDTO.DDayResponseDto.builder()
.id(day.getId())
.name(day.getName())
.day(day.getDay())
.build())
.collect(Collectors.toList());
}

public CommonDTO.IsSuccessDTO deleteDDay (HttpServletRequest request, Long id) {
User user = getUserFromRequest(request);

dayRepository.findById(id).orElseThrow(() -> new DDayHandler(ErrorStatus._NOT_FOUND_DDAY));
DDay dDay = dayRepository.findByIdAndUser(id, user)
.orElseThrow(() -> new DDayHandler(ErrorStatus._NOT_USER_DDAY));

dayRepository.delete(dDay);

return CommonDTO.IsSuccessDTO.builder().isSuccess(true).build();
}

public CommonDTO.IsSuccessDTO editDDay (HttpServletRequest request, DDayDTO.DDayEditRequestDto requestDto) {
User user = getUserFromRequest(request);

dayRepository.findById(requestDto.getId()).orElseThrow(() -> new DDayHandler(ErrorStatus._NOT_FOUND_DDAY));
DDay dDay = dayRepository.findByIdAndUser(requestDto.getId(), user)
.orElseThrow(() -> new DDayHandler(ErrorStatus._NOT_USER_DDAY));

dDay.setName(requestDto.getName());
dDay.setDay(requestDto.getDay());

dayRepository.save(dDay);

return CommonDTO.IsSuccessDTO.builder().isSuccess(true).build();
}
}
50 changes: 50 additions & 0 deletions src/main/java/com/example/be/web/controller/DDayController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
package com.example.be.web.controller;

import com.example.be.apiPayload.ApiResponse;
import com.example.be.service.DDayServiceImpl;
import com.example.be.web.dto.CommentDTO;
import com.example.be.web.dto.CommonDTO;
import com.example.be.web.dto.DDayDTO;
import io.swagger.v3.oas.annotations.Operation;
import jakarta.servlet.http.HttpServletRequest;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import retrofit2.http.POST;

import java.util.List;

@RestController
@RequestMapping("/day")
@RequiredArgsConstructor
public class DDayController {
private final DDayServiceImpl dayService;

@PostMapping("")
@Operation(summary = "디데이 추가 API", description = "디데이를 추가합니다.")
public ApiResponse<CommonDTO.IsSuccessDTO> createDDay(
HttpServletRequest request,
@RequestBody DDayDTO.DDayRequestDto requestDto) {
return ApiResponse.onSuccess(dayService.createDDay(request, requestDto));
}

@DeleteMapping("/{id}")
@Operation(summary = "디데이 삭제 API", description = "디데이를 삭제합니다.")
public ApiResponse<CommonDTO.IsSuccessDTO> deleteDDay(
HttpServletRequest request, @PathVariable Long id) {
return ApiResponse.onSuccess(dayService.deleteDDay(request, id));
}

@PostMapping("/{id}")
@Operation(summary = "디데이 수정 API", description = "디데이를 수정합니다.")
public ApiResponse<CommonDTO.IsSuccessDTO> editDDay(
HttpServletRequest request, @RequestBody DDayDTO.DDayEditRequestDto requestDto) {
return ApiResponse.onSuccess(dayService.editDDay(request, requestDto));
}

@GetMapping("")
@Operation(summary = "디데이 조회 API", description = "디데이를 조회합니다.")
public ApiResponse<List<DDayDTO.DDayResponseDto>> getDDay(
HttpServletRequest request) {
return ApiResponse.onSuccess(dayService.getDDays(request));
}
}
39 changes: 39 additions & 0 deletions src/main/java/com/example/be/web/dto/DDayDTO.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.example.be.web.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.LocalDate;

public class DDayDTO {
@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class DDayRequestDto {
private String name;
private LocalDate day;
}

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class DDayResponseDto {
private Long id;
private String name;
private LocalDate day;
}

@Builder
@Getter
@NoArgsConstructor
@AllArgsConstructor
public static class DDayEditRequestDto {
private Long id;
private String name;
private LocalDate day;
}
}