From 42a8e2fd043b76abe9882279e48c4b34535222e7 Mon Sep 17 00:00:00 2001 From: yechan-kim Date: Sun, 2 Mar 2025 20:37:45 +0900 Subject: [PATCH 1/5] =?UTF-8?q?refactor:=20S3=20=EB=B2=84=ED=82=B7=20?= =?UTF-8?q?=ED=8C=8C=EC=9D=BC=20=EA=B5=AC=EC=A1=B0=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../invitation/port/in/InvitationUseCase.kt | 2 +- .../invitation/service/InvitationService.kt | 8 +++----- .../site/yourevents/qr/port/in/QrCodeUseCase.kt | 2 +- .../site/yourevents/qr/service/QrCodeService.kt | 4 ++-- .../yourevents/s3/port/out/PreSignedUrlPort.kt | 4 +++- .../kotlin/site/yourevents/service/S3Service.kt | 14 ++++++-------- 6 files changed, 16 insertions(+), 18 deletions(-) diff --git a/module-domain/src/main/kotlin/site/yourevents/invitation/port/in/InvitationUseCase.kt b/module-domain/src/main/kotlin/site/yourevents/invitation/port/in/InvitationUseCase.kt index 1531b76e..112bb407 100644 --- a/module-domain/src/main/kotlin/site/yourevents/invitation/port/in/InvitationUseCase.kt +++ b/module-domain/src/main/kotlin/site/yourevents/invitation/port/in/InvitationUseCase.kt @@ -11,7 +11,7 @@ interface InvitationUseCase { fun createInvitation(memberId: UUID, qrUrl: String, templateKey: String?): Invitation - fun updateQrCode(invitationId: UUID): Invitation + fun updateQrCode(invitation: Invitation, invitationTitle: String): Invitation fun findById(id: UUID): Invitation diff --git a/module-domain/src/main/kotlin/site/yourevents/invitation/service/InvitationService.kt b/module-domain/src/main/kotlin/site/yourevents/invitation/service/InvitationService.kt index 31853016..b8d4d54d 100644 --- a/module-domain/src/main/kotlin/site/yourevents/invitation/service/InvitationService.kt +++ b/module-domain/src/main/kotlin/site/yourevents/invitation/service/InvitationService.kt @@ -36,12 +36,10 @@ class InvitationService( ) } - override fun updateQrCode(invitationId: UUID): Invitation { - val invitation = findById(invitationId) - - val qrCode = qrCodeUseCase.generateQrCode(invitationId) + override fun updateQrCode(invitation: Invitation, invitationTitle: String): Invitation { + val qrCode = qrCodeUseCase.generateQrCode(invitation.id) - val qrUrl = qrCodeUseCase.uploadQrCode(invitationId.toString(), qrCode) + val qrUrl = qrCodeUseCase.uploadQrCode(invitation.id, invitationTitle, qrCode) invitation.updateQrCode(qrUrl) diff --git a/module-domain/src/main/kotlin/site/yourevents/qr/port/in/QrCodeUseCase.kt b/module-domain/src/main/kotlin/site/yourevents/qr/port/in/QrCodeUseCase.kt index cb5150d2..91723212 100644 --- a/module-domain/src/main/kotlin/site/yourevents/qr/port/in/QrCodeUseCase.kt +++ b/module-domain/src/main/kotlin/site/yourevents/qr/port/in/QrCodeUseCase.kt @@ -5,5 +5,5 @@ import java.util.UUID interface QrCodeUseCase { fun generateQrCode(invitationId: UUID): ByteArray - fun uploadQrCode(imageName: String, qrCodeBytes: ByteArray): String + fun uploadQrCode(invitationId: UUID, invitationTitle: String, qrCodeBytes: ByteArray): String } diff --git a/module-domain/src/main/kotlin/site/yourevents/qr/service/QrCodeService.kt b/module-domain/src/main/kotlin/site/yourevents/qr/service/QrCodeService.kt index ba07ffae..a8571355 100644 --- a/module-domain/src/main/kotlin/site/yourevents/qr/service/QrCodeService.kt +++ b/module-domain/src/main/kotlin/site/yourevents/qr/service/QrCodeService.kt @@ -14,6 +14,6 @@ class QrCodeService( override fun generateQrCode(invitationId: UUID): ByteArray = qrCodePort.generate(invitationId) - override fun uploadQrCode(imageName: String, qrCodeBytes: ByteArray): String = - preSignedPort.uploadQrCode(imageName, qrCodeBytes) + override fun uploadQrCode(invitationId: UUID, invitationTitle: String, qrCodeBytes: ByteArray): String = + preSignedPort.uploadQrCode(invitationId, invitationTitle, qrCodeBytes) } diff --git a/module-domain/src/main/kotlin/site/yourevents/s3/port/out/PreSignedUrlPort.kt b/module-domain/src/main/kotlin/site/yourevents/s3/port/out/PreSignedUrlPort.kt index ffa06e62..d0e5e81e 100644 --- a/module-domain/src/main/kotlin/site/yourevents/s3/port/out/PreSignedUrlPort.kt +++ b/module-domain/src/main/kotlin/site/yourevents/s3/port/out/PreSignedUrlPort.kt @@ -1,7 +1,9 @@ package site.yourevents.s3.port.out +import java.util.UUID + interface PreSignedUrlPort { - fun uploadQrCode(imageName: String, qrCodeBytes: ByteArray): String + fun uploadQrCode(invitationId: UUID, invitationTitle: String, qrCodeBytes: ByteArray): String fun getPreSignedUrl(imageName: String): String } diff --git a/module-infrastructure/s3/src/main/kotlin/site/yourevents/service/S3Service.kt b/module-infrastructure/s3/src/main/kotlin/site/yourevents/service/S3Service.kt index 2a45b1e2..aedf7e3d 100644 --- a/module-infrastructure/s3/src/main/kotlin/site/yourevents/service/S3Service.kt +++ b/module-infrastructure/s3/src/main/kotlin/site/yourevents/service/S3Service.kt @@ -19,20 +19,21 @@ class S3Service( private val bucketName: String, ) : PreSignedUrlPort { - override fun uploadQrCode(imageName: String, qrCodeBytes: ByteArray): String { + override fun uploadQrCode(invitationId: UUID, invitationTitle: String, qrCodeBytes: ByteArray): String { + val path = "qr/$invitationId/$invitationTitle" val inputStream = qrCodeBytes.inputStream() val metadata = ObjectMetadata().apply { this.contentType = "image/png" this.contentLength = qrCodeBytes.size.toLong() - this.contentDisposition = "attachment; filename=\"$imageName.png\"" + this.contentDisposition = "attachment; filename=\"$invitationTitle.png\"" } - amazonS3.putObject(bucketName, imageName, inputStream, metadata) - return amazonS3.getUrl(bucketName, imageName).toString() + amazonS3.putObject(bucketName, path, inputStream, metadata) + return amazonS3.getUrl(bucketName, path).toString() } override fun getPreSignedUrl(imageName: String): String { - val fileName = createPath(imageName) + val fileName = String.format("thumbnail/%S", UUID.randomUUID().toString() + imageName) val getGeneratePresignedUrlRequest = getGeneratePreSignedUrlRequest(bucketName, fileName) val preSignedUrl: URL = amazonS3.generatePresignedUrl(getGeneratePresignedUrlRequest) @@ -50,7 +51,4 @@ class S3Service( expiration.time = expTimeMillis return expiration } - - private fun createPath(fileName: String): String = - String.format("%S", UUID.randomUUID().toString() + fileName) } From d4d43e4e71d00e88b5484844c0035759fc4825a6 Mon Sep 17 00:00:00 2001 From: yechan-kim Date: Sun, 2 Mar 2025 20:51:57 +0900 Subject: [PATCH 2/5] =?UTF-8?q?refactor:=20QR=20=EC=97=85=EB=A1=9C?= =?UTF-8?q?=EB=93=9C=20=EB=B0=A9=EC=8B=9D=20=EB=B3=80=EA=B2=BD=EC=97=90=20?= =?UTF-8?q?=EB=94=B0=EB=A5=B8=20=EC=B4=88=EB=8C=80=EC=9E=A5=20=EC=83=9D?= =?UTF-8?q?=EC=84=B1=20=EB=A1=9C=EC=A7=81=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 초대장 QR 생성 시기를 초대장 생성 이후로 변경 - 초대장 제목을 기반으로 초대장 QR 생성 --- .../site/yourevents/invitation/facade/InvitationFacade.kt | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/module-presentation/src/main/kotlin/site/yourevents/invitation/facade/InvitationFacade.kt b/module-presentation/src/main/kotlin/site/yourevents/invitation/facade/InvitationFacade.kt index 9fe5a117..16ecfc0e 100644 --- a/module-presentation/src/main/kotlin/site/yourevents/invitation/facade/InvitationFacade.kt +++ b/module-presentation/src/main/kotlin/site/yourevents/invitation/facade/InvitationFacade.kt @@ -32,15 +32,13 @@ class InvitationFacade( ): UUID { val memberId = authDetails.uuid - val invitation = invitationUseCase.updateQrCode( - generateInvitation(memberId, createInvitationRequest.templateKey).id - ) + val invitation = generateInvitation(memberId, createInvitationRequest.templateKey) generateOwner(memberId, invitation.id, createInvitationRequest.ownerNickname) generateInvitationThumbnail(invitation.id, createInvitationRequest.thumbnailUrl) - generateInvitationInformation( + val invitationInfo = generateInvitationInformation( invitation.id, title = createInvitationRequest.title, schedule = createInvitationRequest.schedule, @@ -48,7 +46,7 @@ class InvitationFacade( remark = createInvitationRequest.remark ) - return invitation.id + return invitationUseCase.updateQrCode(invitation, invitationInfo.title).id } fun deleteInvitation( From ee6371158db731f18eaf7674c4bdf1b87aff2901 Mon Sep 17 00:00:00 2001 From: yechan-kim Date: Sun, 2 Mar 2025 20:58:25 +0900 Subject: [PATCH 3/5] =?UTF-8?q?refactor:=20`/login`=20=EC=97=94=EB=93=9C?= =?UTF-8?q?=ED=8F=AC=EC=9D=B8=ED=8A=B8=20=EA=B6=8C=ED=95=9C=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - `POST`를 제외한 모든 접근 제한 --- .../src/main/kotlin/site/yourevents/SecurityConfig.kt | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/module-infrastructure/security/src/main/kotlin/site/yourevents/SecurityConfig.kt b/module-infrastructure/security/src/main/kotlin/site/yourevents/SecurityConfig.kt index e1b937ff..e6ebd3a9 100644 --- a/module-infrastructure/security/src/main/kotlin/site/yourevents/SecurityConfig.kt +++ b/module-infrastructure/security/src/main/kotlin/site/yourevents/SecurityConfig.kt @@ -39,7 +39,6 @@ class SecurityConfig( "/v3/**", "/health-check", "$actuatorEndPoint/**", - "/login" ) @Bean @@ -48,6 +47,10 @@ class SecurityConfig( authorizeHttpRequests { whiteList.forEach { authorize(it, permitAll) } + // login + authorize(HttpMethod.POST, "/login", permitAll) // POST 허용 + authorize("/login", denyAll) + // presigned url authorize("/presignedurl", authenticated) From 555fd2a49b49cd680d59c4645618ba5839e7ba54 Mon Sep 17 00:00:00 2001 From: yechan-kim Date: Sun, 2 Mar 2025 21:26:11 +0900 Subject: [PATCH 4/5] =?UTF-8?q?test:=20=EB=A1=9C=EC=A7=81=20=EB=B3=80?= =?UTF-8?q?=EA=B2=BD=EC=9C=BC=EB=A1=9C=20=EC=9D=B8=ED=95=9C=20=ED=85=8C?= =?UTF-8?q?=EC=8A=A4=ED=8A=B8=20=EC=BD=94=EB=93=9C=20=EB=B3=80=EA=B2=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../site/yourevents/invitation/facade/InvitationFacadeTest.kt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/module-presentation/src/test/kotlin/site/yourevents/invitation/facade/InvitationFacadeTest.kt b/module-presentation/src/test/kotlin/site/yourevents/invitation/facade/InvitationFacadeTest.kt index c6ce0637..89004e98 100644 --- a/module-presentation/src/test/kotlin/site/yourevents/invitation/facade/InvitationFacadeTest.kt +++ b/module-presentation/src/test/kotlin/site/yourevents/invitation/facade/InvitationFacadeTest.kt @@ -72,7 +72,7 @@ class InvitationFacadeTest : DescribeSpec({ modifiedAt = LocalDateTime.now() ) - every { invitationUseCase.updateQrCode(any()) } returns invitation + every { invitationUseCase.updateQrCode(any(), any()) } returns invitation val guest = Guest( id = ownerId, @@ -114,7 +114,7 @@ class InvitationFacadeTest : DescribeSpec({ every { invitationUseCase.createInvitation(any(), any(), any()) } answers { - invitationUseCase.updateQrCode(invitation.id) + invitationUseCase.updateQrCode(invitation, invitationInformation.title) invitation } every { guestUseCase.createGuest(any(), any(), any()) } returns guest From a1d3012191cb6af020da26e5c2f4c660ae83ce4a Mon Sep 17 00:00:00 2001 From: yechan-kim Date: Sun, 2 Mar 2025 21:58:16 +0900 Subject: [PATCH 5/5] =?UTF-8?q?delete:=20=EB=B6=88=ED=95=84=EC=9A=94?= =?UTF-8?q?=ED=95=9C=20=EC=A3=BC=EC=84=9D=20=EC=82=AD=EC=A0=9C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../security/src/main/kotlin/site/yourevents/SecurityConfig.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/module-infrastructure/security/src/main/kotlin/site/yourevents/SecurityConfig.kt b/module-infrastructure/security/src/main/kotlin/site/yourevents/SecurityConfig.kt index e6ebd3a9..b5e64cbb 100644 --- a/module-infrastructure/security/src/main/kotlin/site/yourevents/SecurityConfig.kt +++ b/module-infrastructure/security/src/main/kotlin/site/yourevents/SecurityConfig.kt @@ -48,7 +48,7 @@ class SecurityConfig( whiteList.forEach { authorize(it, permitAll) } // login - authorize(HttpMethod.POST, "/login", permitAll) // POST 허용 + authorize(HttpMethod.POST, "/login", permitAll) authorize("/login", denyAll) // presigned url