Compare commits

...

2 Commits

Author SHA1 Message Date
khwezi 1c3f3eaf0d Merge pull request 'Added a way to get the Author by productId' (#49) from midrandshop into master
Reviewed-on: #49
2026-05-30 18:20:21 +02:00
Khwezi Mngoma 91ede2d568 Added a way to get the Author by productId
continuous-integration/drone/pr Build is passing
2026-05-30 18:17:55 +02:00
2 changed files with 29 additions and 2 deletions
@@ -8,6 +8,29 @@ namespace LiteCharms.Features.MidrandBooks.Authors;
public sealed class AuthorService(IDbContextFactory<MidrandBooksDbContext> contextFactory) : IService
{
public async ValueTask<Result<Author>> GetAuthorByProductIdAsync(long productId, CancellationToken cancellationToken = default)
{
try
{
await using var context = await contextFactory.CreateDbContextAsync(cancellationToken);
var author = await context.Books
.AsNoTracking()
.Include(i => i.Author)
.Where(b => b.ProductId == productId)
.FirstOrDefaultAsync(cancellationToken);
if (author is null)
return Result.Fail<Author>(new Error($"No author association discovered for Product ID {productId}"));
return Result.Ok(author.Author!.ToModel());
}
catch (Exception ex)
{
return Result.Fail<Author>(new Error(ex.Message).CausedBy(ex));
}
}
public async ValueTask<Result> UpdateAuthorStatusAsync(long authorId, bool isEnabled, CancellationToken cancellationToken = default)
{
try
@@ -153,7 +153,9 @@ public sealed class ProductService(IDbContextFactory<MidrandBooksDbContext> cont
{
await using var context = await contextFactory.CreateDbContextAsync(cancellationToken);
var query = context.Products.AsQueryable();
var query = context.Products
.Include(i => i.Price)
.AsQueryable();
var cultureInfo = CultureInfo.InvariantCulture;
@@ -304,7 +306,9 @@ public sealed class ProductService(IDbContextFactory<MidrandBooksDbContext> cont
{
await using var context = await contextFactory.CreateDbContextAsync(cancellationToken);
var product = await context.Products.AsNoTracking().FirstOrDefaultAsync(p => p.Id == productId, cancellationToken);
var product = await context.Products
.Include(i => i.Price)
.AsNoTracking().FirstOrDefaultAsync(p => p.Id == productId, cancellationToken);
return product is null
? Result.Fail<Product>(new Error($"Product with ID {productId} not found."))