Skip to content

Commit daac765

Browse files
committed
feat : calender CRUD
1 parent d13e601 commit daac765

File tree

10 files changed

+216
-76
lines changed

10 files changed

+216
-76
lines changed

src/main/java/KKSC/page/domain/calendar/controller/EventController.java

+79-28
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,116 @@
22

33
import KKSC.page.domain.calendar.dto.EventRequest;
44
import KKSC.page.domain.calendar.dto.EventResponse;
5-
import KKSC.page.domain.calendar.exception.CalendarException;
5+
import KKSC.page.domain.calendar.dto.EventResponseInterface;
6+
import KKSC.page.domain.calendar.exception.EventException;
67
import KKSC.page.domain.calendar.repoAndService.EventService;
78
import KKSC.page.global.auth.service.JwtService;
89
import KKSC.page.global.exception.ErrorCode;
10+
import KKSC.page.global.exception.dto.ErrorResponseVO;
911
import KKSC.page.global.exception.dto.ResponseVO;
12+
import io.swagger.v3.oas.annotations.Operation;
13+
import io.swagger.v3.oas.annotations.Parameter;
14+
import io.swagger.v3.oas.annotations.Parameters;
15+
import io.swagger.v3.oas.annotations.media.Content;
16+
import io.swagger.v3.oas.annotations.media.Schema;
17+
import io.swagger.v3.oas.annotations.responses.ApiResponse;
18+
import io.swagger.v3.oas.annotations.responses.ApiResponses;
19+
import io.swagger.v3.oas.annotations.tags.Tag;
1020
import jakarta.servlet.http.HttpServletRequest;
1121
import lombok.RequiredArgsConstructor;
22+
import lombok.extern.slf4j.Slf4j;
23+
1224
import org.springframework.web.bind.annotation.*;
1325

1426
import java.util.List;
1527

