Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Ambev.DeveloperEvaluation.Domain.Repositories;

public interface IDefaultUnitOfWork : IUnitOfWork
{
IProductRepository ProductRepository { get; init; }
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
using Ambev.DeveloperEvaluation.Domain.Common;
using Ambev.DeveloperEvaluation.Domain.Entities;

namespace Ambev.DeveloperEvaluation.Domain.Repositories;

public interface IReadOnlyRepository<TEntity> where TEntity : BaseEntity
{
Task<TEntity?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default);
Task<PagedResult<TEntity>> GetAllAsync(
int pageNumber = 1,
int pageSize = 10,
string? order = null,
string? category = null,
CancellationToken cancellationToken = default);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Ambev.DeveloperEvaluation.Domain.Common;

namespace Ambev.DeveloperEvaluation.Domain.Repositories;

public interface IRepository<TEntity> : IReadOnlyRepository<TEntity> where TEntity: BaseEntity
{
Task AddAsync(TEntity entity, CancellationToken cancellationToken = default);
Task UpdateAsync(TEntity entity, CancellationToken cancellationToken = default);
Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default);
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
namespace Ambev.DeveloperEvaluation.Domain.Repositories;

public interface IUnitOfWork
{
Task<bool> SaveChangesAsync(CancellationToken cancellationToken = default);
}
Original file line number Diff line number Diff line change
Expand Up @@ -16,5 +16,7 @@ public void Initialize(WebApplicationBuilder builder)
builder.Services.AddScoped<IProductRepository, ProductRepository>();
builder.Services.AddScoped<ICartRepository, CartRepository>();
builder.Services.AddScoped<ISaleRepository, SaleRepository>();
builder.Services.AddScoped(typeof(IDefaultUnitOfWork), typeof(DefaultUnitOfWork));

}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
using Ambev.DeveloperEvaluation.Domain.Repositories;

namespace Ambev.DeveloperEvaluation.ORM.Repositories;

public class DefaultUnitOfWork(
DefaultContext defaultContext,
IProductRepository productRepository) : UnitOfWork(defaultContext), IDefaultUnitOfWork
{
public IProductRepository ProductRepository { get; init; } = productRepository;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using Ambev.DeveloperEvaluation.Domain.Common;
using Ambev.DeveloperEvaluation.Domain.Entities;
using Ambev.DeveloperEvaluation.Domain.Repositories;
using Microsoft.EntityFrameworkCore;

namespace Ambev.DeveloperEvaluation.ORM.Repositories;

public class ReadOnlyRepository<TEntity>(
DefaultContext defaultContext
) : RepositoryProperties<TEntity>(defaultContext), IReadOnlyRepository<TEntity> where TEntity : BaseEntity
{
public async Task<TEntity?> GetByIdAsync(Guid id, CancellationToken cancellationToken = default)
{
return await SetAsTracking.FirstOrDefaultAsync(x => x.Id == id, cancellationToken);
}

public async Task<PagedResult<TEntity>> GetAllAsync(
int pageNumber = 1,
int pageSize = 10,
string? order = null,
string? category = null,
CancellationToken cancellationToken = default
)
{
var totalCount = await SetAsNoTracking.CountAsync(cancellationToken);
var items = await SetAsNoTracking
.Skip((pageNumber - 1) * pageSize)
.Take(pageSize)
.ToListAsync(cancellationToken);

return PagedResult<TEntity>.Create(items, totalCount, pageNumber, pageSize);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
using Ambev.DeveloperEvaluation.Domain.Common;
using Ambev.DeveloperEvaluation.Domain.Repositories;

namespace Ambev.DeveloperEvaluation.ORM.Repositories;

public class Repository<TEntity>(
DefaultContext defaultContext
) : ReadOnlyRepository<TEntity>(defaultContext),
IRepository<TEntity> where TEntity : BaseEntity
{
public async Task AddAsync(TEntity entity, CancellationToken cancellationToken = default)
{
await Set.AddAsync(entity, cancellationToken);
}

public async Task UpdateAsync(TEntity entity, CancellationToken cancellationToken = default)
{
await Task.Run(() =>
{
Set.Update(entity);
}, cancellationToken);
}

public async Task DeleteAsync(TEntity entity, CancellationToken cancellationToken = default)
{
await Task.Run(() =>
{
Set.Remove(entity);
}, cancellationToken);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
using Ambev.DeveloperEvaluation.Domain.Common;
using Microsoft.EntityFrameworkCore;

namespace Ambev.DeveloperEvaluation.ORM.Repositories;

public class RepositoryProperties<TEntity>(
DefaultContext defaultContext
) where TEntity : BaseEntity
{
protected readonly DefaultContext ApplicationDbContext = defaultContext;

protected DbSet<TEntity> Set => ApplicationDbContext.Set<TEntity>();

protected IQueryable<TEntity> SetAsTracking
{
get
{
var query = Set.AsTracking();

return query;
}
}

protected IQueryable<TEntity> SetAsNoTracking
{
get
{
var query = Set.AsNoTracking();

return query;
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using Ambev.DeveloperEvaluation.Domain.Repositories;

namespace Ambev.DeveloperEvaluation.ORM.Repositories;

public class UnitOfWork(DefaultContext defaultContext) : IUnitOfWork
{
public async Task<bool> SaveChangesAsync(CancellationToken cancellationToken = default)
{
return await defaultContext.SaveChangesAsync(cancellationToken) > 0;
}
}