Skip to content

Commit

Permalink
Merge pull request #329 from apeun-gidaechi/Feature/#328
Browse files Browse the repository at this point in the history
Feature :: 워크스페이스 추방기능 추가 #328
  • Loading branch information
yeseong0412 authored Oct 21, 2024
2 parents 14a24df + 1d2ab16 commit ebcb2eb
Show file tree
Hide file tree
Showing 9 changed files with 65 additions and 4 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -115,7 +115,7 @@ class MessageServiceImpl(
chatRoomId = room.id.toString(),
timestamp = if (timestamp == DateTimeUtil.localDateTime) LocalDateTime.now() else timestamp
?: LocalDateTime.now()
).count()
).count { it.type == Type.MESSAGE || it.type == Type.IMG || it.type == Type.FILE }
}

@Transactional
Expand Down
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
package com.seugi.api.domain.profile.adapter.out

import com.seugi.api.domain.member.adapter.out.repository.MemberRepository
import com.seugi.api.domain.profile.adapter.out.repository.ProfileRepository
import com.seugi.api.domain.member.application.exception.MemberErrorCode
import com.seugi.api.domain.profile.adapter.out.mapper.ProfileMapper
import com.seugi.api.domain.profile.adapter.out.repository.ProfileRepository
import com.seugi.api.domain.profile.application.exception.ProfileErrorCode
import com.seugi.api.domain.profile.application.model.Profile
import com.seugi.api.domain.profile.application.port.out.DeleteProfileUseCase
import com.seugi.api.domain.profile.application.port.out.ExistProfilePort
import com.seugi.api.domain.profile.application.port.out.LoadProfilePort
import com.seugi.api.domain.profile.application.port.out.SaveProfilePort
Expand All @@ -17,8 +18,8 @@ import org.springframework.stereotype.Component
class ProfileAdapter(
private val memberRepository: MemberRepository,
private val profileRepository: ProfileRepository,
private val profileMapper: ProfileMapper
) : LoadProfilePort, SaveProfilePort, ExistProfilePort {
private val profileMapper: ProfileMapper,
) : LoadProfilePort, SaveProfilePort, ExistProfilePort, DeleteProfileUseCase {

override fun loadProfile(memberId: Long, workspaceId: String): Profile {
val memberEntity = memberRepository.findByIdOrNull(memberId)
Expand All @@ -43,4 +44,11 @@ class ProfileAdapter(
return profileRepository.existsByMemberAndWorkspaceId(memberEntity, workspaceId)
}

override fun deleteProfile(memberId: Long, workspaceId: String) {
val memberEntity = memberRepository.findByIdOrNull(memberId)
?: throw CustomException(MemberErrorCode.MEMBER_NOT_FOUND)
val profile = profileRepository.findByMemberAndWorkspaceId(memberEntity, workspaceId)
profileRepository.delete(profile!!)
}

}
Original file line number Diff line number Diff line change
Expand Up @@ -6,5 +6,6 @@ import com.seugi.api.domain.workspace.domain.enums.WorkspaceRole
interface ManageProfileUseCase {

fun manageProfile(memberId: Long, workspaceId: String, permission: WorkspaceRole)
fun deleteProfile(memberId: Long, workspaceId: String)

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
package com.seugi.api.domain.profile.application.port.out

interface DeleteProfileUseCase {
fun deleteProfile(memberId: Long, workspaceId: String)
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import com.seugi.api.domain.profile.application.model.Profile
import com.seugi.api.domain.profile.application.model.value.ProfilePermission
import com.seugi.api.domain.profile.application.model.value.ProfileWorkspaceId
import com.seugi.api.domain.profile.application.port.`in`.ManageProfileUseCase
import com.seugi.api.domain.profile.application.port.out.DeleteProfileUseCase
import com.seugi.api.domain.profile.application.port.out.ExistProfilePort
import com.seugi.api.domain.profile.application.port.out.LoadProfilePort
import com.seugi.api.domain.profile.application.port.out.SaveProfilePort
Expand All @@ -18,6 +19,7 @@ class ManageProfileService(
private val loadMemberPort: LoadMemberPort,
private val loaProfilePort: LoadProfilePort,
private val saveProfilePort: SaveProfilePort,
private val deleteProfileUseCase: DeleteProfileUseCase,
) : ManageProfileUseCase {

override fun manageProfile(memberId: Long, workspaceId: String, permission: WorkspaceRole) {
Expand All @@ -30,6 +32,10 @@ class ManageProfileService(
}
}

override fun deleteProfile(memberId: Long, workspaceId: String) {
deleteProfileUseCase.deleteProfile(memberId, workspaceId)
}

private fun updateExistingProfile(memberId: Long, workspaceId: String, permission: WorkspaceRole) {
val profile = loaProfilePort.loadProfile(memberId, workspaceId)
profile.changeRole(ProfilePermission(permission))
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -147,4 +147,12 @@ class WorkspaceController(
return workspaceService.manageWorkspaceMemberPermission(userId, manageWorkspaceMemberPermissionRequest)
}

@PatchMapping("/kick")
fun kickWorkspaceMember(
@GetAuthenticatedId userId: Long,
@RequestBody kickWorkspaceMemberRequest: KickWorkspaceMemberRequest,
): BaseResponse<Unit> {
return workspaceService.kickWorkspaceMember(userId, kickWorkspaceMemberRequest)
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
package com.seugi.api.domain.workspace.presentation.dto.request

data class KickWorkspaceMemberRequest(
val memberList: Set<Long>? = null,
val workspaceId: String? = null,
)
Original file line number Diff line number Diff line change
Expand Up @@ -35,4 +35,5 @@ interface WorkspaceService {
manageWorkspaceMemberPermissionRequest: ManageWorkspaceMemberPermissionRequest,
): BaseResponse<Unit>

fun kickWorkspaceMember(userId: Long, kickWorkspaceMemberRequest: KickWorkspaceMemberRequest): BaseResponse<Unit>
}
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ package com.seugi.api.domain.workspace.service
import com.seugi.api.domain.member.adapter.`in`.dto.res.RetrieveMemberResponse
import com.seugi.api.domain.member.application.port.out.LoadMemberPort
import com.seugi.api.domain.profile.adapter.`in`.response.RetrieveProfileResponse
import com.seugi.api.domain.profile.adapter.out.ProfileAdapter
import com.seugi.api.domain.profile.application.port.`in`.ManageProfileUseCase
import com.seugi.api.domain.profile.application.port.out.LoadProfilePort
import com.seugi.api.domain.workspace.domain.WorkspaceRepository
Expand Down Expand Up @@ -36,6 +37,7 @@ class WorkspaceServiceImpl(
private val loadMemberPort: LoadMemberPort,
private val niceSchoolService: NiceSchoolService,
private val fcmService: FCMService,
private val profileAdapter: ProfileAdapter,
) : WorkspaceService {

private fun genCode(length: Int = 6): String {
Expand Down Expand Up @@ -477,6 +479,30 @@ class WorkspaceServiceImpl(
)
}

@Transactional
override fun kickWorkspaceMember(
userId: Long,
kickWorkspaceMemberRequest: KickWorkspaceMemberRequest,
): BaseResponse<Unit> {
val workspaceEntity = findWorkspaceById(kickWorkspaceMemberRequest.workspaceId ?: "")

if (workspaceEntity.workspaceAdmin != userId && !workspaceEntity.middleAdmin.contains(userId)) throw CustomException(
WorkspaceErrorCode.FORBIDDEN
)

kickWorkspaceMemberRequest.memberList?.forEach {
if (!workspaceEntity.middleAdmin.contains(it)) removeUserFromWorkspace(it, workspaceEntity)
profileAdapter.deleteProfile(it, kickWorkspaceMemberRequest.workspaceId ?: "")
}



workspaceRepository.save(workspaceEntity)
return BaseResponse(
message = "맴버 추방 성공"
)
}

private fun validateUserPermission(userId: Long, workspace: WorkspaceEntity, workspaceRole: WorkspaceRole) {
if (workspaceRole == WorkspaceRole.MIDDLE_ADMIN && workspace.workspaceAdmin != userId) {
throw CustomException(WorkspaceErrorCode.FORBIDDEN)
Expand Down

0 comments on commit ebcb2eb

Please sign in to comment.