Skip to content

Commit eefc082

Browse files
authored
Merge pull request #21 from cmsong111/Refactor-Event
Refactor event
2 parents 0f99e8e + 297af63 commit eefc082

File tree

7 files changed

+126
-80
lines changed

7 files changed

+126
-80
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
package ac.kr.deu.connect.luck.ad
2+
3+
import io.swagger.v3.oas.annotations.tags.Tag
4+
import org.springframework.web.bind.annotation.GetMapping
5+
import org.springframework.web.bind.annotation.RestController
6+
7+
@Tag(name = "10-Advertisement API", description = "광고 관련 API")
8+
@RestController
9+
class AdRestController {
10+
11+
val adList: List<String> = listOf(
12+
"https://i.ibb.co/tXHJ42V/Lime-Wire-AI-Studio-Asset-7.jpg",
13+
"https://i.ibb.co/MphYSMG/Lime-Wire-AI-Studio-Asset-6.jpg",
14+
"https://i.ibb.co/8X33yyG/Lime-Wire-AI-Studio-Asset-5.jpg",
15+
"https://i.ibb.co/gvmGnq1/Lime-Wire-AI-Studio-Asset-4.jpg",
16+
"https://i.ibb.co/9Zt0868/Lime-Wire-AI-Studio-Asset-3.jpg",
17+
"https://i.ibb.co/m6fwTnX/Lime-Wire-AI-Studio-Asset-2.jpg",
18+
"https://i.ibb.co/c1mr03H/Lime-Wire-AI-Studio-Asset-1.jpg",
19+
"https://i.ibb.co/Q99zZj0/Lime-Wire-AI-Studio-Asset.jpg"
20+
)
21+
22+
@GetMapping("/ad")
23+
fun getAd(): List<String> {
24+
return adList;
25+
}
26+
}

src/main/java/ac/kr/deu/connect/luck/event/EventMapper.java

+3
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
import ac.kr.deu.connect.luck.event.dto.EventDetailResponse;
44
import ac.kr.deu.connect.luck.event.dto.EventRequest;
5+
import ac.kr.deu.connect.luck.event.dto.EventRequestV2;
56
import org.mapstruct.Mapper;
67
import org.mapstruct.Mapping;
78

@@ -23,4 +24,6 @@ public interface EventMapper {
2324
*/
2425
@Mapping(source = "manager.name", target = "managerName")
2526
EventDetailResponse toEventResponse(Event event);
27+
28+
Event toEvent(EventRequestV2 eventRequest);
2629
}

src/main/java/ac/kr/deu/connect/luck/event/EventService.java

+21-38
Original file line numberDiff line numberDiff line change
@@ -2,20 +2,22 @@
22

33
import ac.kr.deu.connect.luck.event.dto.EventDetailResponse;
44
import ac.kr.deu.connect.luck.event.dto.EventRequest;
5-
import ac.kr.deu.connect.luck.event_application.EventApplication;
5+
import ac.kr.deu.connect.luck.event.dto.EventRequestV2;
66
import ac.kr.deu.connect.luck.image.ImageUploader;
77
import ac.kr.deu.connect.luck.user.User;
88
import ac.kr.deu.connect.luck.user.UserRepository;
99
import lombok.RequiredArgsConstructor;
10+
import org.slf4j.Logger;
11+
import org.slf4j.LoggerFactory;
1012
import org.springframework.stereotype.Service;
1113
import org.springframework.web.multipart.MultipartFile;
1214

13-
import java.time.LocalDateTime;
1415
import java.util.List;
1516

