From 869d37c5d1ca2c7b1028f47b07f84f02441cfe36 Mon Sep 17 00:00:00 2001 From: Eneko Nieto Date: Wed, 16 Mar 2022 00:23:52 +0100 Subject: [PATCH] refactor --- .../fosil/okupamicoche/cli/CommandParser.kt | 59 ++---------- .../db/{TravelEntity.kt => Travels.kt} | 12 +-- .../okupamicoche/matrix/createAppService.kt | 4 +- ...ontent.kt => TravelCreatedEventContent.kt} | 18 ++-- .../TravelEventContentSerializerMappings.kt | 2 +- ...{MatrixApiClient.kt => matrixApiClient.kt} | 0 .../eu/fosil/okupamicoche/model/Travel.kt | 10 +- .../usecase/travel/createTravel.kt | 95 +++++++++++++++++++ 8 files changed, 126 insertions(+), 74 deletions(-) rename src/main/kotlin/eu/fosil/okupamicoche/db/{TravelEntity.kt => Travels.kt} (78%) rename src/main/kotlin/eu/fosil/okupamicoche/matrix/event/{NewTravelEventContent.kt => TravelCreatedEventContent.kt} (72%) rename src/main/kotlin/eu/fosil/okupamicoche/matrix/{MatrixApiClient.kt => matrixApiClient.kt} (100%) create mode 100644 src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt diff --git a/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt b/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt index f1fa9de..27c1031 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/cli/CommandParser.kt @@ -1,18 +1,10 @@ package eu.fosil.okupamicoche.cli -import eu.fosil.okupamicoche.config.ConfigReader.config -import eu.fosil.okupamicoche.db.TravelEntity -import eu.fosil.okupamicoche.matrix.db -import eu.fosil.okupamicoche.matrix.event.NewTravelEventContent -import eu.fosil.okupamicoche.matrix.matrixApiClient -import eu.fosil.okupamicoche.model.Travel +import eu.fosil.okupamicoche.model.TravelOptions +import eu.fosil.okupamicoche.usecase.travel.createTravel import mu.KotlinLogging -import net.folivo.trixnity.clientserverapi.model.rooms.Visibility -import net.folivo.trixnity.core.model.RoomAliasId import net.folivo.trixnity.core.model.RoomId import net.folivo.trixnity.core.model.UserId -import net.folivo.trixnity.core.model.events.m.room.RoomMessageEventContent -import org.jetbrains.exposed.sql.transactions.transaction import java.time.LocalDateTime import java.time.ZoneOffset import java.time.format.DateTimeFormatter @@ -56,52 +48,21 @@ object CommandParser { roomId: RoomId, args: List ) { - requireNotNull(matrixApiClient) - val from = args[0] - val to = args[1] val date = args[2] val time = args[3] val formatter = DateTimeFormatter.ofPattern("yyyy/M/d H:mm") - val unixTime = LocalDateTime.from(formatter.parse("$date $time")).toEpochSecond(ZoneOffset.UTC) - val places = args[4].toIntOrNull() ?: 0 - val description = args[5] + val unixTime = LocalDateTime.from(formatter.parse("$date $time")).toEpochSecond(ZoneOffset.UTC) * 1000 - val newRoomAliasId = RoomAliasId("#viaje_$from-${to}_${date}_$time:${config?.homeserver}") - val newRoomId = matrixApiClient.rooms.createRoom( - visibility = Visibility.PUBLIC, - roomAliasId = newRoomAliasId - ).getOrThrow() - - val newTravel = Travel( - newRoomId, - userId, - from, - to, - unixTime, - places, - description + val travelOptions = TravelOptions( + from = args[0], + to = args[1], + time = unixTime, + places = args[4].toIntOrNull() ?: 0, + description = args[5] ) - transaction(db) { - TravelEntity.insert(newTravel) - TravelEntity.all().forEachIndexed { index, travel -> - logger.info("#$index: travel id=${travel.id} origin=${travel.from} dest=${travel.to} travel=$travel") - } - } - - // Send text message - val displayName = matrixApiClient.users.getDisplayName(userId).getOrNull() ?: userId.full - matrixApiClient.rooms.sendMessageEvent( - roomId, - RoomMessageEventContent.TextMessageEventContent("$displayName created a new travel! $from-$to on $date $time with $places free places.") - ) - - // Send new travel event - matrixApiClient.rooms.sendMessageEvent( - roomId, - NewTravelEventContent(newTravel) - ) + createTravel(userId, roomId, travelOptions) } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/db/TravelEntity.kt b/src/main/kotlin/eu/fosil/okupamicoche/db/Travels.kt similarity index 78% rename from src/main/kotlin/eu/fosil/okupamicoche/db/TravelEntity.kt rename to src/main/kotlin/eu/fosil/okupamicoche/db/Travels.kt index 82337c0..d74a114 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/db/TravelEntity.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/db/Travels.kt @@ -18,14 +18,14 @@ object TravelsTable: IntIdTable() { class TravelEntity(id: EntityID) : IntEntity(id) { companion object : IntEntityClass(TravelsTable) { - fun insert(travel: Travel) = TravelEntity.new { + fun new(travel: Travel) = TravelEntity.new { this.roomId = travel.room.full this.driver = travel.driver.full - this.from = travel.from - this.to = travel.to - this.time = travel.time - this.places = travel.places - this.description = travel.description + this.from = travel.options.from + this.to = travel.options.to + this.time = travel.options.time + this.places = travel.options.places + this.description = travel.options.description } } var roomId by TravelsTable.roomId diff --git a/src/main/kotlin/eu/fosil/okupamicoche/matrix/createAppService.kt b/src/main/kotlin/eu/fosil/okupamicoche/matrix/createAppService.kt index 7a38cc4..987c0fb 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/matrix/createAppService.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/matrix/createAppService.kt @@ -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.NewTravelEventContent +import eu.fosil.okupamicoche.matrix.event.TravelCreatedEventContent import eu.fosil.okupamicoche.matrix.services.EventTnxService import eu.fosil.okupamicoche.matrix.services.RoomService import eu.fosil.okupamicoche.matrix.services.UserService @@ -39,7 +39,7 @@ fun createAppService(matrixClientServerApiClient: MatrixClientServerApiClient): logger.info("${it.content.creator} created room ${it.roomId}") } } - subscribe { event-> + subscribe { event-> logger.info("NEW TRAVEL CREATED EVENT!!") logger.info("$event") } diff --git a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/NewTravelEventContent.kt b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/TravelCreatedEventContent.kt similarity index 72% rename from src/main/kotlin/eu/fosil/okupamicoche/matrix/event/NewTravelEventContent.kt rename to src/main/kotlin/eu/fosil/okupamicoche/matrix/event/TravelCreatedEventContent.kt index ce7ed9f..2ac1ba3 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/NewTravelEventContent.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/TravelCreatedEventContent.kt @@ -7,7 +7,7 @@ import net.folivo.trixnity.core.model.events.MessageEventContent import net.folivo.trixnity.core.model.events.RelatesTo @Serializable -data class NewTravelEventContent( +data class TravelCreatedEventContent( @SerialName("room") val room: String, @SerialName("driver") @@ -22,20 +22,16 @@ data class NewTravelEventContent( val places: Int, @SerialName("description") val description: String, - - @SerialName("body") - val body: String = "New travel created", @SerialName("m.relates_to") - override val relatesTo: RelatesTo.Reference? = null, + override val relatesTo: RelatesTo.Reference? = null ) : MessageEventContent { constructor(travel: Travel) : this( travel.room.full, travel.driver.full, - travel.from, - travel.to, - travel.time, - travel.places, - travel.description, - "New travel created2", + travel.options.from, + travel.options.to, + travel.options.time, + travel.options.places, + travel.options.description ) } \ No newline at end of file diff --git a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/TravelEventContentSerializerMappings.kt b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/TravelEventContentSerializerMappings.kt index 603f9b2..5a5ef1f 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/TravelEventContentSerializerMappings.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/matrix/event/TravelEventContentSerializerMappings.kt @@ -6,7 +6,7 @@ import net.folivo.trixnity.core.serialization.events.EventContentSerializerMappi object TravelEventContentSerializerMappings : EventContentSerializerMappings { override val message: Set> = setOf( - EventContentSerializerMapping.of("eu.fosil.travel.create") + EventContentSerializerMapping.of("eu.fosil.travel.created") ) override val state: Set> = setOf() override val ephemeral: Set> = setOf() diff --git a/src/main/kotlin/eu/fosil/okupamicoche/matrix/MatrixApiClient.kt b/src/main/kotlin/eu/fosil/okupamicoche/matrix/matrixApiClient.kt similarity index 100% rename from src/main/kotlin/eu/fosil/okupamicoche/matrix/MatrixApiClient.kt rename to src/main/kotlin/eu/fosil/okupamicoche/matrix/matrixApiClient.kt diff --git a/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt b/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt index 504a02c..7f39122 100644 --- a/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt +++ b/src/main/kotlin/eu/fosil/okupamicoche/model/Travel.kt @@ -2,17 +2,17 @@ package eu.fosil.okupamicoche.model import net.folivo.trixnity.core.model.RoomId import net.folivo.trixnity.core.model.UserId -import org.jetbrains.exposed.dao.IntEntity -import org.jetbrains.exposed.dao.IntEntityClass -import org.jetbrains.exposed.dao.id.EntityID -import org.jetbrains.exposed.dao.id.IntIdTable class Travel( var room: RoomId, var driver: UserId, + var options: TravelOptions +) + +class TravelOptions( var from: String, var to: String, var time: Long, var places: Int, var description: String -) +) \ No newline at end of file diff --git a/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt new file mode 100644 index 0000000..5f6bfd8 --- /dev/null +++ b/src/main/kotlin/eu/fosil/okupamicoche/usecase/travel/createTravel.kt @@ -0,0 +1,95 @@ +package eu.fosil.okupamicoche.usecase.travel + +import eu.fosil.okupamicoche.config.ConfigReader +import eu.fosil.okupamicoche.db.TravelEntity +import eu.fosil.okupamicoche.matrix.db +import eu.fosil.okupamicoche.matrix.event.TravelCreatedEventContent +import eu.fosil.okupamicoche.matrix.matrixApiClient +import eu.fosil.okupamicoche.model.Travel +import eu.fosil.okupamicoche.model.TravelOptions +import mu.KotlinLogging +import net.folivo.trixnity.clientserverapi.model.rooms.Visibility +import net.folivo.trixnity.core.model.RoomAliasId +import net.folivo.trixnity.core.model.RoomId +import net.folivo.trixnity.core.model.UserId +import net.folivo.trixnity.core.model.events.m.room.RoomMessageEventContent +import org.jetbrains.exposed.sql.transactions.transaction +import java.time.Instant +import java.time.LocalDateTime +import java.time.ZoneId +import java.time.format.DateTimeFormatter + + +private val logger = KotlinLogging.logger {} + +suspend fun createTravel( + driver: UserId, + roomId: RoomId, + travelOptions: TravelOptions +) { + requireNotNull(matrixApiClient) + + val newRoomAliasId = getRoomAlias(travelOptions) + val newRoomId = matrixApiClient.rooms.createRoom( + visibility = Visibility.PUBLIC, + roomAliasId = newRoomAliasId, +// name = + ).getOrThrow() + + val travel = Travel( + newRoomId, + driver, + travelOptions + ) + + sendCreateEvents(travel, roomId) + + transaction(db) { + TravelEntity.new(travel) + TravelEntity.all().forEachIndexed { index, travel -> + logger.info("#$index: travel id=${travel.id} origin=${travel.from} dest=${travel.to} travel=$travel") + } + } +} + +private fun getRoomAlias(travelOptions: TravelOptions): RoomAliasId { + + val timezone = ZoneId.of("Europe/Paris") + val localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(travelOptions.time), timezone) + val date = DateTimeFormatter.ofPattern("yyyy/MM/dd").format(localDateTime) + val time = DateTimeFormatter.ofPattern("H:mm").format(localDateTime).replace(':', 'H') + + val newRoomAliasId = travelOptions.run { + RoomAliasId("#viaje_${from}-${to}_${date}_${time}:${ConfigReader.config?.homeserver}") + } + + return newRoomAliasId +} + +private suspend fun sendCreateEvents( + travel: Travel, + roomId: RoomId +) { + requireNotNull(matrixApiClient) + + val timezone = ZoneId.of("Europe/Paris") + val localDateTime = LocalDateTime.ofInstant(Instant.ofEpochMilli(travel.options.time), timezone) + val date = DateTimeFormatter.ofPattern("yyyy/MM/dd").format(localDateTime) + val time = DateTimeFormatter.ofPattern("H:mm").format(localDateTime) + + // Send text message + val displayName = matrixApiClient.users.getDisplayName(travel.driver).getOrNull() ?: travel.driver.full + val messageBody = "$displayName created a new travel! ${travel.options.from}-${travel.options.to}" + + " on $date $time with ${travel.options.places} free places." + matrixApiClient.rooms.sendMessageEvent( + roomId, + RoomMessageEventContent.TextMessageEventContent(messageBody) + ) + + // Send new travel event + matrixApiClient.rooms.sendMessageEvent( + roomId, + TravelCreatedEventContent(travel) + ) + +} \ No newline at end of file