using AutoMapper; using DbFirst.Application.Repositories; using DbFirst.Domain.Entities; using DbFirst.Domain; namespace DbFirst.Application.Catalogs; //TODO: create generic service to reduce code duplication //TODO (TR): kod tekrar?n? azaltmak için generic bir servis/basit CRUD altyap?s? ekleyin //TODO: implement CQRS pattern with MediatR //TODO (TR): CQRS desenini MediatR ile uygulay?n public class CatalogService : ICatalogService { private readonly ICatalogRepository _repository; private readonly IMapper _mapper; public CatalogService(ICatalogRepository repository, IMapper mapper) { _repository = repository; _mapper = mapper; } public async Task> GetAllAsync(CancellationToken cancellationToken = default) { var items = await _repository.GetAllAsync(cancellationToken); return _mapper.Map>(items); } public async Task GetByIdAsync(int id, CancellationToken cancellationToken = default) { var item = await _repository.GetByIdAsync(id, cancellationToken); return item == null ? null : _mapper.Map(item); } public async Task CreateAsync(CatalogWriteDto dto, CancellationToken cancellationToken = default) { var existing = await _repository.GetByTitleAsync(dto.CatTitle, cancellationToken); if (existing != null) { return null; } var entity = _mapper.Map(dto); entity.AddedWho = "system"; entity.AddedWhen = DateTime.UtcNow; entity.ChangedWho = "system"; entity.ChangedWhen = DateTime.UtcNow; var created = await _repository.InsertAsync(entity, cancellationToken); return _mapper.Map(created); } public async Task UpdateAsync(int id, CatalogWriteDto dto, CancellationToken cancellationToken = default) { var existing = await _repository.GetByIdAsync(id, cancellationToken); if (existing == null) { return null; } var entity = _mapper.Map(dto); entity.Guid = id; entity.CatTitle = dto.UpdateProcedure == CatalogUpdateProcedure.Update ? existing.CatTitle : dto.CatTitle; entity.AddedWho = existing.AddedWho; entity.AddedWhen = existing.AddedWhen; entity.ChangedWho = "system"; entity.ChangedWhen = DateTime.UtcNow; var procedure = dto.UpdateProcedure; var updated = await _repository.UpdateAsync(id, entity, procedure, cancellationToken); return updated == null ? null : _mapper.Map(updated); } public async Task DeleteAsync(int id, CancellationToken cancellationToken = default) { return await _repository.DeleteAsync(id, cancellationToken); } }