Invite user to chat on travel join

This commit is contained in:
2021-04-02 20:09:06 +02:00
parent bff282d0eb
commit d32eaa9b9a
7 changed files with 55 additions and 17 deletions

View File

@@ -36,8 +36,8 @@ class PrivateTravelRestController(
throw CannotDuplicateIdException("Travel id already exists.")
travel.driverInfo = UserInfoDto(driver)
val createTravel = useCaseService.getCreateTravel()
createTravel.createTravel(travel.toTravel(userRepository))
val useCase = useCaseService.getCreateTravel()
useCase.createTravel(travel.toTravel(userRepository))
}
}
@@ -98,7 +98,8 @@ class PrivateTravelRestController(
suspend fun join(@RequestParam @Validated travelId: TravelId, principal: Principal): ApiResponse<Unit> {
return response {
val userId = authService.currentUser(principal).id
AddTraveler(userRepository, travelRepository).addTraveler(travelId, userId)
val useCase = useCaseService.getAddTraveler()
useCase.addTraveler(travelId, userId)
}
}
@@ -106,7 +107,8 @@ class PrivateTravelRestController(
suspend fun leave(@RequestParam @Validated travelId: TravelId, principal: Principal): ApiResponse<Unit> {
return response {
val userId = authService.currentUser(principal).id
RemoveTraveler(userRepository, travelRepository).removeTraveler(travelId, userId)
val useCase = useCaseService.getRemoveTraveler()
useCase.removeTraveler(travelId, userId)
}
}
@@ -118,7 +120,8 @@ class PrivateTravelRestController(
): ApiResponse<Unit> {
return response {
throwErrorIfCannotEditTravel(travelId, principal)
AddTraveler(userRepository, travelRepository).addTraveler(travelId, userId)
val useCase = useCaseService.getAddTraveler()
useCase.addTraveler(travelId, userId)
}
}
@@ -129,8 +132,8 @@ class PrivateTravelRestController(
principal: Principal
): ApiResponse<Unit> {
return response {
throwErrorIfCannotEditTravel(travelId, principal)
RemoveTraveler(userRepository, travelRepository).removeTraveler(travelId, userId)
val useCase = useCaseService.getRemoveTraveler()
useCase.removeTraveler(travelId, userId)
}
}

View File

@@ -31,4 +31,10 @@ class MatrixService(private val matrixClient: MatrixClient) : MatrixApi {
logger.debug { "Invite user $matrixUserId to room $roomId" }
matrixClient.roomsApi.inviteUser(MatrixId.RoomId(roomId), matrixUserId)
}
override suspend fun kickUser(roomId: String, user: User) {
val matrixUserId = MatrixId.UserId(user.matrixId)
logger.debug { "Kick user $matrixUserId from room $roomId" }
matrixClient.roomsApi.leaveRoom(MatrixId.RoomId(roomId), matrixUserId)
}
}

View File

@@ -1,14 +1,18 @@
package eu.fosil.okupamicoche.spring.services
import eu.fosil.okupamicoche.repositories.TravelRepository
import eu.fosil.okupamicoche.repositories.UserRepository
import eu.fosil.okupamicoche.usecases.UseCaseFactory
import eu.fosil.okupamicoche.usecases.matrix.CreateRoomForTravel
import eu.fosil.okupamicoche.usecases.travel.AddTraveler
import eu.fosil.okupamicoche.usecases.travel.CreateTravel
import eu.fosil.okupamicoche.usecases.travel.RemoveTraveler
import org.springframework.stereotype.Service
@Service
class UseCaseService(
private val travelRepository: TravelRepository,
private val userRepository: UserRepository,
private val matrixService: MatrixService
) : UseCaseFactory {
override fun getCreateTravel(): CreateTravel {
@@ -18,4 +22,12 @@ class UseCaseService(
override fun getCreateRoomForTravel(): CreateRoomForTravel {
return CreateRoomForTravel(matrixService)
}
override fun getAddTraveler(): AddTraveler {
return AddTraveler(userRepository, travelRepository, matrixService)
}
override fun getRemoveTraveler(): RemoveTraveler {
return RemoveTraveler(userRepository, travelRepository, matrixService)
}
}

View File

@@ -1,10 +1,13 @@
package eu.fosil.okupamicoche.usecases
import eu.fosil.okupamicoche.usecases.matrix.CreateRoomForTravel
import eu.fosil.okupamicoche.usecases.travel.AddTraveler
import eu.fosil.okupamicoche.usecases.travel.CreateTravel
import eu.fosil.okupamicoche.usecases.travel.RemoveTraveler
interface UseCaseFactory {
fun getCreateTravel(): CreateTravel
fun getCreateRoomForTravel(): CreateRoomForTravel
fun getAddTraveler(): AddTraveler
fun getRemoveTraveler(): RemoveTraveler
}

View File

@@ -10,4 +10,6 @@ interface MatrixApi {
suspend fun createRoom(name: String, alias: String, usersToInvite: Set<User>, topic: String?): String
suspend fun inviteUser(roomId: String, user: User)
suspend fun kickUser(roomId: String, user: User)
}

View File

@@ -4,16 +4,21 @@ import eu.fosil.okupamicoche.entities.TravelId
import eu.fosil.okupamicoche.entities.UserId
import eu.fosil.okupamicoche.repositories.TravelRepository
import eu.fosil.okupamicoche.repositories.UserRepository
import eu.fosil.okupamicoche.usecases.matrix.MatrixApi
import org.springframework.data.repository.findByIdOrNull
class AddTraveler(
private val userRepository: UserRepository,
private val travelRepository: TravelRepository
private val userRepository: UserRepository,
private val travelRepository: TravelRepository,
private val matrixApi: MatrixApi
) {
fun addTraveler(travelId: TravelId, userId: UserId) {
suspend fun addTraveler(travelId: TravelId, userId: UserId) {
val user = userRepository.findByIdOrNull(userId)
val travel = travelRepository.findByIdOrNull(travelId)
if ((travel?.travelers?.contains(user) == false) && (user != null)) {
val traveler = travel?.travelers?.find { it.id == userId }
if ((traveler == null) && (travel != null) && (user != null)) {
matrixApi.inviteUser(travel.matrixRoomId, user)
travel.travelers.add(user)
travelRepository.save(travel)
}

View File

@@ -4,17 +4,24 @@ import eu.fosil.okupamicoche.entities.TravelId
import eu.fosil.okupamicoche.entities.UserId
import eu.fosil.okupamicoche.repositories.TravelRepository
import eu.fosil.okupamicoche.repositories.UserRepository
import eu.fosil.okupamicoche.usecases.matrix.MatrixApi
import org.springframework.data.repository.findByIdOrNull
class RemoveTraveler(
private val userRepository: UserRepository,
private val travelRepository: TravelRepository
private val userRepository: UserRepository,
private val travelRepository: TravelRepository,
private val matrixApi: MatrixApi
) {
fun removeTraveler(travelId: TravelId, userId: UserId) {
suspend fun removeTraveler(travelId: TravelId, userId: UserId) {
val user = userRepository.findByIdOrNull(userId)
val travel = travelRepository.findByIdOrNull(travelId)
if ((user != null) && (travel != null)) {
travel.travelers.remove(user)
println("userId=$userId user=$user travel=$travel contains=${travel?.travelers?.contains(user)}")
val traveler = travel?.travelers?.find { it.id == userId }
if ((traveler != null) && (user != null)) {
matrixApi.kickUser(travel.matrixRoomId, user)
travel.travelers.remove(traveler)
travelRepository.save(travel)
}
}