Skip to content

Commit 70c5194

Browse files
committed
refactor: DemoController 비즈니스 로직 DemoService로 분리
1 parent 07099b7 commit 70c5194

2 files changed

Lines changed: 72 additions & 50 deletions

File tree

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,79 +1,32 @@
11
package com.semosan.api.domain.demo.controller;
22

33
import com.semosan.api.common.config.DemoProperties;
4-
import com.semosan.api.common.config.MinioProperties;
54
import com.semosan.api.common.response.ApiResponse;
65
import com.semosan.api.common.status.SuccessStatus;
76
import com.semosan.api.domain.demo.controller.docs.DemoControllerDocs;
8-
import com.semosan.api.domain.tracking.entity.TrackingPhoto;
9-
import com.semosan.api.domain.tracking.repository.TrackingPhotoRepository;
10-
import io.minio.GetPresignedObjectUrlArgs;
11-
import io.minio.MinioClient;
12-
import io.minio.http.Method;
7+
import com.semosan.api.domain.demo.service.DemoService;
138
import lombok.RequiredArgsConstructor;
14-
import lombok.extern.slf4j.Slf4j;
159
import org.springframework.boot.context.properties.EnableConfigurationProperties;
1610
import org.springframework.http.ResponseEntity;
1711
import org.springframework.web.bind.annotation.*;
1812

19-
import java.util.ArrayList;
20-
import java.util.Collections;
2113
import java.util.List;
22-
import java.util.concurrent.TimeUnit;
2314

24-
@Slf4j
2515
@RestController
2616
@RequestMapping("/api/demo")
2717
@RequiredArgsConstructor
2818
@EnableConfigurationProperties(DemoProperties.class)
2919
public class DemoController implements DemoControllerDocs {
3020

31-
private static final String BUCKET = "tracking-photos";
32-
33-
private final DemoProperties demoProperties;
34-
private final MinioClient minioClient;
35-
private final MinioProperties minioProperties;
36-
private final TrackingPhotoRepository trackingPhotoRepository;
21+
private final DemoService demoService;
3722

3823
@GetMapping("/tracking/sessions/{sessionId}/photos")
3924
@Override
4025
public ResponseEntity<ApiResponse<List<String>>> getDemoPhotos(
4126
@PathVariable Long sessionId,
4227
@RequestParam(defaultValue = "3") int count
4328
) {
44-
List<String> shuffled = new ArrayList<>(demoProperties.photoFilenames());
45-
Collections.shuffle(shuffled);
46-
List<String> randomUrls = shuffled.subList(0, Math.min(count, shuffled.size()))
47-
.stream()
48-
.map(this::presignedGetUrl)
49-
.toList();
50-
51-
List<String> uploadedUrls = trackingPhotoRepository
52-
.findByTrackingSession_IdOrderByMilestoneIndexAsc(sessionId)
53-
.stream()
54-
.map(TrackingPhoto::getImageUrl)
55-
.toList();
56-
57-
List<String> combined = new ArrayList<>(randomUrls);
58-
combined.addAll(uploadedUrls);
59-
29+
List<String> combined = demoService.getDemoPhotos(sessionId, count);
6030
return ApiResponse.success(SuccessStatus.TRACKING_PHOTO_LIST_SUCCESS, combined);
6131
}
62-
63-
private String presignedGetUrl(String objectKey) {
64-
try {
65-
String url = minioClient.getPresignedObjectUrl(
66-
GetPresignedObjectUrlArgs.builder()
67-
.method(Method.GET)
68-
.bucket(BUCKET)
69-
.object(objectKey)
70-
.expiry(1, TimeUnit.HOURS)
71-
.build()
72-
);
73-
return url.replace(minioProperties.endpoint(), minioProperties.publicUrl());
74-
} catch (Exception e) {
75-
log.warn("Failed to generate presigned URL for {}", objectKey, e);
76-
return minioProperties.publicUrl() + "/" + BUCKET + "/" + objectKey;
77-
}
78-
}
7932
}
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
2+
package com.semosan.api.domain.demo.service;
3+
4+
import com.semosan.api.common.config.DemoProperties;
5+
import com.semosan.api.common.config.MinioProperties;
6+
import com.semosan.api.domain.tracking.entity.TrackingPhoto;
7+
import com.semosan.api.domain.tracking.repository.TrackingPhotoRepository;
8+
import io.minio.GetPresignedObjectUrlArgs;
9+
import io.minio.MinioClient;
10+
import io.minio.http.Method;
11+
import lombok.RequiredArgsConstructor;
12+
import lombok.extern.slf4j.Slf4j;
13+
import org.springframework.stereotype.Service;
14+
import org.springframework.transaction.annotation.Transactional;
15+
16+
import java.util.ArrayList;
17+
import java.util.Collections;
18+
import java.util.List;
19+
import java.util.concurrent.TimeUnit;
20+
21+
@Slf4j
22+
@Service
23+
@RequiredArgsConstructor
24+
@Transactional(readOnly = true)
25+
public class DemoService {
26+
27+
private static final String BUCKET = "tracking-photos";
28+
29+
private final DemoProperties demoProperties;
30+
private final MinioClient minioClient;
31+
private final MinioProperties minioProperties;
32+
private final TrackingPhotoRepository trackingPhotoRepository;
33+
34+
public List<String> getDemoPhotos(Long sessionId, int count) {
35+
List<String> shuffled = new ArrayList<>(demoProperties.photoFilenames());
36+
Collections.shuffle(shuffled);
37+
List<String> randomUrls = shuffled.subList(0, Math.min(count, shuffled.size()))
38+
.stream()
39+
.map(this::presignedGetUrl)
40+
.toList();
41+
42+
List<String> uploadedUrls = trackingPhotoRepository
43+
.findByTrackingSession_IdOrderByMilestoneIndexAsc(sessionId)
44+
.stream()
45+
.map(TrackingPhoto::getImageUrl)
46+
.toList();
47+
48+
List<String> combined = new ArrayList<>(randomUrls);
49+
combined.addAll(uploadedUrls);
50+
return combined;
51+
}
52+
53+
private String presignedGetUrl(String objectKey) {
54+
try {
55+
String url = minioClient.getPresignedObjectUrl(
56+
GetPresignedObjectUrlArgs.builder()
57+
.method(Method.GET)
58+
.bucket(BUCKET)
59+
.object(objectKey)
60+
.expiry(1, TimeUnit.HOURS)
61+
.build()
62+
);
63+
return url.replace(minioProperties.endpoint(), minioProperties.publicUrl());
64+
} catch (Exception e) {
65+
log.warn("Failed to generate presigned URL for {}", objectKey, e);
66+
return minioProperties.publicUrl() + "/" + BUCKET + "/" + objectKey;
67+
}
68+
}
69+
}

0 commit comments

Comments
 (0)