Skip to content

Commit

Permalink
Merge pull request #79 from BbeumbungE/dev
Browse files Browse the repository at this point in the history
Deploy: v2 Release
  • Loading branch information
ah9mon authored Sep 30, 2023
2 parents 70281e4 + 1a8d188 commit 558c51c
Show file tree
Hide file tree
Showing 21 changed files with 354 additions and 30 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,6 @@
public class CanvasController {

private final CanvasConvertService canvasConvertService;
private final CanvasSseEmitterService canvasSseEmitterService;
private final S3ImageUploadService s3ImageUploadService;
private final S3PathBuildService s3PathBuildService;

Expand All @@ -46,20 +45,13 @@ public ResponseEntity<Response> updateSketchAndCanvas(
return ResponseEntity.status(HttpStatus.OK).body(response);
}

@GetMapping("/profile/{profileId}/sse")
public SseEmitter connectSseForConvertedCanvas(
@PathVariable Long profileId
){
return canvasSseEmitterService.connect(profileId);
}

@GetMapping("")
@PostMapping("/demo/tempId/{tempId}")
public ResponseEntity<Response> convertSketchToCanvasTest(
@RequestParam MultipartFile sketchFile
@RequestParam ("sketchFile") MultipartFile sketchFile,
@PathVariable String tempId
)throws IOException{
String sketchUrl = s3ImageUploadService.uploadFile(sketchFile, "rendingPage");
Response response = canvasConvertService.convertSketchToCanvasDemo(sketchUrl);
String sketchUrl = s3ImageUploadService.uploadFile(sketchFile, "demo");
Response response = canvasConvertService.convertSketchToCanvasDemo(sketchUrl, tempId);
return ResponseEntity.ok(response);
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@
import com.siliconvalley.domain.item.subject.domain.Subject;
import com.siliconvalley.domain.profile.dao.ProfileFindDao;
import com.siliconvalley.domain.profile.domain.Profile;
import com.siliconvalley.domain.rabbitMQ.dto.DemoConversionResponse;
import com.siliconvalley.domain.rabbitMQ.dto.SketchConversionResponse;
import com.siliconvalley.domain.rabbitMQ.service.ConvertRequestSender;
import com.siliconvalley.domain.sse.application.CanvasSseEmitterFInder;
import com.siliconvalley.domain.sse.application.CanvasSseEmitterFinder;
import com.siliconvalley.domain.sse.application.ConvertResultSender;
import com.siliconvalley.global.common.code.CommonCode;
import com.siliconvalley.global.common.dto.Response;
Expand All @@ -33,7 +34,7 @@ public class CanvasConvertService {
private final ConvertRequestSender convertRequestSender;
private final CanvasUpdateService canvasUpdateService;
private final CanvasCreateService canvasCreateService;
private final CanvasSseEmitterFInder canvasSseEmitterFInder;
private final CanvasSseEmitterFinder canvasSseEmitterFinder;
private final ConvertResultSender convertResultSender;


Expand All @@ -44,7 +45,8 @@ public Response convertSketchToCanvas(Long profileId, Long subjectId, String ske
return convertRequestSender.sendSketchConversionRequest(sketch, canvas.getId(), profileId, subject);
}

public Response convertSketchToCanvasDemo(String sketch){
public Response convertSketchToCanvasDemo(String sketch, String tempId){
convertRequestSender.sendDemoConversionRequest(sketch, tempId);
return Response.of(CommonCode.GOOD_REQUEST, null);
}

Expand All @@ -53,11 +55,14 @@ public Response updateSketchAndCanvas(Long profileId, Long canvasId, String sket
return canvasUpdateService.updateSketchAndCanvas(canvas, sketch, profileId);
}

public void updateConvertedData(SketchConversionResponse response){
public void updateConvertedData(SketchConversionResponse response){
Canvas canvas = canvasFindDao.findById(response.getCanvasId());
canvas.updateCanvas(response.getCanvasUrl());
Long profileId = canvas.getProfile().getId();
ConvertEventDto convertEventDto = new ConvertEventDto(canvas.getId(), response.getCanvasUrl());
convertResultSender.send(canvasSseEmitterFInder.findByProfileId(profileId), convertEventDto, profileId, "drawing");
convertResultSender.send(canvasSseEmitterFinder.findByProfileId(profileId), convertEventDto, profileId, "drawing");
}
public void sendConvertedDemoCanvas(DemoConversionResponse response){
convertResultSender.send(canvasSseEmitterFinder.findByTempId(response.getTempId()), response.getCanvasUrl(), response.getTempId(), "demo");
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,11 +14,18 @@ public class DetectingTestController {

private final VisionDetectingService visionDetectingService;

@GetMapping("{canvasId}")
@GetMapping("/{canvasId}")
public ResponseEntity<Response> test(
@PathVariable Long canvasId
){
return ResponseEntity.ok(visionDetectingService.testLabelDetecting(canvasId));
}

@GetMapping("/{canvasId}/score")
public ResponseEntity<Response> scoreTest(
@PathVariable Long canvasId
){
return ResponseEntity.ok(Response.of(CommonCode.GOOD_REQUEST, visionDetectingService.calculateCanvasScore(canvasId).getScoreValue()));
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ public class VisionDetectingService {
public Score calculateCanvasScore(Long canvasId) {
Canvas canvas = canvasFindDao.findById(canvasId);
Map<String, Float> detectResult = visionService.detectLabels(canvas.getCanvas());
if (detectResult.size() == 0 || canvas.getSubject().getPix2Pix().getVisionName().equals(null)) {return Score.LOW;}
if (detectResult.size() == 0) {return Score.LOW;}
Float detectionScore = detectResult.get(canvas.getSubject().getPix2Pix().getVisionName());

return Score.determineScore(detectionScore);
Expand All @@ -41,7 +41,6 @@ public Response testLabelDetecting(Long canvasId){
}

return Response.of(CommonCode.GOOD_REQUEST, results);

}

}
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@
public class DemoConversionRequest {
private String sketchUrl;
private String modelName;
private String tempId;

public DemoConversionRequest(String sketchUrl, String modelName){
public DemoConversionRequest(String sketchUrl, String modelName, String tempId){
this.sketchUrl = sketchUrl;
this.modelName = modelName;
this.tempId = tempId;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,12 @@
@NoArgsConstructor(access = AccessLevel.PRIVATE)
public class DemoConversionResponse {
private String canvasUrl;
private String status;
private String tempId;

public DemoConversionResponse(String canvasUrl, String status, String tempId){
this.canvasUrl = canvasUrl;
this.status = status;
this.tempId = tempId;
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,8 @@ public Response sendSketchConversionRequest(String sketchUrl, Long canvasId, Lon
return Response.of(RabbitMQCode.CONVERSION_REQUEST_SUCCESS, new CanvasConvertResponse(canvasId, rankCachingService.getTopPostThisWeek(subject.getId())));
}

public Response sendDemoConversionRequest(String sketchUrl){
DemoConversionRequest request = new DemoConversionRequest(sketchUrl, "panda");
public Response sendDemoConversionRequest(String sketchUrl, String tempId){
DemoConversionRequest request = new DemoConversionRequest(sketchUrl, "panda", tempId);
rabbitTemplate.convertAndSend(exchange, "demo_conversion_request_queue", request);
return Response.of(RabbitMQCode.CONVERSION_REQUEST_SUCCESS);
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import com.rabbitmq.client.Channel;
import com.siliconvalley.domain.canvas.service.CanvasConvertService;
import com.siliconvalley.domain.rabbitMQ.dto.DemoConversionResponse;
import com.siliconvalley.domain.rabbitMQ.dto.SketchConversionResponse;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
Expand Down Expand Up @@ -31,4 +32,16 @@ public void receiveMessage(SketchConversionResponse response, Message message, C
}
}

@RabbitListener(queues = "demo_conversion_response_queue", ackMode = "MANUAL")
public void receiveMessage(DemoConversionResponse response, Message message, Channel channel) throws IOException {
log.info("Received message: {}", response);
try {
canvasConvertService.sendConvertedDemoCanvas(response);
channel.basicAck(message.getMessageProperties().getDeliveryTag(), false); // 메시지 승인
} catch (Exception e) {
log.error("Error processing the message: {}", e.getMessage());
channel.basicNack(message.getMessageProperties().getDeliveryTag(), false, false); // 메시지 거부, 글로벌 핸들링
}
}

}
27 changes: 25 additions & 2 deletions src/main/java/com/siliconvalley/domain/sse/api/SseConnectApi.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package com.siliconvalley.domain.sse.api;

import com.siliconvalley.domain.sse.application.CanvasSseEmitterService;
import com.siliconvalley.domain.sse.application.SseEmitterService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
Expand All @@ -11,16 +12,38 @@
public class SseConnectApi {

private final SseEmitterService sseEmitterService;
private final CanvasSseEmitterService canvasSseEmitterService;

/**
* SSE Connect
* Notification SSE Connect
**/
@GetMapping("/connects/profiles/{profileId}")
@GetMapping("/notifications/profiles/{profileId}")
public SseEmitter connect(
@PathVariable(name = "profileId") Long profileId,
@RequestHeader(value = "Last-Event_ID", required = false, defaultValue = "") String lastEventId
)
{
return sseEmitterService.connect(profileId, lastEventId);
}

/**
* Canvas SSE Connect
**/
@GetMapping("canvases/profile/{profileId}")
public SseEmitter connectSseForConvertedCanvas(
@PathVariable Long profileId
){
return canvasSseEmitterService.connect(profileId);
}

/**
* Demo Canvas SSE Connect
**/
@GetMapping("canvases/demoId/{tempId}")
public SseEmitter connectSseForConvertedDemoCanvas(
@PathVariable String tempId
){
return canvasSseEmitterService.connect(tempId);
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.siliconvalley.domain.sse.api;

import com.siliconvalley.domain.sse.application.TempIdCreateService;
import com.siliconvalley.global.common.code.CommonCode;
import com.siliconvalley.global.common.dto.Response;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import java.util.UUID;

@RestController
@RequestMapping("/api")
@RequiredArgsConstructor
public class SseTempIdController {

private final TempIdCreateService tempIdCreateService;

@PostMapping("/tempId")
public ResponseEntity<Response> createTempId(){
return ResponseEntity.status(HttpStatus.CREATED).body(Response.of(CommonCode.SUCCESS_CREATE, tempIdCreateService.createTempIdForSse()));
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.siliconvalley.domain.sse.application;

import com.siliconvalley.domain.sse.repository.CanvasSseEmitterRepository;
import com.siliconvalley.domain.sse.repository.DemoCanvasSseEmitterRepository;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
Expand All @@ -12,7 +13,9 @@
public class CanvasSseEmitterCreater {

private final CanvasSseEmitterRepository canvasSseEmitterRepository;
private final DemoCanvasSseEmitterRepository demoCanvasSseEmitterRepository;
public static final long EXPIRATION_TIME = 600000;
public static final long DEMO_EXPIRATION_TIME = 120000;
public SseEmitter createEmitter(Long profileId) {

SseEmitter sseEmitter = new SseEmitter(EXPIRATION_TIME);
Expand All @@ -34,4 +37,26 @@ public SseEmitter createEmitter(Long profileId) {

return sseEmitter;
}

public SseEmitter createEmitter(String tempId){

SseEmitter sseEmitter = new SseEmitter(DEMO_EXPIRATION_TIME);
demoCanvasSseEmitterRepository.save(tempId, sseEmitter);

// 연결 실패시 삭제
sseEmitter.onCompletion(() -> {
log.info("onCompletion callback");
demoCanvasSseEmitterRepository.delete(tempId);
});
sseEmitter.onTimeout(() -> {
log.info("onTimeout callback");
demoCanvasSseEmitterRepository.delete(tempId);
});
sseEmitter.onError((e) -> {
log.info("on" + e.getMessage() + " callback");
demoCanvasSseEmitterRepository.delete(tempId);
});

return sseEmitter;
}
}
Original file line number Diff line number Diff line change
@@ -1,16 +1,19 @@
package com.siliconvalley.domain.sse.application;

import com.siliconvalley.domain.sse.repository.CanvasSseEmitterRepository;
import com.siliconvalley.domain.sse.repository.DemoCanvasSseEmitterRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;

@Component
@RequiredArgsConstructor
public class CanvasSseEmitterFInder {
public class CanvasSseEmitterFinder {
private final CanvasSseEmitterRepository canvasSseEmitterRepository;
private final DemoCanvasSseEmitterRepository demoCanvasSseEmitterRepository;

public SseEmitter findByProfileId(Long profileId){
return canvasSseEmitterRepository.findById(profileId);
}
public SseEmitter findByTempId(String tempId) {return demoCanvasSseEmitterRepository.findById(tempId);}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package com.siliconvalley.domain.sse.application;

import com.siliconvalley.domain.sse.dto.SseConnectSuccessResponse;
import com.siliconvalley.domain.sse.repository.CanvasSseEmitterRepository;
import com.siliconvalley.domain.sse.repository.DemoCanvasSseEmitterRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Service;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
Expand All @@ -11,6 +11,7 @@
public class CanvasSseEmitterService {

private final CanvasSseEmitterRepository canvasSseEmitterRepository;
private final DemoCanvasSseEmitterRepository demoCanvasSseEmitterRepository;
private final CanvasSseEmitterCreater canvasSseEmitterCreater;

public SseEmitter connect(Long profileId) {
Expand All @@ -23,4 +24,15 @@ public SseEmitter connect(Long profileId) {

return sseEmitter;
}

public SseEmitter connect(String tempId){

SseEmitter preSseEmitters = demoCanvasSseEmitterRepository.findById(tempId);
if (preSseEmitters != null) {
demoCanvasSseEmitterRepository.delete(tempId);
}
SseEmitter sseEmitter = canvasSseEmitterCreater.createEmitter(tempId);

return sseEmitter;
}
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.siliconvalley.domain.sse.application;

import com.siliconvalley.domain.sse.repository.CanvasSseEmitterRepository;
import com.siliconvalley.domain.sse.repository.DemoCanvasSseEmitterRepository;
import lombok.RequiredArgsConstructor;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.mvc.method.annotation.SseEmitter;
Expand All @@ -12,6 +13,7 @@
public class ConvertResultSender {

private final CanvasSseEmitterRepository canvasSseEmitterRepository;
private final DemoCanvasSseEmitterRepository demoCanvasSseEmitterRepository;

public void send(SseEmitter sseEmitter, Object data, Long profileId, String eventName) {
try {
Expand All @@ -25,4 +27,15 @@ public void send(SseEmitter sseEmitter, Object data, Long profileId, String even
}
}

public void send(SseEmitter sseEmitter, Object data, String tempId, String eventName){
try {
sseEmitter.send(SseEmitter.event()
.name(eventName)
.data(data));// 재연결 시도
} catch (IOException exception) {
demoCanvasSseEmitterRepository.delete(tempId);
throw new RuntimeException("SSE Connect Fail");
}
}

}
Loading

0 comments on commit 558c51c

Please sign in to comment.