Skip to content

Commit 5801072

Browse files
authored
Merge pull request #13 from DMU-Capstone/feat/#10
Feat/#10
2 parents e24ea6e + 85029e2 commit 5801072

12 files changed

Lines changed: 234 additions & 14 deletions

File tree

src/main/java/com/waitit/capstone/domain/admin/AdminController.java

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,24 +2,31 @@
22

33
import com.waitit.capstone.domain.admin.dto.AllHostRequest;
44
import com.waitit.capstone.domain.admin.dto.AllUserRequest;
5+
import com.waitit.capstone.domain.admin.dto.MainBannerResponse;
56
import com.waitit.capstone.domain.admin.dto.UpdatedRequest;
7+
import com.waitit.capstone.domain.image.AllImageResponse;
8+
import com.waitit.capstone.domain.image.ImageService;
69
import com.waitit.capstone.global.util.PageResponse;
710
import java.util.HashMap;
11+
import java.util.List;
812
import java.util.Map;
913
import lombok.AllArgsConstructor;
1014
import org.springframework.data.domain.PageRequest;
1115
import org.springframework.data.domain.Pageable;
1216
import org.springframework.data.domain.Sort;
17+
import org.springframework.http.HttpStatus;
1318
import org.springframework.http.ResponseEntity;
1419
import org.springframework.security.access.prepost.PreAuthorize;
1520
import org.springframework.web.bind.annotation.DeleteMapping;
1621
import org.springframework.web.bind.annotation.GetMapping;
1722
import org.springframework.web.bind.annotation.PatchMapping;
1823
import org.springframework.web.bind.annotation.PathVariable;
24+
import org.springframework.web.bind.annotation.PostMapping;
1925
import org.springframework.web.bind.annotation.RequestBody;
2026
import org.springframework.web.bind.annotation.RequestMapping;
2127
import org.springframework.web.bind.annotation.RequestParam;
2228
import org.springframework.web.bind.annotation.RestController;
29+
import org.springframework.web.multipart.MultipartFile;
2330

2431

