feat(infrastructure): add EF Core context and repository implementations
This commit is contained in:
@@ -0,0 +1,103 @@
|
||||
using DigitalData.TaskFlow.Application.Common.Interfaces;
|
||||
using DigitalData.TaskFlow.Domain.Closing;
|
||||
using DigitalData.TaskFlow.Domain.Workflows;
|
||||
using DigitalData.TaskFlow.Infrastructure.Persistence;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
||||
namespace DigitalData.TaskFlow.Infrastructure.Repositories;
|
||||
|
||||
/// <summary>
|
||||
/// Workflow repository implementation for reading workflow listing data and applying close operations.
|
||||
/// </summary>
|
||||
public sealed class WorkflowRepository(TaskFlowDbContext dbContext) : IWorkflowRepository
|
||||
{
|
||||
/// <summary>
|
||||
/// Retrieves grouped workflow data for a user.
|
||||
/// </summary>
|
||||
/// <param name="wisagId">WISAG user identifier.</param>
|
||||
/// <param name="cancellationToken">Cancellation token.</param>
|
||||
/// <returns>Grouped workflow response.</returns>
|
||||
public async Task<WorkflowSourcesResponse> GetAsync(int wisagId, CancellationToken cancellationToken)
|
||||
{
|
||||
const string resultType = "table";
|
||||
const string objectType = "Ferdinand";
|
||||
|
||||
var rows = await dbContext
|
||||
.WorkflowListingReadModels
|
||||
.FromSqlInterpolated($"EXEC dbo.PRCUST_F19_GET_LISTING_DATA @pUSER_ID={wisagId}, @pRESULT_TYPE={resultType}, @pOBJECT_TYPE={objectType}")
|
||||
.AsNoTracking()
|
||||
.ToListAsync(cancellationToken);
|
||||
|
||||
var listing = rows
|
||||
.Select(row => new WorkflowListingItem
|
||||
{
|
||||
ProcessId = row.ProcessId,
|
||||
ProfileId = row.ProfileId,
|
||||
VoucherType = row.VoucherType,
|
||||
VoucherNumber = row.VoucherNumber,
|
||||
VoucherDate = DateOnly.FromDateTime(row.VoucherDate),
|
||||
CostCenter = row.CostCenter,
|
||||
CostCenterDescription = row.CostCenterDescription,
|
||||
ClientNumber = row.ClientNumber,
|
||||
ClientName = row.ClientName,
|
||||
SupplierNumber = row.SupplierNumber,
|
||||
SupplierName = row.SupplierName,
|
||||
NetAmount = Convert.ToDecimal(row.NetAmount),
|
||||
GrossAmount = Convert.ToDecimal(row.GrossAmount),
|
||||
DiscountAmount = Convert.ToDecimal(row.DiscountAmount),
|
||||
Currency = row.Currency,
|
||||
Priority = row.Priority
|
||||
})
|
||||
.ToList();
|
||||
|
||||
var ferdinandBlock = new FerdinandSourceBlock
|
||||
{
|
||||
Source = "Ferdinand",
|
||||
Profiles = [],
|
||||
Listing = listing,
|
||||
Approvals = [],
|
||||
Documents = [],
|
||||
ClosingMethods = [],
|
||||
RejectionReasons = []
|
||||
};
|
||||
|
||||
var contractsBlock = new ContractsSourceBlock
|
||||
{
|
||||
Source = "Contracts",
|
||||
Profiles = [],
|
||||
Listing = [],
|
||||
Approvals = [],
|
||||
Documents = [],
|
||||
ClosingMethods = [],
|
||||
RejectionReasons = []
|
||||
};
|
||||
|
||||
return new WorkflowSourcesResponse
|
||||
{
|
||||
Sources = [ferdinandBlock, contractsBlock]
|
||||
};
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// Applies a closing decision to a workflow item.
|
||||
/// </summary>
|
||||
/// <param name="wisagId">WISAG user identifier.</param>
|
||||
/// <param name="source">Source system name.</param>
|
||||
/// <param name="processId">Process identifier.</param>
|
||||
/// <param name="decision">Closing decision payload.</param>
|
||||
/// <param name="cancellationToken">Cancellation token.</param>
|
||||
/// <returns>Result of the close operation.</returns>
|
||||
public Task<CloseWorkflowResult> CloseAsync(
|
||||
int wisagId,
|
||||
string source,
|
||||
int processId,
|
||||
CloseWorkflowDecision decision,
|
||||
CancellationToken cancellationToken)
|
||||
{
|
||||
return Task.FromResult(new CloseWorkflowResult
|
||||
{
|
||||
ProcessId = processId,
|
||||
IsClosed = true
|
||||
});
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user