28+
@Tag(name = "Event", description = "일정관리 API")
1629
@RestController
1730
@RequiredArgsConstructor
18-
@RequestMapping("/calendar")
31+
@RequestMapping("/event")
32+
@Slf4j
1933
public class EventController {
2034

2135
private final EventService eventService;
2236
private final JwtService jwtService;
2337

2438
// 캘린더 일정 추가
39+
@ApiResponses(value = {
40+
@ApiResponse(responseCode = "200", description = "API 정상 작동",content = @Content(schema = @Schema(implementation = ResponseVO.class))),
41+
@ApiResponse(responseCode = "???", description = "서버 에러",content = @Content(schema = @Schema(implementation = ErrorResponseVO.class)))}
42+
)
43+
@Operation(summary = "일정 추가", description = " 일정 추가 API ")
2544
@PostMapping("/")
2645
public ResponseVO<Long> addEvent(@RequestBody EventRequest eventRequest) {
27-
return new ResponseVO<>(eventService.createSchedule(eventRequest));
46+
return new ResponseVO<>(eventService.createEvent(eventRequest));
2847
}
2948

30-
// 캘린더 일정 삭제
31-
@DeleteMapping("/{id}")
32-
public ResponseVO<String> deleteEvent(@PathVariable Long id) {
33-
eventService.deleteSchedule(id);
49+
// 캘린더 일정 수정
50+
@ApiResponses(value = {
51+
@ApiResponse(responseCode = "200", description = "API 정상 작동",content = @Content(schema = @Schema(implementation = ResponseVO.class))),
52+
@ApiResponse(responseCode = "???", description = "서버 에러",content = @Content(schema = @Schema(implementation = ErrorResponseVO.class)))}
53+
)
54+
@Parameter(name = "eventId", description = "일정 번호")
55+
@Operation(summary = " 일정 수정 ", description = " 일정 수정 API ")
56+
@PutMapping("/{eventId}")
57+
public ResponseVO<EventResponse> updateEvent(@PathVariable Long eventId, @RequestBody EventRequest eventRequest) {
58+
return new ResponseVO<>(eventService.updateEvent(eventId, eventRequest));
59+
}
3460

35-
return new ResponseVO<>("Delete Success");
61+
// 캘린더 일정 삭제
62+
@ApiResponses(value = {
63+
@ApiResponse(responseCode = "200", description = "API 정상 작동",content = @Content(schema = @Schema(implementation = ResponseVO.class))),
64+
@ApiResponse(responseCode = "???", description = "서버 에러",content = @Content(schema = @Schema(implementation = ErrorResponseVO.class)))}
65+
)
66+
@Parameter(name = "eventId", description = "일정 번호")
67+
@Operation(summary = " 일정 삭제 ", description = " 일정 삭제 API ")
68+
@DeleteMapping("/{eventId}")
69+
public ResponseVO<String> deleteEvent(@PathVariable Long eventId) {
70+
return new ResponseVO<>("Delete success");
3671
}
3772

38-
// 캘린더 일정 수정
39-
@PutMapping("/{id}")
40-
public ResponseVO<EventResponse> updateEvent(@PathVariable Long id, @RequestBody EventRequest eventRequest) {
41-
return new ResponseVO<>(eventService.updateSchedule(id, eventRequest));
73+
// 캘린더 일정 목록 조회 완성
74+
@ApiResponses(value = {
75+
@ApiResponse(responseCode = "200", description = "API 정상 작동",content = @Content(schema = @Schema(implementation = ResponseVO.class))),
76+
@ApiResponse(responseCode = "???", description = "서버 에러",content = @Content(schema = @Schema(implementation = ErrorResponseVO.class)))}
77+
)
78+
@Parameters({
79+
@Parameter(name = "year", description = "일정 검색 년도"),
80+
@Parameter(name = "month", description = "일정 검색 월"),
81+
})
82+
@Operation(summary = " 일정 조회 ", description = " 일정 조회 API ")
83+
@GetMapping("")
84+
public ResponseVO<List<EventResponseInterface>> getEventList(@RequestParam int year, @RequestParam int month) {
85+
return new ResponseVO<>(eventService.getEventList(year, month));
4286
}
4387

4488
// 캘린더 일정 참가
45-
@PostMapping("/{id}/join")
46-
public ResponseVO<Long> joinEvent(HttpServletRequest request, @PathVariable Long id) {
89+
@ApiResponses(value = {
90+
@ApiResponse(responseCode = "200", description = "API 정상 작동",content = @Content(schema = @Schema(implementation = ResponseVO.class))),
91+
@ApiResponse(responseCode = "???", description = "서버 에러",content = @Content(schema = @Schema(implementation = ErrorResponseVO.class)))}
92+
)
93+
@Parameter(name = "eventId", description = "일정 번호")
94+
@Operation(summary = " 일정 참가 ", description = " 일정 참가 API ")
95+
@PostMapping("/join/{eventId}")
96+
public ResponseVO<Long> joinEvent(HttpServletRequest request, @PathVariable Long eventId) {
4797
String username = jwtService.extractUsername(request)
48-
.orElseThrow(() -> new CalendarException(ErrorCode.ACCESS_DENIED));
49-
50-
return new ResponseVO<>(eventService.joinSchedule(id, username));
98+
.orElseThrow(() -> new EventException(ErrorCode.ACCESS_DENIED));
99+
100+
return new ResponseVO<>(eventService.joinEvent(eventId, username));
51101
}
52-
102+
53103
// 캘린더 일정 참가 취소
54-
@DeleteMapping("/cancel/{id}")
55-
public ResponseVO<String> cancelEvent(@PathVariable Long id) {
56-
eventService.cancelSchedule(id);
57-
58-
return new ResponseVO<>("Cancel Success");
59-
}
104+
@ApiResponses(value = {
105+
@ApiResponse(responseCode = "200", description = "API 정상 작동",content = @Content(schema = @Schema(implementation = ResponseVO.class))),
106+
@ApiResponse(responseCode = "???", description = "서버 에러",content = @Content(schema = @Schema(implementation = ErrorResponseVO.class)))}
107+
)
108+
@Parameter(name = "eventId", description = "일정 번호")
109+
@Operation(summary = " 일정 참가 취소 ", description = " 일정 참가 취소 API ")
110+
@DeleteMapping("/cancel/{eventId}")
111+
public ResponseVO<String> cancelEvent(HttpServletRequest request, @PathVariable Long eventId) {
112+
String username = jwtService.extractUsername(request)
113+
.orElseThrow(() -> new EventException(ErrorCode.ACCESS_DENIED));
60114

61-
// 캘린더 일정 목록 조회
62-
@GetMapping("/")
63-
public ResponseVO<List<EventResponse>> getEventList(@RequestParam Long year, @RequestParam Long month) {
64-
return new ResponseVO<>(eventService.getScheduleList(year, month));
115+
return new ResponseVO<>(eventService.cancelEvent(eventId, username));
65116
}
66117
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package KKSC.page.domain.calendar.dto;
2+
3+
import java.time.LocalDateTime;
4+
import com.fasterxml.jackson.annotation.JsonFormat;
5+
6+
import KKSC.page.domain.calendar.entity.Category;
7+
8+
public interface EventResponseInterface {
9+
10+
Long getId();
11+
String getTitle();
12+
String getDetail();
13+
14+
Category getCategory();
15+
16+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss", timezone = "Asia/Seoul")
17+
LocalDateTime getStartDate();
18+
19+
@JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd hh:mm:ss", timezone = "Asia/Seoul")
20+
LocalDateTime getEndDate();
21+
22+
Long getMaxParticipant();
23+
24+
}

src/main/java/KKSC/page/domain/calendar/entity/Event.java

+9-12
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
package KKSC.page.domain.calendar.entity;
22

3-
import KKSC.page.domain.member.entity.Member;
3+
import KKSC.page.domain.calendar.dto.EventRequest;
44
import KKSC.page.global.common.BaseTimeEntity;
55
import jakarta.persistence.*;
66
import lombok.AllArgsConstructor;
@@ -26,10 +26,6 @@ public class Event extends BaseTimeEntity {
2626
@OneToMany(mappedBy = "event")
2727
private List<Participant> participants;
2828

29-
@ManyToOne(fetch = FetchType.LAZY)
30-
@JoinColumn(name = "member_id")
31-
private Member member;
32-
3329
// 일정 제목
3430
private String title;
3531

@@ -50,12 +46,13 @@ public class Event extends BaseTimeEntity {
5046
private String detail;
5147

5248
// 일정 수정(시작 날짜, 종료 날짜, 세부 사항 수정)
53-
public void update(String title, String detail, Category category, LocalDateTime startDate, LocalDateTime endDate, Long maxParticipant) {
54-
this.title = title;
55-
this.detail = detail;
56-
this.category = category;
57-
this.startDate = startDate;
58-
this.endDate = endDate;
59-
this.maxParticipant = maxParticipant;
49+
public void update(Long eventId, EventRequest eventRequest) {
50+
this.id = eventId;
51+
this.title = eventRequest.title();
52+
this.detail = eventRequest.detail();
53+
this.category = eventRequest.category();
54+
this.startDate = eventRequest.startDate();
55+
this.endDate = eventRequest.endDate();
56+
this.maxParticipant = eventRequest.maxParticipant();
6057
}
6158
}

src/main/java/KKSC/page/domain/calendar/entity/Participant.java

+7-3
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package KKSC.page.domain.calendar.entity;
22

3+
import KKSC.page.domain.member.entity.Member;
34
import KKSC.page.global.common.BaseTimeEntity;
45
import jakarta.persistence.*;
56
import lombok.AllArgsConstructor;
@@ -18,9 +19,12 @@ public class Participant extends BaseTimeEntity {
1819
@Column(name = "participant_id")
1920
private Long id;
2021

21-
@ManyToOne(fetch = FetchType.LAZY)
22+
@ManyToOne
2223
@JoinColumn(name = "event_id")
2324
private Event event;
2425

25-
private String name;
26-
}
26+
@OneToOne
27+
@JoinColumn(name = "member_id")
28+
private Member member;
29+
30+
}

src/main/java/KKSC/page/domain/calendar/exception/CalendarException.java src/main/java/KKSC/page/domain/calendar/exception/EventException.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
@Getter
88
@RequiredArgsConstructor
9-
public class CalendarException extends RuntimeException {
9+
public class EventException extends RuntimeException {
1010

1111
private final ErrorCode errorCode;
1212
}
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,27 @@
11
package KKSC.page.domain.calendar.repoAndService;
22

3+
import KKSC.page.domain.calendar.dto.EventResponseInterface;
34
import KKSC.page.domain.calendar.entity.Event;
5+
6+
import java.util.List;
7+
48
import org.springframework.data.jpa.repository.JpaRepository;
9+
import org.springframework.data.jpa.repository.Query;
10+
import org.springframework.data.repository.query.Param;
11+
512

613
public interface EventRepository extends JpaRepository<Event, Long>, EventRepositoryCustom {
14+
@Query(value = "SELECT "+
15+
"event_id as id,"+
16+
"title as title,"+
17+
"detail as detail,"+
18+
"category as category,"+
19+
"start_date as startDate,"+
20+
"end_date as endDate ,"+
21+
"max_participant as maxParticipant "+
22+
"FROM event "+
23+
"WHERE YEAR(end_date) = :Year "+
24+
"AND MONTH(end_date) = :Month "
25+
, nativeQuery = true)
26+
List<EventResponseInterface> EventList(@Param("Year") int Year,@Param("Month") int Month);
727
}

src/main/java/KKSC/page/domain/calendar/repoAndService/EventService.java

+10-8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
import KKSC.page.domain.calendar.dto.EventRequest;
66
import KKSC.page.domain.calendar.dto.EventResponse;
7+
import KKSC.page.domain.calendar.dto.EventResponseInterface;
78

89
import org.springframework.stereotype.Service;
910

@@ -15,26 +16,27 @@ public interface EventService {
1516

1617
// 일정 목록 조회
1718
@PreAuthorize("hasRole('permission_level1')")
18-
List<EventResponse> getScheduleList(Long year, Long month);
19+
List<EventResponseInterface> getEventList(int year, int month);
1920

2021
// 일정 생성
2122
@PreAuthorize("hasRole('permission_level0')")
22-
Long createSchedule(EventRequest eventRequest);
23+
Long createEvent(EventRequest eventRequest);
2324

24-
// 일정 삭제
25+
// 일정 수정
2526
@PreAuthorize("hasRole('permission_level0')")
26-
void deleteSchedule(Long id);
27+
EventResponse updateEvent(Long evetnId, EventRequest eventRequest);
2728

28-
// 일정 수정
29+
// 일정 삭제
2930
@PreAuthorize("hasRole('permission_level0')")
30-
EventResponse updateSchedule(Long id, EventRequest eventRequest);
31+
void deleteEvent(Long evetnId);
32+
3133

3234
// 일정 참가
3335
@PreAuthorize("hasRole('permission_level1')")
34-
Long joinSchedule(Long id, String name);
36+
Long joinEvent(Long evetnId, String userName);
3537

3638
// 일정 참가 취소
3739
@PreAuthorize("hasRole('permission_level1')")
38-
void cancelSchedule (Long id);
40+
String cancelEvent (Long evetnId, String userName);
3941

4042
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package KKSC.page.domain.calendar.repoAndService;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
import KKSC.page.domain.calendar.entity.Participant;
6+
7+
public interface ParticipantRepository extends JpaRepository<Participant, Long> {
8+
9+
}

0 commit comments

Comments
 (0)