From 303093d1a8e223f9bc4fa5ca877ab5e183375d1d Mon Sep 17 00:00:00 2001 From: DongGeon0908 Date: Tue, 30 Jul 2024 11:10:17 +0900 Subject: [PATCH] refac: join code --- .../domain/group/application/GroupFacade.kt | 38 ++++++++++++++++ .../domain/group/application/GroupService.kt | 45 +------------------ .../group/application/GroupUserService.kt | 6 +++ .../group/application/JoinCodeGenerator.kt | 9 ++++ .../infrastructure/GroupUserRepository.kt | 2 + .../domain/group/model/CreateGroupContext.kt | 21 +++++++++ .../domain/group/model/UpdateGroupContext.kt | 19 ++++++++ .../domain/group/resource/GroupResource.kt | 2 +- .../resources/config/application-prod.yml | 2 +- 9 files changed, 99 insertions(+), 45 deletions(-) create mode 100644 src/main/kotlin/com/hero/alignlab/domain/group/application/JoinCodeGenerator.kt create mode 100644 src/main/kotlin/com/hero/alignlab/domain/group/model/CreateGroupContext.kt create mode 100644 src/main/kotlin/com/hero/alignlab/domain/group/model/UpdateGroupContext.kt diff --git a/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupFacade.kt b/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupFacade.kt index 6c8a992..0618a52 100644 --- a/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupFacade.kt +++ b/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupFacade.kt @@ -7,19 +7,57 @@ import com.hero.alignlab.config.database.TransactionTemplates import com.hero.alignlab.domain.auth.model.AuthUser import com.hero.alignlab.domain.group.domain.Group import com.hero.alignlab.domain.group.domain.GroupUser +import com.hero.alignlab.domain.group.model.CreateGroupContext +import com.hero.alignlab.domain.group.model.request.CreateGroupRequest +import com.hero.alignlab.domain.group.model.response.CreateGroupResponse import com.hero.alignlab.domain.group.model.response.GetGroupResponse import com.hero.alignlab.domain.group.model.response.JoinGroupResponse +import com.hero.alignlab.event.model.CreateGroupEvent import com.hero.alignlab.exception.ErrorCode import com.hero.alignlab.exception.InvalidRequestException import com.hero.alignlab.exception.NotFoundException +import org.springframework.context.ApplicationEventPublisher import org.springframework.stereotype.Service +import java.util.* @Service class GroupFacade( private val groupService: GroupService, private val groupUserService: GroupUserService, private val txTemplates: TransactionTemplates, + private val publisher: ApplicationEventPublisher, ) { + suspend fun createGroup(user: AuthUser, request: CreateGroupRequest): CreateGroupResponse { + return parZip( + { groupService.existsByName(request.name) }, + { groupUserService.existsByUid(user.uid) } + ) { existsByName, existsByUid -> + if (existsByName) { + throw InvalidRequestException(ErrorCode.DUPLICATE_GROUP_NAME_ERROR) + } + + if (existsByUid) { + throw InvalidRequestException(ErrorCode.DUPLICATE_GROUP_JOIN_ERROR) + } + + val group = CreateGroupContext(user, request).create() + + val createdGroup = createGroup(user, group) + + CreateGroupResponse.from(createdGroup) + } + } + + fun createGroup(user: AuthUser, group: Group): Group { + return txTemplates.writer.executes { + val createdGroup = groupService.saveSync(group) + + publisher.publishEvent(CreateGroupEvent(createdGroup)) + + createdGroup + } + } + suspend fun withdraw(user: AuthUser, groupId: Long) { val group = groupService.findByIdOrThrow(groupId) diff --git a/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupService.kt b/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupService.kt index 9c38efc..f6d29c8 100644 --- a/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupService.kt +++ b/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupService.kt @@ -5,67 +5,26 @@ import com.hero.alignlab.config.database.TransactionTemplates import com.hero.alignlab.domain.auth.model.AuthUser import com.hero.alignlab.domain.group.domain.Group import com.hero.alignlab.domain.group.infrastructure.GroupRepository -import com.hero.alignlab.domain.group.infrastructure.GroupUserRepository -import com.hero.alignlab.domain.group.model.request.CreateGroupRequest +import com.hero.alignlab.domain.group.model.UpdateGroupContext import com.hero.alignlab.domain.group.model.request.UpdateGroupRequest -import com.hero.alignlab.domain.group.model.response.CreateGroupResponse import com.hero.alignlab.domain.group.model.response.UpdateGroupResponse -import com.hero.alignlab.event.model.CreateGroupEvent import com.hero.alignlab.exception.ErrorCode -import com.hero.alignlab.exception.InvalidRequestException import com.hero.alignlab.exception.NotFoundException import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.withContext -import org.springframework.context.ApplicationEventPublisher import org.springframework.data.repository.findByIdOrNull import org.springframework.stereotype.Service -import java.util.* @Service class GroupService( private val groupRepository: GroupRepository, - private val groupUserRepository: GroupUserRepository, private val txTemplates: TransactionTemplates, - private val publisher: ApplicationEventPublisher, ) { - suspend fun createGroup(user: AuthUser, request: CreateGroupRequest): CreateGroupResponse { - if (existsByName(request.name)) { - throw InvalidRequestException(ErrorCode.DUPLICATE_GROUP_NAME_ERROR) - } - - if (withContext(Dispatchers.IO) { groupUserRepository.findAllByUid(user.uid) }.isNotEmpty()) { - throw InvalidRequestException(ErrorCode.DUPLICATE_GROUP_JOIN_ERROR) - } - - val createdGroup = txTemplates.writer.executes { - val group = groupRepository.save( - Group( - name = request.name, - description = request.description, - ownerUid = user.uid, - isHidden = request.isHidden, - joinCode = request.joinCode ?: UUID.randomUUID().toString().replace("-", "") - ) - ) - - publisher.publishEvent(CreateGroupEvent(group)) - - group - } - - return CreateGroupResponse.from(createdGroup) - } - suspend fun updateGroup(user: AuthUser, id: Long, request: UpdateGroupRequest): UpdateGroupResponse { val group = findByIdAndOwnerUidOrThrow(id, user.uid) val updatedGroup = txTemplates.writer.executes { - group.apply { - this.name = request.name - this.description = request.description - this.isHidden = request.isHidden - this.joinCode = request.joinCode ?: UUID.randomUUID().toString().replace("-", "") - }.run { groupRepository.save(this) } + groupRepository.save(UpdateGroupContext(group, request).update()) } return UpdateGroupResponse.from(updatedGroup) diff --git a/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupUserService.kt b/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupUserService.kt index 4fcc34e..7784620 100644 --- a/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupUserService.kt +++ b/src/main/kotlin/com/hero/alignlab/domain/group/application/GroupUserService.kt @@ -17,6 +17,12 @@ import org.springframework.transaction.annotation.Transactional class GroupUserService( private val groupUserRepository: GroupUserRepository, ) { + suspend fun existsByUid(uid: Long): Boolean { + return withContext(Dispatchers.IO) { + groupUserRepository.existsByUid(uid) + } + } + suspend fun findAllByUid(uid: Long): List { return withContext(Dispatchers.IO) { findAllByUid(uid) diff --git a/src/main/kotlin/com/hero/alignlab/domain/group/application/JoinCodeGenerator.kt b/src/main/kotlin/com/hero/alignlab/domain/group/application/JoinCodeGenerator.kt new file mode 100644 index 0000000..f551726 --- /dev/null +++ b/src/main/kotlin/com/hero/alignlab/domain/group/application/JoinCodeGenerator.kt @@ -0,0 +1,9 @@ +package com.hero.alignlab.domain.group.application + +import java.util.* + +object JoinCodeGenerator { + fun joinCode(code: String? = null): String { + return code ?: UUID.randomUUID().toString().replace("-", "") + } +} diff --git a/src/main/kotlin/com/hero/alignlab/domain/group/infrastructure/GroupUserRepository.kt b/src/main/kotlin/com/hero/alignlab/domain/group/infrastructure/GroupUserRepository.kt index ad7f9d2..f50d3fe 100644 --- a/src/main/kotlin/com/hero/alignlab/domain/group/infrastructure/GroupUserRepository.kt +++ b/src/main/kotlin/com/hero/alignlab/domain/group/infrastructure/GroupUserRepository.kt @@ -21,4 +21,6 @@ interface GroupUserRepository : JpaRepository { fun existsByGroupIdAndUid(groupId: Long, uid: Long): Boolean fun findAllByGroupId(groupId: Long, pageable: Pageable): Page + + fun existsByUid(uid: Long): Boolean } diff --git a/src/main/kotlin/com/hero/alignlab/domain/group/model/CreateGroupContext.kt b/src/main/kotlin/com/hero/alignlab/domain/group/model/CreateGroupContext.kt new file mode 100644 index 0000000..b435392 --- /dev/null +++ b/src/main/kotlin/com/hero/alignlab/domain/group/model/CreateGroupContext.kt @@ -0,0 +1,21 @@ +package com.hero.alignlab.domain.group.model + +import com.hero.alignlab.domain.auth.model.AuthUser +import com.hero.alignlab.domain.group.application.JoinCodeGenerator +import com.hero.alignlab.domain.group.domain.Group +import com.hero.alignlab.domain.group.model.request.CreateGroupRequest + +class CreateGroupContext( + private val user: AuthUser, + private val request: CreateGroupRequest, +) { + fun create(): Group { + return Group( + name = request.name, + description = request.description, + ownerUid = user.uid, + isHidden = request.isHidden, + joinCode = JoinCodeGenerator.joinCode(request.joinCode) + ) + } +} diff --git a/src/main/kotlin/com/hero/alignlab/domain/group/model/UpdateGroupContext.kt b/src/main/kotlin/com/hero/alignlab/domain/group/model/UpdateGroupContext.kt new file mode 100644 index 0000000..bb7f10c --- /dev/null +++ b/src/main/kotlin/com/hero/alignlab/domain/group/model/UpdateGroupContext.kt @@ -0,0 +1,19 @@ +package com.hero.alignlab.domain.group.model + +import com.hero.alignlab.domain.group.application.JoinCodeGenerator +import com.hero.alignlab.domain.group.domain.Group +import com.hero.alignlab.domain.group.model.request.UpdateGroupRequest + +class UpdateGroupContext( + private val before: Group, + private val request: UpdateGroupRequest, +) { + fun update(): Group { + return this.before.apply { + this.name = request.name + this.description = request.description + this.isHidden = request.isHidden + this.joinCode = JoinCodeGenerator.joinCode(request.joinCode) + } + } +} diff --git a/src/main/kotlin/com/hero/alignlab/domain/group/resource/GroupResource.kt b/src/main/kotlin/com/hero/alignlab/domain/group/resource/GroupResource.kt index c2c4a01..8ac10a1 100644 --- a/src/main/kotlin/com/hero/alignlab/domain/group/resource/GroupResource.kt +++ b/src/main/kotlin/com/hero/alignlab/domain/group/resource/GroupResource.kt @@ -36,7 +36,7 @@ class GroupResource( suspend fun createGroup( user: AuthUser, @RequestBody request: CreateGroupRequest - ) = groupService.createGroup(user, request).wrapCreated() + ) = groupFacade.createGroup(user, request).wrapCreated() @Operation(summary = "그룹 수정하기") @PutMapping("/api/v1/groups/{id}") diff --git a/src/main/resources/config/application-prod.yml b/src/main/resources/config/application-prod.yml index 4e91998..50913c2 100644 --- a/src/main/resources/config/application-prod.yml +++ b/src/main/resources/config/application-prod.yml @@ -38,7 +38,7 @@ hero: password: hikari: minimum-idle: 10 - maximum-pool-size: 20 + maximum-pool-size: 15 jpa: properties: hibernate.hbm2ddl.auto: none