AobaService

use transactions
Added gRPC
This commit is contained in:
2025-04-30 23:26:24 -04:00
parent 4f976fb7af
commit 2a6ef8ca20
10 changed files with 128 additions and 59 deletions

View File

@@ -8,11 +8,10 @@
<ItemGroup>
<PackageReference Include="Microsoft.Extensions.DependencyInjection.Abstractions" Version="9.0.4" />
<PackageReference Include="MaybeError" Version="1.0.6" />
<PackageReference Include="MaybeError" Version="1.1.0" />
<PackageReference Include="MongoDB.Analyzer" Version="1.5.0" />
<PackageReference Include="MongoDB.Driver" Version="3.3.0" />
<PackageReference Include="MongoDB.Driver.Core.Extensions.DiagnosticSources" Version="2.0.0" />
<PackageReference Include="MongoDB.Driver.GridFS" Version="2.30.0" />
</ItemGroup>
</Project>

View File

@@ -1,31 +1,76 @@
using AobaV2.Models;
using AobaCore.Models;
using MaybeError.Errors;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.GridFS;
namespace AobaCore;
public class AobaService(IMongoDatabase db)
{
private readonly IMongoCollection<Media> _media = db.GetCollection<Media>("media");
private readonly GridFSBucket _gridFs = new(db);
public async Task<Media?> GetMediaAsync(ObjectId id)
public async Task<Media?> GetMediaAsync(ObjectId id, CancellationToken cancellationToken = default)
{
return await _media.Find(m => m.Id == id).FirstOrDefaultAsync();
return await _media.Find(m => m.Id == id).FirstOrDefaultAsync(cancellationToken);
}
public Task AddMediaAsync(Media media)
public Task AddMediaAsync(Media media, CancellationToken cancellationToken = default)
{
return _media.InsertOneAsync(media);
return _media.InsertOneAsync(media, null, cancellationToken);
}
public Task IncrementViewCountAsync(ObjectId id)
public Task IncrementViewCountAsync(ObjectId id, CancellationToken cancellationToken = default)
{
return _media.UpdateOneAsync(m => m.Id == id, Builders<Media>.Update.Inc(m => m.ViewCount, 1));
return _media.UpdateOneAsync(m => m.Id == id, Builders<Media>.Update.Inc(m => m.ViewCount, 1), cancellationToken: cancellationToken);
}
public Task IncrementFileViewCountAsync(ObjectId fileId)
public Task IncrementFileViewCountAsync(ObjectId fileId, CancellationToken cancellationToken = default)
{
return _media.UpdateOneAsync(m => m.MediaId == fileId, Builders<Media>.Update.Inc(m => m.ViewCount, 1));
return _media.UpdateOneAsync(m => m.MediaId == fileId, Builders<Media>.Update.Inc(m => m.ViewCount, 1), cancellationToken: cancellationToken);
}
public async Task<Maybe<Media>> UploadFileAsync(Stream data, string filename, ObjectId owner, CancellationToken cancellationToken = default)
{
try
{
var fileId = await _gridFs.UploadFromStreamAsync(filename, data, cancellationToken: cancellationToken);
var media = new Media(fileId, filename, owner);
await AddMediaAsync(media, cancellationToken);
return media;
}
catch (Exception ex)
{
return ex;
}
}
public async Task<MaybeEx<GridFSDownloadStream, GridFSException>> GetFileStreamAsync(ObjectId id, bool seekable = false, CancellationToken cancellationToken = default)
{
try
{
return await _gridFs.OpenDownloadStreamAsync(id, new GridFSDownloadOptions { Seekable = seekable }, cancellationToken);
}
catch (GridFSException ex)
{
return ex;
}
}
public async Task DeleteFileAsync(ObjectId fileId, CancellationToken cancellationToken = default)
{
try
{
await _gridFs.DeleteAsync(fileId, cancellationToken);
await _media.DeleteOneAsync(m => m.MediaId == fileId, cancellationToken);
}
catch (GridFSFileNotFoundException)
{
//ignore if file was not found
}
}
}

View File

@@ -23,7 +23,6 @@ public static class Extensions
services.AddSingleton(dbClient);
services.AddSingleton<IMongoDatabase>(db);
services.AddSingleton<AobaService>();
services.AddSingleton<MediaService>();
return services;
}
}

View File

@@ -1,34 +0,0 @@
using AobaV2.Models;
using MaybeError.Errors;
using MongoDB.Bson;
using MongoDB.Driver;
using MongoDB.Driver.GridFS;
namespace AobaCore;
public class MediaService(IMongoDatabase db, AobaService aobaService)
{
private readonly GridFSBucket _gridFs = new(db);
public async Task<Maybe<Media>> UploadMediaAsync(Stream data, string filename, ObjectId owner, CancellationToken cancellationToken = default)
{
var fileId = await _gridFs.UploadFromStreamAsync(filename, data, cancellationToken: cancellationToken);
var media = new Media(fileId, filename, owner);
await aobaService.AddMediaAsync(media);
return media;
}
public async Task<Maybe<GridFSDownloadStream, ExceptionError<GridFSException>>> GetMediaStreamAsync(ObjectId id, bool seekable = false)
{
try
{
return await _gridFs.OpenDownloadStreamAsync(id, new GridFSDownloadOptions { Seekable = seekable });
}
catch (GridFSException ex)
{
return new ExceptionError<GridFSException>(ex);
}
}
}

View File

@@ -1,7 +1,7 @@
using MongoDB.Bson;
using MongoDB.Bson.Serialization.Attributes;
namespace AobaV2.Models;
namespace AobaCore.Models;
[BsonIgnoreExtraElements]
public class Media