From e4d251a0b387f4961fe883a86fdce6ed7133e3cd Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 11 Mar 2024 17:28:11 +0900 Subject: [PATCH 1/5] =?UTF-8?q?=EC=8B=9C=EA=B7=B8=EB=8B=88=EC=B2=98=20?= =?UTF-8?q?=EC=BA=94=20-=20repository=20=EC=9D=B4=EB=A6=84=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 --- ...SignatureCanRepository.kt => AdminSignatureCanRepository.kt} | 2 +- .../sodalive/admin/live/signature/AdminSignatureCanService.kt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) rename src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/{AdminAdminSignatureCanRepository.kt => AdminSignatureCanRepository.kt} (93%) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminAdminSignatureCanRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanRepository.kt similarity index 93% rename from src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminAdminSignatureCanRepository.kt rename to src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanRepository.kt index 215e006..5f34200 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminAdminSignatureCanRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanRepository.kt @@ -6,7 +6,7 @@ import kr.co.vividnext.sodalive.live.signature.SignatureCan import kr.co.vividnext.sodalive.member.QMember.member import org.springframework.data.jpa.repository.JpaRepository -interface AdminAdminSignatureCanRepository : JpaRepository, AdminSignatureCanQueryRepository +interface AdminSignatureCanRepository : JpaRepository, AdminSignatureCanQueryRepository interface AdminSignatureCanQueryRepository { fun getSignatureCanListTotalCount(): Int diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanService.kt index cae253a..8834731 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/admin/live/signature/AdminSignatureCanService.kt @@ -15,7 +15,7 @@ import org.springframework.web.multipart.MultipartFile @Service class AdminSignatureCanService( - private val repository: AdminAdminSignatureCanRepository, + private val repository: AdminSignatureCanRepository, private val memberRepository: MemberRepository, private val s3Uploader: S3Uploader, -- 2.40.1 From e06b4c3179206af22f394aab8f9272ea7ef13f4e Mon Sep 17 00:00:00 2001 From: Klaus Date: Mon, 11 Mar 2024 22:55:44 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4?= =?UTF-8?q?=ED=84=B0=20=EA=B4=80=EB=A6=AC=EC=9E=90=20-=20=EC=8B=9C?= =?UTF-8?q?=EA=B7=B8=EB=8B=88=EC=B2=98=20=EC=A1=B0=ED=9A=8C/=EB=93=B1?= =?UTF-8?q?=EB=A1=9D/=EC=88=98=EC=A0=95/=EC=82=AD=EC=A0=9C=20API=20?= =?UTF-8?q?=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../member/CreatorAdminMemberController.kt | 2 +- .../CreatorAdminSignatureController.kt | 53 ++++++++++++ .../CreatorAdminSignatureRepository.kt | 57 +++++++++++++ .../signature/CreatorAdminSignatureService.kt | 80 +++++++++++++++++++ .../signature/GetSignatureListResponse.kt | 15 ++++ 5 files changed, 206 insertions(+), 1 deletion(-) create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureController.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureRepository.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt create mode 100644 src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/GetSignatureListResponse.kt diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt index 3f14263..0acc861 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt @@ -13,13 +13,13 @@ import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController +@PreAuthorize("hasRole('CREATOR')") @RequestMapping("/creator-admin/member") class CreatorAdminMemberController(private val service: CreatorAdminMemberService) { @PostMapping("/login") fun login(@RequestBody loginRequest: LoginRequest) = service.login(loginRequest) @PostMapping("/logout") - @PreAuthorize("hasRole('CREATOR')") fun logout( @RequestHeader("Authorization") token: String, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureController.kt new file mode 100644 index 0000000..40e93df --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureController.kt @@ -0,0 +1,53 @@ +package kr.co.vividnext.sodalive.creator.admin.signature + +import kr.co.vividnext.sodalive.common.ApiResponse +import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.member.Member +import org.springframework.data.domain.Pageable +import org.springframework.security.access.prepost.PreAuthorize +import org.springframework.security.core.annotation.AuthenticationPrincipal +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.PostMapping +import org.springframework.web.bind.annotation.PutMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RequestParam +import org.springframework.web.bind.annotation.RestController +import org.springframework.web.multipart.MultipartFile + +@RestController +@PreAuthorize("hasRole('CREATOR')") +@RequestMapping("/creator-admin/signature") +class CreatorAdminSignatureController(private val service: CreatorAdminSignatureService) { + @GetMapping + fun getSignatureCanList(pageable: Pageable) = ApiResponse.ok(data = service.getSignatureList(pageable)) + + @PostMapping + fun createSignature( + @RequestParam("can") can: Int, + @RequestParam("image") image: MultipartFile, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok( + service.createSignature(can = can, image = image, memberId = member.id!!), + "등록되었습니다." + ) + } + + @PutMapping + fun modifySignature( + @RequestParam("id") id: Long, + @RequestParam("image", required = false) image: MultipartFile?, + @RequestParam("isActive", required = false) isActive: Boolean?, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + if (image == null && isActive == null) throw SodaException("변경사항이 없습니다.") + + ApiResponse.ok( + service.modifySignature(id = id, image = image, isActive = isActive, memberId = member.id!!), + if (isActive == false) "삭제되었습니다." else "수정되었습니다." + ) + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureRepository.kt new file mode 100644 index 0000000..14c76ad --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureRepository.kt @@ -0,0 +1,57 @@ +package kr.co.vividnext.sodalive.creator.admin.signature + +import com.querydsl.jpa.impl.JPAQueryFactory +import kr.co.vividnext.sodalive.live.signature.QSignatureCan.signatureCan +import kr.co.vividnext.sodalive.live.signature.SignatureCan +import kr.co.vividnext.sodalive.member.QMember.member +import org.springframework.data.jpa.repository.JpaRepository + +interface CreatorAdminSignatureRepository : JpaRepository, CreatorAdminSignatureQueryRepository + +interface CreatorAdminSignatureQueryRepository { + fun getSignatureListTotalCount(): Int + + fun getSignatureList(imageHost: String, offset: Long, limit: Long): List + + fun findSignatureByIdOrNull(id: Long, memberId: Long): SignatureCan? +} + +class CreatorAdminSignatureQueryRepositoryImpl( + private val queryFactory: JPAQueryFactory +) : CreatorAdminSignatureQueryRepository { + override fun getSignatureListTotalCount(): Int { + return queryFactory.select(signatureCan.id) + .from(signatureCan) + .where(signatureCan.isActive.isTrue) + .fetch() + .size + } + + override fun getSignatureList(imageHost: String, offset: Long, limit: Long): List { + return queryFactory.select( + QGetSignatureListItem( + signatureCan.id, + signatureCan.can, + signatureCan.image.prepend("/").prepend(imageHost), + member.nickname + ) + ) + .from(signatureCan) + .innerJoin(signatureCan.creator, member) + .where(signatureCan.isActive.isTrue) + .offset(offset) + .limit(limit) + .orderBy(signatureCan.id.desc()) + .fetch() + } + + override fun findSignatureByIdOrNull(id: Long, memberId: Long): SignatureCan? { + return queryFactory + .selectFrom(signatureCan) + .where( + signatureCan.id.eq(id) + .and(signatureCan.creator.id.eq(memberId)) + ) + .fetchFirst() + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt new file mode 100644 index 0000000..551eecf --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt @@ -0,0 +1,80 @@ +package kr.co.vividnext.sodalive.creator.admin.signature + +import com.amazonaws.services.s3.model.ObjectMetadata +import kr.co.vividnext.sodalive.aws.s3.S3Uploader +import kr.co.vividnext.sodalive.common.SodaException +import kr.co.vividnext.sodalive.live.signature.SignatureCan +import kr.co.vividnext.sodalive.member.MemberRepository +import kr.co.vividnext.sodalive.utils.generateFileName +import org.springframework.beans.factory.annotation.Value +import org.springframework.data.domain.Pageable +import org.springframework.stereotype.Service +import org.springframework.transaction.annotation.Transactional +import org.springframework.web.multipart.MultipartFile + +@Service +class CreatorAdminSignatureService( + private val repository: CreatorAdminSignatureRepository, + private val memberRepository: MemberRepository, + + private val s3Uploader: S3Uploader, + + @Value("\${cloud.aws.s3.bucket}") + private val bucket: String, + @Value("\${cloud.aws.cloud-front.host}") + private val imageHost: String +) { + fun getSignatureList(pageable: Pageable): GetSignatureListResponse { + val totalCount = repository.getSignatureListTotalCount() + val items = repository.getSignatureList( + imageHost = imageHost, + offset = pageable.offset, + limit = pageable.pageSize.toLong() + ) + + return GetSignatureListResponse(totalCount, items) + } + + fun createSignature(can: Int, image: MultipartFile, memberId: Long) { + val member = memberRepository.findCreatorByIdOrNull(memberId = memberId) + ?: throw SodaException("잘못된 접근입니다.") + + val signatureCan = SignatureCan(can = can) + signatureCan.creator = member + repository.save(signatureCan) + + val metadata = ObjectMetadata() + metadata.contentLength = image.size + val imagePath = s3Uploader.upload( + inputStream = image.inputStream, + bucket = bucket, + filePath = "signature_can/${signatureCan.id}/${generateFileName()}", + metadata = metadata + ) + + signatureCan.image = imagePath + } + + @Transactional + fun modifySignature(id: Long, image: MultipartFile?, isActive: Boolean?, memberId: Long) { + val signatureCan = repository.findSignatureByIdOrNull(id = id, memberId = memberId) + ?: throw SodaException("잘못된 요청입니다.") + + if (isActive != null) { + signatureCan.isActive = isActive + } + + if (image != null) { + val metadata = ObjectMetadata() + metadata.contentLength = image.size + val imagePath = s3Uploader.upload( + inputStream = image.inputStream, + bucket = bucket, + filePath = "signature_can/${signatureCan.id}/${generateFileName()}", + metadata = metadata + ) + + signatureCan.image = imagePath + } + } +} diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/GetSignatureListResponse.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/GetSignatureListResponse.kt new file mode 100644 index 0000000..95093d8 --- /dev/null +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/GetSignatureListResponse.kt @@ -0,0 +1,15 @@ +package kr.co.vividnext.sodalive.creator.admin.signature + +import com.querydsl.core.annotations.QueryProjection + +data class GetSignatureListResponse( + val totalCount: Int, + val items: List +) + +data class GetSignatureListItem @QueryProjection constructor( + val id: Long, + val can: Int, + val image: String, + val nickname: String +) -- 2.40.1 From 48706f0bd572513de49e3e5963dc8541eeff1b07 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 12 Mar 2024 00:40:39 +0900 Subject: [PATCH 3/5] . --- .../creator/admin/member/CreatorAdminMemberController.kt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt index 0acc861..3f14263 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/member/CreatorAdminMemberController.kt @@ -13,13 +13,13 @@ import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController @RestController -@PreAuthorize("hasRole('CREATOR')") @RequestMapping("/creator-admin/member") class CreatorAdminMemberController(private val service: CreatorAdminMemberService) { @PostMapping("/login") fun login(@RequestBody loginRequest: LoginRequest) = service.login(loginRequest) @PostMapping("/logout") + @PreAuthorize("hasRole('CREATOR')") fun logout( @RequestHeader("Authorization") token: String, @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? -- 2.40.1 From 28124fc05941a6400160abc5c798d4537dd346e6 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 12 Mar 2024 00:56:49 +0900 Subject: [PATCH 4/5] =?UTF-8?q?@Transactional=20=EC=B6=94=EA=B0=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../creator/admin/signature/CreatorAdminSignatureService.kt | 1 + 1 file changed, 1 insertion(+) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt index 551eecf..3cf754c 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt @@ -35,6 +35,7 @@ class CreatorAdminSignatureService( return GetSignatureListResponse(totalCount, items) } + @Transactional fun createSignature(can: Int, image: MultipartFile, memberId: Long) { val member = memberRepository.findCreatorByIdOrNull(memberId = memberId) ?: throw SodaException("잘못된 접근입니다.") -- 2.40.1 From 536923c00bc8db1ddd39e179f3edc98d0919e150 Mon Sep 17 00:00:00 2001 From: Klaus Date: Tue, 12 Mar 2024 01:00:17 +0900 Subject: [PATCH 5/5] =?UTF-8?q?=EC=8B=9C=EA=B7=B8=EB=8B=88=EC=B2=98=20?= =?UTF-8?q?=EC=A1=B0=ED=9A=8C=20-=20=EC=A1=B0=ED=9A=8C=ED=95=98=EB=8A=94?= =?UTF-8?q?=20=ED=81=AC=EB=A6=AC=EC=97=90=EC=9D=B4=ED=84=B0=20=EB=B3=B8?= =?UTF-8?q?=EC=9D=B8=20=EA=B2=83=EB=A7=8C=20=EC=A1=B0=ED=9A=8C=ED=95=98?= =?UTF-8?q?=EB=8F=84=EB=A1=9D=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../CreatorAdminSignatureController.kt | 9 +++++++- .../CreatorAdminSignatureRepository.kt | 23 ++++++++++++++----- .../signature/CreatorAdminSignatureService.kt | 5 ++-- 3 files changed, 28 insertions(+), 9 deletions(-) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureController.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureController.kt index 40e93df..5fdafa1 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureController.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureController.kt @@ -19,7 +19,14 @@ import org.springframework.web.multipart.MultipartFile @RequestMapping("/creator-admin/signature") class CreatorAdminSignatureController(private val service: CreatorAdminSignatureService) { @GetMapping - fun getSignatureCanList(pageable: Pageable) = ApiResponse.ok(data = service.getSignatureList(pageable)) + fun getSignatureCanList( + pageable: Pageable, + @AuthenticationPrincipal(expression = "#this == 'anonymousUser' ? null : member") member: Member? + ) = run { + if (member == null) throw SodaException("로그인 정보를 확인해주세요.") + + ApiResponse.ok(data = service.getSignatureList(pageable, memberId = member.id!!)) + } @PostMapping fun createSignature( diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureRepository.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureRepository.kt index 14c76ad..4442839 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureRepository.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureRepository.kt @@ -9,9 +9,9 @@ import org.springframework.data.jpa.repository.JpaRepository interface CreatorAdminSignatureRepository : JpaRepository, CreatorAdminSignatureQueryRepository interface CreatorAdminSignatureQueryRepository { - fun getSignatureListTotalCount(): Int + fun getSignatureListTotalCount(memberId: Long): Int - fun getSignatureList(imageHost: String, offset: Long, limit: Long): List + fun getSignatureList(memberId: Long, imageHost: String, offset: Long, limit: Long): List fun findSignatureByIdOrNull(id: Long, memberId: Long): SignatureCan? } @@ -19,15 +19,23 @@ interface CreatorAdminSignatureQueryRepository { class CreatorAdminSignatureQueryRepositoryImpl( private val queryFactory: JPAQueryFactory ) : CreatorAdminSignatureQueryRepository { - override fun getSignatureListTotalCount(): Int { + override fun getSignatureListTotalCount(memberId: Long): Int { return queryFactory.select(signatureCan.id) .from(signatureCan) - .where(signatureCan.isActive.isTrue) + .where( + signatureCan.isActive.isTrue + .and(signatureCan.creator.id.eq(memberId)) + ) .fetch() .size } - override fun getSignatureList(imageHost: String, offset: Long, limit: Long): List { + override fun getSignatureList( + memberId: Long, + imageHost: String, + offset: Long, + limit: Long + ): List { return queryFactory.select( QGetSignatureListItem( signatureCan.id, @@ -38,7 +46,10 @@ class CreatorAdminSignatureQueryRepositoryImpl( ) .from(signatureCan) .innerJoin(signatureCan.creator, member) - .where(signatureCan.isActive.isTrue) + .where( + signatureCan.isActive.isTrue + .and(signatureCan.creator.id.eq(memberId)) + ) .offset(offset) .limit(limit) .orderBy(signatureCan.id.desc()) diff --git a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt index 3cf754c..f1a637e 100644 --- a/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt +++ b/src/main/kotlin/kr/co/vividnext/sodalive/creator/admin/signature/CreatorAdminSignatureService.kt @@ -24,9 +24,10 @@ class CreatorAdminSignatureService( @Value("\${cloud.aws.cloud-front.host}") private val imageHost: String ) { - fun getSignatureList(pageable: Pageable): GetSignatureListResponse { - val totalCount = repository.getSignatureListTotalCount() + fun getSignatureList(pageable: Pageable, memberId: Long): GetSignatureListResponse { + val totalCount = repository.getSignatureListTotalCount(memberId = memberId) val items = repository.getSignatureList( + memberId = memberId, imageHost = imageHost, offset = pageable.offset, limit = pageable.pageSize.toLong() -- 2.40.1