Finished cancelTravel use case

This commit is contained in:
2022-04-28 00:15:16 +02:00
parent cc1de1d2d2
commit 316723a9ac
8 changed files with 66 additions and 42 deletions

View File

@@ -2,7 +2,7 @@ package eu.fosil.okupamicoche.matrix
import eu.fosil.okupamicoche.cli.CommandParser
import eu.fosil.okupamicoche.db.TravelsTable
import eu.fosil.okupamicoche.matrix.event.message.TravelCreatedMessageEventContent
import eu.fosil.okupamicoche.matrix.event.message.TravelMessageEventContent
import eu.fosil.okupamicoche.matrix.services.EventTnxService
import eu.fosil.okupamicoche.matrix.services.RoomService
import eu.fosil.okupamicoche.matrix.services.UserService
@@ -41,7 +41,7 @@ fun createAppService(matrixClientServerApiClient: MatrixClientServerApiClient):
logger.info("${it.content.creator} created room ${it.roomId}")
}
}
subscribe(TravelCreatedMessageEventContent::class) { event ->
subscribe(TravelMessageEventContent::class) { event ->
logger.info("NEW TRAVEL CREATED EVENT!!")
logger.info("$event")
}

View File

@@ -2,12 +2,12 @@ package eu.fosil.okupamicoche.matrix.event
import eu.fosil.okupamicoche.matrix.event.message.JOIN_MESSAGE_EVENT_TYPE
import eu.fosil.okupamicoche.matrix.event.message.JoinMessageEventContent
import eu.fosil.okupamicoche.matrix.event.message.TRAVEL_CREATED_MESSAGE_EVENT_TYPE
import eu.fosil.okupamicoche.matrix.event.message.TravelCreatedMessageEventContent
import eu.fosil.okupamicoche.matrix.event.message.TRAVEL_MESSAGE_EVENT_TYPE
import eu.fosil.okupamicoche.matrix.event.message.TravelMessageEventContent
import eu.fosil.okupamicoche.matrix.event.state.MEMBERSHIP_STATE_EVENT_TYPE
import eu.fosil.okupamicoche.matrix.event.state.MembershipStateEventContent
import eu.fosil.okupamicoche.matrix.event.state.TRAVEL_CREATED_STATE_EVENT_TYPE
import eu.fosil.okupamicoche.matrix.event.state.TravelCreatedStateEventContent
import eu.fosil.okupamicoche.matrix.event.state.TRAVEL_STATE_EVENT_TYPE
import eu.fosil.okupamicoche.matrix.event.state.TravelStateEventContent
import net.folivo.trixnity.core.model.events.MessageEventContent
import net.folivo.trixnity.core.model.events.StateEventContent
import net.folivo.trixnity.core.serialization.events.BaseEventContentSerializerMappings
@@ -15,11 +15,11 @@ import net.folivo.trixnity.core.serialization.events.EventContentSerializerMappi
object TravelEventContentSerializerMappings : BaseEventContentSerializerMappings() {
override val message: Set<EventContentSerializerMapping<out MessageEventContent>> = setOf(
EventContentSerializerMapping.of<TravelCreatedMessageEventContent>(TRAVEL_CREATED_MESSAGE_EVENT_TYPE),
EventContentSerializerMapping.of<TravelMessageEventContent>(TRAVEL_MESSAGE_EVENT_TYPE),
EventContentSerializerMapping.of<JoinMessageEventContent>(JOIN_MESSAGE_EVENT_TYPE)
)
override val state: Set<EventContentSerializerMapping<out StateEventContent>> = setOf(
EventContentSerializerMapping.of<TravelCreatedStateEventContent>(TRAVEL_CREATED_STATE_EVENT_TYPE),
EventContentSerializerMapping.of<TravelStateEventContent>(TRAVEL_STATE_EVENT_TYPE),
EventContentSerializerMapping.of<MembershipStateEventContent>(MEMBERSHIP_STATE_EVENT_TYPE)
)
}

View File

@@ -7,10 +7,10 @@ import net.folivo.trixnity.core.model.events.MessageEventContent
import net.folivo.trixnity.core.model.events.RelatesTo
import net.folivo.trixnity.core.model.events.StateEventContent
const val TRAVEL_CREATED_MESSAGE_EVENT_TYPE = "eu.fosil.travel.created"
const val TRAVEL_MESSAGE_EVENT_TYPE = "eu.fosil.travel"
@Serializable
data class TravelCreatedMessageEventContent(
data class TravelMessageEventContent(
@SerialName("room")
val room: String,
@SerialName("driver")
@@ -27,10 +27,12 @@ data class TravelCreatedMessageEventContent(
val description: String,
@SerialName("duplicateNum")
val duplicateNum: Int?,
@SerialName("canceled")
val canceled: Boolean,
@SerialName("m.relates_to")
override val relatesTo: RelatesTo.Reference? = null
) : MessageEventContent, StateEventContent {
constructor(travel: Travel, duplicateNum: Int? = null) : this(
constructor(travel: Travel) : this(
travel.room.full,
travel.driver.full,
travel.options.from,
@@ -38,6 +40,7 @@ data class TravelCreatedMessageEventContent(
travel.options.time,
travel.options.places,
travel.options.description,
duplicateNum
travel.duplicateNum,
travel.canceled
)
}

View File

@@ -6,10 +6,10 @@ import kotlinx.serialization.Serializable
import net.folivo.trixnity.core.model.UserId
import net.folivo.trixnity.core.model.events.StateEventContent
const val TRAVEL_CREATED_STATE_EVENT_TYPE = "eu.fosil.travel.created"
const val TRAVEL_STATE_EVENT_TYPE = "eu.fosil.travel"
@Serializable
data class TravelCreatedStateEventContent(
data class TravelStateEventContent(
@SerialName("driver")
val driver: String,
@SerialName("from")
@@ -23,15 +23,23 @@ data class TravelCreatedStateEventContent(
@SerialName("description")
val description: String,
@SerialName("duplicateNum")
val duplicateNum: Int?
val duplicateNum: Int?,
@SerialName("canceled")
val canceled: Boolean
) : StateEventContent {
constructor(travelOptions: TravelOptions, driver: UserId, duplicateNum: Int? = null) : this(
constructor(
travelOptions: TravelOptions,
driver: UserId,
duplicateNum: Int? = null,
canceled: Boolean = false
) : this(
driver.full,
travelOptions.from,
travelOptions.to,
travelOptions.time,
travelOptions.places,
travelOptions.description,
duplicateNum
duplicateNum,
canceled
)
}

View File

@@ -11,7 +11,8 @@ class Travel(
var driver: UserId,
var options: TravelOptions,
var travelers: List<UserId> = listOf(),
var duplicateNum: Int? = null
var duplicateNum: Int? = null,
var canceled: Boolean = false
)
class TravelOptions(

View File

@@ -2,7 +2,7 @@ package eu.fosil.okupamicoche.model
import eu.fosil.okupamicoche.matrix.MatrixApiClient
import eu.fosil.okupamicoche.matrix.event.state.MembershipStateEventContent
import eu.fosil.okupamicoche.matrix.event.state.TravelCreatedStateEventContent
import eu.fosil.okupamicoche.matrix.event.state.TravelStateEventContent
import net.folivo.trixnity.clientserverapi.client.getStateEvent
import net.folivo.trixnity.core.model.RoomId
import net.folivo.trixnity.core.model.UserId
@@ -14,12 +14,12 @@ object TravelRepository {
MatrixApiClient.client.users.getDisplayName(userId).getOrNull() ?: userId.localpart
suspend fun isTravel(roomId: RoomId) =
MatrixApiClient.client.rooms.getStateEvent<TravelCreatedStateEventContent>(
MatrixApiClient.client.rooms.getStateEvent<TravelStateEventContent>(
roomId
).getOrNull() !== null
suspend fun getTravel(roomId: RoomId): Travel? {
val travelCreatedstateEvent = MatrixApiClient.client.rooms.getStateEvent<TravelCreatedStateEventContent>(
val travelCreatedstateEvent = MatrixApiClient.client.rooms.getStateEvent<TravelStateEventContent>(
roomId
).getOrNull() ?: return null
@@ -39,7 +39,7 @@ object TravelRepository {
}
suspend fun isDriver(roomId: RoomId, userId: UserId) =
MatrixApiClient.client.rooms.getStateEvent<TravelCreatedStateEventContent>(
MatrixApiClient.client.rooms.getStateEvent<TravelStateEventContent>(
roomId
).getOrNull()?.driver == userId.full
@@ -56,7 +56,7 @@ object TravelRepository {
suspend fun getAvailablePlaces(roomId: RoomId): Int? {
// Get travel total places (not counting driver)
val roomState = MatrixApiClient.client.rooms.getStateEvent<TravelCreatedStateEventContent>(roomId).getOrNull()
val roomState = MatrixApiClient.client.rooms.getStateEvent<TravelStateEventContent>(roomId).getOrNull()
?: return null
// Get travelers count

View File

@@ -1,6 +1,8 @@
package eu.fosil.okupamicoche.usecase.travel
import eu.fosil.okupamicoche.matrix.MatrixApiClient
import eu.fosil.okupamicoche.matrix.event.message.TravelMessageEventContent
import eu.fosil.okupamicoche.matrix.event.state.TravelStateEventContent
import eu.fosil.okupamicoche.model.TravelRepository
import eu.fosil.okupamicoche.usecase.Usecase
import net.folivo.trixnity.clientserverapi.model.rooms.DirectoryVisibility
@@ -12,8 +14,7 @@ import java.time.format.DateTimeFormatter
suspend fun Usecase.cancelTravel(
roomId: RoomId,
driverId: UserId,
eventSentToRoomId: RoomId
driverId: UserId
) {
val isTravel = TravelRepository.isTravel(roomId)
val isDriver = TravelRepository.isDriver(roomId, driverId)
@@ -48,13 +49,12 @@ suspend fun Usecase.cancelTravel(
MatrixApiClient.client.rooms.leaveRoom(roomId, "Travel canceled")
// Send messages to main room
sendCancelMessageEvents(roomId, eventSentToRoomId)
sendCancelMessageEvents(roomId)
}
}
private suspend fun sendCancelMessageEvents(
roomId: RoomId,
eventSentToRoomId: RoomId
roomId: RoomId
) {
val mainRoomId = requireNotNull(MatrixApiClient.mainRoomId)
val travel = requireNotNull(TravelRepository.getTravel(roomId))
@@ -63,17 +63,29 @@ private suspend fun sendCancelMessageEvents(
val date = DateTimeFormatter.ofPattern("yyyy/MM/dd").withZone(ZoneId.systemDefault()).format(instant)
val time = DateTimeFormatter.ofPattern("H:mm").withZone(ZoneId.systemDefault()).format(instant)
// Remove state event from travel room
MatrixApiClient.client.rooms.sendStateEvent(
roomId,
TravelStateEventContent(
travelOptions = travel.options,
driver = travel.driver,
duplicateNum = travel.duplicateNum,
canceled = true
),
""
)
// Send text message to main room
val body = "TRAVEL CANCELED: ${travel.options.from}-${travel.options.to} on $date $time."
MatrixApiClient.sendErrorTextMessage(mainRoomId, body)
// Send text message to room where create command was sent (if it is not main room)
if (eventSentToRoomId != mainRoomId)
MatrixApiClient.sendErrorTextMessage(roomId, body)
// Send text message to travel room
MatrixApiClient.sendErrorTextMessage(roomId, body)
// TODO send state event to room and custom event to main room
// Send travel canceled message event to main room
// MatrixApiClient.client.rooms.sendMessageEvent(
// mainRoomId,
// TravelCreatedMessageEventContent(travel)
// )
travel.canceled = true
MatrixApiClient.client.rooms.sendMessageEvent(
mainRoomId,
TravelMessageEventContent(travel)
)
}

View File

@@ -3,9 +3,9 @@ package eu.fosil.okupamicoche.usecase.travel
import eu.fosil.okupamicoche.db.TravelEntity
import eu.fosil.okupamicoche.matrix.MatrixApiClient
import eu.fosil.okupamicoche.matrix.db
import eu.fosil.okupamicoche.matrix.event.message.TravelCreatedMessageEventContent
import eu.fosil.okupamicoche.matrix.event.state.TRAVEL_CREATED_STATE_EVENT_TYPE
import eu.fosil.okupamicoche.matrix.event.state.TravelCreatedStateEventContent
import eu.fosil.okupamicoche.matrix.event.message.TravelMessageEventContent
import eu.fosil.okupamicoche.matrix.event.state.TRAVEL_STATE_EVENT_TYPE
import eu.fosil.okupamicoche.matrix.event.state.TravelStateEventContent
import eu.fosil.okupamicoche.model.Travel
import eu.fosil.okupamicoche.model.TravelOptions
import eu.fosil.okupamicoche.model.TravelRepository
@@ -45,7 +45,7 @@ private suspend fun createRoom(travelOptions: TravelOptions, driver: UserId): Ro
val newRoomNameInfo = Usecase.getRoomNameInfoFromTravelOptions(travelOptions)
val initialState = Event.InitialStateEvent(
TravelCreatedStateEventContent(
TravelStateEventContent(
travelOptions,
driver,
newRoomNameInfo.duplicateNum
@@ -53,7 +53,7 @@ private suspend fun createRoom(travelOptions: TravelOptions, driver: UserId): Ro
""
)
val powerLevels = PowerLevelsEventContent(
events = mapOf(Pair(TRAVEL_CREATED_STATE_EVENT_TYPE, 100)),
events = mapOf(Pair(TRAVEL_STATE_EVENT_TYPE, 100)),
users = mapOf(
Pair(appServiceUserId, 100),
Pair(driver, 50)
@@ -110,7 +110,7 @@ private suspend fun sendCreateMessageEvents(
// Send new travel message event to main room
MatrixApiClient.client.rooms.sendMessageEvent(
mainRoomId,
TravelCreatedMessageEventContent(travel)
TravelMessageEventContent(travel)
)
// Send text message to room where create command was sent (if it is not main room)