This commit is contained in:
Халимов Рустам
2026-04-14 10:48:07 +03:00
parent dc051fa9ae
commit d8b0d86534
19 changed files with 504 additions and 184 deletions
@@ -8,6 +8,7 @@ import chats.domain.model.Chat
import chats.domain.model.Message
import chats.domain.model.MediaType
import chats.domain.repository.ChatRepository
import core.network.ServerConfig
import core.security.TokenManager
import okhttp3.MediaType.Companion.toMediaTypeOrNull
import okhttp3.MultipartBody
@@ -16,21 +17,25 @@ import javax.inject.Inject
class ChatRepositoryImpl @Inject constructor(
private val api: ChatApi,
private val tokenManager: TokenManager
private val tokenManager: TokenManager,
private val serverConfig: ServerConfig
) : ChatRepository {
override suspend fun getChats(): List<Chat> {
val currentUserId = tokenManager.getUserId() ?: ""
return api.getChats().map { it.toDomain(currentUserId) }
val baseUrl = serverConfig.getBaseUrl().removeSuffix("/api/")
return api.getChats().map { it.toDomain(currentUserId, baseUrl) }
}
override suspend fun getMessages(chatId: String): List<Message> {
return api.getMessages(chatId).map { it.toDomain() }
val baseUrl = serverConfig.getBaseUrl().removeSuffix("/api/")
return api.getMessages(chatId).map { it.toDomain(baseUrl) }
}
override suspend fun sendMessage(chatId: String, content: String): Message {
val request = SendMessageRequest(content = content, type = "text")
return api.sendMessage(chatId, request).toDomain()
val baseUrl = serverConfig.getBaseUrl().removeSuffix("/api/")
return api.sendMessage(chatId, request).toDomain(baseUrl)
}
override suspend fun addReaction(messageId: String, emoji: String) {
@@ -56,15 +61,15 @@ class ChatRepositoryImpl @Inject constructor(
// Mappers
fun ChatDto.toDomain(currentUserId: String): Chat {
fun ChatDto.toDomain(currentUserId: String, baseUrl: String): Chat {
// Если это личный чат и имя пустое, ищем имя собеседника в списке участников
val chatName = name ?: if (type == "personal") {
members.firstOrNull { it.userId != currentUserId }?.user?.displayName ?: "Unknown Chat"
} else "Group Chat"
val chatAvatar = avatar ?: if (type == "personal") {
val chatAvatar = (avatar ?: if (type == "personal") {
members.firstOrNull { it.userId != currentUserId }?.user?.avatarUrl
} else null
} else null)?.ensureAbsoluteUrl(baseUrl)
return Chat(
id = id,
@@ -72,25 +77,48 @@ fun ChatDto.toDomain(currentUserId: String): Chat {
name = chatName,
avatar = chatAvatar,
unreadCount = unreadCount,
lastMessage = messages.firstOrNull()?.toDomain()
lastMessage = messages.firstOrNull()?.toDomain(baseUrl)
)
}
fun MessageDto.toDomain(): Message = Message(
id = id,
chatId = chatId,
senderId = senderId,
senderName = sender.displayName,
content = content,
sequenceId = sequenceId,
createdAt = createdAt,
media = media.map { it.url },
mediaUrl = media.firstOrNull()?.url,
mediaType = when (media.firstOrNull()?.type) {
"image" -> MediaType.IMAGE
fun MessageDto.toDomain(baseUrl: String): Message {
val domainMediaType = when (type) {
"image", "photo" -> MediaType.IMAGE
"video" -> MediaType.VIDEO
"audio" -> MediaType.AUDIO
"audio", "voice" -> MediaType.AUDIO
"file" -> MediaType.FILE
else -> MediaType.TEXT
else -> when (media.firstOrNull()?.type) {
"image", "photo" -> MediaType.IMAGE
"video" -> MediaType.VIDEO
"audio", "voice" -> MediaType.AUDIO
"file" -> MediaType.FILE
else -> MediaType.TEXT
}
}
)
return Message(
id = id,
chatId = chatId,
senderId = senderId,
senderName = sender.displayName,
senderAvatar = sender.avatarUrl?.ensureAbsoluteUrl(baseUrl),
content = content,
sequenceId = sequenceId,
createdAt = createdAt,
media = media.map { it.url.ensureAbsoluteUrl(baseUrl) },
mediaUrl = media.firstOrNull()?.url?.ensureAbsoluteUrl(baseUrl),
mediaType = domainMediaType,
reactions = reactions?.associate { it.emoji to it.count } ?: emptyMap()
)
}
fun String.ensureAbsoluteUrl(baseUrl: String): String {
return if (this.startsWith("http")) {
this
} else {
val base = baseUrl.removeSuffix("/")
val path = if (this.startsWith("/")) this else "/$this"
"$base$path"
}
}