[Add] MasterData Services.
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
using System.Data;
|
||||
using AMREZ.EOP.Abstractions.Applications.Tenancy;
|
||||
using AMREZ.EOP.Abstractions.Applications.UseCases.MasterData.Allergen;
|
||||
using AMREZ.EOP.Abstractions.Infrastructures.Common;
|
||||
using AMREZ.EOP.Abstractions.Infrastructures.Repositories;
|
||||
using AMREZ.EOP.Contracts.DTOs.MasterData.Allergen;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
|
||||
namespace AMREZ.EOP.Application.UseCases.MasterData.Allergen;
|
||||
|
||||
public sealed class CreateAllergenUseCase : ICreateAllergenUseCase
|
||||
{
|
||||
private readonly IAllergenRepository _repo;
|
||||
private readonly IUnitOfWork _uow;
|
||||
private readonly ITenantResolver _tenantResolver;
|
||||
private readonly IHttpContextAccessor _http;
|
||||
|
||||
public CreateAllergenUseCase(IAllergenRepository repo, IUnitOfWork uow, ITenantResolver tr, IHttpContextAccessor http)
|
||||
{
|
||||
_repo = repo; _uow = uow; _tenantResolver = tr; _http = http;
|
||||
}
|
||||
|
||||
public async Task<AllergenResponse> ExecuteAsync(AllergenCreateRequest req, CancellationToken ct = default)
|
||||
{
|
||||
var http = _http.HttpContext ?? throw new InvalidOperationException("No HttpContext");
|
||||
var tc = _tenantResolver.Resolve(http) ?? throw new InvalidOperationException("No tenant");
|
||||
|
||||
await _uow.BeginAsync(tc, IsolationLevel.ReadCommitted, ct);
|
||||
try
|
||||
{
|
||||
var tid = Guid.Parse(tc.Id);
|
||||
|
||||
if (req.Scope == "tenant" && await _repo.CodeExistsAsync(tid, req.Code, ct))
|
||||
throw new InvalidOperationException($"Brand code '{req.Code}' already exists.");
|
||||
|
||||
var entity = new Domain.Entities.MasterData.Allergen()
|
||||
{
|
||||
TenantId = tid,
|
||||
Scope = string.IsNullOrWhiteSpace(req.Scope) ? "tenant" : req.Scope,
|
||||
Code = req.Code.Trim(),
|
||||
Name = req.Name.Trim(),
|
||||
NameI18n = req.NameI18n,
|
||||
Meta = req.Meta,
|
||||
IsActive = req.IsActive,
|
||||
IsSystem = false,
|
||||
OverridesGlobalId = req.OverridesGlobalId
|
||||
};
|
||||
|
||||
await _repo.AddAsync(entity, ct);
|
||||
await _uow.CommitAsync(ct);
|
||||
|
||||
return new AllergenResponse(entity.Id, entity.Scope, entity.Code, entity.Name, entity.NameI18n, entity.OverridesGlobalId, entity.IsActive, entity.IsSystem, entity.Meta);
|
||||
}
|
||||
catch
|
||||
{
|
||||
await _uow.RollbackAsync(ct);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,30 @@
|
||||
using AMREZ.EOP.Abstractions.Applications.Tenancy;
|
||||
using AMREZ.EOP.Abstractions.Applications.UseCases.MasterData.Allergen;
|
||||
using AMREZ.EOP.Abstractions.Infrastructures.Repositories;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
|
||||
namespace AMREZ.EOP.Application.UseCases.MasterData.Allergen;
|
||||
|
||||
public class DeleteAllergenUseCase : IDeleteAllergenUseCase
|
||||
{
|
||||
private readonly IAllergenRepository _repo;
|
||||
private readonly ITenantResolver _tenantResolver;
|
||||
private readonly IHttpContextAccessor _http;
|
||||
|
||||
public DeleteAllergenUseCase(IAllergenRepository repo, ITenantResolver tr, IHttpContextAccessor http)
|
||||
{
|
||||
_repo = repo;
|
||||
_tenantResolver = tr;
|
||||
_http = http;
|
||||
}
|
||||
|
||||
public async Task<bool> ExecuteAsync(Guid id, CancellationToken ct = default)
|
||||
{
|
||||
var http = _http.HttpContext ?? throw new InvalidOperationException("No HttpContext");
|
||||
var tc = _tenantResolver.Resolve(http) ?? throw new InvalidOperationException("No tenant");
|
||||
var tid = Guid.Parse(tc.Id);
|
||||
|
||||
var n = await _repo.SoftDeleteAsync(id, tid, ct);
|
||||
return n > 0;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
using AMREZ.EOP.Abstractions.Applications.UseCases.MasterData.Allergen;
|
||||
using AMREZ.EOP.Abstractions.Infrastructures.Repositories;
|
||||
using AMREZ.EOP.Contracts.DTOs.MasterData.Allergen;
|
||||
|
||||
namespace AMREZ.EOP.Application.UseCases.MasterData.Allergen;
|
||||
|
||||
public class GetAllergenUseCase : IGetAllergenUseCase
|
||||
{
|
||||
private readonly IAllergenRepository _repo;
|
||||
public GetAllergenUseCase(IAllergenRepository repo) => _repo = repo;
|
||||
|
||||
public async Task<AllergenResponse?> ExecuteAsync(Guid id, CancellationToken ct = default)
|
||||
{
|
||||
var e = await _repo.GetAsync(id, ct);
|
||||
return e is null ? null : new AllergenResponse(e.Id, e.Scope, e.Code, e.Name, e.NameI18n, e.OverridesGlobalId, e.IsActive, e.IsSystem, e.Meta);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
using AMREZ.EOP.Abstractions.Applications.Tenancy;
|
||||
using AMREZ.EOP.Abstractions.Applications.UseCases.MasterData.Allergen;
|
||||
using AMREZ.EOP.Abstractions.Infrastructures.Repositories;
|
||||
using AMREZ.EOP.Contracts.DTOs.Common;
|
||||
using AMREZ.EOP.Contracts.DTOs.MasterData.Allergen;
|
||||
using Microsoft.AspNetCore.Http;
|
||||
|
||||
namespace AMREZ.EOP.Application.UseCases.MasterData.Allergen;
|
||||
|
||||
public class ListAllergenUseCase : IListAllergenUseCase
|
||||
{
|
||||
private readonly IAllergenRepository _repo;
|
||||
private readonly ITenantResolver _tenantResolver;
|
||||
private readonly IHttpContextAccessor _http;
|
||||
|
||||
public ListAllergenUseCase(IAllergenRepository repo, ITenantResolver tenantResolver, IHttpContextAccessor http)
|
||||
{
|
||||
_repo = repo;
|
||||
_tenantResolver = tenantResolver;
|
||||
_http = http;
|
||||
}
|
||||
|
||||
public async Task<PagedResponse<AllergenResponse>> ExecuteAsync(AllergenListRequest req, CancellationToken ct = default)
|
||||
{
|
||||
var http = _http.HttpContext ?? throw new InvalidOperationException("No HttpContext");
|
||||
var tc = _tenantResolver.Resolve(http) ?? throw new InvalidOperationException("No tenant");
|
||||
var tid = Guid.Parse(tc.Id);
|
||||
|
||||
var page = await _repo.SearchEffectiveAsync(tid, req, ct);
|
||||
var items = page.Items.Select(Map).ToList();
|
||||
return new PagedResponse<AllergenResponse>(page.Page, page.PageSize, page.Total, items);
|
||||
}
|
||||
|
||||
private static AllergenResponse Map(Domain.Entities.MasterData.Allergen e) =>
|
||||
new(e.Id, e.Scope, e.Code, e.Name, e.NameI18n, e.OverridesGlobalId, e.IsActive, e.IsSystem, e.Meta);
|
||||
}
|
||||
@@ -0,0 +1,40 @@
|
||||
using System.Data;
|
||||
using AMREZ.EOP.Abstractions.Applications.UseCases.MasterData.Allergen;
|
||||
using AMREZ.EOP.Abstractions.Infrastructures.Common;
|
||||
using AMREZ.EOP.Abstractions.Infrastructures.Repositories;
|
||||
using AMREZ.EOP.Contracts.DTOs.MasterData.Allergen;
|
||||
|
||||
namespace AMREZ.EOP.Application.UseCases.MasterData.Allergen;
|
||||
|
||||
public class UpdateAllergenUseCase : IUpdateAllergenUseCase
|
||||
{
|
||||
private readonly IAllergenRepository _repo;
|
||||
private readonly IUnitOfWork _uow;
|
||||
|
||||
public UpdateAllergenUseCase(IAllergenRepository repo, IUnitOfWork uow) { _repo = repo; _uow = uow; }
|
||||
|
||||
public async Task<AllergenResponse?> ExecuteAsync(Guid id, AllergenUpdateRequest req, CancellationToken ct = default)
|
||||
{
|
||||
await _uow.BeginAsync(null, IsolationLevel.ReadCommitted, ct);
|
||||
try
|
||||
{
|
||||
var e = await _repo.GetAsync(id, ct);
|
||||
if (e is null) { await _uow.RollbackAsync(ct); return null; }
|
||||
|
||||
e.Name = req.Name.Trim();
|
||||
e.NameI18n = req.NameI18n;
|
||||
e.Meta = req.Meta;
|
||||
e.IsActive = req.IsActive;
|
||||
|
||||
await _repo.UpdateAsync(e, ct);
|
||||
await _uow.CommitAsync(ct);
|
||||
|
||||
return new AllergenResponse(e.Id, e.Scope, e.Code, e.Name, e.NameI18n, e.OverridesGlobalId, e.IsActive, e.IsSystem, e.Meta);
|
||||
}
|
||||
catch
|
||||
{
|
||||
await _uow.RollbackAsync(ct);
|
||||
throw;
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user