Coverage Summary for Class: CancelInviteUseCase (com.georgeci.moneysurfer.domain.usecase)
| Class |
Method, %
|
Branch, %
|
Line, %
|
Instruction, %
|
| CancelInviteUseCase |
0%
(0/2)
|
0%
(0/12)
|
0%
(0/19)
|
0%
(0/397)
|
| CancelInviteUseCase$Companion |
|
| CancelInviteUseCase$invoke$1 |
|
| Total |
0%
(0/2)
|
0%
(0/12)
|
0%
(0/19)
|
0%
(0/397)
|
package com.georgeci.moneysurfer.domain.usecase
import arrow.core.Either
import arrow.core.raise.either
import arrow.core.raise.ensure
import co.touchlab.kermit.Logger
import com.georgeci.moneysurfer.domain.auth.SessionPointers
import com.georgeci.moneysurfer.domain.logging.redactUid
import com.georgeci.moneysurfer.domain.model.InviteStatus
import com.georgeci.moneysurfer.domain.model.WorkspaceRole
import com.georgeci.moneysurfer.domain.primitives.WorkspaceInviteId
import com.georgeci.moneysurfer.domain.repositories.WorkspaceInviteRepository
import com.georgeci.moneysurfer.domain.repositories.WorkspaceMemberRepository
import kotlinx.coroutines.flow.first
import org.koin.core.annotation.Single
/**
* Owner cancels a pending invitation before the recipient responds. Owner-only.
*/
@Single
class CancelInviteUseCase(
private val inviteRepository: WorkspaceInviteRepository,
private val memberRepository: WorkspaceMemberRepository,
private val session: SessionPointers,
) {
private val log = Logger.withTag(TAG)
suspend operator fun invoke(id: WorkspaceInviteId): Either<InviteError, Unit> = either {
val callerId = session.currentUserId.first()
?: raise(InviteError.NoCurrentUser)
val invite = inviteRepository.getById(id)
?: raise(InviteError.InviteNotFound)
ensure(invite.status == InviteStatus.PENDING) { InviteError.InviteNotPending }
val callerMember = memberRepository.getById(callerId, invite.workspaceId)
ensure(callerMember?.role == WorkspaceRole.OWNER) { InviteError.NotOwner }
Either.catch { inviteRepository.cancel(id) }
.onLeft { log.e(it) { "[local] cancel failed id=${id.value}" } }
.mapLeft { InviteError.LocalWriteFailed(it) }
.bind()
log.i { "[done] uid=${callerId.value.redactUid()} id=${id.value}" }
}
private companion object {
const val TAG = "CancelInvite"
}
}