Jacob Schmidt f86ac5e4b9 Remove dead code, fix duplicated connection logic, eliminate fake async
- Delete unused FileFragmentRepository.cs
- DatabaseSessionService delegates to JournalDatabaseService for
  OpenEncryptedConnection/EnsureSchema instead of duplicating logic
- Make IJournalDatabaseService expose OpenEncryptedConnection and
  EnsureSchema as public
- Convert entire fragment chain from fake async (Task.FromResult
  wrappers) to synchronous: IFragmentRepository, SqliteFragmentRepository,
  InMemoryFragmentRepository, IFragmentService, FragmentService,
  Entry.cs dispatch, and SmokeTests

Co-Authored-By: Warp <agent@warp.dev>
2026-02-23 22:10:36 -06:00

82 lines
2.4 KiB
C#

using System.ComponentModel.DataAnnotations;
using Journal.Core.Dtos;
using Journal.Core.Models;
using Journal.Core.Repositories;
namespace Journal.Core.Services.Fragments;
public class FragmentService(IFragmentRepository repo) : IFragmentService
{
private readonly IFragmentRepository _repo = repo ?? throw new ArgumentNullException(nameof(repo));
private static FragmentDto Map(Fragment f) => new(
f.Id,
f.Type,
f.Description,
f.Time,
f.Tags != null ? [.. f.Tags] : []
);
public FragmentDto Create(CreateFragmentDto dto)
{
ArgumentNullException.ThrowIfNull(dto);
var ctx = new ValidationContext(dto);
Validator.ValidateObject(dto, ctx, validateAllProperties: true);
var f = new Fragment(dto.Type, dto.Description);
if (dto.Tags != null)
f.Tags = [.. dto.Tags.Where(t => !string.IsNullOrWhiteSpace(t)).Select(t => t!.Trim())];
_repo.Add(f);
return Map(f);
}
public bool Update(Guid id, UpdateFragmentDto dto)
{
ArgumentNullException.ThrowIfNull(dto);
if (dto.Type != null && string.IsNullOrWhiteSpace(dto.Type))
throw new ValidationException("Type cannot be empty");
if (dto.Description != null && string.IsNullOrWhiteSpace(dto.Description))
throw new ValidationException("Description cannot be empty");
var type = dto.Type?.Trim();
var description = dto.Description?.Trim();
var tags = dto.Tags?.Where(t => !string.IsNullOrWhiteSpace(t)).Select(t => t!.Trim()).ToList();
return _repo.Update(id, type, description, tags, dto.Time);
}
public bool Remove(Guid id) => _repo.Remove(id);
public List<FragmentDto> Search(string? type = null, string? tag = null, DateTimeOffset? timeAfter = null)
{
var items = _repo.Search(type, tag, timeAfter);
return [.. items.Select(Map)];
}
public List<FragmentDto> GetByTag(string tag)
{
var items = _repo.GetByTag(tag);
return [.. items.Select(Map)];
}
public List<FragmentDto> GetByType(string type)
{
var items = _repo.GetByType(type);
return [.. items.Select(Map)];
}
public List<FragmentDto> GetAll()
{
var items = _repo.GetAll();
return [.. items.Select(Map)];
}
public FragmentDto? GetById(Guid id)
{
var f = _repo.GetById(id);
return f is null ? null : Map(f);
}
}