Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Binary file added .DS_Store
Binary file not shown.
Binary file added src/.DS_Store
Binary file not shown.
Binary file added src/main/.DS_Store
Binary file not shown.
14 changes: 14 additions & 0 deletions src/main/java/com/uggthon/team01/config/AppConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,14 @@
package com.uggthon.team01.config;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestTemplate;

@Configuration
public class AppConfig {

@Bean
public RestTemplate restTemplate() {
return new RestTemplate();
}
}
2 changes: 1 addition & 1 deletion src/main/java/com/uggthon/team01/config/SwaggerConfig.java
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public OpenAPI customOpenAPI() {
localServer.setDescription("Local Server");

Server prodServer = new Server();
prodServer.setUrl("http://13.60.193.191:8080/swagger-ui/index.html");
prodServer.setUrl("http://54.180.121.231:8080/swagger-ui/index.html");
prodServer.setDescription("Production Server");

return new OpenAPI()
Expand Down
18 changes: 18 additions & 0 deletions src/main/java/com/uggthon/team01/config/WebConfig.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
package com.uggthon.team01.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.CorsRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
registry
.addMapping("/**")
.allowedOrigins("http://localhost:5173", "https://ug-gthon-team1-fe.vercel.app")
.allowedMethods("GET", "POST")
.allowedHeaders("*")
.allowCredentials(true);
}
}
37 changes: 37 additions & 0 deletions src/main/java/com/uggthon/team01/controller/FileController.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
package com.uggthon.team01.controller;

import java.io.IOException;

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import com.uggthon.team01.dto.GenerateRequestDto;
import com.uggthon.team01.dto.GenerateResponseDto;
import com.uggthon.team01.service.AIService;
import com.uggthon.team01.service.FileService;

import lombok.RequiredArgsConstructor;

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

private final FileService fileService;
private final AIService aiService;

@PostMapping("/file")
public ResponseEntity<String> uploadFile(@RequestParam("file") MultipartFile file)
throws IOException {
String imageId = fileService.uploadFile(file);
return ResponseEntity.ok(imageId);
}

@PostMapping("/generate")
public ResponseEntity<GenerateResponseDto> generateImages(
@RequestBody GenerateRequestDto requestDto) {
GenerateResponseDto responseDto = aiService.generateImages(requestDto);
return ResponseEntity.ok(responseDto);
}
}
13 changes: 13 additions & 0 deletions src/main/java/com/uggthon/team01/dto/GenerateRequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package com.uggthon.team01.dto;

import java.util.List;

import lombok.Data;

@Data
public class GenerateRequestDto {
private List<String> scenario1;
private List<String> scenario2;
private Long scenario3; // img아이디
private List<Long> scenario4;
}
26 changes: 26 additions & 0 deletions src/main/java/com/uggthon/team01/dto/GenerateResponseDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
package com.uggthon.team01.dto;

import java.util.List;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class GenerateResponseDto {
private List<OutfitOption> outfitOptions;

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public static class OutfitOption {
private String topImageUrl;
private String bottomImageUrl;
private String description;
}
}
12 changes: 12 additions & 0 deletions src/main/java/com/uggthon/team01/dto/ImageUploadRequestDto.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
package com.uggthon.team01.dto;

import org.springframework.web.multipart.MultipartFile;

import lombok.Data;

@Data
public class ImageUploadRequestDto {

private MultipartFile file;
private String scenario;
}
21 changes: 21 additions & 0 deletions src/main/java/com/uggthon/team01/entity/Image.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
package com.uggthon.team01.entity;

import jakarta.persistence.Entity;
import jakarta.persistence.Id;

import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

@Entity
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class Image {

@Id private String id;

private String url;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package com.uggthon.team01.repository;

import org.springframework.data.jpa.repository.JpaRepository;

import com.uggthon.team01.entity.Image;

public interface ImageRepository extends JpaRepository<Image, String> {}
17 changes: 17 additions & 0 deletions src/main/java/com/uggthon/team01/service/AIService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
package com.uggthon.team01.service;

import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import com.uggthon.team01.dto.GenerateRequestDto;
import com.uggthon.team01.dto.GenerateResponseDto;

@Service
public class AIService {

public GenerateResponseDto generateImages(GenerateRequestDto requestDto) {
RestTemplate restTemplate = new RestTemplate();
String aiServerUrl = "http://ai-server-url.com/generate"; // AI 서버 URL
return restTemplate.postForObject(aiServerUrl, requestDto, GenerateResponseDto.class);
}
}
32 changes: 32 additions & 0 deletions src/main/java/com/uggthon/team01/service/FileService.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package com.uggthon.team01.service;

import java.io.IOException;
import java.util.UUID;

import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import com.uggthon.team01.entity.Image;
import com.uggthon.team01.repository.ImageRepository;
import com.uggthon.team01.util.S3Uploader;

import lombok.RequiredArgsConstructor;

@RequiredArgsConstructor
@Service
public class FileService {

private final S3Uploader s3Uploader;
private final ImageRepository imageRepository;

public String uploadFile(MultipartFile file) throws IOException {
String imageUrl = s3Uploader.upload(file);
String imageId = UUID.randomUUID().toString();

// DB 저장 로직
Image image = new Image(imageId, imageUrl); // Image 객체 생성
imageRepository.save(image); // DB에 저장

return imageId;
}
}
53 changes: 53 additions & 0 deletions src/main/java/com/uggthon/team01/util/S3Uploader.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package com.uggthon.team01.util;

import java.io.File;
import java.io.IOException;
import java.util.Objects;
import java.util.UUID;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import org.springframework.web.multipart.MultipartFile;

import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.model.PutObjectRequest;

@Component
public class S3Uploader {

private final AmazonS3 amazonS3;

@Autowired
public S3Uploader(AmazonS3 amazonS3) {
this.amazonS3 = amazonS3;
}

public String upload(MultipartFile file) throws IOException {
String bucketName = "your-bucket-name"; // 설정한 버킷명 사용
String key = "images/" + UUID.randomUUID() + "-" + file.getOriginalFilename();

// MultipartFile을 File로 변환
File convertedFile = convertMultipartFileToFile(file);

try {
// S3에 파일 업로드
amazonS3.putObject(new PutObjectRequest(bucketName, key, convertedFile));
// 파일 업로드 후 URL 반환
return amazonS3.getUrl(bucketName, key).toString();
} catch (Exception e) {
throw new RuntimeException("S3 업로드 실패", e);
} finally {
// 업로드 완료됐으면 로컬 시스템에 저장된 파일 삭제
convertedFile.delete();
}
}

// MultipartFile을 File로 변환하는 메서드
private File convertMultipartFileToFile(MultipartFile file) throws IOException {
// 업로드된 파일의 원본 파일 이름을 가져옴
File convertedFile = new File(Objects.requireNonNull(file.getOriginalFilename()));
// 파일을 로컬 시스템에 저장
file.transferTo(convertedFile);
return convertedFile;
}
}
Loading