2532
@AllArgsConstructor
@@ -28,7 +35,7 @@
2835
public class AdminController {
2936

3037
private final AdminService adminService;
31-
38+
private final ImageService imageService;
3239
//모든 회원 조회
3340
@GetMapping("/users")
3441
@PreAuthorize("hasRole('ADMIN')")
@@ -63,8 +70,37 @@ public ResponseEntity<?> deleteUser(@PathVariable Long id){
6370
}
6471

6572
//이벤트 배너 등록
73+
@PostMapping("/event/upload")
74+
@PreAuthorize("hasRole('ADMIN')")
75+
public ResponseEntity<?> uploadEventBanner(@RequestParam("images") List<MultipartFile> eventImages){
76+
adminService.uploadEventImage(eventImages);
77+
return ResponseEntity.status(HttpStatus.CREATED).body("이미지 저장 완료");
78+
}
79+
6680
//이벤트 배너 조회
81+
@GetMapping("/event")
82+
public ResponseEntity<PageResponse<AllImageResponse>> getAllImages(
83+
@RequestParam(defaultValue = "1") int page,
84+
@RequestParam(defaultValue = "10") int size) {
85+
Pageable pageable = PageRequest.of(page - 1, size, Sort.by("id").descending());
86+
PageResponse<AllImageResponse> images = imageService.getAllImage(pageable);
87+
return ResponseEntity.ok(images);
88+
}
89+
//메인 이벤트 배너 결정 기능
90+
@PreAuthorize("hasRole('ADMIN')")
91+
@PostMapping("/event/select")
92+
public ResponseEntity<?> selectEventBanner(@RequestParam Long imgId,@RequestParam int number){
93+
adminService.selectBanner(imgId,number);
94+
return ResponseEntity.status(HttpStatus.OK).body("이미지 이벤트 등록 완료");
95+
}
6796

97+
//메인 이벤트배너 조회
98+
@PreAuthorize("hasRole('ADMIN')")
99+
@GetMapping("/event/select")
100+
public ResponseEntity<MainBannerResponse> getAllBanner(){
101+
MainBannerResponse responseList = adminService.getEventBanner();
102+
return ResponseEntity.ok(responseList);
103+
}
68104

69105
//대기열 현황 조회
70106

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,24 @@
11
package com.waitit.capstone.domain.admin;
22

3+
import com.sun.tools.javac.Main;
34
import com.waitit.capstone.domain.admin.dto.AllHostRequest;
45
import com.waitit.capstone.domain.admin.dto.AllUserRequest;
6+
import com.waitit.capstone.domain.admin.dto.MainBannerResponse;
57
import com.waitit.capstone.domain.admin.dto.UpdatedRequest;
68

9+
import com.waitit.capstone.domain.image.ImageService;
710
import com.waitit.capstone.domain.manager.Host;
8-
import com.waitit.capstone.domain.manager.HostMapper;
911
import com.waitit.capstone.domain.manager.HostRepository;
1012
import com.waitit.capstone.domain.member.Entity.Member;
1113
import com.waitit.capstone.domain.member.MemberRepository;
1214
import com.waitit.capstone.global.util.PageResponse;
15+
import java.util.List;
1316
import lombok.AllArgsConstructor;
1417
import org.springframework.data.domain.Page;
1518
import org.springframework.data.domain.Pageable;
19+
import org.springframework.data.redis.core.StringRedisTemplate;
1620
import org.springframework.stereotype.Service;
21+
import org.springframework.web.multipart.MultipartFile;
1722

1823

1924
@AllArgsConstructor
@@ -23,7 +28,10 @@ public class AdminService {
2328
private final MemberRepository memberRepository;
2429
private final AdminMapper adminMapper;
2530
private final HostRepository hostRepository;
26-
private final HostMapper hostMapper;
31+
private final ImageService imageService;
32+
private final StringRedisTemplate redisTemplate;
33+
34+
2735
//모든 유저를 조회후 페이징
2836
public PageResponse<AllUserRequest> getAllUser(Pageable pageable) {
2937
Page<Member> members = memberRepository.findAll(pageable);
@@ -32,7 +40,7 @@ public PageResponse<AllUserRequest> getAllUser(Pageable pageable) {
3240
return new PageResponse<>(allUserRequests);
3341
}
3442

35-
//유저 리퀘스트 바디를 받아서 수정후 저장
43+
//유저 리퀘스트 바디를 받아서 멤버 수정후 저장
3644
public void updateMember(UpdatedRequest request) {
3745
Long memberId = Long.parseLong(request.getId());
3846
Member member = memberRepository.findMemberById(memberId);
@@ -41,19 +49,36 @@ public void updateMember(UpdatedRequest request) {
4149
memberRepository.save(member);
4250
}
4351

44-
//아이디로 삭제
52+
//아이디로 멤버삭제
4553
public void deleteMember(Long id) {
4654
memberRepository.deleteById(id);
4755
}
4856

4957
//이벤트 배너 등록
50-
//이벤트 배너 조회
58+
public void uploadEventImage(List<MultipartFile> images) {
59+
imageService.uploadEvent(images);
60+
}
61+
62+
//이벤트 배너 메인 등록
63+
public void selectBanner(Long imgId, int number) {
64+
//레디스에 imgId 받은걸 db 패스를 찾음
65+
String img = imageService.getImgPath(imgId);
66+
String redisKey = "main_banner";
67+
// 레디스 리스트의 number 인덱스에 등록
68+
redisTemplate.opsForList().set(redisKey, number, img);
69+
}
5170

5271
//모든 대기열 내역 조회
53-
public PageResponse<AllHostRequest> getAllHost(Pageable pageable){
72+
public PageResponse<AllHostRequest> getAllHost(Pageable pageable) {
5473
Page<Host> hosts = hostRepository.findAll(pageable);
5574
Page<AllHostRequest> allHostRequests = hosts.map(adminMapper::toAllHostRequest);
5675

5776
return new PageResponse<>(allHostRequests);
5877
}
78+
79+
public MainBannerResponse getEventBanner() {
80+
String redisKey = "main_banner";
81+
List<String> list = redisTemplate.opsForList().range(redisKey, 0, 4);
82+
return new MainBannerResponse("mainBanner", list);
83+
}
5984
}
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
package com.waitit.capstone.domain.admin.dto;
2+
3+
import java.util.List;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Getter;
6+
import lombok.RequiredArgsConstructor;
7+
8+
@Getter
9+
@AllArgsConstructor
10+
public class MainBannerResponse {
11+
private String banner;
12+
private List<String> imgList;
13+
}
Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,15 @@
1+
package com.waitit.capstone.domain.image;
2+
3+
import java.time.LocalDateTime;
4+
import lombok.AllArgsConstructor;
5+
import lombok.Builder;
6+
import lombok.Getter;
7+
8+
@Getter
9+
@Builder
10+
@AllArgsConstructor
11+
public class AllImageResponse {
12+
private Long id;
13+
private String dbFilePath;
14+
private LocalDateTime createdAt;
15+
}
Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package com.waitit.capstone.domain.image;
2+
3+
import jakarta.persistence.Column;
4+
import jakarta.persistence.Entity;
5+
import jakarta.persistence.GeneratedValue;
6+
import jakarta.persistence.GenerationType;
7+
import jakarta.persistence.Id;
8+
import jakarta.persistence.Table;
9+
import java.time.LocalDateTime;
10+
import lombok.AllArgsConstructor;
11+
import lombok.Builder;
12+
import lombok.Getter;
13+
import lombok.NoArgsConstructor;
14+
15+
@Getter
16+
@Entity
17+
@AllArgsConstructor
18+
@NoArgsConstructor
19+
@Table(name = "event_image")
20+
public class EventImage {
21+
22+
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
23+
private Long id;
24+
25+
private String imgPath;
26+
@Column(columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
27+
private LocalDateTime createdAt;
28+
29+
30+
public EventImage(String dbFilePath) {
31+
this.imgPath = dbFilePath;
32+
this.createdAt = LocalDateTime.now(); // 명시적으로 설정해야 함
33+
}
34+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
package com.waitit.capstone.domain.image;
2+
3+
import org.springframework.data.jpa.repository.JpaRepository;
4+
5+
public interface EventImageRepository extends JpaRepository<EventImage,Long> {
6+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package com.waitit.capstone.domain.image;
2+
3+
import org.mapstruct.Mapper;
4+
5+
@Mapper(componentModel = "spring")
6+
public interface ImageMapper {
7+
AllImageResponse toAllImageResponse(EventImage eventImage);
8+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package com.waitit.capstone.domain.image;
2+
3+
import com.waitit.capstone.global.util.PageResponse;
4+
import java.io.IOException;
5+
import java.nio.file.Files;
6+
import java.nio.file.Path;
7+
import java.nio.file.Paths;
8+
import java.util.List;
9+
import java.util.UUID;
10+
import lombok.AllArgsConstructor;
11+
import org.springframework.data.domain.Page;
12+
import org.springframework.data.domain.Pageable;
13+
import org.springframework.stereotype.Service;
14+
import org.springframework.web.multipart.MultipartFile;
15+
16+
@Service
17+
@AllArgsConstructor
18+
public class ImageService {
19+
private final EventImageRepository eventImageRepository;
20+
private final ImageMapper imageMapper;
21+
public void uploadEvent(List<MultipartFile> images){
22+
try{
23+
//이미지 파일 저장을 위한 경로 설정
24+
String uploadDir = "src/main/resources/static/uploads/events/";
25+
26+
//각 이미지 파일에 대해 업로드 및 db 저장 수행
27+
for(MultipartFile image : images){
28+
String dbFilePath = saveImage(image,uploadDir);
29+
EventImage eventImage = new EventImage(dbFilePath);
30+
eventImageRepository.save(eventImage);
31+
}
32+
33+
}catch (IOException e) {
34+
// 파일 저장 중 오류가 발생한 경우 처리
35+
e.printStackTrace();
36+
}
37+
}
38+
39+
private String saveImage(MultipartFile image, String uploadDir) throws IOException {
40+
//파일 이름 생성
41+
String fileName = UUID.randomUUID().toString().replace("-","")+"_"+image.getOriginalFilename();
42+
//실제 파일이 저장될 경로
43+
String filePath = uploadDir + fileName;
44+
//db에 저장할 경로 문자열
45+
String dbFilePath = "/uploads/events/" + fileName;
46+
47+
Path path = Paths.get(filePath);
48+
Files.createDirectories(path.getParent());
49+
Files.write(path,image.getBytes());
50+
51+
return dbFilePath;
52+
}
53+
54+
public PageResponse<AllImageResponse> getAllImage(Pageable pageable){
55+
Page<EventImage> eventImages = eventImageRepository.findAll(pageable);
56+
Page<AllImageResponse> page = eventImages.map(imageMapper::toAllImageResponse);
57+
return new PageResponse<>(page);
58+
}
59+
public String getImgPath(Long id){
60+
EventImage eventImage = eventImageRepository.findById(id).orElseThrow(()->new IllegalArgumentException("없는 이미지 입니다."));
61+
return eventImage.getImgPath();
62+
}
63+
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.waitit.capstone.global.common;
2+
3+
import jakarta.annotation.PostConstruct;
4+
import lombok.RequiredArgsConstructor;
5+
import org.springframework.data.redis.core.StringRedisTemplate;
6+
import org.springframework.stereotype.Component;
7+
8+
@Component
9+
@RequiredArgsConstructor
10+
public class RedisInitializer {
11+
private final StringRedisTemplate redisTemplate;
12+
13+
@PostConstruct
14+
public void initList() {
15+
String LIST_KEY = "main_banner";
16+
if (Boolean.FALSE.equals(redisTemplate.hasKey(LIST_KEY))) {
17+
redisTemplate.opsForList().leftPushAll(LIST_KEY, "default1","default2","default3","default4","default5");
18+
}
19+
}
20+
}

src/main/java/com/waitit/capstone/global/config/RedisConfig.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,4 +32,4 @@ public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory connection
3232
template.setConnectionFactory(connectionFactory);
3333
return template;
3434
}
35-
}
35+
}

0 commit comments

Comments
 (0)