Finished cancelTravel use case
This commit is contained in:
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
@@ -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
|
||||
)
|
||||
}
|
||||
@@ -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(
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
)
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user