Fixed: model namespace mismatch and property naming in FileUploadService

This commit is contained in:
2026-05-05 07:31:45 +02:00
parent 03d8fe15f8
commit b43725506b
4 changed files with 114 additions and 79 deletions

View File

@@ -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<StartNewFileTransferResp> 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<StartNewFileTransferResp> StartNew(StartNewFileTransferReq req) =>
await _apiClient.PostAsync<StartNewFileTransferReq, StartNewFileTransferResp>("v2/chat/dm/startNewFileTransfer", req);
public async Task Accept(AcceptFileTransferReq req) =>
await _apiClient.PostAsync<AcceptFileTransferReq, object>("v2/chat/dm/acceptFileTransfer", req);
public async Task Decline(DeclineFileTransferReq req) =>
await _apiClient.PostAsync<DeclineFileTransferReq, object>("v2/chat/dm/declineFileTransfer", req);
public async Task SendRtcOffer(FileTransferSendOfferRTCReq req) =>
await _apiClient.PostAsync<FileTransferSendOfferRTCReq, object>("v2/chat/dm/sendRtcOfferFileTransfer", req);
public async Task SendRtcAnswer(FileTransferSendAnswerRTCReq req) =>
await _apiClient.PostAsync<FileTransferSendAnswerRTCReq, object>("v2/chat/dm/sendRtcAnswerFileTransfer", req);
public async Task SendRtcIce(FileTransferSendICERTCReq req) =>
await _apiClient.PostAsync<FileTransferSendICERTCReq, object>("v2/chat/dm/sendRtcICEFileTransfer", req);
}
}

View File

@@ -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<RegisterUploadResp> UploadFiles(RegisterUploadReq req);
Task<RegisterUploadResp> 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<RegisterUploadResp> UploadFiles(RegisterUploadReq req) =>
await _apiClient.PostAsync<RegisterUploadReq, RegisterUploadResp>("chat/cdnRegisterUpload", req);
public async Task<RegisterUploadResp> UploadFile(RegisterUploadReq req) =>
await UploadFiles(req);
public async Task UploadChunk(ChunkUploadReq req) =>
await _apiClient.PostAsync<ChunkUploadReq, object>("chat/uploadChunk", req);
}
}

View File

@@ -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<string> UploadFiles(string tempMsgId, string roomId, string userId, List<FileData> 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<string> UploadFiles(string tempMsgId, string roomId, string userId, List<FileData> 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<RegisterUploadReq, RegisterUploadResp>("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<ChunkUploadReq, object>("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<FinishUploadReq, object>("chat/finishUpload", finishReq);
}
}
}