Skip to content

Commit

Permalink
Merge pull request #53 from KeunSori/develop
Browse files Browse the repository at this point in the history
v1.1.0
  • Loading branch information
kckc0608 authored Feb 8, 2025
2 parents 9a2cea7 + 40fa117 commit 65b32e7
Show file tree
Hide file tree
Showing 27 changed files with 538 additions and 47 deletions.
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.keunsori.keunsoriserver.domain.admin.controller;
package com.keunsori.keunsoriserver.domain.admin.member.controller;

import com.keunsori.keunsoriserver.domain.member.dto.response.MemberApplicantResponse;
import com.keunsori.keunsoriserver.domain.admin.member.dto.response.MemberApplicantResponse;
import com.keunsori.keunsoriserver.domain.admin.member.service.AdminMemberService;
import com.keunsori.keunsoriserver.domain.member.dto.response.MemberResponse;
import com.keunsori.keunsoriserver.domain.member.service.MemberService;
import lombok.RequiredArgsConstructor;
Expand All @@ -14,26 +15,27 @@
@RequestMapping("/admin/members")
public class AdminMemberController {

private final AdminMemberService adminMemberService;
private final MemberService memberService;

// 회원관리 리스트
@GetMapping("/list")
public ResponseEntity<List<MemberResponse>> findAllMembers(){
List<MemberResponse> memberList = memberService.findAllMember();
List<MemberResponse> memberList = adminMemberService.findAllMember();
return ResponseEntity.ok().body(memberList);
}

// 가입승인 리스트
@GetMapping("/applicants")
public ResponseEntity<List<MemberApplicantResponse>> findAllApplicants(){
List<MemberApplicantResponse> applicants = memberService.findAllApplicants();
List<MemberApplicantResponse> applicants = adminMemberService.findAllApplicants();
return ResponseEntity.ok().body(applicants);
}

// 가입승인
@PatchMapping("/{id}/approve")
public ResponseEntity<Void> approveMember(@PathVariable("id") Long id){
memberService.approveMember(id);
adminMemberService.approveMember(id);
return ResponseEntity.ok().build();
}

Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package com.keunsori.keunsoriserver.domain.member.dto.response;
package com.keunsori.keunsoriserver.domain.admin.member.dto.response;

import com.keunsori.keunsoriserver.domain.member.domain.vo.MemberStatus;
import com.keunsori.keunsoriserver.domain.member.domain.Member;
Expand All @@ -12,7 +12,6 @@ public record MemberApplicantResponse(
MemberStatus status,
LocalDateTime applicationDate
) {

public static MemberApplicantResponse from(Member member) {
return new MemberApplicantResponse(
member.getId(),
Expand All @@ -22,5 +21,4 @@ public static MemberApplicantResponse from(Member member) {
member.getCreateDate()
);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.keunsori.keunsoriserver.domain.admin.member.service;

import com.keunsori.keunsoriserver.domain.admin.member.dto.response.MemberApplicantResponse;
import com.keunsori.keunsoriserver.domain.member.domain.Member;
import com.keunsori.keunsoriserver.domain.member.domain.vo.MemberStatus;
import com.keunsori.keunsoriserver.domain.member.dto.response.MemberResponse;
import com.keunsori.keunsoriserver.domain.member.repository.MemberRepository;
import com.keunsori.keunsoriserver.global.exception.MemberException;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.List;

import static com.keunsori.keunsoriserver.global.exception.ErrorMessage.MEMBER_NOT_EXISTS_WITH_STUDENT_ID;

@Service
@Transactional(readOnly = true)
@RequiredArgsConstructor
public class AdminMemberService {

private final MemberRepository memberRepository;

// 회원 리스트
public List<MemberResponse> findAllMember(){
return memberRepository.findAllByStatus(MemberStatus.일반)
.stream().map(MemberResponse::from).toList();
}

// 가입 신청 리스트
public List<MemberApplicantResponse> findAllApplicants(){
return memberRepository.findAllByStatus(MemberStatus.승인대기)
.stream().map(MemberApplicantResponse::from).toList();
}

// 가입 승인
@Transactional
public void approveMember(Long id){
Member member = memberRepository.findById(id)
.orElseThrow(()->new MemberException(MEMBER_NOT_EXISTS_WITH_STUDENT_ID));
member.approve();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
package com.keunsori.keunsoriserver.domain.admin.reservation.controller;

import com.keunsori.keunsoriserver.domain.admin.reservation.dto.request.DailyScheduleUpdateOrCreateRequest;
import com.keunsori.keunsoriserver.domain.admin.reservation.dto.request.WeeklyScheduleUpdateRequest;
import com.keunsori.keunsoriserver.domain.admin.reservation.dto.response.DailyAvailableResponse;
import com.keunsori.keunsoriserver.domain.admin.reservation.dto.response.WeeklyScheduleResponse;
import com.keunsori.keunsoriserver.domain.admin.reservation.service.AdminReservationService;
import jakarta.validation.Valid;
import lombok.RequiredArgsConstructor;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequiredArgsConstructor
@RequestMapping("/admin/reservation")
public class AdminReservationController {

private final AdminReservationService adminReservationService;

// 기본 예약 관리 페이지 반환
@GetMapping("/weekly-schedule")
public ResponseEntity<List<WeeklyScheduleResponse>> findAllWeeklySchedules(){
List<WeeklyScheduleResponse> responses = adminReservationService.findAllWeeklySchedules();
return ResponseEntity.ok().body(responses);
}

// 주간 테이블 설정
@PutMapping("/weekly-schedule")
public ResponseEntity<Void> saveWeeklySchedule(@Valid @RequestBody List<WeeklyScheduleUpdateRequest> requests){
adminReservationService.saveWeeklySchedule(requests);
return ResponseEntity.ok().build();
}

// 일자별 관리 페이지 반환
@GetMapping("/daily-schedule")
public ResponseEntity<List<DailyAvailableResponse>> findAllDailySchedulesAndResrvations(@RequestParam("month") String month) {
List<DailyAvailableResponse> responses = adminReservationService.findDailyAvailableByMonth(month);
return ResponseEntity.ok().body(responses);
}

// 일간 시간 설정
@PutMapping("/daily-schedule")
public ResponseEntity<Void> saveDailySchedule(@RequestBody DailyScheduleUpdateOrCreateRequest request){
adminReservationService.saveDailySchedule(request);
return ResponseEntity.ok().build();
}

// 관리자 예약 삭제
@DeleteMapping("/{reservationId}")
public ResponseEntity<Void> deleteReservationByAdmin(@PathVariable(name = "reservationId") Long reservationId) {
adminReservationService.deleteReservationByAdmin(reservationId);
return ResponseEntity.noContent().build();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,35 @@
package com.keunsori.keunsoriserver.domain.admin.reservation.domain;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;
import lombok.*;

import java.time.LocalDate;
import java.time.LocalTime;

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

@Id
private LocalDate date;

private boolean isActive;

private LocalTime startTime;

private LocalTime endTime;

@Builder
private DailySchedule(LocalDate date, boolean isActive, LocalTime startTime, LocalTime endTime){
this.date = date;
this.isActive = isActive;
this.startTime = startTime;
this.endTime = endTime;
}

public boolean isPastDate(){
return date.isBefore(LocalDate.now());
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.keunsori.keunsoriserver.domain.admin.reservation.domain;

import jakarta.persistence.*;
import lombok.AccessLevel;
import lombok.Builder;
import lombok.Getter;
import lombok.NoArgsConstructor;

import java.time.DayOfWeek;
import java.time.LocalTime;

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

@Id
@Enumerated(EnumType.STRING)
private DayOfWeek dayOfWeek;

private boolean isActive;

private LocalTime startTime;

private LocalTime endTime;

@Builder
private WeeklySchedule(DayOfWeek dayOfWeek, boolean isActive, LocalTime startTime, LocalTime endTime){
this.dayOfWeek = dayOfWeek;
this.isActive = isActive;
this.startTime = startTime;
this.endTime = endTime;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.keunsori.keunsoriserver.domain.admin.reservation.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;

import java.time.LocalDate;
import java.time.LocalTime;

public record DailyScheduleUpdateOrCreateRequest(
@Schema(example = "2025-01-01", type = "string")
LocalDate date,
boolean isActive,
@Schema(example = "10:00", type = "string")
LocalTime startTime,
@Schema(example = "22:00", type = "string")
LocalTime endTime
) {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
package com.keunsori.keunsoriserver.domain.admin.reservation.dto.request;

import com.keunsori.keunsoriserver.domain.admin.reservation.domain.WeeklySchedule;
import com.keunsori.keunsoriserver.global.util.DayOfWeekUtil;
import io.swagger.v3.oas.annotations.media.Schema;
import jakarta.validation.constraints.Max;
import jakarta.validation.constraints.Min;
import jakarta.validation.constraints.NotNull;

import java.time.LocalTime;

public record WeeklyScheduleUpdateRequest(
@NotNull
@Min(value = 0) @Max(value = 7)
int dayOfWeekNum, // 0 = 일요일, 1 = 월요일, ...
boolean isActive,
@Schema(example = "10:00", type = "string")
LocalTime startTime,
@Schema(example = "22:00", type = "string")
LocalTime endTime
) {
public WeeklySchedule toEntity(){
return WeeklySchedule.builder()
.dayOfWeek(DayOfWeekUtil.fromCustomDayValue(dayOfWeekNum))
.isActive(isActive)
.startTime(startTime)
.endTime(endTime)
.build();
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
package com.keunsori.keunsoriserver.domain.admin.reservation.dto.response;

import com.keunsori.keunsoriserver.domain.admin.reservation.domain.DailySchedule;
import com.keunsori.keunsoriserver.domain.admin.reservation.domain.WeeklySchedule;

import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

public record DailyAvailableResponse(
LocalDate date,
boolean isActive,
String startTime,
String endTime
) {
public static DailyAvailableResponse from(DailySchedule dailySchedule){
return new DailyAvailableResponse(
dailySchedule.getDate(),
dailySchedule.isActive(),
dailySchedule.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")),
dailySchedule.getEndTime().format(DateTimeFormatter.ofPattern("HH:mm"))
);
}

public static DailyAvailableResponse of(LocalDate date, WeeklySchedule weeklySchedule){
return new DailyAvailableResponse(
date,
weeklySchedule.isActive(),
weeklySchedule.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")),
weeklySchedule.getEndTime().format(DateTimeFormatter.ofPattern("HH:mm"))
);
}

public static DailyAvailableResponse createInactiveDate(LocalDate date){
return new DailyAvailableResponse(
date,
false,
null,
null
);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package com.keunsori.keunsoriserver.domain.admin.reservation.dto.response;

import com.keunsori.keunsoriserver.domain.admin.reservation.domain.WeeklySchedule;
import com.keunsori.keunsoriserver.global.util.DayOfWeekUtil;
import lombok.Getter;

import java.time.format.DateTimeFormatter;

public record WeeklyScheduleResponse(
int dayOfWeekNum, // 0 = 일요일, 1 = 월요일, ...
boolean isActive,
String startTime,
String endTime
) {
public static WeeklyScheduleResponse from(WeeklySchedule weeklySchedule){
return new WeeklyScheduleResponse(
DayOfWeekUtil.getCustomDayValue(weeklySchedule.getDayOfWeek()),
weeklySchedule.isActive(),
weeklySchedule.getStartTime().format(DateTimeFormatter.ofPattern("HH:mm")),
weeklySchedule.getEndTime().format(DateTimeFormatter.ofPattern("HH:mm"))
);
}

public int getDayOfWeekNum() {
return dayOfWeekNum;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package com.keunsori.keunsoriserver.domain.admin.reservation.repository;

import com.keunsori.keunsoriserver.domain.admin.reservation.domain.DailySchedule;
import org.springframework.data.jpa.repository.JpaRepository;

import java.time.LocalDate;
import java.util.Optional;

public interface DailyScheduleRepository extends JpaRepository<DailySchedule, LocalDate> {
Optional<DailySchedule> findByDate(LocalDate date);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.keunsori.keunsoriserver.domain.admin.reservation.repository;

import com.keunsori.keunsoriserver.domain.admin.reservation.domain.WeeklySchedule;
import org.springframework.data.jpa.repository.JpaRepository;

import java.time.DayOfWeek;
import java.util.Optional;

public interface WeeklyScheduleRepository extends JpaRepository<WeeklySchedule, DayOfWeek> {

Optional<WeeklySchedule> findByDayOfWeek(DayOfWeek dayOfWeek);
}
Loading

0 comments on commit 65b32e7

Please sign in to comment.