Files
Govor/Govor.Application/Services/Messages/MediaService.cs
T
Artemy ab643c16a4 Implement user session management and JWT refresh tokens
Added user session models, interfaces, repository, and service for managing user sessions and refresh tokens. Refactored authentication flow to return user objects and open sessions with device info, supporting refresh token generation and validation. Updated JWT configuration to separate access and refresh options, and refactored related tests and API contracts. Improved media upload handling and error logging. Migrated dependency references and DI registrations accordingly.
2025-07-18 20:16:36 +07:00

99 lines
3.2 KiB
C#

using Govor.Application.Interfaces;
using Govor.Application.Interfaces.Medias;
using Govor.Core.Models;
using Govor.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
namespace Govor.Application.Services.Messages;
public class MediaService : IMediaService
{
private ILogger<MediaService> _logger;
private IStorageService _storageService;
private GovorDbContext _dbContext;
public MediaService(IStorageService storageService, GovorDbContext dbContext, ILogger<MediaService> logger)
{
_storageService = storageService;
_dbContext = dbContext;
_logger = logger;
}
public async Task<MediaUploadResult> UploadMediaAsync(Media file)
{
try
{
var url = await _storageService.SaveAsync(file.Data, file.FileName);
var mediaId = Guid.NewGuid();
_dbContext.MediaFiles.Add(new MediaFile()
{
Id = mediaId,
UploaderId = file.UploaderId,
DateCreated = file.UploadedOn,
MediaType = file.Type,
MineType = file.MineType,
Url = url
});
await _dbContext.SaveChangesAsync();
_logger.LogInformation($"Media uploaded: {url} with id: {mediaId} by {file.UploaderId}");
return new MediaUploadResult(mediaId, url);
}
catch (ArgumentException ex)
{
throw new InvalidOperationException($"An error occured while uploading the media file: {ex.Message}");
}
}
public Task DeleteMediaAsync(Guid fileId)
{
throw new NotImplementedException();
}
public Task<Media> GetMediaByUrlAsync(string url)
{
throw new NotImplementedException();
}
public async Task<Media> GetMediaByIdAsync(Guid mediaId)
{
try
{
var mediaFile = await _dbContext.MediaFiles
.AsNoTracking()
.FirstOrDefaultAsync(x => x.Id == mediaId)
?? throw new KeyNotFoundException($"No media found by given id {mediaId}");
// Загрузить бинарные данные из хранилища
Stream dataStream = await _storageService.LoadAsync(mediaFile.Url);
// Считать поток в byte[]
using var memoryStream = new MemoryStream();
await dataStream.CopyToAsync(memoryStream);
var contentBytes = memoryStream.ToArray();
_logger.LogInformation($"Media found: {mediaFile.MediaType} with id: {mediaFile.Id} and url: {mediaFile.Url}");
// Вернуть объект Media
return new Media(
mediaFile.UploaderId,
mediaFile.DateCreated,
mediaFile.MediaType.ToString(),
contentBytes,
mediaFile.MediaType,
mediaFile.MineType,
string.Empty
);
}
catch (FileNotFoundException ex)
{
_logger.LogWarning(ex, "Media file not found on storage.");
throw;
}
}
}