public async Task <ResponseDTO <bool> > UploadPartFileAsync(FilePartDTO filePart, Guid fileId) { var response = new ResponseDTO <bool>(); var file = await _context.Files.FirstOrDefaultAsync(f => f.Id == fileId); var path = Path.Combine(_path, fileId.ToString() + Path.GetExtension(file.Name)); using (var fs = new FileStream(path, FileMode.Append)) { fs.Write(filePart.Content, 0, filePart.Content.Length); } file.PartsUploaded++; await _context.SaveChangesAsync(); var message = await _context.Messages.Include(m => m.Room).FirstOrDefaultAsync(m => m.Id == file.MessageId); var socketMessage = new FileStatusDTO { Id = fileId, MessageId = file.MessageId, PartsUploaded = file.PartsUploaded }; var socketDTO = new SocketResponseDTO <FileStatusDTO> { Type = SocketMessageTypes.FileStatusChanged, Model = socketMessage }; foreach (var p in message.Room.Participants.Select(p => p.UserId)) { await _chatHandler.SendMessageByUserId(p, socketDTO); } return(response); }
public async Task <ResponseDTO <FileDTO> > SendFileMessageAsync(FileMessageRequest request, Guid roomId, Guid userId) { var response = new ResponseDTO <FileDTO>(); var room = await _context.Rooms.FirstOrDefaultAsync(r => r.Id == roomId); if (room == null) { response.Error = new Error(404, "Room not found"); return(response); } if (!room.Participants.Select(p => p.UserId).Contains(userId)) { response.Error = new Error(409, "You can't send message here, because you are not participant"); return(response); } var fileId = Guid.NewGuid(); var message = new MessageEntity() { Id = Guid.NewGuid(), SenderId = userId, RoomId = roomId, Content = fileId.ToString(), Type = MessageTypes.File, SendingTime = DateTime.UtcNow }; var file = new FileEntity() { Id = fileId, MessageId = message.Id, Name = request.Name, Size = request.Size, PartSize = request.PartSize, Path = request.Path, Parts = request.Parts }; await _context.Messages.AddAsync(message); await _context.Files.AddAsync(file); await _context.SaveChangesAsync(); var socketDTO = new SocketResponseDTO <MessageDTO> { Type = SocketMessageTypes.NewMessage, Model = new MessageDTO(message) }; foreach (var participantId in room.Participants.Select(p => p.UserId)) { await _chatHandler.SendMessageByUserId(participantId, socketDTO); } response.Data = new FileDTO(file); return(response); }