Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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<Ticket> {
TODO("Not yet implemented")
}

override fun getMessages(ticketId: String): Flow<List<Message>> {
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<TicketDto> {
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
}
}
Original file line number Diff line number Diff line change
@@ -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<TicketDto>.toEntity(): List<Ticket> {

fun MessageDto.toEntity(): Message {
return Message(
id = id ?: "",
senderId = senderId ?: "",
content = content ?: "",
time = time?.toTime() ?: Time(0, 0)
)
}

fun List<MessageDto>.toEntity(): List<Message> {
return map { it.toEntity() }
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
)
Original file line number Diff line number Diff line change
Expand Up @@ -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<MessageDto>? = null,
@SerialName("isOpen") val isOpen: Boolean? = null
)
Original file line number Diff line number Diff line change
@@ -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
Expand All @@ -17,7 +17,7 @@ import org.koin.dsl.module
import data.gateway.remote.TransactionsGateway

val gatewayModule = module {
singleOf(::FakeChatGateway) { bind<IChatGateway>() } // fake
singleOf(::ChatGateway) { bind<IChatGateway>() } // remote
singleOf(::FakeNotificationGateway) { bind<INotificationGateway>() } // fake
singleOf(::TransactionsGateway) { bind<ITransactionsGateway>() } // fake
singleOf(::RestaurantGateway) { bind<IRestaurantGateway>() } // remote
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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<Message>
)
Original file line number Diff line number Diff line change
@@ -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<Ticket>
fun getMessages(ticketId: String): Flow<List<Message>>
suspend fun sendMessage(message: String, senderId: String, ticketId: String)
suspend fun createTicket(userId: String) : Ticket
}
Original file line number Diff line number Diff line change
Expand Up @@ -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<List<Message>>

suspend fun sendMessage(message: String, senderId: String, ticketId: String)
Expand All @@ -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<List<Message>> {
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<Ticket> {
return chatGateway.getTickets()
// return chatGateway.getTickets()
return flow { }
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,8 @@ class ChatSupportScreenModel(
}

private fun getTickets() {
tryToCollect(
{ manageChat.getTickets() },
tryToExecute(
{ manageChat.openNewTicket("64fc7ac0caa12e39d6a34213") },
::onGetTicketsSuccess,
::onError
)
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package presentation.chatSupport

import domain.entity.Message
import domain.entity.Time

data class ChatUIState(
val ticketId: String = "",
Expand All @@ -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
)
}