Skip to content

Commit

Permalink
[DEV-6] 활동 보고서 회차별 기간 API (#58)
Browse files Browse the repository at this point in the history
  • Loading branch information
wonjunYou authored Jul 25, 2024
1 parent d31b449 commit 0f7f598
Show file tree
Hide file tree
Showing 12 changed files with 212 additions and 18 deletions.
2 changes: 2 additions & 0 deletions build.gradle
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,8 @@ dependencies {
implementation 'io.sentry:sentry-logback:7.6.0'
implementation 'org.springdoc:springdoc-openapi-ui:1.6.11'

implementation 'com.fasterxml.jackson.core:jackson-core:2.17.0'

compileOnly 'org.projectlombok:lombok'
runtimeOnly 'com.h2database:h2'
annotationProcessor 'org.projectlombok:lombok'
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package ddingdong.ddingdongBE.auth;

import ddingdong.ddingdongBE.domain.user.entity.User;
import io.swagger.v3.oas.annotations.Hidden;
import java.util.ArrayList;
import java.util.Collection;
import lombok.Getter;
Expand All @@ -9,6 +10,7 @@
import org.springframework.security.core.authority.SimpleGrantedAuthority;
import org.springframework.security.core.userdetails.UserDetails;

@Hidden
@RequiredArgsConstructor
@Getter
public class PrincipalDetails implements UserDetails {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,8 @@
package ddingdong.ddingdongBE.common.exception;

import static ddingdong.ddingdongBE.common.exception.ErrorMessage.*;
import static ddingdong.ddingdongBE.common.exception.ErrorMessage.INTERNAL_SERVER_ERROR;

import io.swagger.v3.oas.annotations.Hidden;
import java.util.NoSuchElementException;
import lombok.extern.slf4j.Slf4j;
import org.springframework.http.HttpStatus;
Expand All @@ -11,6 +12,7 @@
import org.springframework.web.bind.annotation.RestControllerAdvice;
import org.springframework.web.multipart.support.MissingServletRequestPartException;

@Hidden
@RestControllerAdvice
@Slf4j
public class ExceptionController {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
package ddingdong.ddingdongBE.common.handler;

import static ddingdong.ddingdongBE.common.exception.ErrorMessage.*;
import static ddingdong.ddingdongBE.common.exception.ErrorMessage.INVALID_PASSWORD;
import static ddingdong.ddingdongBE.common.exception.ErrorMessage.NON_VALIDATED_TOKEN;
import static ddingdong.ddingdongBE.common.exception.ErrorMessage.valueOf;

import com.fasterxml.jackson.databind.ObjectMapper;
import ddingdong.ddingdongBE.common.exception.ErrorMessage;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
package ddingdong.ddingdongBE.domain.activityreport.api;

import ddingdong.ddingdongBE.auth.PrincipalDetails;
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.request.CreateActivityTermInfoRequest;
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.ActivityReportTermInfoResponse;
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.AllActivityReportResponse;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.tags.Tag;
import java.util.List;
import org.springframework.http.HttpStatus;
import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseStatus;

@Tag(name = "Activity Report - Admin", description = "Activity Report Admin API")
@RequestMapping("/server/admin/activity-reports")
public interface AdminActivityReportApi {

@Operation(summary = "활동 보고서 전체 조회")
@GetMapping
@ResponseStatus(HttpStatus.OK)
List<AllActivityReportResponse> getActivityReports();

@Operation(summary = "활동 보고서 회차별 기간 조회 API")
@GetMapping("/term")
@ResponseStatus(HttpStatus.OK)
@SecurityRequirement(name = "AccessToken")
List<ActivityReportTermInfoResponse> getActivityTermInfos(
@AuthenticationPrincipal PrincipalDetails principalDetails);

@Operation(summary = "활동 보고서 회차별 기간 설정 API")
@PostMapping("/term")
@ResponseStatus(HttpStatus.CREATED)
@SecurityRequirement(name = "AccessToken")
void createActivityTermInfo(
@AuthenticationPrincipal PrincipalDetails principalDetails,
@RequestBody CreateActivityTermInfoRequest request
);

}
Original file line number Diff line number Diff line change
@@ -1,24 +1,42 @@
package ddingdong.ddingdongBE.domain.activityreport.controller;

import ddingdong.ddingdongBE.auth.PrincipalDetails;
import ddingdong.ddingdongBE.domain.activityreport.api.AdminActivityReportApi;
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.request.CreateActivityTermInfoRequest;
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.ActivityReportTermInfoResponse;
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.AllActivityReportResponse;
import ddingdong.ddingdongBE.domain.activityreport.service.ActivityReportService;
import ddingdong.ddingdongBE.domain.activityreport.service.ActivityReportTermInfoService;
import java.util.List;

import lombok.RequiredArgsConstructor;

import org.springframework.security.core.annotation.AuthenticationPrincipal;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequiredArgsConstructor
@RequestMapping("/server/admin/activity-reports")
public class AdminActivityReportApiController {
public class AdminActivityReportApiController implements AdminActivityReportApi {

private final ActivityReportService activityReportService;
private final ActivityReportTermInfoService activityReportTermInfoService;

@GetMapping
public List<AllActivityReportResponse> getActivityReports() {
return activityReportService.getAll();
}

@Override
public List<ActivityReportTermInfoResponse> getActivityTermInfos(
@AuthenticationPrincipal PrincipalDetails principalDetails) {
return activityReportTermInfoService.getAll();
}

@Override
public void createActivityTermInfo(
@AuthenticationPrincipal PrincipalDetails principalDetails,
CreateActivityTermInfoRequest request
) {
activityReportTermInfoService.create(request.startDate(), request.totalTermCount());
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package ddingdong.ddingdongBE.domain.activityreport.controller.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import java.time.LocalDate;
import javax.validation.constraints.Pattern;
import org.springframework.format.annotation.DateTimeFormat;

@Schema(
name = "CreateActivityTermInfoRequest",
description = "활동 보고서 회차 시작 기준일 설정 요청"
)
public record CreateActivityTermInfoRequest(
@Schema(description = "활동 보고서 시작 일자", example = "2024-07-22")
@DateTimeFormat(pattern = "yyyy-MM-dd")
@Pattern(regexp = "^\\d{4}-\\d{2}-\\d{2}$", message = "날짜는 yyyy-MM-dd 형식이어야 합니다.")
LocalDate startDate,
@Schema(description = "설정할 총 회차 수", example = "10 (=총 10회 설정)")
int totalTermCount
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package ddingdong.ddingdongBE.domain.activityreport.controller.dto.response;

import io.swagger.v3.oas.annotations.media.Schema;
import java.time.LocalDate;

@Schema(
name = "ActivityReportTermInfoResponse",
description = "활동 보고서 회차 전체 조회 응답"
)
public record ActivityReportTermInfoResponse(
@Schema(description = "회차")
int term,
@Schema(description = "시작 일자", example = "2024-07-22")
LocalDate startDate,
@Schema(description = "마감 일자", example = "2024-08-04")
LocalDate endDate
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package ddingdong.ddingdongBE.domain.activityreport.domain;

import java.time.LocalDate;
import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

@Entity
@Getter
@NoArgsConstructor(access = AccessLevel.PROTECTED)
public class ActivityReportTermInfo {

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

@Column(nullable = false)
private int term;

@Column(nullable = false, columnDefinition = "DATE")
private LocalDate startDate;

@Column(nullable = false, columnDefinition = "DATE")
private LocalDate endDate;

@Builder
public ActivityReportTermInfo(int term, LocalDate startDate, LocalDate endDate) {
this.term = term;
this.startDate = startDate;
this.endDate = endDate;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package ddingdong.ddingdongBE.domain.activityreport.repository;

import ddingdong.ddingdongBE.domain.activityreport.domain.ActivityReportTermInfo;
import org.springframework.data.jpa.repository.JpaRepository;

public interface ActivityReportTermInfoRepository extends JpaRepository<ActivityReportTermInfo, Long> {
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package ddingdong.ddingdongBE.domain.activityreport.service;

import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileDomainCategory.ACTIVITY_REPORT;
import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileDomainCategory.CLUB_INTRODUCE;
import static ddingdong.ddingdongBE.domain.fileinformation.entity.FileTypeCategory.IMAGE;

import ddingdong.ddingdongBE.domain.activityreport.controller.dto.request.RegisterActivityReportRequest;
Expand All @@ -12,23 +11,17 @@
import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.DetailActivityReportResponse;
import ddingdong.ddingdongBE.domain.activityreport.domain.ActivityReport;
import ddingdong.ddingdongBE.domain.activityreport.repository.ActivityReportRepository;

import ddingdong.ddingdongBE.domain.club.entity.Club;
import ddingdong.ddingdongBE.domain.club.service.ClubService;
import ddingdong.ddingdongBE.domain.fileinformation.entity.FileInformation;
import ddingdong.ddingdongBE.domain.fileinformation.service.FileInformationService;
import ddingdong.ddingdongBE.domain.user.entity.User;

import java.time.Duration;
import java.time.LocalDate;

import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

import lombok.RequiredArgsConstructor;

import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

Expand Down Expand Up @@ -56,7 +49,7 @@ public List<AllActivityReportResponse> getAll() {

@Transactional(readOnly = true)
public List<AllActivityReportResponse> getMyActivityReports(final User user) {
Club club = clubService.findClubByUserId(user.getId());
Club club = clubService.getByUserId(user.getId());

List<ActivityReport> activityReports = activityReportRepository.findByClubName(
club.getName());
Expand All @@ -80,7 +73,7 @@ public List<DetailActivityReportResponse> getActivityReport(final String term,
public Long register(final User user,
final RegisterActivityReportRequest registerActivityReportRequest) {

Club club = clubService.findClubByUserId(user.getId());
Club club = clubService.getByUserId(user.getId());
ActivityReport activityReport = registerActivityReportRequest.toEntity(club);

ActivityReport savedActivityReport = activityReportRepository.save(activityReport);
Expand All @@ -90,7 +83,7 @@ public Long register(final User user,

public List<ActivityReportDto> update(final User user, final String term,
final List<UpdateActivityReportRequest> requests) {
Club club = clubService.findClubByUserId(user.getId());
Club club = clubService.getByUserId(user.getId());

List<ActivityReport> activityReports = activityReportRepository.findByClubNameAndTerm(
club.getName(), term);
Expand All @@ -103,7 +96,7 @@ public List<ActivityReportDto> update(final User user, final String term,
}

public List<ActivityReportDto> delete(final User user, final String term) {
Club club = clubService.findClubByUserId(user.getId());
Club club = clubService.getByUserId(user.getId());

List<ActivityReport> activityReports = activityReportRepository.findByClubNameAndTerm(
club.getName(), term);
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
package ddingdong.ddingdongBE.domain.activityreport.service;

import ddingdong.ddingdongBE.domain.activityreport.controller.dto.response.ActivityReportTermInfoResponse;
import ddingdong.ddingdongBE.domain.activityreport.domain.ActivityReportTermInfo;
import ddingdong.ddingdongBE.domain.activityreport.repository.ActivityReportTermInfoRepository;
import java.time.LocalDate;
import java.util.List;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;

@Service
@RequiredArgsConstructor
public class ActivityReportTermInfoService {

private final ActivityReportTermInfoRepository activityReportTermInfoRepository;

public List<ActivityReportTermInfoResponse> getAll() {
List<ActivityReportTermInfo> termInfos = activityReportTermInfoRepository.findAll();

return termInfos.stream()
.map(termInfo -> new ActivityReportTermInfoResponse(
termInfo.getTerm(),
termInfo.getStartDate(),
termInfo.getEndDate()
))
.toList();
}

public void create(LocalDate startDate, int totalTermCount) {
activityReportTermInfoRepository.saveAll(
IntStream.range(0, totalTermCount)
.mapToObj(i -> {
LocalDate termStartDate = startDate.plusDays(i * 14L);
LocalDate termEndDate = termStartDate.plusDays(13L);
return ActivityReportTermInfo.builder()
.term(i + 1)
.startDate(termStartDate)
.endDate(termEndDate)
.build();
})
.collect(Collectors.toList())
);
}

}

0 comments on commit 0f7f598

Please sign in to comment.