Восстановлены голосовые

This commit is contained in:
Халимов Рустам
2026-04-30 10:33:15 +03:00
parent 46c22300e9
commit 2d2e4b685e
6 changed files with 379 additions and 105 deletions
@@ -33,7 +33,7 @@ interface ChatApi {
): List<MessageDto>
@POST("messages/chat/{chatId}")
suspend fun sendMessage(@Path("chatId") chatId: String, @Body request: SendMessageRequest): MessageDto
suspend fun sendMessage(@Path("chatId") chatId: String, @Body request: SendMessageRequest): String
@Multipart
@POST("messages/upload")
@@ -68,7 +68,7 @@ interface ChatApi {
suspend fun deleteMessage(@Path("messageId") messageId: String, @Query("forEveryone") forEveryone: Boolean): retrofit2.Response<Unit>
@PUT("messages/{messageId}")
suspend fun editMessage(@Path("messageId") messageId: String, @Body request: SendMessageRequest): MessageDto
suspend fun editMessage(@Path("messageId") messageId: String, @Body request: SendMessageRequest): String
}
data class CreatePersonalChatRequest(
@@ -75,9 +75,43 @@ class ChatRepositoryImpl @Inject constructor(
replyToId = replyToId,
forwardedFromId = forwardedFromId
)
android.util.Log.d("ChatRepoImpl", "sendMessage request: $request")
val baseUrl = serverConfig.getBaseUrl().removeSuffix("/api/")
val userId = tokenManager.getUserId() ?: ""
return api.sendMessage(chatId, request).toDomain(userId, baseUrl)
return try {
val messageId = api.sendMessage(chatId, request)
android.util.Log.d("ChatRepoImpl", "sendMessage response: $messageId")
// Поскольку сервер вернул только ID, создаем заглушку Message.
// Настоящее сообщение придет через SignalR.
Message(
id = messageId,
chatId = chatId,
senderId = userId,
senderName = "", // Будет обновлено через SignalR
content = content,
sequenceId = 0,
createdAt = java.time.ZonedDateTime.now().toString(),
media = attachments?.map {
chats.domain.model.Media(
id = java.util.UUID.randomUUID().toString(),
type = it.type,
url = it.url,
filename = it.fileName,
size = it.fileSize
)
} ?: emptyList(),
mediaType = when(type) {
"image" -> chats.domain.model.MediaType.IMAGE
"video" -> chats.domain.model.MediaType.VIDEO
"audio", "voice" -> chats.domain.model.MediaType.AUDIO
else -> chats.domain.model.MediaType.TEXT
}
)
} catch (e: Exception) {
android.util.Log.e("ChatRepoImpl", "sendMessage error", e)
throw e
}
}
override suspend fun addReaction(messageId: String, emoji: String) {
@@ -145,7 +179,16 @@ class ChatRepositoryImpl @Inject constructor(
override suspend fun editMessage(messageId: String, content: String): Message {
val request = SendMessageRequest(content = content)
val currentUserId = tokenManager.getUserId() ?: ""
val baseUrl = serverConfig.getBaseUrl().removeSuffix("/api/")
return api.editMessage(messageId, request).toDomain(currentUserId, baseUrl)
val returnedId = api.editMessage(messageId, request)
return Message(
id = returnedId,
chatId = "",
senderId = currentUserId,
senderName = "",
content = content,
sequenceId = 0,
createdAt = java.time.ZonedDateTime.now().toString()
)
}
}
@@ -24,17 +24,21 @@ fun ChatDto.toDomain(currentUserId: String, baseUrl: String): Chat {
}
fun MessageDto.toDomain(currentUserId: String, baseUrl: String): Message {
val firstMedia = media.firstOrNull()
val isVoiceFromFilename = firstMedia?.filename?.endsWith(".mp3", ignoreCase = true) == true ||
firstMedia?.filename?.startsWith("voice_", ignoreCase = true) == true
val domainMediaType = when (type) {
"gif" -> MediaType.GIF
"image", "photo" -> MediaType.IMAGE
"video" -> MediaType.VIDEO
"audio", "voice" -> MediaType.AUDIO
"file" -> MediaType.FILE
else -> when (media.firstOrNull()?.type) {
"file" -> if (isVoiceFromFilename) MediaType.AUDIO else MediaType.FILE
else -> when (firstMedia?.type) {
"image", "photo" -> MediaType.IMAGE
"video" -> MediaType.VIDEO
"audio", "voice" -> MediaType.AUDIO
"file" -> MediaType.FILE
"file" -> if (isVoiceFromFilename) MediaType.AUDIO else MediaType.FILE
else -> MediaType.TEXT
}
}
@@ -51,7 +55,7 @@ fun MessageDto.toDomain(currentUserId: String, baseUrl: String): Message {
media = media.map {
chats.domain.model.Media(
id = it.id ?: java.util.UUID.randomUUID().toString(),
type = it.type ?: "unknown",
type = if (isVoiceFromFilename) "voice" else (it.type ?: "unknown"),
url = (it.url ?: "").ensureAbsoluteUrl(baseUrl),
filename = it.filename,
size = it.size,