1617
@Service
1718
@RequiredArgsConstructor
1819
public class EventService {
20+
private static final Logger log = LoggerFactory.getLogger(EventService.class);
1921
private final EventRepository eventRepository;
2022
private final EventMapper eventMapper;
2123
private final UserRepository userRepository;
@@ -68,22 +70,22 @@ public EventDetailResponse getEvent(Long id) {
6870
/**
6971
* 이벤트 생성
7072
*
71-
* @param eventRequest 이벤트 생성 요청 폼
72-
* @param multipartFile 이벤트 대표 이미지
73-
* null이면 기본 이미지 사용
74-
* @param managerEmail 매니저 이름
73+
* @param eventRequest 이벤트 생성 요청 폼
74+
* null이면 기본 이미지 사용
75+
* @param managerEmail 매니저 이름
7576
* @return 생성된 이벤트
7677
*/
77-
public Event createEvent(EventRequest eventRequest, MultipartFile multipartFile, String managerEmail) {
78+
public Event createEvent(EventRequestV2 eventRequest, String managerEmail) {
7879
Event eventSaved = eventMapper.toEvent(eventRequest);
7980

8081
User user = userRepository.findByEmail(managerEmail).orElseThrow(
8182
() -> new IllegalArgumentException("해당 유저가 존재하지 않습니다.")
8283
);
8384
// 기본 이미지 설정 후 이미지가 있으면 업로드
8485
String image = "https://picsum.photos/1600/900";
85-
if (multipartFile != null) {
86-
image = imageUploader.uploadImage(multipartFile).getData().getUrl();
86+
log.info("image : {}", eventRequest.getImage());
87+
if (eventRequest.getImage() != null) {
88+
image = imageUploader.uploadImage(eventRequest.getImage()).getData().getUrl();
8789
}
8890
eventSaved.setImageUrl(image);
8991
eventSaved.setManager(user);
@@ -97,11 +99,10 @@ public Event createEvent(EventRequest eventRequest, MultipartFile multipartFile,
9799
*
98100
* @param id 이벤트 UID
99101
* @param eventRequest 이벤트 생성 요청 폼
100-
* @param multipartFile 이벤트 대표 이미지
101102
* @param managerEmail 이벤트 매니저 이메일
102103
* @return 수정된 이벤트
103104
*/
104-
public Event updateEvent(Long id, EventRequest eventRequest, MultipartFile multipartFile, String managerEmail) {
105+
public Event updateEvent(Long id, EventRequestV2 eventRequest, String managerEmail) {
105106
Event findEvent = eventRepository.findById(id).orElseThrow(
106107
() -> new IllegalArgumentException("해당 이벤트가 존재하지 않습니다.")
107108
);
@@ -110,37 +111,19 @@ public Event updateEvent(Long id, EventRequest eventRequest, MultipartFile multi
110111
throw new IllegalArgumentException("해당 이벤트의 매니저가 아닙니다.");
111112
}
112113

113-
if (multipartFile != null) {
114-
String image = imageUploader.uploadImage(multipartFile).getData().getUrl();
114+
if (eventRequest.getImage() != null) {
115+
String image = imageUploader.uploadImage(eventRequest.getImage()).getData().getUrl();
115116
findEvent.setImageUrl(image);
116117
}
117-
if (eventRequest.title() != null) {
118-
findEvent.setTitle(eventRequest.title());
119-
}
120-
121-
if (eventRequest.content() != null) {
122-
findEvent.setContent(eventRequest.content());
123-
}
124-
125-
if (eventRequest.zipCode() != null) {
126-
findEvent.setZipCode(eventRequest.zipCode());
127-
}
128118

129-
if (eventRequest.streetAddress() != null) {
130-
findEvent.setStreetAddress(eventRequest.streetAddress());
131-
}
132-
133-
if (eventRequest.detailAddress() != null) {
134-
findEvent.setDetailAddress(eventRequest.detailAddress());
135-
}
119+
findEvent.setTitle(eventRequest.getTitle());
120+
findEvent.setContent(eventRequest.getContent());
121+
findEvent.setZipCode(eventRequest.getZipCode());
122+
findEvent.setStreetAddress(eventRequest.getStreetAddress());
123+
findEvent.setDetailAddress(eventRequest.getDetailAddress());
124+
findEvent.setStartAt(eventRequest.getStartAt());
125+
findEvent.setEndAt(eventRequest.getEndAt());
136126

137-
if (eventRequest.startAt() != null) {
138-
findEvent.setStartAt(eventRequest.startAt());
139-
}
140-
141-
if (eventRequest.endAt() != null) {
142-
findEvent.setEndAt(eventRequest.endAt());
143-
}
144127
return eventRepository.save(findEvent);
145128
}
146129

src/main/java/ac/kr/deu/connect/luck/event/controller/EventController.java

+16-9
Original file line numberDiff line numberDiff line change
@@ -3,14 +3,19 @@
33
import ac.kr.deu.connect.luck.event.EventService;
44
import ac.kr.deu.connect.luck.event.EventStatus;
55
import ac.kr.deu.connect.luck.event.dto.EventRequest;
6+
import ac.kr.deu.connect.luck.event.dto.EventRequestV2;
67
import lombok.RequiredArgsConstructor;
8+
import lombok.extern.slf4j.Slf4j;
9+
import org.springframework.security.access.prepost.PreAuthorize;
710
import org.springframework.stereotype.Controller;
811
import org.springframework.ui.Model;
912
import org.springframework.web.bind.annotation.*;
1013
import org.springframework.web.multipart.MultipartFile;
1114

1215
import java.security.Principal;
16+
import java.time.LocalDateTime;
1317

18+
@Slf4j
1419
@Controller
1520
@RequestMapping("/event")
1621
@RequiredArgsConstructor
@@ -38,15 +43,16 @@ public String getEventDetail(@PathVariable("id") Long id, Model model) {
3843

3944
@GetMapping("/register")
4045
public String getEventRegister(Model model) {
46+
model.addAttribute("eventRequest", new EventRequestV2("", "", "", "", "", LocalDateTime.now(), LocalDateTime.now(), null));
4147
return "event/event_register";
4248
}
4349

44-
@PostMapping("/create")
50+
@PostMapping(value = "/create", consumes = "multipart/form-data")
4551
public String registerEventPost(
4652
Principal principal,
47-
EventRequest eventRequest, @RequestParam("multipartFile") MultipartFile multipartFile
48-
){
49-
eventService.createEvent(eventRequest, multipartFile, principal.getName());
53+
EventRequestV2 eventRequest
54+
) {
55+
eventService.createEvent(eventRequest, principal.getName());
5056
return "redirect:/event/my";
5157
}
5258

@@ -63,21 +69,22 @@ public String getEventUpdate(@PathVariable("id") Long id, Model model) {
6369
}
6470

6571
@PostMapping("/update")
72+
@PreAuthorize("hasRole('ROLE_EVENT_MANAGER')")
6673
public String updateEventPost(
6774
@RequestParam("eventId") Long id,
6875
Principal principal,
69-
EventRequest eventRequest,
70-
@RequestParam("multipartFile") MultipartFile multipartFile
71-
){
72-
eventService.updateEvent(id, eventRequest, multipartFile, principal.getName());
76+
EventRequestV2 eventRequest
77+
) {
78+
eventService.updateEvent(id, eventRequest, principal.getName());
7379
return "redirect:/event/my";
7480
}
81+
7582
@PostMapping("/statusUpdate/{id}")
7683
public String updateEventPost(
7784
@PathVariable("id") Long id,
7885
Principal principal,
7986
@RequestParam("status") EventStatus eventStatus
80-
){
87+
) {
8188
eventService.changeEventStatus(id, eventStatus, principal.getName());
8289
return "redirect:/event/my";
8390
}

src/main/java/ac/kr/deu/connect/luck/event/controller/EventRestController.java

+16-22
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44
import ac.kr.deu.connect.luck.event.EventService;
55
import ac.kr.deu.connect.luck.event.EventStatus;
66
import ac.kr.deu.connect.luck.event.dto.EventDetailResponse;
7+
import ac.kr.deu.connect.luck.event.dto.EventRequestV2;
78
import io.swagger.v3.oas.annotations.Operation;
89
import io.swagger.v3.oas.annotations.Parameter;
910
import io.swagger.v3.oas.annotations.tags.Tag;
@@ -12,7 +13,6 @@
1213
import org.springframework.http.ResponseEntity;
1314
import org.springframework.security.access.prepost.PreAuthorize;
1415
import org.springframework.web.bind.annotation.*;
15-
import org.springframework.web.multipart.MultipartFile;
1616

1717
import java.security.Principal;
1818
import java.util.List;
@@ -39,40 +39,34 @@ public ResponseEntity<EventDetailResponse> getEvent(@PathVariable Long id) {
3939
return ResponseEntity.ok(eventService.getEvent(id));
4040
}
4141

42-
//서비스 로직 수정함 레스트도 수정되어야할듯
43-
/*@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
42+
/**
43+
* 이벤트 생성 Rest API
44+
*
45+
* @param eventRequest 이벤트 생성 요청 정보
46+
* @param principal 로그인 한 사용자 정보
47+
* @return 생성된 이벤트 정보
48+
*/
49+
@PostMapping(consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
4450
@PreAuthorize("hasRole('ROLE_EVENT_MANAGER')")
4551
@Operation(summary = "이벤트 생성", description = "이벤트 생성\n이벤트 주소입력 시 카카오 우편번호 서비스를 사용해서 주소를 입력받아야함.")
4652
public ResponseEntity<Event> createEvent(
47-
@Parameter(description = "행사 이름") @RequestPart(value = "title") String title,
48-
@Parameter(description = "이벤트 내용") @RequestPart(value = "content") String content,
49-
@Parameter(description = "우편번호") @RequestPart(value = "zipCode") String zipCode,
50-
@Parameter(description = "도로명주소") @RequestPart(value = "streetAddress") String streetAddress,
51-
@Parameter(description = "상세주소") @RequestPart(value = "detailAddress") String detailAddress,
52-
@Parameter(description = "시작일자 예시)2021-08-01T00:00:00") @RequestPart(value = "startAt") String startAt,
53-
@Parameter(description = "종료일자 예시)2021-08-01T00:00:00") @RequestPart(value = "endAt") String endAt,
54-
@Parameter(description = "이벤트 대표 이미지") @RequestPart(value = "image", required = false) MultipartFile multipartFile,
53+
@ModelAttribute EventRequestV2 eventRequest,
5554
Principal principal
5655
) {
57-
return ResponseEntity.ok(eventService.createEvent(title, content, zipCode, streetAddress, detailAddress, startAt, endAt, multipartFile, principal.getName()));
56+
return ResponseEntity.ok(eventService.createEvent(eventRequest, principal.getName()));
5857
}
5958

59+
60+
6061
@PatchMapping(value = "/{id}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE)
6162
@PreAuthorize("hasRole('ROLE_EVENT_MANAGER')")
6263
@Operation(summary = "이벤트 수정", description = "이벤트 수정")
6364
public ResponseEntity<Event> updateEvent(
6465
@Parameter(description = "이벤트 UID") @PathVariable(value = "id", required = false) Long id,
65-
@Parameter(description = "행사 이름") @RequestPart(value = "title", required = false) String title,
66-
@Parameter(description = "이벤트 내용") @RequestPart(value = "content", required = false) String content,
67-
@Parameter(description = "우편번호") @RequestPart(value = "zipCode", required = false) String zipCode,
68-
@Parameter(description = "도로명주소") @RequestPart(value = "streetAddress", required = false) String streetAddress,
69-
@Parameter(description = "상세주소") @RequestPart(value = "detailAddress", required = false) String detailAddress,
70-
@Parameter(description = "시작일자 예시)2021-08-01T00:00:00") @RequestPart(value = "startAt", required = false) String startAt,
71-
@Parameter(description = "종료일자 예시)2021-08-01T00:00:00") @RequestPart(value = "endAt", required = false) String endAt,
72-
@Parameter(description = "이벤트 대표 이미지") @RequestPart(value = "image", required = false) MultipartFile multipartFile,
66+
@ModelAttribute EventRequestV2 eventRequest,
7367
Principal principal) {
74-
return ResponseEntity.ok(eventService.updateEvent(id, title, content, zipCode, streetAddress, detailAddress, startAt, endAt, multipartFile, principal.getName()));
75-
}*/
68+
return ResponseEntity.ok(eventService.updateEvent(id, eventRequest, principal.getName()));
69+
}
7670

7771

7872
@DeleteMapping("/{id}")
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package ac.kr.deu.connect.luck.event.dto
2+
3+
import io.swagger.v3.oas.annotations.media.Schema
4+
import org.springframework.format.annotation.DateTimeFormat
5+
import org.springframework.web.multipart.MultipartFile
6+
import java.time.LocalDateTime
7+
8+
@Schema(description = "이벤트 요청 V2")
9+
data class EventRequestV2(
10+
@field:Schema(description = "제목", example = "이벤트 제목")
11+
val title: String,
12+
@field:Schema(description = "내용", example = "이벤트 내용")
13+
val content: String,
14+
@field:Schema(description = "우편번호", example = "12345")
15+
val zipCode: String,
16+
@field:Schema(description = "도로명 주소", example = "서울시 강남구 테헤란로 123")
17+
val streetAddress: String,
18+
@field:Schema(description = "상세 주소", example = "역삼동 123-456")
19+
val detailAddress: String,
20+
@field:Schema(description = "이벤트 시작일", example = "2021-01-01T00:00:00Z")
21+
@field:DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
22+
val startAt: LocalDateTime,
23+
@field:Schema(description = "이벤트 종료일", example = "2021-01-01T23:59:59Z")
24+
@field:DateTimeFormat(iso = DateTimeFormat.ISO.DATE_TIME)
25+
val endAt: LocalDateTime,
26+
@field:Schema(description = "이미지", format = "binary")
27+
var image: MultipartFile?
28+
) {
29+
30+
override fun toString(): String {
31+
return "EventRequestV2(title='$title', content='$content', zipCode='$zipCode', streetAddress='$streetAddress', detailAddress='$detailAddress', startAt=$startAt, endAt=$endAt, image=${image?.originalFilename})"
32+
}
33+
}

src/main/resources/templates/event/event_register.html

+11-11
Original file line numberDiff line numberDiff line change
@@ -12,50 +12,50 @@
1212
</style>
1313
<div class="container mt-5">
1414
<h1 class="text-center">이벤트 생성</h1>
15-
<form th:action="@{/event/create}" method="post" enctype="multipart/form-data">
15+
<form th:action="@{/event/create}" method="post" enctype="multipart/form-data" th:object="${eventRequest}">
1616
<div class="form-group">
1717
<label for="title">이벤트 제목</label>
18-
<input type="text" class="form-control" id="title" name="title" required>
18+
<input type="text" class="form-control" id="title" name="title" th:field="*{title}" required>
1919
</div>
2020

2121
<div class="form-group">
2222
<label for="content">이벤트 내용</label>
23-
<textarea class="form-control" id="content" name="content" rows="3" required></textarea>
23+
<textarea class="form-control" id="content" name="content" rows="3" th:field="*{content}" required></textarea>
2424
</div>
2525

2626
<div class="form-group">
2727
<label for="zipCode">우편번호</label>
28-
<input type="text" class="form-control" id="zipCode" name="zipCode" required>
28+
<input type="text" class="form-control" id="zipCode" name="zipCode" th:field="*{zipCode}" required>
2929
</div>
3030

3131
<div class="form-group">
3232
<label for="streetAddress">도로명 주소</label>
33-
<input type="text" class="form-control" id="streetAddress" name="streetAddress" required>
33+
<input type="text" class="form-control" id="streetAddress" name="streetAddress" th:field="*{streetAddress}" required>
3434
</div>
3535

3636
<div class="form-group">
3737
<label for="detailAddress">상세 주소</label>
38-
<input type="text" class="form-control" id="detailAddress" name="detailAddress" required>
38+
<input type="text" class="form-control" id="detailAddress" name="detailAddress" th:field="*{detailAddress}" required>
3939
</div>
4040

4141
<div class="form-group">
4242
<label for="startAt">시작 일시</label>
43-
<input type="datetime-local" class="form-control" id="startAt" name="startAt" required>
43+
<input type="datetime-local" class="form-control" id="startAt" name="startAt" th:field="*{startAt}" required>
4444
</div>
4545

4646
<div class="form-group">
4747
<label for="endAt">종료 일시</label>
48-
<input type="datetime-local" class="form-control" id="endAt" name="endAt" required>
48+
<input type="datetime-local" class="form-control" id="endAt" name="endAt" th:field="*{endAt}" required>
4949
</div>
5050

5151
<div class="form-group">
52-
<label for="multipartFile">이벤트 대표 이미지</label>
53-
<input type="file" class="form-control" id="multipartFile" name="multipartFile">
52+
<label for="image">이벤트 대표 이미지</label>
53+
<input type="file" class="form-control-file" id="image" name="image" th:field="*{image}" required>
5454
</div>
5555

5656
<button type="submit" class="btn btn-primary">이벤트 생성</button>
5757
<button type="button" class="btn btn-secondary" onclick="location.href='/event/my'">취소하기</button>
5858
</form>
5959
</div>
6060
</th:block>
61-
</html>
61+
</html>

0 commit comments

Comments
 (0)