From d32eaa9b9a7652cb326dc16d5a007499603d5905 Mon Sep 17 00:00:00 2001 From: Eneko Date: Fri, 2 Apr 2021 20:09:06 +0200 Subject: [PATCH] Invite user to chat on travel join --- .../controller/PrivateTravelRestController.kt | 17 ++++++++++------- .../spring/services/MatrixService.kt | 6 ++++++ .../spring/services/UseCaseService.kt | 12 ++++++++++++ .../okupamicoche/usecases/UseCaseFactory.kt | 5 ++++- .../okupamicoche/usecases/matrix/MatrixApi.kt | 2 ++ .../okupamicoche/usecases/travel/AddTraveler.kt | 13 +++++++++---- .../usecases/travel/RemoveTraveler.kt | 17 ++++++++++++----- 7 files changed, 55 insertions(+), 17 deletions(-) diff --git a/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PrivateTravelRestController.kt b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PrivateTravelRestController.kt index 690cb69..c476d3e 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PrivateTravelRestController.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/spring/controller/PrivateTravelRestController.kt @@ -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 { 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 { 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 { 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 { return response { - throwErrorIfCannotEditTravel(travelId, principal) - RemoveTraveler(userRepository, travelRepository).removeTraveler(travelId, userId) + val useCase = useCaseService.getRemoveTraveler() + useCase.removeTraveler(travelId, userId) } } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/spring/services/MatrixService.kt b/src/main/kotlin/eu/fosil/okupamicoche/spring/services/MatrixService.kt index f6fbc1c..f64663c 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/spring/services/MatrixService.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/spring/services/MatrixService.kt @@ -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) + } } \ No newline at end of file diff --git a/src/main/kotlin/eu/fosil/okupamicoche/spring/services/UseCaseService.kt b/src/main/kotlin/eu/fosil/okupamicoche/spring/services/UseCaseService.kt index bfe0949..ef87d9c 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/spring/services/UseCaseService.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/spring/services/UseCaseService.kt @@ -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) + } } \ No newline at end of file diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecases/UseCaseFactory.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecases/UseCaseFactory.kt index 096ff03..5df51b4 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecases/UseCaseFactory.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecases/UseCaseFactory.kt @@ -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 } \ No newline at end of file diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecases/matrix/MatrixApi.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecases/matrix/MatrixApi.kt index 32dd061..a702cc0 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecases/matrix/MatrixApi.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecases/matrix/MatrixApi.kt @@ -10,4 +10,6 @@ interface MatrixApi { suspend fun createRoom(name: String, alias: String, usersToInvite: Set, topic: String?): String suspend fun inviteUser(roomId: String, user: User) + + suspend fun kickUser(roomId: String, user: User) } \ No newline at end of file diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/AddTraveler.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/AddTraveler.kt index 35a4fc1..9fbdd50 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/AddTraveler.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/AddTraveler.kt @@ -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) } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/RemoveTraveler.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/RemoveTraveler.kt index 139353c..e320f1b 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/RemoveTraveler.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecases/travel/RemoveTraveler.kt @@ -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) } }