From 64b186c26278084bba00f4f207323720b32e9067 Mon Sep 17 00:00:00 2001 From: mustafa-sab3alarab Date: Sun, 5 Nov 2023 17:52:22 +0100 Subject: [PATCH] prepare modules and create ticket in chat gateway --- .../kotlin/data/gateway/remote/ChatGateway.kt | 34 ++++++++++++------- .../kotlin/data/remote/mapper/Ticket.kt | 19 ++++++++--- .../kotlin/data/remote/model/MessageDto.kt | 5 ++- .../kotlin/data/remote/model/TicketDto.kt | 8 +++-- .../src/commonMain/kotlin/di/GatewayModule.kt | 4 +-- .../commonMain/kotlin/domain/entity/Ticket.kt | 3 +- .../kotlin/domain/gateway/IChatGateway.kt | 6 +--- .../kotlin/domain/usecase/ChatUseCase.kt | 15 ++++++-- .../chatSupport/ChatSupportScreenModel.kt | 4 +-- .../chatSupport/ChatSupportUiState.kt | 15 ++++---- 10 files changed, 71 insertions(+), 42 deletions(-) diff --git a/client_end_user/shared/src/commonMain/kotlin/data/gateway/remote/ChatGateway.kt b/client_end_user/shared/src/commonMain/kotlin/data/gateway/remote/ChatGateway.kt index 87ce2a8a3..78da7771b 100644 --- a/client_end_user/shared/src/commonMain/kotlin/data/gateway/remote/ChatGateway.kt +++ b/client_end_user/shared/src/commonMain/kotlin/data/gateway/remote/ChatGateway.kt @@ -1,20 +1,30 @@ package data.gateway.remote -import domain.entity.Message +import data.remote.mapper.toEntity +import data.remote.model.ServerResponse +import data.remote.model.TicketDto import domain.entity.Ticket import domain.gateway.IChatGateway -import kotlinx.coroutines.flow.Flow +import domain.utils.GeneralException +import io.ktor.client.HttpClient +import io.ktor.client.request.forms.submitForm +import io.ktor.client.request.post +import io.ktor.http.HttpMethod +import io.ktor.http.Parameters +import io.ktor.util.InternalAPI +import kotlinx.serialization.json.Json +import org.jetbrains.compose.resources.load -class ChatGateway : IChatGateway { - override fun getTickets(): Flow { - TODO("Not yet implemented") - } - - override fun getMessages(ticketId: String): Flow> { - TODO("Not yet implemented") - } +class ChatGateway(client: HttpClient) : BaseGateway(client = client), IChatGateway { + @OptIn(InternalAPI::class) + override suspend fun createTicket(userId: String) : Ticket { + val s = tryToExecute { + post("/chat/ticket") { + body = Json.encodeToString(TicketDto.serializer(), TicketDto(userId = userId)) + } + }.toEntity() - override suspend fun sendMessage(message: String, senderId: String, ticketId: String) { - TODO("Not yet implemented") + println("ddd $s") + return s } } \ No newline at end of file diff --git a/client_end_user/shared/src/commonMain/kotlin/data/remote/mapper/Ticket.kt b/client_end_user/shared/src/commonMain/kotlin/data/remote/mapper/Ticket.kt index 98d8223eb..3f12700a4 100644 --- a/client_end_user/shared/src/commonMain/kotlin/data/remote/mapper/Ticket.kt +++ b/client_end_user/shared/src/commonMain/kotlin/data/remote/mapper/Ticket.kt @@ -1,18 +1,29 @@ package data.remote.mapper +import data.remote.model.MessageDto import data.remote.model.TicketDto +import domain.entity.Message import domain.entity.Ticket import domain.entity.Time fun TicketDto.toEntity(): Ticket { return Ticket( id = id ?: "", - username = username ?: "", - avatar = avatar ?: "", - openedAt = openedAt?.toTime() ?: Time(0,0), + openedAt = openedAt?.toTime() ?: Time(0, 0), + messages = messages?.toEntity() ?: emptyList() ) } -fun List.toEntity(): List { + +fun MessageDto.toEntity(): Message { + return Message( + id = id ?: "", + senderId = senderId ?: "", + content = content ?: "", + time = time?.toTime() ?: Time(0, 0) + ) +} + +fun List.toEntity(): List { return map { it.toEntity() } } \ No newline at end of file diff --git a/client_end_user/shared/src/commonMain/kotlin/data/remote/model/MessageDto.kt b/client_end_user/shared/src/commonMain/kotlin/data/remote/model/MessageDto.kt index 35964e3e5..723621f0b 100644 --- a/client_end_user/shared/src/commonMain/kotlin/data/remote/model/MessageDto.kt +++ b/client_end_user/shared/src/commonMain/kotlin/data/remote/model/MessageDto.kt @@ -6,8 +6,7 @@ import kotlinx.serialization.Serializable @Serializable data class MessageDto( @SerialName("id") val id: String? = null, - @SerialName("ticketId") val ticketId: String? = null, - @SerialName("message") val message: String? = null, @SerialName("senderId") val senderId: String? = null, - @SerialName("senderAvatar") val senderAvatar: String? = null, + @SerialName("content") val content: String? = null, + @SerialName("time") val time: Long? = null ) \ No newline at end of file diff --git a/client_end_user/shared/src/commonMain/kotlin/data/remote/model/TicketDto.kt b/client_end_user/shared/src/commonMain/kotlin/data/remote/model/TicketDto.kt index a6f81c2a6..e8cb8106c 100644 --- a/client_end_user/shared/src/commonMain/kotlin/data/remote/model/TicketDto.kt +++ b/client_end_user/shared/src/commonMain/kotlin/data/remote/model/TicketDto.kt @@ -6,7 +6,9 @@ import kotlinx.serialization.Serializable @Serializable data class TicketDto( @SerialName("id") val id: String? = null, - @SerialName("username") val username: String? = null, - @SerialName("avatar") val avatar: String? = null, - @SerialName("openedAt") val openedAt: String? = null, + @SerialName("userId") val userId: String, + @SerialName("supportId") val supportId: String? = null, + @SerialName("time") val openedAt: Long? = null, + @SerialName("messages") val messages: List? = null, + @SerialName("isOpen") val isOpen: Boolean? = null ) \ No newline at end of file diff --git a/client_end_user/shared/src/commonMain/kotlin/di/GatewayModule.kt b/client_end_user/shared/src/commonMain/kotlin/di/GatewayModule.kt index ac690c7ac..4755fdbe0 100644 --- a/client_end_user/shared/src/commonMain/kotlin/di/GatewayModule.kt +++ b/client_end_user/shared/src/commonMain/kotlin/di/GatewayModule.kt @@ -1,10 +1,10 @@ package di -import data.gateway.fake.FakeChatGateway import data.gateway.fake.FakeNotificationGateway import data.gateway.local.LocalConfigurationGateway import data.gateway.remote.RestaurantGateway import data.gateway.remote.UserGateway +import data.gateway.remote.ChatGateway import domain.gateway.IChatGateway import domain.gateway.INotificationGateway import domain.gateway.ITransactionsGateway @@ -17,7 +17,7 @@ import org.koin.dsl.module import data.gateway.remote.TransactionsGateway val gatewayModule = module { - singleOf(::FakeChatGateway) { bind() } // fake + singleOf(::ChatGateway) { bind() } // remote singleOf(::FakeNotificationGateway) { bind() } // fake singleOf(::TransactionsGateway) { bind() } // fake singleOf(::RestaurantGateway) { bind() } // remote diff --git a/client_end_user/shared/src/commonMain/kotlin/domain/entity/Ticket.kt b/client_end_user/shared/src/commonMain/kotlin/domain/entity/Ticket.kt index f381c9ba9..d31de3aa3 100644 --- a/client_end_user/shared/src/commonMain/kotlin/domain/entity/Ticket.kt +++ b/client_end_user/shared/src/commonMain/kotlin/domain/entity/Ticket.kt @@ -2,7 +2,6 @@ package domain.entity data class Ticket( val id: String, - val username: String, - val avatar: String, val openedAt: Time, + val messages : List ) \ No newline at end of file diff --git a/client_end_user/shared/src/commonMain/kotlin/domain/gateway/IChatGateway.kt b/client_end_user/shared/src/commonMain/kotlin/domain/gateway/IChatGateway.kt index a99a20fad..42e668323 100644 --- a/client_end_user/shared/src/commonMain/kotlin/domain/gateway/IChatGateway.kt +++ b/client_end_user/shared/src/commonMain/kotlin/domain/gateway/IChatGateway.kt @@ -1,11 +1,7 @@ package domain.gateway -import domain.entity.Message import domain.entity.Ticket -import kotlinx.coroutines.flow.Flow interface IChatGateway { - fun getTickets(): Flow - fun getMessages(ticketId: String): Flow> - suspend fun sendMessage(message: String, senderId: String, ticketId: String) + suspend fun createTicket(userId: String) : Ticket } \ No newline at end of file diff --git a/client_end_user/shared/src/commonMain/kotlin/domain/usecase/ChatUseCase.kt b/client_end_user/shared/src/commonMain/kotlin/domain/usecase/ChatUseCase.kt index d3e23f981..ad78e28ce 100644 --- a/client_end_user/shared/src/commonMain/kotlin/domain/usecase/ChatUseCase.kt +++ b/client_end_user/shared/src/commonMain/kotlin/domain/usecase/ChatUseCase.kt @@ -4,8 +4,11 @@ import domain.entity.Message import domain.entity.Ticket import domain.gateway.IChatGateway import kotlinx.coroutines.flow.Flow +import kotlinx.coroutines.flow.flow interface IChatUseCase { + + suspend fun openNewTicket(userId : String) : Ticket fun getMessages(ticketId: String): Flow> suspend fun sendMessage(message: String, senderId: String, ticketId: String) @@ -15,15 +18,21 @@ interface IChatUseCase { } class ChatUseCase(private val chatGateway: IChatGateway) : IChatUseCase { + override suspend fun openNewTicket(userId: String): Ticket { + return chatGateway.createTicket(userId) + } + override fun getMessages(ticketId: String): Flow> { - return chatGateway.getMessages(ticketId) +// return chatGateway.getMessages(ticketId) + return flow { } } override suspend fun sendMessage(message: String, senderId: String, ticketId: String) { - chatGateway.sendMessage(message, senderId, ticketId) +// chatGateway.sendMessage(message, senderId, ticketId) } override suspend fun getTickets(): Flow { - return chatGateway.getTickets() +// return chatGateway.getTickets() + return flow { } } } diff --git a/client_end_user/shared/src/commonMain/kotlin/presentation/chatSupport/ChatSupportScreenModel.kt b/client_end_user/shared/src/commonMain/kotlin/presentation/chatSupport/ChatSupportScreenModel.kt index 20e667fae..36e32a621 100644 --- a/client_end_user/shared/src/commonMain/kotlin/presentation/chatSupport/ChatSupportScreenModel.kt +++ b/client_end_user/shared/src/commonMain/kotlin/presentation/chatSupport/ChatSupportScreenModel.kt @@ -19,8 +19,8 @@ class ChatSupportScreenModel( } private fun getTickets() { - tryToCollect( - { manageChat.getTickets() }, + tryToExecute( + { manageChat.openNewTicket("64fc7ac0caa12e39d6a34213") }, ::onGetTicketsSuccess, ::onError ) diff --git a/client_end_user/shared/src/commonMain/kotlin/presentation/chatSupport/ChatSupportUiState.kt b/client_end_user/shared/src/commonMain/kotlin/presentation/chatSupport/ChatSupportUiState.kt index c85cce75c..e6774d9d0 100644 --- a/client_end_user/shared/src/commonMain/kotlin/presentation/chatSupport/ChatSupportUiState.kt +++ b/client_end_user/shared/src/commonMain/kotlin/presentation/chatSupport/ChatSupportUiState.kt @@ -1,6 +1,7 @@ package presentation.chatSupport import domain.entity.Message +import domain.entity.Time data class ChatUIState( val ticketId: String = "", @@ -18,18 +19,20 @@ data class MessageUIState( fun MessageUIState.toEntity(ticketId: String): Message{ return Message( id = id, - message = message, - isMe = isMe, +// message = message, +// isMe = isMe, senderId = senderId, - avatarUrl = "", - ticketId = ticketId +// avatarUrl = "", +// ticketId = ticketId, + content = "", + time = Time(0,0) ) } fun Message.toUIState(): MessageUIState { return MessageUIState( id = id, - message = message, - isMe = isMe, + message = "message", + isMe = true, senderId = senderId ) } \ No newline at end of file