initial commit

This commit is contained in:
2026-07-21 15:03:40 +07:00
commit 5c20bb8a9e
2752 changed files with 864209 additions and 0 deletions
@@ -0,0 +1,105 @@
using Application.Common.Repositories;
using Application.Features.NumberSequenceManager;
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.VendorManager.Commands;
public class CreateVendorResult
{
public Vendor? Data { get; set; }
}
public class CreateVendorRequest : IRequest<CreateVendorResult>
{
public string? Name { get; set; }
public string? Description { get; set; }
public string? Street { get; set; }
public string? City { get; set; }
public string? State { get; set; }
public string? ZipCode { get; set; }
public string? Country { get; set; }
public string? PhoneNumber { get; set; }
public string? FaxNumber { get; set; }
public string? EmailAddress { get; set; }
public string? Website { get; set; }
public string? WhatsApp { get; set; }
public string? LinkedIn { get; set; }
public string? Facebook { get; set; }
public string? Instagram { get; set; }
public string? TwitterX { get; set; }
public string? TikTok { get; set; }
public string? VendorGroupId { get; set; }
public string? VendorCategoryId { get; set; }
public string? CreatedById { get; init; }
}
public class CreateVendorValidator : AbstractValidator<CreateVendorRequest>
{
public CreateVendorValidator()
{
RuleFor(x => x.Name).NotEmpty();
RuleFor(x => x.Street).NotEmpty();
RuleFor(x => x.City).NotEmpty();
RuleFor(x => x.State).NotEmpty();
RuleFor(x => x.ZipCode).NotEmpty();
RuleFor(x => x.PhoneNumber).NotEmpty();
RuleFor(x => x.EmailAddress).NotEmpty();
RuleFor(x => x.VendorGroupId).NotEmpty();
RuleFor(x => x.VendorCategoryId).NotEmpty();
}
}
public class CreateVendorHandler : IRequestHandler<CreateVendorRequest, CreateVendorResult>
{
private readonly ICommandRepository<Vendor> _repository;
private readonly IUnitOfWork _unitOfWork;
private readonly NumberSequenceService _numberSequenceService;
public CreateVendorHandler(
ICommandRepository<Vendor> repository,
IUnitOfWork unitOfWork,
NumberSequenceService numberSequenceService
)
{
_repository = repository;
_unitOfWork = unitOfWork;
_numberSequenceService = numberSequenceService;
}
public async Task<CreateVendorResult> Handle(CreateVendorRequest request, CancellationToken cancellationToken = default)
{
var entity = new Vendor();
entity.CreatedById = request.CreatedById;
entity.Name = request.Name;
entity.Number = _numberSequenceService.GenerateNumber(nameof(Vendor), "", "CST");
entity.Description = request.Description;
entity.Street = request.Street;
entity.City = request.City;
entity.State = request.State;
entity.ZipCode = request.ZipCode;
entity.Country = request.Country;
entity.PhoneNumber = request.PhoneNumber;
entity.FaxNumber = request.FaxNumber;
entity.EmailAddress = request.EmailAddress;
entity.Website = request.Website;
entity.WhatsApp = request.WhatsApp;
entity.LinkedIn = request.LinkedIn;
entity.Facebook = request.Facebook;
entity.Instagram = request.Instagram;
entity.TwitterX = request.TwitterX;
entity.TikTok = request.TikTok;
entity.VendorGroupId = request.VendorGroupId;
entity.VendorCategoryId = request.VendorCategoryId;
await _repository.CreateAsync(entity, cancellationToken);
await _unitOfWork.SaveAsync(cancellationToken);
return new CreateVendorResult
{
Data = entity
};
}
}
@@ -0,0 +1,62 @@
using Application.Common.Repositories;
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.VendorManager.Commands;
public class DeleteVendorResult
{
public Vendor? Data { get; set; }
}
public class DeleteVendorRequest : IRequest<DeleteVendorResult>
{
public string? Id { get; init; }
public string? DeletedById { get; init; }
}
public class DeleteVendorValidator : AbstractValidator<DeleteVendorRequest>
{
public DeleteVendorValidator()
{
RuleFor(x => x.Id).NotEmpty();
}
}
public class DeleteVendorHandler : IRequestHandler<DeleteVendorRequest, DeleteVendorResult>
{
private readonly ICommandRepository<Vendor> _repository;
private readonly IUnitOfWork _unitOfWork;
public DeleteVendorHandler(
ICommandRepository<Vendor> repository,
IUnitOfWork unitOfWork
)
{
_repository = repository;
_unitOfWork = unitOfWork;
}
public async Task<DeleteVendorResult> Handle(DeleteVendorRequest request, CancellationToken cancellationToken)
{
var entity = await _repository.GetAsync(request.Id ?? string.Empty, cancellationToken);
if (entity == null)
{
throw new Exception($"Entity not found: {request.Id}");
}
entity.UpdatedById = request.DeletedById;
_repository.Delete(entity);
await _unitOfWork.SaveAsync(cancellationToken);
return new DeleteVendorResult
{
Data = entity
};
}
}
@@ -0,0 +1,111 @@
using Application.Common.Repositories;
using Domain.Entities;
using FluentValidation;
using MediatR;
namespace Application.Features.VendorManager.Commands;
public class UpdateVendorResult
{
public Vendor? Data { get; set; }
}
public class UpdateVendorRequest : IRequest<UpdateVendorResult>
{
public string? Id { get; init; }
public string? Name { get; set; }
public string? Description { get; set; }
public string? Street { get; set; }
public string? City { get; set; }
public string? State { get; set; }
public string? ZipCode { get; set; }
public string? Country { get; set; }
public string? PhoneNumber { get; set; }
public string? FaxNumber { get; set; }
public string? EmailAddress { get; set; }
public string? Website { get; set; }
public string? WhatsApp { get; set; }
public string? LinkedIn { get; set; }
public string? Facebook { get; set; }
public string? Instagram { get; set; }
public string? TwitterX { get; set; }
public string? TikTok { get; set; }
public string? VendorGroupId { get; set; }
public string? VendorCategoryId { get; set; }
public string? CreatedById { get; init; }
public string? UpdatedById { get; init; }
}
public class UpdateVendorValidator : AbstractValidator<UpdateVendorRequest>
{
public UpdateVendorValidator()
{
RuleFor(x => x.Id).NotEmpty();
RuleFor(x => x.Name).NotEmpty();
RuleFor(x => x.Street).NotEmpty();
RuleFor(x => x.City).NotEmpty();
RuleFor(x => x.State).NotEmpty();
RuleFor(x => x.ZipCode).NotEmpty();
RuleFor(x => x.PhoneNumber).NotEmpty();
RuleFor(x => x.EmailAddress).NotEmpty();
RuleFor(x => x.VendorGroupId).NotEmpty();
RuleFor(x => x.VendorCategoryId).NotEmpty();
}
}
public class UpdateVendorHandler : IRequestHandler<UpdateVendorRequest, UpdateVendorResult>
{
private readonly ICommandRepository<Vendor> _repository;
private readonly IUnitOfWork _unitOfWork;
public UpdateVendorHandler(
ICommandRepository<Vendor> repository,
IUnitOfWork unitOfWork
)
{
_repository = repository;
_unitOfWork = unitOfWork;
}
public async Task<UpdateVendorResult> Handle(UpdateVendorRequest request, CancellationToken cancellationToken)
{
var entity = await _repository.GetAsync(request.Id ?? string.Empty, cancellationToken);
if (entity == null)
{
throw new Exception($"Entity not found: {request.Id}");
}
entity.UpdatedById = request.UpdatedById;
entity.Name = request.Name;
entity.Description = request.Description;
entity.Street = request.Street;
entity.City = request.City;
entity.State = request.State;
entity.ZipCode = request.ZipCode;
entity.Country = request.Country;
entity.PhoneNumber = request.PhoneNumber;
entity.FaxNumber = request.FaxNumber;
entity.EmailAddress = request.EmailAddress;
entity.Website = request.Website;
entity.WhatsApp = request.WhatsApp;
entity.LinkedIn = request.LinkedIn;
entity.Facebook = request.Facebook;
entity.Instagram = request.Instagram;
entity.TwitterX = request.TwitterX;
entity.TikTok = request.TikTok;
entity.VendorGroupId = request.VendorGroupId;
entity.VendorCategoryId = request.VendorCategoryId;
_repository.Update(entity);
await _unitOfWork.SaveAsync(cancellationToken);
return new UpdateVendorResult
{
Data = entity
};
}
}
@@ -0,0 +1,102 @@
using Application.Common.CQS.Queries;
using Application.Common.Extensions;
using AutoMapper;
using Domain.Entities;
using MediatR;
using Microsoft.EntityFrameworkCore;
namespace Application.Features.VendorManager.Queries;
public record GetVendorListDto
{
public string? Id { get; init; }
public string? Name { get; set; }
public string? Number { get; set; }
public string? Description { get; set; }
public string? Street { get; set; }
public string? City { get; set; }
public string? State { get; set; }
public string? ZipCode { get; set; }
public string? Country { get; set; }
public string? PhoneNumber { get; set; }
public string? FaxNumber { get; set; }
public string? EmailAddress { get; set; }
public string? Website { get; set; }
public string? WhatsApp { get; set; }
public string? LinkedIn { get; set; }
public string? Facebook { get; set; }
public string? Instagram { get; set; }
public string? TwitterX { get; set; }
public string? TikTok { get; set; }
public string? VendorGroupId { get; set; }
public string? VendorGroupName { get; set; }
public string? VendorCategoryId { get; set; }
public string? VendorCategoryName { get; set; }
public string? CreatedById { get; init; }
public DateTime? CreatedAtUtc { get; init; }
}
public class GetVendorListProfile : Profile
{
public GetVendorListProfile()
{
CreateMap<Vendor, GetVendorListDto>()
.ForMember(
dest => dest.VendorGroupName,
opt => opt.MapFrom(src => src.VendorGroup != null ? src.VendorGroup.Name : string.Empty)
)
.ForMember(
dest => dest.VendorCategoryName,
opt => opt.MapFrom(src => src.VendorCategory != null ? src.VendorCategory.Name : string.Empty)
);
}
}
public class GetVendorListResult
{
public List<GetVendorListDto>? Data { get; init; }
}
public class GetVendorListRequest : IRequest<GetVendorListResult>
{
public bool IsDeleted { get; init; } = false;
}
public class GetVendorListHandler : IRequestHandler<GetVendorListRequest, GetVendorListResult>
{
private readonly IMapper _mapper;
private readonly IQueryContext _context;
public GetVendorListHandler(IMapper mapper, IQueryContext context)
{
_mapper = mapper;
_context = context;
}
public async Task<GetVendorListResult> Handle(GetVendorListRequest request, CancellationToken cancellationToken)
{
var query = _context
.Vendor
.AsNoTracking()
.ApplyIsDeletedFilter(request.IsDeleted)
.Include(x => x.VendorGroup)
.Include(x => x.VendorCategory)
.AsQueryable();
var entities = await query.ToListAsync(cancellationToken);
var dtos = _mapper.Map<List<GetVendorListDto>>(entities);
return new GetVendorListResult
{
Data = dtos
};
}
}