From 5ed5d4b83673269a135c11fd78f6daacd07ba099 Mon Sep 17 00:00:00 2001 From: usbharu <64310155+usbharu@users.noreply.github.com> Date: Wed, 6 Dec 2023 21:37:00 +0900 Subject: [PATCH] =?UTF-8?q?fix:=20#188=20=E3=81=A7=E6=8C=87=E5=AE=9A?= =?UTF-8?q?=E3=81=97=E3=81=9F=E3=82=A8=E3=83=B3=E3=83=89=E3=83=9D=E3=82=A4?= =?UTF-8?q?=E3=83=B3=E3=83=88=E3=81=A7=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=82=92=E5=8F=96=E5=BE=97=E3=81=A7=E3=81=8D=E3=81=AA=E3=81=84?= =?UTF-8?q?=E5=95=8F=E9=A1=8C=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../application/config/SecurityConfig.kt | 1 + .../api/media/LocalFileController.kt | 40 +++++++++++++++++++ 2 files changed, 41 insertions(+) create mode 100644 src/main/kotlin/dev/usbharu/hideout/core/interfaces/api/media/LocalFileController.kt diff --git a/src/main/kotlin/dev/usbharu/hideout/application/config/SecurityConfig.kt b/src/main/kotlin/dev/usbharu/hideout/application/config/SecurityConfig.kt index dead45f0..85f22367 100644 --- a/src/main/kotlin/dev/usbharu/hideout/application/config/SecurityConfig.kt +++ b/src/main/kotlin/dev/usbharu/hideout/application/config/SecurityConfig.kt @@ -186,6 +186,7 @@ class SecurityConfig { authorize(POST, "/api/v1/accounts", permitAll) authorize("/auth/sign_up", hasRole("ANONYMOUS")) + authorize(GET, "/files", permitAll) authorize(GET, "/api/v1/accounts/verify_credentials", hasAnyScope("read", "read:accounts")) diff --git a/src/main/kotlin/dev/usbharu/hideout/core/interfaces/api/media/LocalFileController.kt b/src/main/kotlin/dev/usbharu/hideout/core/interfaces/api/media/LocalFileController.kt new file mode 100644 index 00000000..a7c4032e --- /dev/null +++ b/src/main/kotlin/dev/usbharu/hideout/core/interfaces/api/media/LocalFileController.kt @@ -0,0 +1,40 @@ +package dev.usbharu.hideout.core.interfaces.api.media + +import dev.usbharu.hideout.application.config.LocalStorageConfig +import dev.usbharu.hideout.core.service.media.FileTypeDeterminationService +import org.springframework.boot.autoconfigure.condition.ConditionalOnProperty +import org.springframework.core.io.PathResource +import org.springframework.core.io.Resource +import org.springframework.http.MediaType +import org.springframework.http.ResponseEntity +import org.springframework.stereotype.Controller +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PathVariable +import java.nio.file.Path +import kotlin.io.path.name + +@Controller +@ConditionalOnProperty("hideout.storage.type", havingValue = "local", matchIfMissing = true) +class LocalFileController( + localStorageConfig: LocalStorageConfig, + private val fileTypeDeterminationService: FileTypeDeterminationService +) { + + private val savePath = Path.of(localStorageConfig.path).toAbsolutePath() + + @GetMapping("/files/{id}") + fun files(@PathVariable("id") id: String): ResponseEntity { + + val name = Path.of(id).name + val path = savePath.resolve(name) + + val mimeType = fileTypeDeterminationService.fileType(path, name) + val pathResource = PathResource(path) + + return ResponseEntity + .ok() + .contentType(MediaType(mimeType.type, mimeType.subtype)) + .contentLength(pathResource.contentLength()) + .body(pathResource) + } +}