diff --git a/.gitmodules b/.gitmodules index aa8c6b31b..3c09b9341 100644 --- a/.gitmodules +++ b/.gitmodules @@ -2,11 +2,3 @@ path = backend/src/main/resources/config url = git@github.com:zzimkkong/config.git branch = main -[submodule "s3proxy/src/main/resources/s3proxy-config"] - path = s3proxy/src/main/resources/s3proxy-config - url = git@github.com:zzimkkong/s3proxy-config.git - branch = main -[submodule "s3proxy/src/main/resources/config"] - path = s3proxy/src/main/resources/config - url = git@github.com:zzimkkong/config.git - branch = main diff --git a/backend/build.gradle b/backend/build.gradle index 19d3cd838..304f0ea30 100644 --- a/backend/build.gradle +++ b/backend/build.gradle @@ -46,12 +46,6 @@ dependencies { // Jwt implementation 'io.jsonwebtoken:jjwt:0.9.1' - // SvgToPng - implementation 'org.apache.xmlgraphics:batik-all:1.12' - implementation 'org.apache.xmlgraphics:xmlgraphics-commons:2.4' - implementation 'xml-apis:xml-apis:1.4.01' - implementation 'xml-apis:xml-apis-ext:1.3.04' - // Cryptor implementation 'commons-codec:commons-codec:1.15' diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/DataLoader.java b/backend/src/main/java/com/woowacourse/zzimkkong/DataLoader.java index da635b8b3..9276ee639 100644 --- a/backend/src/main/java/com/woowacourse/zzimkkong/DataLoader.java +++ b/backend/src/main/java/com/woowacourse/zzimkkong/DataLoader.java @@ -48,7 +48,7 @@ public void run(String... args) { new Map( "루터회관", "{'id': '1', 'type': 'polyline', 'fill': '', 'stroke': 'rgba(111, 111, 111, 1)', 'points': '['60,250', '1,231', '242,252']', 'd': '[]', 'transform': ''}", - "https://d1dgzmdd5f1fx6.cloudfront.net/thumbnails-local/1.png", + "프론트 강의실1프론트 강의실 2회의실 3회의실 4회의실 51234방송실전화백엔드 강의실회의실 1회의실 25트랙방", pobi) ); diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/config/S3ProxyConfig.java b/backend/src/main/java/com/woowacourse/zzimkkong/config/S3ProxyConfig.java deleted file mode 100644 index 68825ba00..000000000 --- a/backend/src/main/java/com/woowacourse/zzimkkong/config/S3ProxyConfig.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.woowacourse.zzimkkong.config; - -import com.woowacourse.zzimkkong.infrastructure.thumbnail.S3ProxyUploader; -import com.woowacourse.zzimkkong.infrastructure.thumbnail.StorageUploader; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.context.annotation.PropertySource; -import org.springframework.web.reactive.function.client.WebClient; - -@Configuration -@PropertySource("classpath:config/s3proxy.properties") -public class S3ProxyConfig { - private final WebClient webClient; - - public S3ProxyConfig(final WebClient webClient) { - this.webClient = webClient; - } - - @Bean(name = "storageUploader") - @Profile("prod") - public StorageUploader storageUploaderProd( - @Value("${s3proxy.server-uri.prod}") final String serverUri, - @Value("${s3proxy.secret-key.prod}") final String secretKey) { - return new S3ProxyUploader(serverUri, secretKey, webClient); - } - - @Bean(name = "storageUploader") - @Profile({"dev", "local", "test"}) - public StorageUploader storageUploaderDev( - @Value("${s3proxy.server-uri.dev}") final String serverUri, - @Value("${s3proxy.secret-key.dev}") final String secretKey) { - return new S3ProxyUploader(serverUri, secretKey, webClient); - } -} diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/config/warmup/WarmUpScheduler.java b/backend/src/main/java/com/woowacourse/zzimkkong/config/warmup/WarmUpScheduler.java deleted file mode 100644 index 120976f30..000000000 --- a/backend/src/main/java/com/woowacourse/zzimkkong/config/warmup/WarmUpScheduler.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.woowacourse.zzimkkong.config.warmup; - -import com.woowacourse.zzimkkong.infrastructure.warmup.Warmer; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.scheduling.annotation.EnableScheduling; -import org.springframework.scheduling.annotation.Scheduled; - -import javax.annotation.PostConstruct; - -@EnableScheduling -@Configuration -@Profile("!test") -public class WarmUpScheduler { - private Warmer warmer; - - public WarmUpScheduler(final Warmer warmer) { - this.warmer = warmer; - } - - @Scheduled(fixedDelay = 60 * 60 * 1000) - public void warmUp() { - warmer.warmUp(); - } -} diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/config/warmup/WarmerConfig.java b/backend/src/main/java/com/woowacourse/zzimkkong/config/warmup/WarmerConfig.java deleted file mode 100644 index 2cf14e110..000000000 --- a/backend/src/main/java/com/woowacourse/zzimkkong/config/warmup/WarmerConfig.java +++ /dev/null @@ -1,45 +0,0 @@ -package com.woowacourse.zzimkkong.config.warmup; - -import com.woowacourse.zzimkkong.domain.SlackUrl; -import com.woowacourse.zzimkkong.infrastructure.thumbnail.BatikConverter; -import com.woowacourse.zzimkkong.infrastructure.warmup.Warmer; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.context.annotation.PropertySource; -import org.springframework.web.reactive.function.client.WebClient; - -@Configuration -@PropertySource("classpath:config/s3proxy.properties") -@Profile("!test") -public class WarmerConfig { - private final BatikConverter batikConverter; - private final SlackUrl slackUrl; - private final WebClient webClient; - - public WarmerConfig( - final BatikConverter batikConverter, - final SlackUrl slackUrl, - final WebClient webClient) { - this.batikConverter = batikConverter; - this.slackUrl = slackUrl; - this.webClient = webClient; - } - - @Bean(name = "warmer") - @Profile("prod") - public Warmer warmerProd( - @Value("${s3proxy.server-uri.prod}") final String serverUri, - @Value("${s3proxy.secret-key.prod}") final String secretKey) { - return new Warmer(batikConverter, slackUrl, webClient, serverUri, secretKey); - } - - @Bean(name = "warmer") - @Profile({"dev", "local"}) - public Warmer warmerDev( - @Value("${s3proxy.server-uri.dev}") final String serverUri, - @Value("${s3proxy.secret-key.dev}") final String secretKey) { - return new Warmer(batikConverter, slackUrl, webClient, serverUri, secretKey); - } -} diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/domain/Map.java b/backend/src/main/java/com/woowacourse/zzimkkong/domain/Map.java index 863dfe519..ca0a58000 100644 --- a/backend/src/main/java/com/woowacourse/zzimkkong/domain/Map.java +++ b/backend/src/main/java/com/woowacourse/zzimkkong/domain/Map.java @@ -26,7 +26,7 @@ public class Map { @Column(nullable = false) @Lob - private String mapImageUrl; + private String thumbnail; @ManyToOne @JoinColumn(name = "member_id", foreignKey = @ForeignKey(name = "fk_map_member"), nullable = false) @@ -35,10 +35,10 @@ public class Map { @OneToMany(mappedBy = "map", cascade = CascadeType.REMOVE, fetch = FetchType.LAZY, orphanRemoval = true) private List spaces = new ArrayList<>(); - public Map(final String name, final String mapDrawing, final String mapImageUrl, final Member member) { + public Map(final String name, final String mapDrawing, final String thumbnail, final Member member) { this.name = name; this.mapDrawing = mapDrawing; - this.mapImageUrl = mapImageUrl; + this.thumbnail = thumbnail; this.member = member; if (member != null) { @@ -46,8 +46,8 @@ public Map(final String name, final String mapDrawing, final String mapImageUrl, } } - public Map(final Long id, final String name, final String mapDrawing, final String mapImageUrl, final Member member) { - this(name, mapDrawing, mapImageUrl, member); + public Map(final Long id, final String name, final String mapDrawing, final String thumbnail, final Member member) { + this(name, mapDrawing, thumbnail, member); this.id = id; } @@ -71,8 +71,8 @@ public Optional findSpaceById(final Long spaceId) { .findFirst(); } - public void updateImageUrl(final String mapImageUrl) { - this.mapImageUrl = mapImageUrl; + public void updateThumbnail(final String thumbnail) { + this.thumbnail = thumbnail; } public void addSpace(final Space space) { diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/dto/map/MapCreateUpdateRequest.java b/backend/src/main/java/com/woowacourse/zzimkkong/dto/map/MapCreateUpdateRequest.java index 94d172cf9..8b4ff174d 100644 --- a/backend/src/main/java/com/woowacourse/zzimkkong/dto/map/MapCreateUpdateRequest.java +++ b/backend/src/main/java/com/woowacourse/zzimkkong/dto/map/MapCreateUpdateRequest.java @@ -17,11 +17,11 @@ public class MapCreateUpdateRequest { private String mapDrawing; @NotBlank(message = EMPTY_MESSAGE) - private String mapImageSvg; + private String thumbnail; - public MapCreateUpdateRequest(final String mapName, final String mapDrawing, final String mapImageSvg) { + public MapCreateUpdateRequest(final String mapName, final String mapDrawing, final String thumbnail) { this.mapName = mapName; this.mapDrawing = mapDrawing; - this.mapImageSvg = mapImageSvg; + this.thumbnail = thumbnail; } } diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/dto/map/MapFindResponse.java b/backend/src/main/java/com/woowacourse/zzimkkong/dto/map/MapFindResponse.java index ea4a04dcc..381cb3d88 100644 --- a/backend/src/main/java/com/woowacourse/zzimkkong/dto/map/MapFindResponse.java +++ b/backend/src/main/java/com/woowacourse/zzimkkong/dto/map/MapFindResponse.java @@ -10,32 +10,32 @@ public class MapFindResponse { private Long mapId; private String mapName; private String mapDrawing; - private String mapImageUrl; + private String thumbnail; private String sharingMapId; private String managerEmail; private MapFindResponse(final Long mapId, final String mapName, final String mapDrawing, - final String mapImageUrl, + final String thumbnail, final String sharingMapId) { this.mapId = mapId; this.mapName = mapName; this.mapDrawing = mapDrawing; - this.mapImageUrl = mapImageUrl; + this.thumbnail = thumbnail; this.sharingMapId = sharingMapId; } private MapFindResponse(final Long mapId, final String mapName, final String mapDrawing, - final String mapImageUrl, + final String thumbnail, final String sharingMapId, final String managerEmail) { this.mapId = mapId; this.mapName = mapName; this.mapDrawing = mapDrawing; - this.mapImageUrl = mapImageUrl; + this.thumbnail = thumbnail; this.sharingMapId = sharingMapId; this.managerEmail = managerEmail; } @@ -46,7 +46,7 @@ public static MapFindResponse of(final Map map, map.getId(), map.getName(), map.getMapDrawing(), - map.getMapImageUrl(), + map.getThumbnail(), sharingMapId ); } @@ -57,7 +57,7 @@ public static MapFindResponse ofAdmin(final Map map, map.getId(), map.getName(), map.getMapDrawing(), - map.getMapImageUrl(), + map.getThumbnail(), sharingMapId, map.getMember().getEmail() ); diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/BatikConverter.java b/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/BatikConverter.java deleted file mode 100644 index 9fa382f04..000000000 --- a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/BatikConverter.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.woowacourse.zzimkkong.infrastructure.thumbnail; - -import com.woowacourse.zzimkkong.config.logaspect.LogMethodExecutionTime; -import com.woowacourse.zzimkkong.exception.infrastructure.SvgToPngConvertException; -import org.apache.batik.transcoder.TranscoderException; -import org.apache.batik.transcoder.TranscoderInput; -import org.apache.batik.transcoder.TranscoderOutput; -import org.apache.batik.transcoder.image.PNGTranscoder; -import org.springframework.stereotype.Component; - -import java.io.InputStream; -import java.io.OutputStream; - -@Component -@LogMethodExecutionTime(group = "infrastructure") -public class BatikConverter implements SvgConverter { - private final PNGTranscoder pngTranscoder = new PNGTranscoder(); - - @Override - public void convertSvgToPng(InputStream inputStream, OutputStream outputStream) { - try { - TranscoderInput transcoderInput = new TranscoderInput(inputStream); - TranscoderOutput transcoderOutput = new TranscoderOutput(outputStream); - - pngTranscoder.transcode(transcoderInput, transcoderOutput); - } catch (TranscoderException e) { - throw new SvgToPngConvertException(e); - } - } -} diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/S3ProxyUploader.java b/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/S3ProxyUploader.java deleted file mode 100644 index a6a155409..000000000 --- a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/S3ProxyUploader.java +++ /dev/null @@ -1,78 +0,0 @@ -package com.woowacourse.zzimkkong.infrastructure.thumbnail; - -import com.woowacourse.zzimkkong.config.logaspect.LogMethodExecutionTime; -import com.woowacourse.zzimkkong.exception.infrastructure.S3ProxyRespondedFailException; -import com.woowacourse.zzimkkong.exception.infrastructure.S3UploadException; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpMethod; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.http.client.MultipartBodyBuilder; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.io.InputStream; -import java.util.Objects; - -@LogMethodExecutionTime(group = "infrastructure") -public class S3ProxyUploader implements StorageUploader { - private static final String PATH_DELIMITER = "/"; - private static final String API_PATH = "/api/storage"; - private static final String CONTENT_DISPOSITION_HEADER_VALUE_FORMAT = "form-data; name=file; filename=%s"; - - private final WebClient proxyServerClient; - private final String secretKey; - - public S3ProxyUploader( - @Value("${s3proxy.server-uri}") final String serverUri, - final String secretKey, - final WebClient webClient) { - this.proxyServerClient = webClient.mutate() - .baseUrl(serverUri) - .build(); - this.secretKey = secretKey; - } - - @Override - public String upload(String directoryName, String uploadFileName, InputStream inputStream) { - MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder(); - multipartBodyBuilder.part("file", new InputStreamResource(inputStream)) - .header(HttpHeaders.CONTENT_DISPOSITION, - String.format(CONTENT_DISPOSITION_HEADER_VALUE_FORMAT, uploadFileName)); - - return requestMultipartUpload(directoryName, multipartBodyBuilder); - } - - private String requestMultipartUpload(String directoryName, MultipartBodyBuilder multipartBodyBuilder) { - return proxyServerClient - .method(HttpMethod.POST) - .uri(String.join(PATH_DELIMITER, API_PATH, directoryName)) - .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) - .header(HttpHeaders.AUTHORIZATION, secretKey) - .body(BodyInserters.fromMultipartData(multipartBodyBuilder.build())) - .exchangeToMono(clientResponse -> { - if (clientResponse.statusCode().equals(HttpStatus.CREATED)) { - String location = Objects.requireNonNull( - clientResponse.headers().asHttpHeaders().get(HttpHeaders.LOCATION)) - .stream().findFirst() - .orElseThrow(S3UploadException::new); - return Mono.just(location); - } - return Mono.error(S3ProxyRespondedFailException::new); - }) - .block(); - } - - @Override - public void delete(String directoryName, String fileName) { - proxyServerClient - .method(HttpMethod.DELETE) - .uri(String.join(PATH_DELIMITER, API_PATH, directoryName, fileName)) - .retrieve() - .bodyToMono(String.class) - .block(); - } -} diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/StorageUploader.java b/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/StorageUploader.java deleted file mode 100644 index e4a03d18d..000000000 --- a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/StorageUploader.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.woowacourse.zzimkkong.infrastructure.thumbnail; - -import java.io.InputStream; - -public interface StorageUploader { - String upload(final String directoryName, String uploadFileName, final InputStream inputStream); - - void delete(final String directoryName, final String fileName); -} diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/SvgConverter.java b/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/SvgConverter.java deleted file mode 100644 index e7808ea78..000000000 --- a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/SvgConverter.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.woowacourse.zzimkkong.infrastructure.thumbnail; - -import java.io.InputStream; -import java.io.OutputStream; - -public interface SvgConverter { - void convertSvgToPng(final InputStream inputStream, final OutputStream outputStream); -} diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/ThumbnailManager.java b/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/ThumbnailManager.java deleted file mode 100644 index 1400277b9..000000000 --- a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/ThumbnailManager.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.woowacourse.zzimkkong.infrastructure.thumbnail; - -import com.woowacourse.zzimkkong.domain.Map; - -public interface ThumbnailManager { - String uploadMapThumbnail(final String svgData, final Map map); - - void deleteThumbnail(final Map map); -} diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/ThumbnailManagerImpl.java b/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/ThumbnailManagerImpl.java deleted file mode 100644 index dc02db47b..000000000 --- a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/ThumbnailManagerImpl.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.woowacourse.zzimkkong.infrastructure.thumbnail; - -import com.woowacourse.zzimkkong.domain.Map; -import com.woowacourse.zzimkkong.exception.infrastructure.CannotGenerateInputStreamFromSvgDataException; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.stereotype.Component; - -import java.io.*; - -@Component -public class ThumbnailManagerImpl implements ThumbnailManager { - public static final String THUMBNAIL_EXTENSION = ".png"; - private static final String THUMBNAIL_FILE_FORMAT = "%s"; - - private final SvgConverter svgConverter; - private final StorageUploader storageUploader; - private final String thumbnailsDirectoryName; - - public ThumbnailManagerImpl( - final SvgConverter svgConverter, - final StorageUploader storageUploader, - @Value("${storage.thumbnails-directory}") final String thumbnailsDirectoryName) { - this.svgConverter = svgConverter; - this.storageUploader = storageUploader; - this.thumbnailsDirectoryName = thumbnailsDirectoryName; - } - - public String uploadMapThumbnail(final String svgData, final Map map) { - try (final ByteArrayInputStream svgInputStream = new ByteArrayInputStream(svgData.getBytes()); - final ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream()) { - final BufferedInputStream bufferedSvgInputStream = new BufferedInputStream(svgInputStream); - final BufferedOutputStream bufferedPngOutputStream = new BufferedOutputStream(pngOutputStream); - - final String fileName = makeThumbnailFileName(map); - svgConverter.convertSvgToPng(bufferedSvgInputStream, bufferedPngOutputStream); - - return uploadFromByteArray(fileName, pngOutputStream.toByteArray()); - } catch (IOException exception) { - throw new CannotGenerateInputStreamFromSvgDataException(exception); - } - } - - private String makeThumbnailFileName(final Map map) { - return String.format(THUMBNAIL_FILE_FORMAT, map.getId().toString() + THUMBNAIL_EXTENSION); - } - - private String uploadFromByteArray(String fileName, byte[] byteArray) throws IOException { - try (final BufferedInputStream bufferedPngInputStream = new BufferedInputStream(new ByteArrayInputStream(byteArray))) { - return storageUploader.upload(thumbnailsDirectoryName, fileName, bufferedPngInputStream); - } - } - - public void deleteThumbnail(final Map map) { - String fileName = makeThumbnailFileName(map); - storageUploader.delete(thumbnailsDirectoryName, fileName + THUMBNAIL_EXTENSION); - } -} diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/warmup/Warmer.java b/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/warmup/Warmer.java deleted file mode 100644 index 236eb9f58..000000000 --- a/backend/src/main/java/com/woowacourse/zzimkkong/infrastructure/warmup/Warmer.java +++ /dev/null @@ -1,88 +0,0 @@ -package com.woowacourse.zzimkkong.infrastructure.warmup; - -import com.woowacourse.zzimkkong.domain.SlackUrl; -import com.woowacourse.zzimkkong.infrastructure.thumbnail.BatikConverter; -import lombok.extern.slf4j.Slf4j; -import org.slf4j.MDC; -import org.springframework.core.io.InputStreamResource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.MediaType; -import org.springframework.http.client.MultipartBodyBuilder; -import org.springframework.web.reactive.function.BodyInserters; -import org.springframework.web.reactive.function.client.WebClient; -import reactor.core.publisher.Mono; - -import java.io.*; - -@Slf4j -public class Warmer { - private final BatikConverter batikConverter; - private final SlackUrl slackUrl; - private final WebClient webClient; - private final String s3ProxyServerUri; - private final String s3ProxyServerSecretKey; - - public Warmer( - final BatikConverter batikConverter, - final SlackUrl slackUrl, - final WebClient webClient, - final String s3ProxyServerUri, - final String s3ProxyServerSecretKey) { - this.batikConverter = batikConverter; - this.slackUrl = slackUrl; - this.webClient = webClient; - this.s3ProxyServerUri = s3ProxyServerUri; - this.s3ProxyServerSecretKey = s3ProxyServerSecretKey; - } - - public void warmUp() { - log.info("warm up을 시작합니다"); - - initSvgConverter(); - initWebClient(); - - log.info("warm up이 완료 되었습니다."); - } - - private void initSvgConverter() { - String svgData = " "; - - try (final ByteArrayInputStream svgInputStream = new ByteArrayInputStream(svgData.getBytes()); - final ByteArrayOutputStream pngOutputStream = new ByteArrayOutputStream()) { - final BufferedInputStream bufferedSvgInputStream = new BufferedInputStream(svgInputStream); - final BufferedOutputStream bufferedPngOutputStream = new BufferedOutputStream(pngOutputStream); - batikConverter.convertSvgToPng(bufferedSvgInputStream, bufferedPngOutputStream); - } catch (IOException ignored) { - } - } - - private void initWebClient() { - webClient - .post() - .uri(slackUrl.getUrl()) - .contentType(MediaType.APPLICATION_JSON) - .bodyValue("let's warm up") - .retrieve() - .bodyToMono(String.class) - .onErrorResume(e -> Mono.just("warm up finisehd")) - .subscribe(); - - try (final BufferedInputStream bufferedPngInputStream = new BufferedInputStream(new ByteArrayInputStream("warmUp".getBytes()))) { - MultipartBodyBuilder multipartBodyBuilder = new MultipartBodyBuilder(); - multipartBodyBuilder.part("file", new InputStreamResource(bufferedPngInputStream)) - .header(HttpHeaders.CONTENT_DISPOSITION, "form-data; name=file; filename=warmFile"); - - webClient - .post() - .uri(s3ProxyServerUri + "/api/storage/warmup") - .header(HttpHeaders.CONTENT_TYPE, MediaType.MULTIPART_FORM_DATA_VALUE) - .header(HttpHeaders.AUTHORIZATION, s3ProxyServerSecretKey) - .body(BodyInserters.fromMultipartData(multipartBodyBuilder.build())) - .retrieve() - .bodyToMono(String.class) - .onErrorResume(e -> Mono.just("warm up finished")) - .block(); - } catch (IOException ignored) { - } - } -} diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/service/MapService.java b/backend/src/main/java/com/woowacourse/zzimkkong/service/MapService.java index 8c762ed45..2505bb542 100644 --- a/backend/src/main/java/com/woowacourse/zzimkkong/service/MapService.java +++ b/backend/src/main/java/com/woowacourse/zzimkkong/service/MapService.java @@ -7,13 +7,12 @@ import com.woowacourse.zzimkkong.dto.map.MapCreateUpdateRequest; import com.woowacourse.zzimkkong.dto.map.MapFindAllResponse; import com.woowacourse.zzimkkong.dto.map.MapFindResponse; +import com.woowacourse.zzimkkong.dto.member.LoginEmailDto; import com.woowacourse.zzimkkong.exception.authorization.NoAuthorityOnMapException; import com.woowacourse.zzimkkong.exception.map.NoSuchMapException; import com.woowacourse.zzimkkong.exception.member.NoSuchMemberException; import com.woowacourse.zzimkkong.exception.space.ReservationExistOnSpaceException; -import com.woowacourse.zzimkkong.dto.member.LoginEmailDto; import com.woowacourse.zzimkkong.infrastructure.sharingid.SharingIdGenerator; -import com.woowacourse.zzimkkong.infrastructure.thumbnail.ThumbnailManager; import com.woowacourse.zzimkkong.repository.MapRepository; import com.woowacourse.zzimkkong.repository.MemberRepository; import com.woowacourse.zzimkkong.repository.ReservationRepository; @@ -32,19 +31,16 @@ public class MapService { private final MemberRepository members; private final MapRepository maps; private final ReservationRepository reservations; - private final ThumbnailManager thumbnailManager; private final SharingIdGenerator sharingIdGenerator; public MapService( final MemberRepository members, final MapRepository maps, final ReservationRepository reservations, - final ThumbnailManager thumbnailManager, final SharingIdGenerator sharingIdGenerator) { this.members = members; this.maps = maps; this.reservations = reservations; - this.thumbnailManager = thumbnailManager; this.sharingIdGenerator = sharingIdGenerator; } @@ -54,12 +50,9 @@ public MapCreateResponse saveMap(final MapCreateUpdateRequest mapCreateUpdateReq Map saveMap = maps.save(new Map( mapCreateUpdateRequest.getMapName(), mapCreateUpdateRequest.getMapDrawing(), - mapCreateUpdateRequest.getMapImageSvg().substring(0, 10), + mapCreateUpdateRequest.getThumbnail(), manager)); - final String thumbnailUrl = thumbnailManager.uploadMapThumbnail(mapCreateUpdateRequest.getMapImageSvg(), saveMap); - saveMap.updateImageUrl(thumbnailUrl); - return MapCreateResponse.from(saveMap); } @@ -99,7 +92,6 @@ public void updateMap(final Long mapId, .orElseThrow(NoSuchMapException::new); validateManagerOfMap(map, loginEmailDto.getEmail()); - thumbnailManager.uploadMapThumbnail(mapCreateUpdateRequest.getMapImageSvg(), map); map.update( mapCreateUpdateRequest.getMapName(), mapCreateUpdateRequest.getMapDrawing()); @@ -113,7 +105,6 @@ public void deleteMap(final Long mapId, final LoginEmailDto loginEmailDto) { validateExistReservations(map); maps.delete(map); - thumbnailManager.deleteThumbnail(map); } private void validateExistReservations(final Map map) { diff --git a/backend/src/main/java/com/woowacourse/zzimkkong/service/SpaceService.java b/backend/src/main/java/com/woowacourse/zzimkkong/service/SpaceService.java index 7b52d0fff..2c7d40aca 100644 --- a/backend/src/main/java/com/woowacourse/zzimkkong/service/SpaceService.java +++ b/backend/src/main/java/com/woowacourse/zzimkkong/service/SpaceService.java @@ -9,7 +9,6 @@ import com.woowacourse.zzimkkong.exception.map.NoSuchMapException; import com.woowacourse.zzimkkong.exception.space.NoSuchSpaceException; import com.woowacourse.zzimkkong.exception.space.ReservationExistOnSpaceException; -import com.woowacourse.zzimkkong.infrastructure.thumbnail.ThumbnailManager; import com.woowacourse.zzimkkong.repository.MapRepository; import com.woowacourse.zzimkkong.repository.ReservationRepository; import com.woowacourse.zzimkkong.repository.SpaceRepository; @@ -25,17 +24,14 @@ public class SpaceService { private final MapRepository maps; private final SpaceRepository spaces; private final ReservationRepository reservations; - private final ThumbnailManager thumbnailManager; public SpaceService( final MapRepository maps, final SpaceRepository spaces, - final ReservationRepository reservations, - final ThumbnailManager thumbnailManager) { + final ReservationRepository reservations) { this.maps = maps; this.spaces = spaces; this.reservations = reservations; - this.thumbnailManager = thumbnailManager; } public SpaceCreateResponse saveSpace( @@ -57,7 +53,6 @@ public SpaceCreateResponse saveSpace( .build(); Space saveSpace = spaces.save(space); - thumbnailManager.uploadMapThumbnail(spaceCreateUpdateRequest.getMapImageSvg(), map); return SpaceCreateResponse.from(saveSpace); } @@ -119,7 +114,6 @@ public void updateSpace( .build(); space.update(updateSpace); - thumbnailManager.uploadMapThumbnail(spaceCreateUpdateRequest.getMapImageSvg(), map); } public void deleteSpace( @@ -137,7 +131,6 @@ public void deleteSpace( validateReservationExistence(spaceId); spaces.delete(space); - thumbnailManager.uploadMapThumbnail(spaceDeleteRequest.getMapImageSvg(), map); } private Setting getSetting(final SpaceCreateUpdateRequest spaceCreateUpdateRequest) { diff --git a/backend/src/main/resources/db/migration/prod/V13__thumbnail_as_svg.sql b/backend/src/main/resources/db/migration/prod/V13__thumbnail_as_svg.sql new file mode 100644 index 000000000..1357c4398 --- /dev/null +++ b/backend/src/main/resources/db/migration/prod/V13__thumbnail_as_svg.sql @@ -0,0 +1,11 @@ +SET foreign_key_checks = 0; + +TRUNCATE TABLE map; +TRUNCATE TABLE member; +TRUNCATE TABLE preset; +TRUNCATE TABLE reservation; +TRUNCATE TABLE space; + +SET foreign_key_checks = 1; + +ALTER TABLE map CHANGE COLUMN map_image_url thumbnail longtext not null; diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/Constants.java b/backend/src/test/java/com/woowacourse/zzimkkong/Constants.java index 2a46adade..2fbb59ef4 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/Constants.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/Constants.java @@ -21,7 +21,6 @@ private Constants() { public static final String DESCRIPTION = "찜꽁 1차 회의"; public static final String USER_NAME = "찜꽁"; public static final String RESERVATION_PW = "1234"; - public static final String MAP_IMAGE_URL = "https://zzimkkong-personal.s3.ap-northeast-2.amazonaws.com/thumbnails/2387563.png"; public static final String MAP_SVG = " "; public static final String SPACE_DRAWING = "{ \"id\": \"1\", \"type\" : \"rect\", \"x\": \"10\", \"y\": \"10\", \"width\": \"30\", \"height\": \"30\" }"; public static final String LUTHER_NAME = "루터회관"; diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/controller/AcceptanceTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/controller/AcceptanceTest.java index 1aac0fa30..fb5e82e14 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/controller/AcceptanceTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/controller/AcceptanceTest.java @@ -9,7 +9,6 @@ import com.woowacourse.zzimkkong.dto.space.SpaceCreateUpdateRequest; import com.woowacourse.zzimkkong.infrastructure.oauth.GithubRequester; import com.woowacourse.zzimkkong.infrastructure.oauth.GoogleRequester; -import com.woowacourse.zzimkkong.infrastructure.thumbnail.StorageUploader; import io.restassured.RestAssured; import io.restassured.builder.RequestSpecBuilder; import io.restassured.specification.RequestSpecification; @@ -88,9 +87,6 @@ class AcceptanceTest { @Autowired private DatabaseCleaner databaseCleaner; - @MockBean - private StorageUploader storageUploader; - @Autowired protected PasswordEncoder passwordEncoder; @@ -110,9 +106,6 @@ void setUp(RestDocumentationContextProvider restDocumentation) { saveMember(memberSaveRequest); accessToken = getToken(); - - given(storageUploader.upload(anyString(), anyString(), any(InputStream.class))) - .willReturn(MAP_IMAGE_URL); } @AfterEach diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/controller/AdminControllerTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/controller/AdminControllerTest.java index 7a4725c14..c3d6760f5 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/controller/AdminControllerTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/controller/AdminControllerTest.java @@ -1,5 +1,6 @@ package com.woowacourse.zzimkkong.controller; +import com.woowacourse.zzimkkong.Constants; import com.woowacourse.zzimkkong.domain.*; import com.woowacourse.zzimkkong.dto.admin.*; import com.woowacourse.zzimkkong.dto.map.MapFindResponse; @@ -40,7 +41,7 @@ class AdminControllerTest extends AcceptanceTest { private SlackService slackService; private static final Member POBI = new Member(memberSaveRequest.getEmail(), memberSaveRequest.getPassword(), memberSaveRequest.getOrganization()); - private static final Map LUTHER = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, POBI); + private static final Map LUTHER = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, POBI); private static final Setting BE_SETTING = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) .availableEndTime(BE_AVAILABLE_END_TIME) diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/controller/GuestReservationControllerTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/controller/GuestReservationControllerTest.java index 87cd9b03a..00dc7b35b 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/controller/GuestReservationControllerTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/controller/GuestReservationControllerTest.java @@ -1,5 +1,6 @@ package com.woowacourse.zzimkkong.controller; +import com.woowacourse.zzimkkong.Constants; import com.woowacourse.zzimkkong.domain.*; import com.woowacourse.zzimkkong.dto.reservation.*; import com.woowacourse.zzimkkong.service.slack.SlackService; @@ -62,7 +63,7 @@ void setUp() { SALLY_DESCRIPTION); Member pobi = new Member(EMAIL, passwordEncoder.encode(PW), ORGANIZATION); - Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); Setting beSetting = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/controller/GuestSpaceControllerTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/controller/GuestSpaceControllerTest.java index 2b54ee2ff..76404468f 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/controller/GuestSpaceControllerTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/controller/GuestSpaceControllerTest.java @@ -1,5 +1,6 @@ package com.woowacourse.zzimkkong.controller; +import com.woowacourse.zzimkkong.Constants; import com.woowacourse.zzimkkong.domain.Map; import com.woowacourse.zzimkkong.domain.Member; import com.woowacourse.zzimkkong.domain.Setting; @@ -39,7 +40,7 @@ void setUp() { Long feSpaceId = Long.valueOf(saveFe1SpaceResponse.header("location").split("/")[6]); Member pobi = new Member(EMAIL, passwordEncoder.encode(PW), ORGANIZATION); - Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); Setting beSetting = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) .availableEndTime(BE_AVAILABLE_END_TIME) diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/controller/ManagerReservationControllerTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/controller/ManagerReservationControllerTest.java index 31c5a0fbf..953389800 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/controller/ManagerReservationControllerTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/controller/ManagerReservationControllerTest.java @@ -60,7 +60,7 @@ void setUp() { SALLY_DESCRIPTION); Member pobi = new Member(EMAIL, passwordEncoder.encode(PW), ORGANIZATION); - Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); Setting beSetting = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/controller/ManagerSpaceControllerTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/controller/ManagerSpaceControllerTest.java index 28ef82ed8..5464241b3 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/controller/ManagerSpaceControllerTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/controller/ManagerSpaceControllerTest.java @@ -41,7 +41,7 @@ void setUp() { Long feSpaceId = Long.valueOf(saveFe1SpaceResponse.header("location").split("/")[6]); Member pobi = new Member(EMAIL, passwordEncoder.encode(PW), ORGANIZATION); - Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); Setting beSetting = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) .availableEndTime(BE_AVAILABLE_END_TIME) diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/controller/MapControllerTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/controller/MapControllerTest.java index 61fdcc1de..a18e77dd8 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/controller/MapControllerTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/controller/MapControllerTest.java @@ -1,5 +1,6 @@ package com.woowacourse.zzimkkong.controller; +import com.woowacourse.zzimkkong.Constants; import com.woowacourse.zzimkkong.domain.Map; import com.woowacourse.zzimkkong.domain.Member; import com.woowacourse.zzimkkong.dto.map.MapCreateUpdateRequest; @@ -43,8 +44,8 @@ void setUp() { // For Test Comparison pobi = new Member(EMAIL, passwordEncoder.encode(PW), ORGANIZATION); - luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); - smallHouse = new Map(SMALL_HOUSE_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); + smallHouse = new Map(SMALL_HOUSE_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); } @Test @@ -72,8 +73,8 @@ void findAll() { String lutherId = createdMapApi.split("/")[4]; String smallHouseId = smallHouseCreatedMapApi.header("location").split("/")[4]; - Map lutherWithId = new Map(Long.parseLong(lutherId), luther.getName(), luther.getMapDrawing(), luther.getMapImageUrl(), luther.getMember()); - Map smallHouseWithId = new Map(Long.parseLong(smallHouseId), smallHouse.getName(), smallHouse.getMapDrawing(), smallHouse.getMapImageUrl(), smallHouse.getMember()); + Map lutherWithId = new Map(Long.parseLong(lutherId), luther.getName(), luther.getMapDrawing(), luther.getThumbnail(), luther.getMember()); + Map smallHouseWithId = new Map(Long.parseLong(smallHouseId), smallHouse.getName(), smallHouse.getMapDrawing(), smallHouse.getThumbnail(), smallHouse.getMember()); Iterator expectedMapIterator = List.of(lutherWithId, smallHouseWithId).iterator(); // when diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/domain/MapTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/domain/MapTest.java index 906e9190e..cf993a744 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/domain/MapTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/domain/MapTest.java @@ -1,5 +1,6 @@ package com.woowacourse.zzimkkong.domain; +import com.woowacourse.zzimkkong.Constants; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -13,7 +14,7 @@ class MapTest { @DisplayName("Space가 생성되면 Map에 Space를 추가한다") void addSpace() { Member pobi = new Member(EMAIL, PW, ORGANIZATION); - Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); assertThat(luther.getSpaces().size()).isZero(); Space.builder() @@ -27,7 +28,7 @@ void addSpace() { @DisplayName("맵의 관리자가 맞으면 true, 아니면 false") void isOwnedBy(String email, boolean expected) { Member pobi = new Member(EMAIL, PW, ORGANIZATION); - Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); boolean result = luther.isOwnedBy(email); assertThat(result).isEqualTo(expected); @@ -39,12 +40,12 @@ void isOwnedBy(String email, boolean expected) { void addMap(boolean nullable) { Map luther; if (nullable) { - luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, null); + luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, null); assertThat(luther.getMember()).isNull(); return; } Member pobi = new Member(EMAIL, PW, ORGANIZATION); - luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); assertThat(pobi.getMaps()).contains(luther); } diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/domain/SpaceTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/domain/SpaceTest.java index fd2dfdbe5..58d4e6f76 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/domain/SpaceTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/domain/SpaceTest.java @@ -1,5 +1,6 @@ package com.woowacourse.zzimkkong.domain; +import com.woowacourse.zzimkkong.Constants; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -18,7 +19,7 @@ class SpaceTest { @Test void update() { Member member = new Member(EMAIL, PW, ORGANIZATION); - Map map = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, member); + Map map = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, member); Setting setting = Setting.builder() .availableStartTime(LocalTime.of(10, 0)) diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/dto/SpaceCreateUpdateRequestTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/dto/SpaceCreateUpdateRequestTest.java index aeb6246f0..e05d9567b 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/dto/SpaceCreateUpdateRequestTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/dto/SpaceCreateUpdateRequestTest.java @@ -5,7 +5,6 @@ import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.NullAndEmptySource; -import static com.woowacourse.zzimkkong.Constants.MAP_SVG; import static com.woowacourse.zzimkkong.dto.ValidatorMessage.EMPTY_MESSAGE; import static org.assertj.core.api.Assertions.assertThat; diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/SharingIdGeneratorTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/sharingid/SharingIdGeneratorTest.java similarity index 91% rename from backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/SharingIdGeneratorTest.java rename to backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/sharingid/SharingIdGeneratorTest.java index bb8bd68ee..2da355387 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/SharingIdGeneratorTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/sharingid/SharingIdGeneratorTest.java @@ -1,10 +1,8 @@ -package com.woowacourse.zzimkkong.infrastructure.thumbnail; +package com.woowacourse.zzimkkong.infrastructure.sharingid; import com.woowacourse.zzimkkong.domain.Map; import com.woowacourse.zzimkkong.domain.Member; import com.woowacourse.zzimkkong.exception.map.InvalidAccessLinkException; -import com.woowacourse.zzimkkong.infrastructure.sharingid.SharingIdGenerator; -import com.woowacourse.zzimkkong.infrastructure.sharingid.Transcoder; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -34,7 +32,7 @@ void setUp() { luther = new Map(1L, LUTHER_NAME, MAP_DRAWING_DATA, - MAP_IMAGE_URL, + MAP_SVG, pobi); } diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/BatikConverterTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/BatikConverterTest.java deleted file mode 100644 index 5dfae0c88..000000000 --- a/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/BatikConverterTest.java +++ /dev/null @@ -1,66 +0,0 @@ -package com.woowacourse.zzimkkong.infrastructure.thumbnail; - -import com.woowacourse.zzimkkong.exception.infrastructure.SvgToPngConvertException; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; - -import java.io.*; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; - -@SpringBootTest -@ActiveProfiles("test") -class BatikConverterTest { - private static final String LUTHER_SVG = "프론트 강의실1프론트 강의실 2회의실 3회의실 4회의실 51234방송실전화백엔드 강의실회의실 1회의실 25트랙방"; - - @Autowired - private BatikConverter batikConverter; - - private File testFile; - - @Test - @DisplayName("svg 데이터를 png 데이터로 변환한다.") - void convertAndWriteToOutputStream() { - // given - try (ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(LUTHER_SVG.getBytes()); - ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream()) { - BufferedInputStream bufferedInputStream = new BufferedInputStream(byteArrayInputStream); - BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(byteArrayOutputStream); - - // when, then - assertDoesNotThrow(() -> batikConverter.convertSvgToPng(bufferedInputStream, bufferedOutputStream)); - } catch (IOException ignore) { - } - } - - @Test - @DisplayName("옳지 않은 svg 데이터가 들어오면 오류가 발생한다.") - void convertException() { - // given - String rawSvgData = "strangeSvgData"; - - // when, then - try (final BufferedInputStream bufferedInputStream = new BufferedInputStream(new ByteArrayInputStream(rawSvgData.getBytes())); - final BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(new ByteArrayOutputStream())) { - - assertThatThrownBy(() -> batikConverter.convertSvgToPng(bufferedInputStream, bufferedOutputStream)) - .isInstanceOf(SvgToPngConvertException.class); - } catch (IOException exception) { - exception.printStackTrace(); - } - } - - @AfterEach - void deleteFile() { - if (testFile != null) { - testFile.delete(); - testFile = null; - } - } -} diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/S3ProxyUploaderTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/S3ProxyUploaderTest.java deleted file mode 100644 index 153890726..000000000 --- a/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/S3ProxyUploaderTest.java +++ /dev/null @@ -1,117 +0,0 @@ -package com.woowacourse.zzimkkong.infrastructure.thumbnail; - -import com.woowacourse.zzimkkong.exception.infrastructure.S3ProxyRespondedFailException; -import io.restassured.RestAssured; -import io.restassured.response.ExtractableResponse; -import io.restassured.response.Response; -import okhttp3.mockwebserver.MockResponse; -import okhttp3.mockwebserver.MockWebServer; -import org.junit.jupiter.api.AfterEach; -import org.junit.jupiter.api.Disabled; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.http.HttpStatus; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.web.reactive.function.client.WebClient; - -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.IOException; -import java.util.regex.Matcher; -import java.util.regex.Pattern; - -import static org.assertj.core.api.Assertions.assertThat; -import static org.assertj.core.api.Assertions.assertThatThrownBy; - -@SpringBootTest -@ActiveProfiles("test") -@Disabled -class S3ProxyUploaderTest { - private static final String URL_REGEX = "^(https?|ftp|file)://[-a-zA-Z0-9+&@#/%?=~_|!:,.;]*[-a-zA-Z0-9+&@#/%=~_|]"; - private static final Pattern URL_PATTERN = Pattern.compile(URL_REGEX); - - @Autowired - private S3ProxyUploader s3ProxyUploader; - - private final String testDirectoryName = "testDirectoryName"; - private File testFile; - - @Test - @DisplayName("데이터를 업로드한 후 파일의 url을 받아온다.") - void uploadInputStreamData() throws FileNotFoundException { - // given - final String fileName = "luther.png"; - String filePath = getClass().getClassLoader().getResource(fileName).getFile(); - testFile = new File(filePath); - - final FileInputStream fileInputStream = new FileInputStream(testFile); - - // when - String uri = s3ProxyUploader.upload(testDirectoryName, fileName, fileInputStream); - Matcher matcher = URL_PATTERN.matcher(uri); - - // then - assertThat(matcher.find()).isTrue(); - } - - @Test - @DisplayName("업로드된 파일을 삭제한다.") - void delete() throws FileNotFoundException { - final String fileName = "luther.png"; - String filePath = getClass().getClassLoader().getResource(fileName).getFile(); - testFile = new File(filePath); - - final FileInputStream fileInputStream = new FileInputStream(testFile); - - String uri = s3ProxyUploader.upload(testDirectoryName, fileName, fileInputStream); - - // when - s3ProxyUploader.delete(testDirectoryName, testFile.getName()); - RestAssured.port = RestAssured.UNDEFINED_PORT; - ExtractableResponse response = RestAssured - .given().log().all() - .accept("application/json") - .when().get(uri) - .then().log().all().extract(); - - // then - assertThat(response.statusCode()).isEqualTo(HttpStatus.FORBIDDEN.value()); - } - - @Test - @DisplayName("업로드시 서버측이 201 응답을 보내지 않으면 예외가 발생한다.") - void invalidUrl() { - // given - try (MockWebServer mockGithubServer = new MockWebServer()) { - mockGithubServer.start(); - mockGithubServer.enqueue(new MockResponse() - .setResponseCode(400)); - - String hostName = mockGithubServer.getHostName(); - int port = mockGithubServer.getPort(); - - S3ProxyUploader s3ProxyUploader = new S3ProxyUploader("http://" + hostName + ":" + port, "secretKey", WebClient.create()); - - String filePath = getClass().getClassLoader().getResource("luther.png").getFile(); - testFile = new File(filePath); - - // when, then - try (final FileInputStream fileInputStream = new FileInputStream(testFile)) { - assertThatThrownBy(() -> s3ProxyUploader.upload(testDirectoryName, testFile.getName(), fileInputStream)) - .isInstanceOf(S3ProxyRespondedFailException.class); - } - } catch (IOException ignored) { - } - } - - @AfterEach - void tearDown() { - if (testFile != null) { - s3ProxyUploader.delete(testDirectoryName, testFile.getName()); - testFile = null; - } - } -} diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/ThumbnailManagerImplTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/ThumbnailManagerImplTest.java deleted file mode 100644 index 3b68567cf..000000000 --- a/backend/src/test/java/com/woowacourse/zzimkkong/infrastructure/thumbnail/ThumbnailManagerImplTest.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.woowacourse.zzimkkong.infrastructure.thumbnail; - -import com.woowacourse.zzimkkong.domain.Map; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.test.context.ActiveProfiles; - -import java.io.InputStream; -import java.util.Random; - -import static com.woowacourse.zzimkkong.Constants.MAP_IMAGE_URL; -import static com.woowacourse.zzimkkong.Constants.MAP_SVG; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; - -@SpringBootTest -@ActiveProfiles("test") -class ThumbnailManagerImplTest { - @Autowired - ThumbnailManagerImpl thumbnailManager; - - @MockBean - SvgConverter svgConverter; - - @MockBean - StorageUploader storageUploader; - - @Test - @DisplayName("Map의 svg 데이터와 Map을 받고 썸네일의 url을 받아온다.") - void uploadMapThumbnailInmemory() { - // given - Map mockMap = mock(Map.class); - long mapId = new Random().nextLong(); - given(mockMap.getId()) - .willReturn(mapId); - - given(storageUploader.upload(anyString(), anyString(), any(InputStream.class))) - .willReturn(MAP_IMAGE_URL); - - // when - String mapThumbnailUrl = thumbnailManager.uploadMapThumbnail(MAP_SVG, mockMap); - - assertThat(mapThumbnailUrl).isEqualTo(MAP_IMAGE_URL); - } -} diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/repository/MapRepositoryTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/repository/MapRepositoryTest.java index b74a9705e..8cad84689 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/repository/MapRepositoryTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/repository/MapRepositoryTest.java @@ -1,5 +1,6 @@ package com.woowacourse.zzimkkong.repository; +import com.woowacourse.zzimkkong.Constants; import com.woowacourse.zzimkkong.domain.Map; import com.woowacourse.zzimkkong.domain.Member; import com.woowacourse.zzimkkong.domain.Setting; @@ -13,7 +14,6 @@ import org.springframework.data.domain.Sort; import java.util.List; -import java.util.Optional; import static com.woowacourse.zzimkkong.Constants.*; import static org.assertj.core.api.Assertions.assertThat; @@ -26,8 +26,8 @@ class MapRepositoryTest extends RepositoryTest { @BeforeEach void setUp() { pobi = new Member(EMAIL, PW, ORGANIZATION); - luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); - smallHouse = new Map(SMALL_HOUSE_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); + smallHouse = new Map(SMALL_HOUSE_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); members.save(pobi); } diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/repository/ReservationRepositoryImplTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/repository/ReservationRepositoryImplTest.java index 8d2ad8a53..f4038ff12 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/repository/ReservationRepositoryImplTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/repository/ReservationRepositoryImplTest.java @@ -1,5 +1,6 @@ package com.woowacourse.zzimkkong.repository; +import com.woowacourse.zzimkkong.Constants; import com.woowacourse.zzimkkong.domain.*; import org.assertj.core.api.AssertionsForClassTypes; import org.junit.jupiter.api.DisplayName; @@ -20,7 +21,7 @@ void existsReservationsByMember(boolean isReservationExists) { Member sakjung = new Member(NEW_EMAIL, PW, ORGANIZATION); Member savedMember = members.save(sakjung); - Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, savedMember); + Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, savedMember); maps.save(luther); Setting beSetting = Setting.builder() diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/repository/ReservationRepositoryTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/repository/ReservationRepositoryTest.java index da1438d76..d866ce59d 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/repository/ReservationRepositoryTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/repository/ReservationRepositoryTest.java @@ -32,7 +32,7 @@ class ReservationRepositoryTest extends RepositoryTest { @BeforeEach void setUp() { pobi = new Member(EMAIL, PW, ORGANIZATION); - Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); Setting beSetting = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/repository/SpaceRepositoryTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/repository/SpaceRepositoryTest.java index f4b5d6475..6659d135d 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/repository/SpaceRepositoryTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/repository/SpaceRepositoryTest.java @@ -1,5 +1,6 @@ package com.woowacourse.zzimkkong.repository; +import com.woowacourse.zzimkkong.Constants; import com.woowacourse.zzimkkong.domain.Map; import com.woowacourse.zzimkkong.domain.Member; import com.woowacourse.zzimkkong.domain.Setting; @@ -24,7 +25,7 @@ class SpaceRepositoryTest extends RepositoryTest { @BeforeEach void setUp() { Member pobi = new Member(EMAIL, PW, ORGANIZATION); - luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); Setting beSetting = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/service/AdminServiceTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/service/AdminServiceTest.java index bf28f7918..dc5cd9e5e 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/service/AdminServiceTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/service/AdminServiceTest.java @@ -84,7 +84,7 @@ void findMembers() { @DisplayName("모든 맵을 페이지네이션을 이용해 조회한다.") void findMaps() { //given - Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); PageRequest pageRequest = PageRequest.of(0, 20, Sort.unsorted()); given(maps.findAllByFetch(any(Pageable.class))) .willReturn(new PageImpl<>(List.of(luther), pageRequest, 1)); @@ -106,7 +106,7 @@ void findMaps() { @DisplayName("모든 공간을 페이지네이션을 이용해 조회한다.") void findSpaces() { //given - Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + Map luther = new Map(LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); Setting beSetting = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) .availableEndTime(BE_AVAILABLE_END_TIME) @@ -147,7 +147,7 @@ void findSpaces() { @DisplayName("모든 예약을 페이지네이션을 이용해 조회한다.") void findReservations() { //given - Map luther = new Map(1L, LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + Map luther = new Map(1L, LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); Setting beSetting = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) .availableEndTime(BE_AVAILABLE_END_TIME) diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/service/GuestReservationServiceTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/service/GuestReservationServiceTest.java index 503312444..ef04dfedb 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/service/GuestReservationServiceTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/service/GuestReservationServiceTest.java @@ -1,5 +1,6 @@ package com.woowacourse.zzimkkong.service; +import com.woowacourse.zzimkkong.Constants; import com.woowacourse.zzimkkong.domain.*; import com.woowacourse.zzimkkong.dto.reservation.*; import com.woowacourse.zzimkkong.exception.map.NoSuchMapException; @@ -60,7 +61,7 @@ class GuestReservationServiceTest extends ServiceTest { @BeforeEach void setUp() { Member pobi = new Member(EMAIL, PW, ORGANIZATION); - luther = new Map(1L, LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + luther = new Map(1L, LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); Setting beSetting = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/service/ManagerReservationServiceTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/service/ManagerReservationServiceTest.java index 2af8fba0a..c656bb4ee 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/service/ManagerReservationServiceTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/service/ManagerReservationServiceTest.java @@ -7,7 +7,6 @@ import com.woowacourse.zzimkkong.exception.map.NoSuchMapException; import com.woowacourse.zzimkkong.exception.reservation.*; import com.woowacourse.zzimkkong.exception.space.NoSuchSpaceException; -import com.woowacourse.zzimkkong.dto.member.LoginEmailDto; import com.woowacourse.zzimkkong.service.strategy.ManagerReservationStrategy; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; @@ -74,7 +73,7 @@ void setUp() { sakjung = new Member(NEW_EMAIL, PW, ORGANIZATION); pobiEmail = LoginEmailDto.from(EMAIL); sakjungEmail = LoginEmailDto.from(NEW_EMAIL); - luther = new Map(1L, LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + luther = new Map(1L, LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); Setting beSetting = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/service/MapServiceTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/service/MapServiceTest.java index 2f43fad5e..ad9c2cf02 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/service/MapServiceTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/service/MapServiceTest.java @@ -1,5 +1,6 @@ package com.woowacourse.zzimkkong.service; +import com.woowacourse.zzimkkong.Constants; import com.woowacourse.zzimkkong.domain.Map; import com.woowacourse.zzimkkong.domain.Member; import com.woowacourse.zzimkkong.domain.Setting; @@ -18,8 +19,6 @@ import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import java.io.File; -import java.io.InputStream; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -46,8 +45,8 @@ class MapServiceTest extends ServiceTest { void setUp() { pobi = new Member(EMAIL, PW, ORGANIZATION); pobiEmail = LoginEmailDto.from(EMAIL); - luther = new Map(1L, LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); - smallHouse = new Map(2L, SMALL_HOUSE_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + luther = new Map(1L, LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); + smallHouse = new Map(2L, SMALL_HOUSE_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); lutherId = luther.getId(); Setting beSetting = Setting.builder() @@ -102,8 +101,6 @@ void create() { .willReturn(Optional.of(pobi)); given(maps.save(any(Map.class))) .willReturn(luther); - given(storageUploader.upload(anyString(), anyString(), any(InputStream.class))) - .willReturn(MAP_IMAGE_URL); //then MapCreateResponse mapCreateResponse = mapService.saveMap(mapCreateUpdateRequest, pobiEmail); @@ -151,8 +148,6 @@ void update() { MapCreateUpdateRequest mapCreateUpdateRequest = new MapCreateUpdateRequest("이름을 바꿔요", luther.getMapDrawing(), MAP_SVG); given(maps.findById(anyLong())) .willReturn(Optional.of(luther)); - given(storageUploader.upload(anyString(), anyString(), any(InputStream.class))) - .willReturn(MAP_IMAGE_URL); //when, then assertDoesNotThrow(() -> mapService.updateMap(luther.getId(), mapCreateUpdateRequest, pobiEmail)); diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/service/ServiceTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/service/ServiceTest.java index 7208c5759..162dad607 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/service/ServiceTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/service/ServiceTest.java @@ -1,6 +1,5 @@ package com.woowacourse.zzimkkong.service; -import com.woowacourse.zzimkkong.infrastructure.thumbnail.StorageUploader; import com.woowacourse.zzimkkong.repository.MapRepository; import com.woowacourse.zzimkkong.repository.MemberRepository; import com.woowacourse.zzimkkong.repository.ReservationRepository; @@ -28,9 +27,6 @@ class ServiceTest { @MockBean protected SpaceRepository spaces; - @MockBean - protected StorageUploader storageUploader; - @Autowired protected PasswordEncoder passwordEncoder; } diff --git a/backend/src/test/java/com/woowacourse/zzimkkong/service/SpaceServiceTest.java b/backend/src/test/java/com/woowacourse/zzimkkong/service/SpaceServiceTest.java index 16f1ace91..603607c99 100644 --- a/backend/src/test/java/com/woowacourse/zzimkkong/service/SpaceServiceTest.java +++ b/backend/src/test/java/com/woowacourse/zzimkkong/service/SpaceServiceTest.java @@ -4,19 +4,17 @@ import com.woowacourse.zzimkkong.domain.Member; import com.woowacourse.zzimkkong.domain.Setting; import com.woowacourse.zzimkkong.domain.Space; +import com.woowacourse.zzimkkong.dto.member.LoginEmailDto; import com.woowacourse.zzimkkong.dto.space.*; import com.woowacourse.zzimkkong.exception.authorization.NoAuthorityOnMapException; import com.woowacourse.zzimkkong.exception.map.NoSuchMapException; import com.woowacourse.zzimkkong.exception.space.NoSuchSpaceException; import com.woowacourse.zzimkkong.exception.space.ReservationExistOnSpaceException; -import com.woowacourse.zzimkkong.dto.member.LoginEmailDto; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; import org.springframework.beans.factory.annotation.Autowired; -import java.io.File; -import java.io.InputStream; import java.time.LocalDateTime; import java.util.List; import java.util.Optional; @@ -25,7 +23,8 @@ import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThatThrownBy; import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.mockito.ArgumentMatchers.*; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyLong; import static org.mockito.BDDMockito.given; class SpaceServiceTest extends ServiceTest { @@ -79,7 +78,7 @@ void setUp() { sakjung = new Member(NEW_EMAIL, PW, ORGANIZATION); pobiEmail = LoginEmailDto.from(EMAIL); sakjungEmail = LoginEmailDto.from(NEW_EMAIL); - luther = new Map(1L, LUTHER_NAME, MAP_DRAWING_DATA, MAP_IMAGE_URL, pobi); + luther = new Map(1L, LUTHER_NAME, MAP_DRAWING_DATA, MAP_SVG, pobi); Setting beSetting = Setting.builder() .availableStartTime(BE_AVAILABLE_START_TIME) @@ -153,8 +152,6 @@ void save() { .willReturn(Optional.of(luther)); given(spaces.save(any(Space.class))) .willReturn(newSpace); - given(storageUploader.upload(anyString(), anyString(), any(InputStream.class))) - .willReturn(MAP_IMAGE_URL); // when SpaceCreateResponse spaceCreateResponse = spaceService.saveSpace(luther.getId(), spaceCreateUpdateRequest, pobiEmail); @@ -278,8 +275,6 @@ void update() { // given, when given(maps.findByIdFetch(anyLong())) .willReturn(Optional.of(luther)); - given(storageUploader.upload(anyString(), anyString(), any(InputStream.class))) - .willReturn(MAP_IMAGE_URL); // then assertDoesNotThrow(() -> spaceService.updateSpace( diff --git a/s3proxy/.gitignore b/s3proxy/.gitignore deleted file mode 100644 index c2065bc26..000000000 --- a/s3proxy/.gitignore +++ /dev/null @@ -1,37 +0,0 @@ -HELP.md -.gradle -build/ -!gradle/wrapper/gradle-wrapper.jar -!**/src/main/**/build/ -!**/src/test/**/build/ - -### STS ### -.apt_generated -.classpath -.factorypath -.project -.settings -.springBeans -.sts4-cache -bin/ -!**/src/main/**/bin/ -!**/src/test/**/bin/ - -### IntelliJ IDEA ### -.idea -*.iws -*.iml -*.ipr -out/ -!**/src/main/**/out/ -!**/src/test/**/out/ - -### NetBeans ### -/nbproject/private/ -/nbbuild/ -/dist/ -/nbdist/ -/.nb-gradle/ - -### VS Code ### -.vscode/ diff --git a/s3proxy/build.gradle b/s3proxy/build.gradle deleted file mode 100644 index 2b1206883..000000000 --- a/s3proxy/build.gradle +++ /dev/null @@ -1,81 +0,0 @@ -plugins { - id 'org.springframework.boot' version '2.5.4' - id 'io.spring.dependency-management' version '1.0.11.RELEASE' - id "org.asciidoctor.convert" version "1.5.10" - id 'java' -} - -group = 'com.woowacourse' -version = '0.0.1-SNAPSHOT' -sourceCompatibility = '11' - -configurations { - compileOnly { - extendsFrom annotationProcessor - } -} - -repositories { - mavenCentral() -} - -ext { - snippetsDir = file('build/generated-snippets') -} - -dependencies { - implementation 'org.springframework.boot:spring-boot-starter-web' - implementation 'org.springframework.boot:spring-boot-starter-webflux' - - // Lombok - compileOnly 'org.projectlombok:lombok' - annotationProcessor 'org.projectlombok:lombok' - - // Multi-Part - implementation 'commons-io:commons-io:2.11.0' - implementation 'commons-fileupload:commons-fileupload:1.4' - - // AWS - implementation 'org.springframework.cloud:spring-cloud-starter-aws:2.2.6.RELEASE' - - // Rest Docs - asciidoctor 'org.springframework.restdocs:spring-restdocs-asciidoctor' - testImplementation 'org.springframework.restdocs:spring-restdocs-restassured' - - testImplementation 'io.rest-assured:rest-assured' - testImplementation 'org.springframework.boot:spring-boot-starter-test' - testImplementation 'io.projectreactor:reactor-test' - - // Logstash - implementation 'net.logstash.logback:logstash-logback-encoder:6.6' - - // Kafka Appender - implementation 'com.github.danielwegener:logback-kafka-appender:0.2.0-RC2' - - implementation 'javax.xml.bind:jaxb-api:2.3.1' -} - -test { - outputs.dir snippetsDir - useJUnitPlatform() -} - -asciidoctor { - inputs.dir snippetsDir - dependsOn test -} - -task createDocument(type: Copy) { - dependsOn asciidoctor - from file("build/asciidoc/html5/index.html") - into file("src/main/resources/static/docs") -} - -bootJar { - dependsOn createDocument - from("${asciidoctor.outputDir}/html5") { - into 'static/docs' - } -} - - diff --git a/s3proxy/docker/main/Dockerfile b/s3proxy/docker/main/Dockerfile deleted file mode 100644 index 02320bc06..000000000 --- a/s3proxy/docker/main/Dockerfile +++ /dev/null @@ -1,17 +0,0 @@ -FROM ubuntu:18.04 - -LABEL email="ssangyu123@gmail.com" -LABEL name="sakjung" -LABEL description="zzimkkong s3proxy application" - -RUN apt-get -y update -RUN apt-get install -y openjdk-11-jdk - -# run application -WORKDIR /home/ubuntu -COPY build/libs/s3proxy-0.0.1-SNAPSHOT.jar app.jar -RUN mkdir zzimkkong && mkdir zzimkkong/tmp - -EXPOSE 8080 - -ENTRYPOINT ["java", "-Dspring.profiles.active=prod", "-jar", "app.jar", "--spring.config.location=classpath:s3proxy-config/application-prod.yml"] diff --git a/s3proxy/gradle/wrapper/gradle-wrapper.jar b/s3proxy/gradle/wrapper/gradle-wrapper.jar deleted file mode 100644 index 7454180f2..000000000 Binary files a/s3proxy/gradle/wrapper/gradle-wrapper.jar and /dev/null differ diff --git a/s3proxy/gradle/wrapper/gradle-wrapper.properties b/s3proxy/gradle/wrapper/gradle-wrapper.properties deleted file mode 100644 index da9702f9e..000000000 --- a/s3proxy/gradle/wrapper/gradle-wrapper.properties +++ /dev/null @@ -1,5 +0,0 @@ -distributionBase=GRADLE_USER_HOME -distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-6.8-bin.zip -zipStoreBase=GRADLE_USER_HOME -zipStorePath=wrapper/dists diff --git a/s3proxy/gradlew b/s3proxy/gradlew deleted file mode 100755 index 744e882ed..000000000 --- a/s3proxy/gradlew +++ /dev/null @@ -1,185 +0,0 @@ -#!/usr/bin/env sh - -# -# Copyright 2015 the original author or authors. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# https://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. -# - -############################################################################## -## -## Gradle start up script for UN*X -## -############################################################################## - -# Attempt to set APP_HOME -# Resolve links: $0 may be a link -PRG="$0" -# Need this for relative symlinks. -while [ -h "$PRG" ] ; do - ls=`ls -ld "$PRG"` - link=`expr "$ls" : '.*-> \(.*\)$'` - if expr "$link" : '/.*' > /dev/null; then - PRG="$link" - else - PRG=`dirname "$PRG"`"/$link" - fi -done -SAVED="`pwd`" -cd "`dirname \"$PRG\"`/" >/dev/null -APP_HOME="`pwd -P`" -cd "$SAVED" >/dev/null - -APP_NAME="Gradle" -APP_BASE_NAME=`basename "$0"` - -# Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -DEFAULT_JVM_OPTS='"-Xmx64m" "-Xms64m"' - -# Use the maximum available, or set MAX_FD != -1 to use that value. -MAX_FD="maximum" - -warn () { - echo "$*" -} - -die () { - echo - echo "$*" - echo - exit 1 -} - -# OS specific support (must be 'true' or 'false'). -cygwin=false -msys=false -darwin=false -nonstop=false -case "`uname`" in - CYGWIN* ) - cygwin=true - ;; - Darwin* ) - darwin=true - ;; - MSYS* | MINGW* ) - msys=true - ;; - NONSTOP* ) - nonstop=true - ;; -esac - -CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar - - -# Determine the Java command to use to start the JVM. -if [ -n "$JAVA_HOME" ] ; then - if [ -x "$JAVA_HOME/jre/sh/java" ] ; then - # IBM's JDK on AIX uses strange locations for the executables - JAVACMD="$JAVA_HOME/jre/sh/java" - else - JAVACMD="$JAVA_HOME/bin/java" - fi - if [ ! -x "$JAVACMD" ] ; then - die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." - fi -else - JAVACMD="java" - which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. - -Please set the JAVA_HOME variable in your environment to match the -location of your Java installation." -fi - -# Increase the maximum file descriptors if we can. -if [ "$cygwin" = "false" -a "$darwin" = "false" -a "$nonstop" = "false" ] ; then - MAX_FD_LIMIT=`ulimit -H -n` - if [ $? -eq 0 ] ; then - if [ "$MAX_FD" = "maximum" -o "$MAX_FD" = "max" ] ; then - MAX_FD="$MAX_FD_LIMIT" - fi - ulimit -n $MAX_FD - if [ $? -ne 0 ] ; then - warn "Could not set maximum file descriptor limit: $MAX_FD" - fi - else - warn "Could not query maximum file descriptor limit: $MAX_FD_LIMIT" - fi -fi - -# For Darwin, add options to specify how the application appears in the dock -if $darwin; then - GRADLE_OPTS="$GRADLE_OPTS \"-Xdock:name=$APP_NAME\" \"-Xdock:icon=$APP_HOME/media/gradle.icns\"" -fi - -# For Cygwin or MSYS, switch paths to Windows format before running java -if [ "$cygwin" = "true" -o "$msys" = "true" ] ; then - APP_HOME=`cygpath --path --mixed "$APP_HOME"` - CLASSPATH=`cygpath --path --mixed "$CLASSPATH"` - - JAVACMD=`cygpath --unix "$JAVACMD"` - - # We build the pattern for arguments to be converted via cygpath - ROOTDIRSRAW=`find -L / -maxdepth 1 -mindepth 1 -type d 2>/dev/null` - SEP="" - for dir in $ROOTDIRSRAW ; do - ROOTDIRS="$ROOTDIRS$SEP$dir" - SEP="|" - done - OURCYGPATTERN="(^($ROOTDIRS))" - # Add a user-defined pattern to the cygpath arguments - if [ "$GRADLE_CYGPATTERN" != "" ] ; then - OURCYGPATTERN="$OURCYGPATTERN|($GRADLE_CYGPATTERN)" - fi - # Now convert the arguments - kludge to limit ourselves to /bin/sh - i=0 - for arg in "$@" ; do - CHECK=`echo "$arg"|egrep -c "$OURCYGPATTERN" -` - CHECK2=`echo "$arg"|egrep -c "^-"` ### Determine if an option - - if [ $CHECK -ne 0 ] && [ $CHECK2 -eq 0 ] ; then ### Added a condition - eval `echo args$i`=`cygpath --path --ignore --mixed "$arg"` - else - eval `echo args$i`="\"$arg\"" - fi - i=`expr $i + 1` - done - case $i in - 0) set -- ;; - 1) set -- "$args0" ;; - 2) set -- "$args0" "$args1" ;; - 3) set -- "$args0" "$args1" "$args2" ;; - 4) set -- "$args0" "$args1" "$args2" "$args3" ;; - 5) set -- "$args0" "$args1" "$args2" "$args3" "$args4" ;; - 6) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" ;; - 7) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" ;; - 8) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" ;; - 9) set -- "$args0" "$args1" "$args2" "$args3" "$args4" "$args5" "$args6" "$args7" "$args8" ;; - esac -fi - -# Escape application args -save () { - for i do printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/" ; done - echo " " -} -APP_ARGS=`save "$@"` - -# Collect all arguments for the java command, following the shell quoting and substitution rules -eval set -- $DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS "\"-Dorg.gradle.appname=$APP_BASE_NAME\"" -classpath "\"$CLASSPATH\"" org.gradle.wrapper.GradleWrapperMain "$APP_ARGS" - -exec "$JAVACMD" "$@" diff --git a/s3proxy/gradlew.bat b/s3proxy/gradlew.bat deleted file mode 100644 index ac1b06f93..000000000 --- a/s3proxy/gradlew.bat +++ /dev/null @@ -1,89 +0,0 @@ -@rem -@rem Copyright 2015 the original author or authors. -@rem -@rem Licensed under the Apache License, Version 2.0 (the "License"); -@rem you may not use this file except in compliance with the License. -@rem You may obtain a copy of the License at -@rem -@rem https://www.apache.org/licenses/LICENSE-2.0 -@rem -@rem Unless required by applicable law or agreed to in writing, software -@rem distributed under the License is distributed on an "AS IS" BASIS, -@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -@rem See the License for the specific language governing permissions and -@rem limitations under the License. -@rem - -@if "%DEBUG%" == "" @echo off -@rem ########################################################################## -@rem -@rem Gradle startup script for Windows -@rem -@rem ########################################################################## - -@rem Set local scope for the variables with windows NT shell -if "%OS%"=="Windows_NT" setlocal - -set DIRNAME=%~dp0 -if "%DIRNAME%" == "" set DIRNAME=. -set APP_BASE_NAME=%~n0 -set APP_HOME=%DIRNAME% - -@rem Resolve any "." and ".." in APP_HOME to make it shorter. -for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi - -@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. -set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" - -@rem Find java.exe -if defined JAVA_HOME goto findJavaFromJavaHome - -set JAVA_EXE=java.exe -%JAVA_EXE% -version >NUL 2>&1 -if "%ERRORLEVEL%" == "0" goto execute - -echo. -echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:findJavaFromJavaHome -set JAVA_HOME=%JAVA_HOME:"=% -set JAVA_EXE=%JAVA_HOME%/bin/java.exe - -if exist "%JAVA_EXE%" goto execute - -echo. -echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% -echo. -echo Please set the JAVA_HOME variable in your environment to match the -echo location of your Java installation. - -goto fail - -:execute -@rem Setup the command line - -set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar - - -@rem Execute Gradle -"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* - -:end -@rem End local scope for the variables with windows NT shell -if "%ERRORLEVEL%"=="0" goto mainEnd - -:fail -rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of -rem the _cmd.exe /c_ return code! -if not "" == "%GRADLE_EXIT_CONSOLE%" exit 1 -exit /b 1 - -:mainEnd -if "%OS%"=="Windows_NT" endlocal - -:omega diff --git a/s3proxy/script/deploy.sh b/s3proxy/script/deploy.sh deleted file mode 100644 index 7ac72174a..000000000 --- a/s3proxy/script/deploy.sh +++ /dev/null @@ -1,20 +0,0 @@ -PROFILE=$1 - -JAR_FILE_NAME=s3proxy-0.0.1-SNAPSHOT.jar - -echo "Checking currently running process id..." -RUNNING_PROCESS_ID=$(pgrep -fl java | awk '{print $1}') - -if [ -z "$RUNNING_PROCESS_ID" ]; then - echo "No s3Proxy server is running." -else - echo "Killing process whose id is $RUNNING_PROCESS_ID" - kill -15 $RUNNING_PROCESS_ID - sleep 5 -fi - -echo "Running jar file..." -nohup java -jar -Dspring.profiles.active=$PROFILE $JAR_FILE_NAME > ~/nohup.out 2>&1 & - -CURRENT_PROCESS_ID=$(pgrep -fl java | awk '{print $1}') -echo "Application is running as pid: $CURRENT_PROCESS_ID" diff --git a/s3proxy/settings.gradle b/s3proxy/settings.gradle deleted file mode 100644 index 78517cd75..000000000 --- a/s3proxy/settings.gradle +++ /dev/null @@ -1 +0,0 @@ -rootProject.name = 's3proxy' diff --git a/s3proxy/src/docs/asciidoc/index.adoc b/s3proxy/src/docs/asciidoc/index.adoc deleted file mode 100644 index d4d7b0d2b..000000000 --- a/s3proxy/src/docs/asciidoc/index.adoc +++ /dev/null @@ -1,24 +0,0 @@ -= ZZIMKKONG S3 Proxy Server Application API Document -:doctype: book -:icons: font -:source-highlighter: highlightjs -:toc: left -:toclevels: 3 -:sectlinks: - -== Multi-Part Upload - -=== Upload -==== Request -include::{snippets}/s3/post/path-parameters.adoc[] -include::{snippets}/s3/post/http-request.adoc[] - -==== Response -include::{snippets}/s3/post/http-response.adoc[] - -=== Delete -==== Request -include::{snippets}/s3/delete/path-parameters.adoc[] -include::{snippets}/s3/delete/http-request.adoc[] -==== Response -include::{snippets}/s3/delete/http-response.adoc[] diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/S3proxyApplication.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/S3proxyApplication.java deleted file mode 100644 index 1ff565504..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/S3proxyApplication.java +++ /dev/null @@ -1,13 +0,0 @@ -package com.woowacourse.s3proxy; - -import org.springframework.boot.SpringApplication; -import org.springframework.boot.autoconfigure.SpringBootApplication; - -@SpringBootApplication -public class S3proxyApplication { - - public static void main(String[] args) { - SpringApplication.run(S3proxyApplication.class, args); - } - -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/config/AuthInterceptorConfig.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/config/AuthInterceptorConfig.java deleted file mode 100644 index 0c285aac0..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/config/AuthInterceptorConfig.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.woowacourse.s3proxy.config; - -import com.woowacourse.s3proxy.infrastructure.AuthInterceptor; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; -import org.springframework.context.annotation.PropertySource; - -@Configuration -@PropertySource("classpath:config/s3proxy.properties") -public class AuthInterceptorConfig { - @Bean(name = "authInterceptor") - @Profile("prod") - public AuthInterceptor authInterceptorProd( - @Value("${s3proxy.secret-key.prod}") String secretKey) { - return new AuthInterceptor(secretKey); - } - - @Bean(name = "authInterceptor") - @Profile({"dev", "local", "test"}) - public AuthInterceptor authInterceptorDev( - @Value("${s3proxy.secret-key.dev}") String secretKey) { - return new AuthInterceptor(secretKey); - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/config/AuthenticationPrincipalConfig.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/config/AuthenticationPrincipalConfig.java deleted file mode 100644 index 2fbca605b..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/config/AuthenticationPrincipalConfig.java +++ /dev/null @@ -1,21 +0,0 @@ -package com.woowacourse.s3proxy.config; - -import com.woowacourse.s3proxy.infrastructure.AuthInterceptor; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.servlet.config.annotation.InterceptorRegistry; -import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; - -@Configuration -public class AuthenticationPrincipalConfig implements WebMvcConfigurer { - private final AuthInterceptor authInterceptor; - - public AuthenticationPrincipalConfig(AuthInterceptor authInterceptor) { - this.authInterceptor = authInterceptor; - } - - @Override - public void addInterceptors(InterceptorRegistry registry) { - registry.addInterceptor(authInterceptor) - .addPathPatterns("/api/storage/*"); - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/config/MultipartConfig.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/config/MultipartConfig.java deleted file mode 100644 index da2013334..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/config/MultipartConfig.java +++ /dev/null @@ -1,15 +0,0 @@ -package com.woowacourse.s3proxy.config; - -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.web.multipart.commons.CommonsMultipartResolver; - -@Configuration -public class MultipartConfig { - @Bean(name = "multipartResolver") - public CommonsMultipartResolver multipartResolver() { - CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver(); - multipartResolver.setMaxUploadSize(1048576); // 1MB - return multipartResolver; - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/config/StorageConfig.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/config/StorageConfig.java deleted file mode 100644 index 6cd5f6262..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/config/StorageConfig.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.woowacourse.s3proxy.config; - -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.AmazonS3ClientBuilder; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.context.annotation.Bean; -import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Profile; - -@Configuration -public class StorageConfig { - - @Bean - @Profile({"prod", "dev"}) - public AmazonS3 amazonS3() { - return AmazonS3ClientBuilder - .standard() - .build(); - } - - @Bean(name = "amazonS3") - @Profile({"test", "local"}) - public AmazonS3 amazonS3Local(@Value("${cloud.aws.region.static}") String region) { - - return AmazonS3ClientBuilder - .standard() - .withRegion(region) - .build(); - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/controller/ControllerAdvice.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/controller/ControllerAdvice.java deleted file mode 100644 index 8e3c40efd..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/controller/ControllerAdvice.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.woowacourse.s3proxy.controller; - -import com.woowacourse.s3proxy.dto.ErrorResponse; -import com.woowacourse.s3proxy.exception.S3ProxyException; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.ExceptionHandler; -import org.springframework.web.bind.annotation.RestControllerAdvice; - -@Slf4j -@RestControllerAdvice -public class ControllerAdvice { - @ExceptionHandler(S3ProxyException.class) - public ResponseEntity s3ProxyExceptionHandler(final S3ProxyException exception) { - log.warn(exception.getMessage(), exception); - return ResponseEntity - .status(exception.getStatus()) - .body(ErrorResponse.from(exception)); - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/controller/S3ProxyController.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/controller/S3ProxyController.java deleted file mode 100644 index d1337db4a..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/controller/S3ProxyController.java +++ /dev/null @@ -1,36 +0,0 @@ -package com.woowacourse.s3proxy.controller; - -import com.woowacourse.s3proxy.service.S3Service; -import lombok.extern.slf4j.Slf4j; -import org.springframework.http.ResponseEntity; -import org.springframework.web.bind.annotation.*; -import org.springframework.web.multipart.MultipartFile; - -import java.net.URI; - -@Slf4j -@RestController -@RequestMapping("/api/storage") -public class S3ProxyController { - private final S3Service s3Service; - - public S3ProxyController(final S3Service s3Service) { - this.s3Service = s3Service; - } - - @PostMapping("/{directoryPath}") - public ResponseEntity submit( - @RequestParam("file") MultipartFile file, - @PathVariable("directoryPath") String directoryPath) { - URI location = s3Service.upload(file, directoryPath); - return ResponseEntity.created(location).build(); - } - - @DeleteMapping("/{directoryPath}/{fileName}") - public ResponseEntity delete( - @PathVariable("directoryPath") String directoryPath, - @PathVariable("fileName") String fileName) { - s3Service.delete(directoryPath, fileName); - return ResponseEntity.noContent().build(); - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/dto/ErrorResponse.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/dto/ErrorResponse.java deleted file mode 100644 index 41582fe6c..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/dto/ErrorResponse.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.woowacourse.s3proxy.dto; - -import lombok.Getter; -import lombok.NoArgsConstructor; - -@Getter -@NoArgsConstructor -public class ErrorResponse { - private String message; - - protected ErrorResponse(final String message) { - this.message = message; - } - - public static ErrorResponse from(final RuntimeException exception) { - return new ErrorResponse(exception.getMessage()); - } - -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/AuthorizationHeaderUninvolvedException.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/AuthorizationHeaderUninvolvedException.java deleted file mode 100644 index c82f87d68..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/AuthorizationHeaderUninvolvedException.java +++ /dev/null @@ -1,10 +0,0 @@ -package com.woowacourse.s3proxy.exception; - -import org.springframework.http.HttpStatus; - -public class AuthorizationHeaderUninvolvedException extends S3ProxyException { - private static final String MESSAGE = "인가에 실패했습니다."; - public AuthorizationHeaderUninvolvedException() { - super(MESSAGE, HttpStatus.UNAUTHORIZED); - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/S3ProxyException.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/S3ProxyException.java deleted file mode 100644 index 5b783b2c6..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/S3ProxyException.java +++ /dev/null @@ -1,19 +0,0 @@ -package com.woowacourse.s3proxy.exception; - -import lombok.Getter; -import org.springframework.http.HttpStatus; - -@Getter -public abstract class S3ProxyException extends RuntimeException { - protected final HttpStatus status; - - public S3ProxyException(String message, HttpStatus status) { - super(message); - this.status = status; - } - - public S3ProxyException(String message, Throwable cause, HttpStatus status) { - super(message, cause); - this.status = status; - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/S3UploadException.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/S3UploadException.java deleted file mode 100644 index 6084d6379..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/S3UploadException.java +++ /dev/null @@ -1,12 +0,0 @@ -package com.woowacourse.s3proxy.exception; - -import org.springframework.http.HttpStatus; - -public class S3UploadException extends S3ProxyException { - private static final String MESSAGE = "이미지 버킷 업로드에 실패했습니다."; - - public S3UploadException(final Throwable cause) { - super(MESSAGE, cause, HttpStatus.INTERNAL_SERVER_ERROR); - } -} - diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/UnsupportedFileExtensionException.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/UnsupportedFileExtensionException.java deleted file mode 100644 index d8176c0d0..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/exception/UnsupportedFileExtensionException.java +++ /dev/null @@ -1,11 +0,0 @@ -package com.woowacourse.s3proxy.exception; - -import org.springframework.http.HttpStatus; - -public class UnsupportedFileExtensionException extends S3ProxyException { - private static final String MESSAGE = "지원하지 않는 확장자입니다."; - - public UnsupportedFileExtensionException() { - super(MESSAGE, HttpStatus.BAD_REQUEST); - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/infrastructure/AuthInterceptor.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/infrastructure/AuthInterceptor.java deleted file mode 100644 index 39f9157f5..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/infrastructure/AuthInterceptor.java +++ /dev/null @@ -1,35 +0,0 @@ -package com.woowacourse.s3proxy.infrastructure; - -import com.woowacourse.s3proxy.exception.AuthorizationHeaderUninvolvedException; -import org.springframework.http.HttpMethod; -import org.springframework.web.servlet.HandlerInterceptor; - -import javax.servlet.http.HttpServletRequest; -import javax.servlet.http.HttpServletResponse; - - -public class AuthInterceptor implements HandlerInterceptor { - private final String secretKey; - - public AuthInterceptor(String secretKey) { - this.secretKey = secretKey; - } - - @Override - public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) { - if (isPreflight(request)) { - return true; - } - - String secretKey = AuthorizationExtractor.extractAccessToken(request); - if (secretKey.equals(this.secretKey)) { - return true; - } - - throw new AuthorizationHeaderUninvolvedException(); - } - - private boolean isPreflight(HttpServletRequest request) { - return request.getMethod().equals(HttpMethod.OPTIONS.toString()); - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/infrastructure/AuthorizationExtractor.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/infrastructure/AuthorizationExtractor.java deleted file mode 100644 index eb2abdc7e..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/infrastructure/AuthorizationExtractor.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.woowacourse.s3proxy.infrastructure; - -import com.woowacourse.s3proxy.exception.AuthorizationHeaderUninvolvedException; - -import javax.servlet.http.HttpServletRequest; -import java.util.Enumeration; - -public class AuthorizationExtractor { - private static final String AUTHORIZATION_HEADER_KEY = "Authorization"; - - private AuthorizationExtractor() { - } - public static String extractAccessToken(HttpServletRequest request) { - Enumeration headers = request.getHeaders(AUTHORIZATION_HEADER_KEY); - if (headers.hasMoreElements()) { - return headers.nextElement(); - } - throw new AuthorizationHeaderUninvolvedException(); - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/infrastructure/S3Uploader.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/infrastructure/S3Uploader.java deleted file mode 100644 index cb729b248..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/infrastructure/S3Uploader.java +++ /dev/null @@ -1,82 +0,0 @@ -package com.woowacourse.s3proxy.infrastructure; - -import com.amazonaws.AmazonClientException; -import com.amazonaws.services.s3.AmazonS3; -import com.amazonaws.services.s3.model.DeleteObjectRequest; -import com.amazonaws.services.s3.model.ObjectMetadata; -import com.woowacourse.s3proxy.exception.S3UploadException; -import com.woowacourse.s3proxy.exception.UnsupportedFileExtensionException; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.http.MediaType; -import org.springframework.http.MediaTypeFactory; -import org.springframework.stereotype.Component; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.net.URL; - -@Component -public class S3Uploader { - public static final String PATH_DELIMITER = "/"; - private static final String S3_HOST_URL_SUFFIX = "amazonaws.com"; - private static final int RESOURCE_URL_INDEX = 1; - - private final AmazonS3 amazonS3; - private final String bucketName; - private final String cloudFrontUrl; - - public S3Uploader( - final AmazonS3 amazonS3, - @Value("${aws.s3.bucket-name}") final String bucketName, - @Value("${aws.s3.mapped-cloudfront}") final String cloudFrontUrl) { - this.amazonS3 = amazonS3; - this.bucketName = bucketName; - this.cloudFrontUrl = cloudFrontUrl; - } - - public URI upload(MultipartFile multipartFile, String directoryPath) { - ObjectMetadata objectMetadata = createObjectMetadata(multipartFile); - - String fileName = multipartFile.getOriginalFilename(); - String fileFullPath = generateFullPath(directoryPath, fileName); - - try(InputStream inputStream = multipartFile.getInputStream()) { - - amazonS3.putObject(this.bucketName, fileFullPath, inputStream, objectMetadata); - - URL fileUrl = amazonS3.getUrl(this.bucketName, fileFullPath); - - return makeAccessibleUrl(fileUrl, cloudFrontUrl); - } catch (AmazonClientException | IOException exception) { - throw new S3UploadException(exception); - } - } - - private ObjectMetadata createObjectMetadata(MultipartFile multipartFile) { - String filename = multipartFile.getOriginalFilename(); - MediaType mediaType = MediaTypeFactory.getMediaType(filename) - .orElseThrow(UnsupportedFileExtensionException::new); - - ObjectMetadata objectMetadata = new ObjectMetadata(); - objectMetadata.setContentType(mediaType.toString()); - objectMetadata.setContentLength(multipartFile.getSize()); - - return objectMetadata; - } - - private String generateFullPath(String directoryPath, String fileName) { - return directoryPath + PATH_DELIMITER + fileName; - } - - private URI makeAccessibleUrl(final URL origin, final String cloudFrontUrl) { - String uriWithoutHost = origin.toString().split(S3_HOST_URL_SUFFIX)[RESOURCE_URL_INDEX]; - String replacedUrl = cloudFrontUrl + uriWithoutHost; - return URI.create(replacedUrl); - } - - public void delete(final String fullPathOfFile) { - amazonS3.deleteObject(new DeleteObjectRequest(bucketName, fullPathOfFile)); - } -} diff --git a/s3proxy/src/main/java/com/woowacourse/s3proxy/service/S3Service.java b/s3proxy/src/main/java/com/woowacourse/s3proxy/service/S3Service.java deleted file mode 100644 index ab41ed023..000000000 --- a/s3proxy/src/main/java/com/woowacourse/s3proxy/service/S3Service.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.woowacourse.s3proxy.service; - -import com.woowacourse.s3proxy.infrastructure.S3Uploader; -import lombok.extern.slf4j.Slf4j; -import org.springframework.stereotype.Service; -import org.springframework.web.multipart.MultipartFile; - -import java.net.URI; - -@Slf4j -@Service -public class S3Service { - private final S3Uploader s3Uploader; - - public S3Service(final S3Uploader s3Uploader) { - this.s3Uploader = s3Uploader; - } - - public URI upload(MultipartFile multipartFile, String directoryPath) { - return s3Uploader.upload(multipartFile, directoryPath); - } - - public void delete(String directoryPath, String fileName) { - s3Uploader.delete(directoryPath + S3Uploader.PATH_DELIMITER + fileName); - } -} diff --git a/s3proxy/src/main/resources/appenders/console-appender.xml b/s3proxy/src/main/resources/appenders/console-appender.xml deleted file mode 100644 index a9c4fb53c..000000000 --- a/s3proxy/src/main/resources/appenders/console-appender.xml +++ /dev/null @@ -1,9 +0,0 @@ - - - - - ${CONSOLE_LOG_PATTERN} - - - - diff --git a/s3proxy/src/main/resources/appenders/file-appender-debug.xml b/s3proxy/src/main/resources/appenders/file-appender-debug.xml deleted file mode 100644 index d46254437..000000000 --- a/s3proxy/src/main/resources/appenders/file-appender-debug.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ${FILE_PATH}/${DATE_FORMAT}/debug/debug.log - - - DEBUG - ACCEPT - DENY - - - - ${FILE_LOG_PATTERN} - - - - ${FILE_PATH}/%d{yyyy-MM-dd}/debug/debug_%i.log - 100MB - 100 - 10GB - - - - diff --git a/s3proxy/src/main/resources/appenders/file-appender-error.xml b/s3proxy/src/main/resources/appenders/file-appender-error.xml deleted file mode 100644 index 1c6d064dc..000000000 --- a/s3proxy/src/main/resources/appenders/file-appender-error.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ${FILE_PATH}/${DATE_FORMAT}/error/error.log - - - ERROR - ACCEPT - DENY - - - - ${FILE_LOG_PATTERN} - - - - ${FILE_PATH}/%d{yyyy-MM-dd}/error/error_%i.log - 100MB - 100 - 10GB - - - - diff --git a/s3proxy/src/main/resources/appenders/file-appender-info.xml b/s3proxy/src/main/resources/appenders/file-appender-info.xml deleted file mode 100644 index abd5116ff..000000000 --- a/s3proxy/src/main/resources/appenders/file-appender-info.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ${FILE_PATH}/${DATE_FORMAT}/info/info.log - - - INFO - ACCEPT - DENY - - - - ${FILE_LOG_PATTERN} - - - - ${FILE_PATH}/%d{yyyy-MM-dd}/info/info_%i.log - 100MB - 100 - 10GB - - - - diff --git a/s3proxy/src/main/resources/appenders/file-appender-trace.xml b/s3proxy/src/main/resources/appenders/file-appender-trace.xml deleted file mode 100644 index 6f24e2375..000000000 --- a/s3proxy/src/main/resources/appenders/file-appender-trace.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ${FILE_PATH}/${DATE_FORMAT}/trace/trace.log - - - TRACE - ACCEPT - DENY - - - - ${FILE_LOG_PATTERN} - - - - ${FILE_PATH}/%d{yyyy-MM-dd}/trace/trace_%i.log - 100MB - 100 - 10GB - - - - diff --git a/s3proxy/src/main/resources/appenders/file-appender-warn.xml b/s3proxy/src/main/resources/appenders/file-appender-warn.xml deleted file mode 100644 index 9908dd63d..000000000 --- a/s3proxy/src/main/resources/appenders/file-appender-warn.xml +++ /dev/null @@ -1,24 +0,0 @@ - - - - ${FILE_PATH}/${DATE_FORMAT}/warn/warn.log - - - WARN - ACCEPT - DENY - - - - ${FILE_LOG_PATTERN} - - - - ${FILE_PATH}/%d{yyyy-MM-dd}/warn/warn_%i.log - 100MB - 100 - 10GB - - - - diff --git a/s3proxy/src/main/resources/appenders/kafka-appender-dev.xml b/s3proxy/src/main/resources/appenders/kafka-appender-dev.xml deleted file mode 100644 index 1f771dfd9..000000000 --- a/s3proxy/src/main/resources/appenders/kafka-appender-dev.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - logstash-s3proxy - - - - bootstrap.servers=192.168.2.139:8080,192.168.2.44:8080,192.168.2.24:8080 - - diff --git a/s3proxy/src/main/resources/appenders/kafka-appender-prod.xml b/s3proxy/src/main/resources/appenders/kafka-appender-prod.xml deleted file mode 100644 index 5a139a88a..000000000 --- a/s3proxy/src/main/resources/appenders/kafka-appender-prod.xml +++ /dev/null @@ -1,11 +0,0 @@ - - - - - logstash-s3proxy - - - - bootstrap.servers=192.168.2.242:8080,192.168.2.150:8080,192.168.2.152:8080 - - diff --git a/s3proxy/src/main/resources/application-dev.yml b/s3proxy/src/main/resources/application-dev.yml deleted file mode 100644 index 4d1ee6e7c..000000000 --- a/s3proxy/src/main/resources/application-dev.yml +++ /dev/null @@ -1,9 +0,0 @@ -cloud: - aws: - stack: - auto: false -aws: - s3: - bucket-name: zzimkkong-thumbnail-dev - mapped-cloudfront: https://d3tdpsdxqmqd52.cloudfront.net - region: ap-northeast-2 diff --git a/s3proxy/src/main/resources/application-local.yml b/s3proxy/src/main/resources/application-local.yml deleted file mode 100644 index bbbbb87dc..000000000 --- a/s3proxy/src/main/resources/application-local.yml +++ /dev/null @@ -1,14 +0,0 @@ -cloud: - aws: - stack: - auto: false - credentials: - instance-profile: false - region: - static: ap-northeast-2 - -aws: - s3: - bucket-name: zzimkkong-personal - mapped-cloudfront: https://zzimkkong-personal.s3.ap-northeast-2.amazonaws.com - region: ap-northeast-2 diff --git a/s3proxy/src/main/resources/application-test.yml b/s3proxy/src/main/resources/application-test.yml deleted file mode 100644 index bbbbb87dc..000000000 --- a/s3proxy/src/main/resources/application-test.yml +++ /dev/null @@ -1,14 +0,0 @@ -cloud: - aws: - stack: - auto: false - credentials: - instance-profile: false - region: - static: ap-northeast-2 - -aws: - s3: - bucket-name: zzimkkong-personal - mapped-cloudfront: https://zzimkkong-personal.s3.ap-northeast-2.amazonaws.com - region: ap-northeast-2 diff --git a/s3proxy/src/main/resources/application.yml b/s3proxy/src/main/resources/application.yml deleted file mode 100644 index d74c444c1..000000000 --- a/s3proxy/src/main/resources/application.yml +++ /dev/null @@ -1,3 +0,0 @@ -spring: - profiles: - active: local diff --git a/s3proxy/src/main/resources/config b/s3proxy/src/main/resources/config deleted file mode 160000 index a2d168ac3..000000000 --- a/s3proxy/src/main/resources/config +++ /dev/null @@ -1 +0,0 @@ -Subproject commit a2d168ac3adfb324408ad8afa2bd3e4d3ac35220 diff --git a/s3proxy/src/main/resources/logback-spring.xml b/s3proxy/src/main/resources/logback-spring.xml deleted file mode 100644 index a23731343..000000000 --- a/s3proxy/src/main/resources/logback-spring.xml +++ /dev/null @@ -1,58 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/s3proxy/src/main/resources/s3proxy-config b/s3proxy/src/main/resources/s3proxy-config deleted file mode 160000 index e33c8a691..000000000 --- a/s3proxy/src/main/resources/s3proxy-config +++ /dev/null @@ -1 +0,0 @@ -Subproject commit e33c8a691c32dfdc9e8f5ce4b33c753363b8a054 diff --git a/s3proxy/src/test/java/com/woowacourse/s3proxy/Constants.java b/s3proxy/src/test/java/com/woowacourse/s3proxy/Constants.java deleted file mode 100644 index 439c4ae2e..000000000 --- a/s3proxy/src/test/java/com/woowacourse/s3proxy/Constants.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.woowacourse.s3proxy; - -public class Constants { - public static final String LUTHER_IMAGE_URI_CLOUDFRONT = "https://d3tdpsdxqmqd52.cloudfront.net/testdir/luther.png"; - public static final String LUTHER_IMAGE_URI_S3 = "https://zzimkkong-thumbnail-dev.s3.ap-northeast-2.amazonaws.com/testdir/luther.png"; -} diff --git a/s3proxy/src/test/java/com/woowacourse/s3proxy/DocumentUtils.java b/s3proxy/src/test/java/com/woowacourse/s3proxy/DocumentUtils.java deleted file mode 100644 index 4503786f0..000000000 --- a/s3proxy/src/test/java/com/woowacourse/s3proxy/DocumentUtils.java +++ /dev/null @@ -1,31 +0,0 @@ -package com.woowacourse.s3proxy; - -import io.restassured.specification.RequestSpecification; -import org.springframework.restdocs.operation.preprocess.OperationRequestPreprocessor; -import org.springframework.restdocs.operation.preprocess.OperationResponsePreprocessor; - -import static org.springframework.restdocs.operation.preprocess.Preprocessors.*; -import static org.springframework.restdocs.operation.preprocess.Preprocessors.prettyPrint; - -public final class DocumentUtils { - private static RequestSpecification preConfiguredRequestSpecification; - - private DocumentUtils() { - } - - public static RequestSpecification getRequestSpecification() { - return preConfiguredRequestSpecification; - } - - public static void setRequestSpecification(RequestSpecification preConfiguredRequestSpecification) { - DocumentUtils.preConfiguredRequestSpecification = preConfiguredRequestSpecification; - } - - public static OperationRequestPreprocessor getRequestPreprocessor() { - return preprocessRequest(prettyPrint()); - } - - public static OperationResponsePreprocessor getResponsePreprocessor() { - return preprocessResponse(prettyPrint()); - } -} diff --git a/s3proxy/src/test/java/com/woowacourse/s3proxy/controller/AcceptanceTest.java b/s3proxy/src/test/java/com/woowacourse/s3proxy/controller/AcceptanceTest.java deleted file mode 100644 index d927f021f..000000000 --- a/s3proxy/src/test/java/com/woowacourse/s3proxy/controller/AcceptanceTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package com.woowacourse.s3proxy.controller; - -import io.restassured.RestAssured; -import io.restassured.builder.RequestSpecBuilder; -import io.restassured.specification.RequestSpecification; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.extension.ExtendWith; -import org.springframework.boot.test.autoconfigure.restdocs.AutoConfigureRestDocs; -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.boot.web.server.LocalServerPort; -import org.springframework.restdocs.RestDocumentationContextProvider; -import org.springframework.restdocs.RestDocumentationExtension; -import org.springframework.test.context.ActiveProfiles; -import org.springframework.test.context.junit.jupiter.SpringExtension; - -import static com.woowacourse.s3proxy.DocumentUtils.setRequestSpecification; -import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.documentationConfiguration; - -@ExtendWith({RestDocumentationExtension.class, SpringExtension.class}) -@AutoConfigureRestDocs -@SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment.RANDOM_PORT) -@ActiveProfiles("test") -public class AcceptanceTest { - @LocalServerPort - int port; - - @BeforeEach - void setUp(RestDocumentationContextProvider restDocumentation) { - RestAssured.port = this.port; - RequestSpecification spec = new RequestSpecBuilder() - .addFilter(documentationConfiguration(restDocumentation)) - .build(); - setRequestSpecification(spec); - } -} - - diff --git a/s3proxy/src/test/java/com/woowacourse/s3proxy/controller/S3ProxyControllerTest.java b/s3proxy/src/test/java/com/woowacourse/s3proxy/controller/S3ProxyControllerTest.java deleted file mode 100644 index eccc5aa55..000000000 --- a/s3proxy/src/test/java/com/woowacourse/s3proxy/controller/S3ProxyControllerTest.java +++ /dev/null @@ -1,102 +0,0 @@ -package com.woowacourse.s3proxy.controller; - -import com.woowacourse.s3proxy.infrastructure.S3Uploader; -import io.restassured.RestAssured; -import io.restassured.response.ExtractableResponse; -import io.restassured.response.Response; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Value; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.context.annotation.PropertySource; -import org.springframework.http.HttpHeaders; -import org.springframework.http.HttpStatus; -import org.springframework.http.MediaType; -import org.springframework.web.multipart.MultipartFile; - -import java.io.File; -import java.net.URI; - -import static com.woowacourse.s3proxy.Constants.LUTHER_IMAGE_URI_CLOUDFRONT; -import static com.woowacourse.s3proxy.DocumentUtils.*; -import static org.assertj.core.api.Assertions.assertThat; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.BDDMockito.given; -import static org.springframework.restdocs.request.RequestDocumentation.parameterWithName; -import static org.springframework.restdocs.request.RequestDocumentation.pathParameters; -import static org.springframework.restdocs.restassured3.RestAssuredRestDocumentation.document; - -@PropertySource("classpath:config/s3proxy.properties") -class S3ProxyControllerTest extends AcceptanceTest { - @MockBean - S3Uploader s3Uploader; - - @Value("${s3proxy.secret-key.prod}") - private String secretKey; - - @BeforeEach - void setUp() { - given(s3Uploader.upload(any(MultipartFile.class), anyString())) - .willReturn(URI.create(LUTHER_IMAGE_URI_CLOUDFRONT)); - } - - @Test - @DisplayName("스토리지에 파일을 업로드한다.") - void upload() { - // given - String directory = "testdir"; - String filePath = getClass().getClassLoader().getResource("luther.png").getFile(); - File file = new File(filePath); - - // when - ExtractableResponse response = uploadFile(directory, file); - - // then - assertThat(response.statusCode()).isEqualTo(HttpStatus.CREATED.value()); - } - - @Test - @DisplayName("스토리지의 파일을 삭제한다.") - void delete() { - // given - String fileName = "filename.png"; - String directory = "testdir"; - - // when - ExtractableResponse response = deleteFile(directory, fileName); - - // then - assertThat(response.statusCode()).isEqualTo(HttpStatus.NO_CONTENT.value()); - } - - private ExtractableResponse uploadFile(String directory, File file) { - return RestAssured.given(getRequestSpecification()) - .log().all() - .filter(document( - "s3/post", getRequestPreprocessor(), getResponsePreprocessor(), - pathParameters(parameterWithName("directory").description("저장하고자 하는 스토리지 내의 디렉토리 이름")))) - .contentType(MediaType.MULTIPART_FORM_DATA_VALUE) - .multiPart("file", file) - .header(HttpHeaders.AUTHORIZATION, secretKey) - .pathParam("directory", directory) - .when().post("/api/storage/{directory}") - .then().log().all().extract(); - } - - private ExtractableResponse deleteFile(String directory, String fileName) { - return RestAssured.given(getRequestSpecification()) - .log().all() - .filter(document("s3/delete", getRequestPreprocessor(), getResponsePreprocessor(), - pathParameters( - parameterWithName("directory").description("저장하고자 하는 스토리지 내의 디렉토리 이름"), - parameterWithName("filename").description("삭제하고자 하는 파일의 이름(확장자 포함)")))) - .when() - .header(HttpHeaders.AUTHORIZATION, secretKey) - .pathParam("directory", directory) - .pathParam("filename", fileName) - .delete("/api/storage/{directory}/{filename}") - .then().log().all().extract(); - } -} diff --git a/s3proxy/src/test/java/com/woowacourse/s3proxy/infrastructure/S3UploaderTest.java b/s3proxy/src/test/java/com/woowacourse/s3proxy/infrastructure/S3UploaderTest.java deleted file mode 100644 index 7bf98f5a2..000000000 --- a/s3proxy/src/test/java/com/woowacourse/s3proxy/infrastructure/S3UploaderTest.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.woowacourse.s3proxy.infrastructure; - -import com.amazonaws.services.s3.AmazonS3; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.web.multipart.MultipartFile; - -import java.io.IOException; -import java.io.InputStream; -import java.net.URI; -import java.net.URL; -import java.util.Random; - -import static com.woowacourse.s3proxy.Constants.LUTHER_IMAGE_URI_S3; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; - -class S3UploaderTest { - - @Test - @DisplayName("멀티 파트 파일을 업로드하고 URI를 얻어, 접근 가능한 URI(CloudFront)로 변경해 리턴한다.") - void upload() throws IOException { - // given - AmazonS3 amazonS3 = mock(AmazonS3.class); - String bucketName = "testBucketName"; - String cloudFrontUrl = "https://expectedCloudFrontUrl.net"; - - S3Uploader s3Uploader = new S3Uploader(amazonS3, bucketName, cloudFrontUrl); - - given(amazonS3.getUrl(anyString(), anyString())) - .willReturn(new URL(LUTHER_IMAGE_URI_S3)); - - MultipartFile mockMultipartFile = mock(MultipartFile.class); - given(mockMultipartFile.getOriginalFilename()) - .willReturn("somePngFileName.png"); - given(mockMultipartFile.getSize()) - .willReturn(new Random().nextLong()); - given(mockMultipartFile.getInputStream()) - .willReturn(mock(InputStream.class)); - - // when - String directoryName = "testDirectoryName"; - URI actual = s3Uploader.upload(mockMultipartFile, directoryName); - - String resourceUriWithoutHost = LUTHER_IMAGE_URI_S3.split("amazonaws.com")[1]; - String expectedUri = cloudFrontUrl + resourceUriWithoutHost; - - // then - assertThat(actual).isEqualTo(URI.create(expectedUri)); - } - - @Test - @DisplayName("경로를 입력받아 파일을 삭제할 수 있다.") - void delete() { - // given - AmazonS3 amazonS3 = mock(AmazonS3.class); - String bucketName = "testBucketName"; - String cloudFrontUrl = "https://testCloudFrontUrl.net"; - - S3Uploader s3Uploader = new S3Uploader(amazonS3, bucketName, cloudFrontUrl); - - String fileName = "filename.png"; - String directory = "directoryName"; - - // when, then - assertDoesNotThrow(() -> s3Uploader.delete(directory + "/" + fileName)); - } -} diff --git a/s3proxy/src/test/java/com/woowacourse/s3proxy/service/S3ServiceTest.java b/s3proxy/src/test/java/com/woowacourse/s3proxy/service/S3ServiceTest.java deleted file mode 100644 index 7e5c8de29..000000000 --- a/s3proxy/src/test/java/com/woowacourse/s3proxy/service/S3ServiceTest.java +++ /dev/null @@ -1,57 +0,0 @@ -package com.woowacourse.s3proxy.service; - -import com.woowacourse.s3proxy.infrastructure.S3Uploader; -import org.junit.jupiter.api.BeforeEach; -import org.junit.jupiter.api.DisplayName; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.mock.mockito.MockBean; -import org.springframework.web.multipart.MultipartFile; - -import java.net.URI; - -import static com.woowacourse.s3proxy.Constants.LUTHER_IMAGE_URI_CLOUDFRONT; -import static org.assertj.core.api.Assertions.assertThat; -import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; -import static org.mockito.ArgumentMatchers.any; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.BDDMockito.given; -import static org.mockito.Mockito.mock; - -class S3ServiceTest extends ServiceTest { - @MockBean - private S3Uploader s3Uploader; - - @Autowired - private S3Service s3Service; - - @BeforeEach - void mockingS3Uploader() { - given(s3Uploader.upload(any(MultipartFile.class), anyString())) - .willReturn(URI.create(LUTHER_IMAGE_URI_CLOUDFRONT)); - } - - @Test - @DisplayName("멀티파트로 전송된 파일을 요청한 디렉토리에 업로드한다.") - void upload() { - // given - MultipartFile multipartFile = mock(MultipartFile.class); - - // when - URI actual = s3Service.upload(multipartFile, "thumbnails"); - - // then - assertThat(actual).isEqualTo(URI.create(LUTHER_IMAGE_URI_CLOUDFRONT)); - } - - @Test - @DisplayName("스토리지의 파일을 삭제할 수 있다.") - void delete() { - // given - String fileName = "filename.png"; - String directory = "directoryName"; - - // when, then - assertDoesNotThrow(() -> s3Service.delete(directory, fileName)); - } -} diff --git a/s3proxy/src/test/java/com/woowacourse/s3proxy/service/ServiceTest.java b/s3proxy/src/test/java/com/woowacourse/s3proxy/service/ServiceTest.java deleted file mode 100644 index e6bbd09a1..000000000 --- a/s3proxy/src/test/java/com/woowacourse/s3proxy/service/ServiceTest.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.woowacourse.s3proxy.service; - -import org.springframework.boot.test.context.SpringBootTest; -import org.springframework.test.context.ActiveProfiles; - -@SpringBootTest -@ActiveProfiles("test") -public class ServiceTest { -} diff --git a/s3proxy/src/test/resources/luther.png b/s3proxy/src/test/resources/luther.png deleted file mode 100644 index c2eac157e..000000000 Binary files a/s3proxy/src/test/resources/luther.png and /dev/null differ