From b43725506b93cc16f15bb182af381685ef36a757 Mon Sep 17 00:00:00 2001 From: GoldenBIOS Date: Tue, 5 May 2026 07:31:45 +0200 Subject: [PATCH] Fixed: model namespace mismatch and property naming in FileUploadService --- Models/FileUploadModels.cs | 13 ++++ Services/FileTransferMethods.cs | 45 -------------- Services/FileUploadMethods.cs | 34 ----------- Services/FileUploadService.cs | 101 ++++++++++++++++++++++++++++++++ 4 files changed, 114 insertions(+), 79 deletions(-) delete mode 100644 Services/FileTransferMethods.cs delete mode 100644 Services/FileUploadMethods.cs create mode 100644 Services/FileUploadService.cs diff --git a/Models/FileUploadModels.cs b/Models/FileUploadModels.cs index f4cc2cc..4c22c83 100644 --- a/Models/FileUploadModels.cs +++ b/Models/FileUploadModels.cs @@ -32,4 +32,17 @@ namespace Chtn.CSharp.SDK.Models.Media { [JsonProperty("uploadId")] public string UploadId { get; set; } } + + public class FileData + { + public string FileId { get; set; } + public string Name { get; set; } + public string Type { get; set; } + public byte[] Data { get; set; } + } + + public interface IFileUploadProgressListener + { + void FileProgressUpdate(string tempMsgId, string fileId, int totalChunks, int currentChunk); + } } \ No newline at end of file diff --git a/Services/FileTransferMethods.cs b/Services/FileTransferMethods.cs deleted file mode 100644 index 79336df..0000000 --- a/Services/FileTransferMethods.cs +++ /dev/null @@ -1,45 +0,0 @@ -using System; -using System.Threading.Tasks; -using Chtn.CSharp.SDK.Core; -using Chtn.CSharp.SDK.Models.Media; - -namespace Chtn.CSharp.SDK.Services -{ - public interface IFileTransferService - { - Task StartNew(StartNewFileTransferReq req); - Task Accept(AcceptFileTransferReq req); - Task Decline(DeclineFileTransferReq req); - Task SendRtcOffer(FileTransferSendOfferRTCReq req); - Task SendRtcAnswer(FileTransferSendAnswerRTCReq req); - Task SendRtcIce(FileTransferSendICERTCReq req); - } - - public class FileTransferServiceProvider : IFileTransferService - { - private readonly ApiClient _apiClient; - - public FileTransferServiceProvider(ApiClient apiClient) - { - _apiClient = apiClient ?? throw new ArgumentNullException(nameof(ApiClient)); - } - - public async Task StartNew(StartNewFileTransferReq req) => - await _apiClient.PostAsync("v2/chat/dm/startNewFileTransfer", req); - - public async Task Accept(AcceptFileTransferReq req) => - await _apiClient.PostAsync("v2/chat/dm/acceptFileTransfer", req); - - public async Task Decline(DeclineFileTransferReq req) => - await _apiClient.PostAsync("v2/chat/dm/declineFileTransfer", req); - - public async Task SendRtcOffer(FileTransferSendOfferRTCReq req) => - await _apiClient.PostAsync("v2/chat/dm/sendRtcOfferFileTransfer", req); - - public async Task SendRtcAnswer(FileTransferSendAnswerRTCReq req) => - await _apiClient.PostAsync("v2/chat/dm/sendRtcAnswerFileTransfer", req); - - public async Task SendRtcIce(FileTransferSendICERTCReq req) => - await _apiClient.PostAsync("v2/chat/dm/sendRtcICEFileTransfer", req); - } -} diff --git a/Services/FileUploadMethods.cs b/Services/FileUploadMethods.cs deleted file mode 100644 index 38fbc5a..0000000 --- a/Services/FileUploadMethods.cs +++ /dev/null @@ -1,34 +0,0 @@ -using System; -using System.Collections.Generic; -using System.Threading.Tasks; -using Chtn.CSharp.SDK.Core; -using Chtn.CSharp.SDK.Models.Media; - -namespace Chtn.CSharp.SDK.Services -{ - public interface IFileUploadService - { - Task UploadFiles(RegisterUploadReq req); - Task UploadFile(RegisterUploadReq req); - Task UploadChunk(ChunkUploadReq req); - } - - public class FileUploadServiceProvider : IFileUploadService - { - private readonly ApiClient _apiClient; - - public FileUploadServiceProvider(ApiClient apiClient) - { - _apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient)); - } - - public async Task UploadFiles(RegisterUploadReq req) => - await _apiClient.PostAsync("chat/cdnRegisterUpload", req); - - public async Task UploadFile(RegisterUploadReq req) => - await UploadFiles(req); - - public async Task UploadChunk(ChunkUploadReq req) => - await _apiClient.PostAsync("chat/uploadChunk", req); - } -} diff --git a/Services/FileUploadService.cs b/Services/FileUploadService.cs new file mode 100644 index 0000000..56bb692 --- /dev/null +++ b/Services/FileUploadService.cs @@ -0,0 +1,101 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Threading.Tasks; +using Chtn.CSharp.SDK.Core; +using Chtn.CSharp.SDK.Models.Media; +using Chtn.CSharp.SDK.Models; + +namespace Chtn.CSharp.SDK.Services +{ + public interface IFileUploadService + { + Task UploadFiles(string tempMsgId, string roomId, string userId, List files, IFileUploadProgressListener listener); + } + + public class FileUploadService : IFileUploadService + { + private readonly ApiClient _apiClient; + private readonly ApiClient _cdnClient; + private const int MIN_CHUNK_SIZE = 25000000; + + public FileUploadService(ApiClient apiClient, ApiClient cdnClient) + { + _apiClient = apiClient ?? throw new ArgumentNullException(nameof(apiClient)); + _cdnClient = cdnClient ?? throw new ArgumentNullException(nameof(cdnClient)); + } + + private int CalculateChunkSize(long totalSize) + { + long chunks = totalSize / MIN_CHUNK_SIZE; + if (chunks == 0) return (int)totalSize; + long chunkSize = (long)Math.Ceiling((double)totalSize / chunks); + return (int)Math.Max(chunkSize, MIN_CHUNK_SIZE); + } + + public async Task UploadFiles(string tempMsgId, string roomId, string userId, List files, IFileUploadProgressListener listener) + { + var registrations = files.Select(f => new FileUploadRegistration + { + FileId = f.FileId, + Name = f.Name, + Type = f.Type, + Size = f.Data.Length + }).ToList(); + + var regReq = new RegisterUploadReq + { + RoomId = roomId, + UserId = userId, + Files = registrations + }; + + var resp = await _apiClient.PostAsync("chat/cdnRegisterUpload", regReq); + string uploadId = resp.UploadId; + + for (int i = 0; i < files.Count; i++) + { + await UploadFileInternal(tempMsgId, uploadId, roomId, userId, files[i], registrations[i], listener); + } + + await FinishUploadInternal(roomId, userId, uploadId); + + return uploadId; + } + + private async Task UploadFileInternal(string tempMsgId, string uploadId, string roomId, string userId, FileData file, FileUploadRegistration registration, IFileUploadProgressListener listener) + { + int chunkSize = CalculateChunkSize(file.Data.Length); + int totalChunks = (int)Math.Ceiling((double)file.Data.Length / chunkSize); + + for (int i = 0; i < totalChunks; i++) + { + int start = i * chunkSize; + int length = (int)Math.Min(chunkSize, file.Data.Length - start); + + byte[] chunkData = new byte[length]; + Array.Copy(file.Data, start, chunkData, 0, length); + + var chunkReq = new ChunkUploadReq + { + UploadId = uploadId, + ChunkIndex = i, + Data = chunkData + }; + + await _cdnClient.PostAsync("chat/uploadChunk", chunkReq); + listener?.FileProgressUpdate(tempMsgId, file.FileId, totalChunks, i); + } + } + + private async Task FinishUploadInternal(string roomId, string userId, string uploadId) + { + var finishReq = new FinishUploadReq + { + UploadId = uploadId + }; + + await _cdnClient.PostAsync("chat/finishUpload", finishReq); + } + } +} \ No newline at end of file