Ajout de code, j'en suis à la partie application

This commit is contained in:
blyssco 2025-07-29 21:00:45 +02:00
parent 659d263ea7
commit 5cd762fc3d
26 changed files with 473 additions and 15 deletions

View File

@ -0,0 +1,10 @@
namespace Liber_Incantamentum.Application.DTOs.Filter
{
public class MageDtoFilter
{
public Guid? Id { get; set; }
public string? Name { get; set; }
public string? Rank { get; set; }
public string? Specialisation { get; set; }
}
}

View File

@ -0,0 +1,12 @@
namespace Liber_Incantamentum.Application.DTOs.Filter
{
public class SpellDtoFilter
{
public Guid? Id { get; set; }
public string? Name { get; set; }
public string? Description { get; set; }
public string? Type { get; set; }
public DateTime? CreationDate { get; set; }
public MageDtoFilter? Mage { get; set; }
}
}

View File

@ -0,0 +1,10 @@
namespace Liber_Incantamentum.Application.DTOs.General
{
public class MageDto
{
public Guid Id { get; set; }
public required string Name { get; set; }
public required string Rank { get; set; }
public required string Specialisation { get; set; }
}
}

View File

@ -0,0 +1,12 @@
namespace Liber_Incantamentum.Application.DTOs.General
{
public class SpellDto
{
public Guid Id { get; set; }
public required string Name { get; set; }
public required string Description { get; set; }
public required string Type { get; set; }
public required DateTime CreationDate { get; set; }
public required MageDto Mage { get; set; }
}
}

View File

@ -0,0 +1,9 @@
namespace Liber_Incantamentum.Application.Exceptions
{
public class ConflictException : Exception
{
public ConflictException() { }
public ConflictException(string message) : base(message) { }
public ConflictException(string? message, Exception? innerException) : base(message, innerException) { }
}
}

View File

@ -0,0 +1,9 @@
namespace Liber_Incantamentum.Application.Exceptions
{
public class NotFoundException : Exception
{
public NotFoundException() { }
public NotFoundException(string message) : base(message) { }
public NotFoundException(string? message, Exception? innerException) : base(message, innerException) { }
}
}

View File

@ -0,0 +1,9 @@
namespace Liber_Incantamentum.Application.Exceptions
{
public class ValidationException : Exception
{
public ValidationException() { }
public ValidationException(string message) : base(message) { }
public ValidationException(string? message, Exception? innerException) : base(message, innerException) { }
}
}

View File

@ -0,0 +1,13 @@
using Liber_Incantamentum.Application.DTOs.Filter;
using Liber_Incantamentum.Application.DTOs.General;
namespace Liber_Incantamentum.Application.Interfaces.Generals
{
public interface IMageService
{
Task<ICollection<MageDto>?> GetAllMageAsync(MageDtoFilter filter);
Task<bool> UpdateMageAsync(MageDtoFilter dto);
Task<bool> DeleteMageAsync(Guid id);
Task<bool> AddMageAsync(MageDto dto);
}
}

View File

@ -0,0 +1,13 @@
using Liber_Incantamentum.Application.DTOs.Filter;
using Liber_Incantamentum.Application.DTOs.General;
namespace Liber_Incantamentum.Application.Interfaces.Generals
{
public interface ISpellService
{
Task<ICollection<SpellDto>?> GetAllSpellAsync(SpellDtoFilter filter);
Task<bool> UpdateSpellAsync(SpellDtoFilter dto);
Task<bool> DeleteSpellAsync(Guid id);
Task<bool> AddSpellAsync(SpellDto dto);
}
}

View File

@ -0,0 +1,16 @@
using Liber_Incantamentum.Application.DTOs.Filter;
using Liber_Incantamentum.Application.DTOs.General;
using Liber_Incantamentum.Domain.Entities;
using Liber_Incantamentum.Domain.Filter;
namespace Liber_Incantamentum.Application.Interfaces.Mappings
{
public interface IMapper
{
MageFilter MapMageDtoFilterToMageFilterEntity(MageDtoFilter filter);
Mage MapMageDtoToMageEntity(MageDto dto);
ICollection<MageDto>? MapMageEntityCollectionToMageDtoCollection(ICollection<Mage>? task);
SpellFilter MapSpellDtoFilterToSpellFilterEntity(SpellDtoFilter dto);
Spell MapSpellDtoToSpellEntity(SpellDto dto);
}
}

View File

@ -0,0 +1,14 @@
using Liber_Incantamentum.Application.DTOs.Filter;
using Liber_Incantamentum.Application.DTOs.General;
namespace Liber_Incantamentum.Application.Interfaces.Validations
{
public interface IValidator
{
void ValidateGuid(Guid id);
void ValidateMageDto(MageDto dto);
void ValidateMageDtoFilter(MageDtoFilter filter);
void ValidateSpellDto(SpellDto dto);
void ValidateSpellDtoFilter(SpellDtoFilter filter);
}
}

View File

@ -7,9 +7,7 @@
</PropertyGroup>
<ItemGroup>
<Folder Include="DTOs\" />
<Folder Include="Interfaces\" />
<Folder Include="Services\" />
<ProjectReference Include="..\Liber_Incantamentum.Domain\Liber_Incantamentum.Domain.csproj" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,46 @@
using Liber_Incantamentum.Application.DTOs.Filter;
using Liber_Incantamentum.Application.DTOs.General;
using Liber_Incantamentum.Application.Interfaces.Generals;
using Liber_Incantamentum.Application.Interfaces.Mappings;
using Liber_Incantamentum.Application.Interfaces.Validations;
using Liber_Incantamentum.Domain.Repositories;
namespace Liber_Incantamentum.Application.Services.Generals
{
public class MageService : IMageService
{
private IValidator _validator;
private IMageRepository _mageRepository;
private IMapper _mapper;
public MageService(IMapper mapper, IMageRepository mageRepository, IValidator validator)
{
_mapper = mapper;
_mageRepository = mageRepository;
_validator = validator;
}
public async Task<bool> AddMageAsync(MageDto dto)
{
_validator.ValidateMageDto(dto);
return await _mageRepository.AddMageAsync(_mapper.MapMageDtoToMageEntity(dto));
}
public async Task<bool> DeleteMageAsync(Guid id)
{
_validator.ValidateGuid(id);
return await _mageRepository.DeleteMageAsync(id);
}
public async Task<ICollection<MageDto>?> GetAllMageAsync(MageDtoFilter filter)
{
_validator.ValidateMageDtoFilter(filter);
return await _mapper.MapMageEntityCollectionToMageDtoCollection(_mageRepository.GetAllMageAsync(_mapper.MapMageDtoFilterToMageFilterEntity(filter)));
}
public async Task<bool> UpdateMageAsync(MageDtoFilter dto)
{
_validator.ValidateMageDtoFilter(dto);
await _mageRepository.UpdateMageAsync(_mapper.MapMageDtoFilterToMageFilterEntity(dto));
return false;
}
}
}

View File

@ -0,0 +1,57 @@
using Liber_Incantamentum.Application.DTOs.Filter;
using Liber_Incantamentum.Application.DTOs.General;
using Liber_Incantamentum.Application.Interfaces.Generals;
using Liber_Incantamentum.Application.Interfaces.Mappings;
using Liber_Incantamentum.Application.Interfaces.Validations;
using Liber_Incantamentum.Domain.Repositories;
namespace Liber_Incantamentum.Application.Services.Generals
{
public class SpellService : ISpellService
{
private IValidator _validator;
private ISpellRepository _spellRepository;
private IMapper _mapper;
public SpellService(IValidator validator, ISpellRepository spellRepository, IMapper mapper)
{
_mapper = mapper;
_validator = validator;
_spellRepository = spellRepository;
}
public async Task<bool> AddSpellAsync(SpellDto dto)
{
if (_validator.ValidateSpellDto(dto))
{
await _spellRepository.AddSpellAsync(_mapper.MapSpellDtoToSpellEntity(dto));
}
return false;
}
public async Task<bool> DeleteSpellAsync(Guid id)
{
if (_validator.ValidateGuid(id))
{
await _spellRepository.DeleteSpellAsync(id);
}
return false;
}
public async Task<ICollection<SpellDto>?> GetAllSpellAsync(SpellDtoFilter filter)
{
if (_validator.ValidateSpellDtoFilter(filter))
{
await _spellRepository.GetAllSpellAsync(_mapper.MapSpellDtoFilterToSpellFilterEntity(filter));
}
return null;
}
public async Task<bool> UpdateSpellAsync(SpellDtoFilter filter)
{
if (_validator.ValidateSpellDtoFilter(filter))
{
await _spellRepository.UpdateSpellAsync(_mapper.MapSpellDtoFilterToSpellFilterEntity(filter));
}
return false;
}
}
}

View File

@ -0,0 +1,108 @@
using Liber_Incantamentum.Application.DTOs.Filter;
using Liber_Incantamentum.Application.DTOs.General;
using Liber_Incantamentum.Application.Interfaces.Mappings;
using Liber_Incantamentum.Domain.Entities;
using Liber_Incantamentum.Domain.Filter;
using System.Collections;
namespace Liber_Incantamentum.Application.Services.Mappings
{
public class Mapper : IMapper
{
public MageFilter MapMageDtoFilterToMageFilterEntity(MageDtoFilter filter)
{
MageFilter entity = new MageFilter()
{
Id = filter.Id,
Name = filter.Name,
Rank = filter.Rank,
Specialisation = filter.Specialisation
};
return entity;
}
public Mage MapMageDtoToMageEntity(MageDto dto)
{
Mage entity = new Mage()
{
Name = dto.Name,
Rank = dto.Rank,
Specialisation = dto.Specialisation
};
return entity;
}
public MageDto MapMageEntityToMageDto(Mage entity)
{
MageDto dto = new MageDto()
{
Name = entity.Name,
Rank = entity.Rank,
Specialisation = entity.Specialisation
};
return dto;
}
public ICollection<MageDto>? MapMageEntityCollectionToMageDtoCollection(ICollection<Mage> collection)
{
ICollection<MageDto> MageDtoCollection = new List<MageDto>();
foreach(var entity in collection)
{
MageDto dto = new MageDto()
{
Id = entity.Id,
Name = entity.Name,
Rank = entity.Rank,
Specialisation = entity.Specialisation
};
MageDtoCollection.Add(dto);
}
return MageDtoCollection;
}
public ICollection<SpellDto>? MapSpellEntityCollectionToSpellDtoCollection(ICollection<Spell> collection)
{
ICollection<SpellDto> SpellDtoCollection = new List<SpellDto>();
foreach (var entity in collection)
{
SpellDto dto = new SpellDto()
{
Id = entity.Id,
Name = entity.Name,
Description = entity.Description,
Type = entity.Type,
CreationDate = entity.CreationDate,
Mage = MapMageEntityToMageDto(entity.Mage)
};
SpellDtoCollection.Add(dto);
}
return SpellDtoCollection;
}
public SpellFilter MapSpellDtoFilterToSpellFilterEntity(SpellDtoFilter dto)
{
SpellFilter entity = new SpellFilter()
{
Id = dto.Id,
Name = dto.Name,
Description = dto.Description,
Type = dto.Type,
CreationDate = dto.CreationDate,
Mage = MapMageDtoFilterToMageFilterEntity(dto.Mage)
};
return entity;
}
public Spell MapSpellDtoToSpellEntity(SpellDto dto)
{
Spell entity = new Spell()
{
Id = dto.Id,
Name = dto.Name,
Description = dto.Description,
Type = dto.Type,
CreationDate = dto.CreationDate,
Mage = MapMageDtoToMageEntity(dto.Mage)
};
return entity;
}
}
}

View File

@ -0,0 +1,34 @@
using Liber_Incantamentum.Application.DTOs.Filter;
using Liber_Incantamentum.Application.DTOs.General;
using Liber_Incantamentum.Application.Interfaces.Validations;
namespace Liber_Incantamentum.Application.Services.Validations
{
public class Validator : IValidator
{
public void ValidateGuid(Guid id)
{
if (id == Guid.Empty) throw new ArgumentNullException("The id received is null");
}
public void ValidateMageDto(MageDto dto)
{
}
public void ValidateMageDtoFilter(MageDtoFilter filter)
{
throw new NotImplementedException();
}
public void ValidateSpellDto(SpellDto dto)
{
throw new NotImplementedException();
}
public void ValidateSpellDtoFilter(SpellDtoFilter filter)
{
throw new NotImplementedException();
}
}
}

View File

@ -0,0 +1,10 @@
namespace Liber_Incantamentum.Domain.Entities
{
public class Mage
{
public Guid Id { get; private set; }
public required string Name { get; set; }
public required string Rank { get; set; }
public required string Specialisation { get; set; }
}
}

View File

@ -0,0 +1,12 @@
namespace Liber_Incantamentum.Domain.Entities
{
public class Spell
{
public Guid Id { get; set; }
public required string Name { get; set; }
public required string Description { get; set; }
public required string Type { get; set; }
public required DateTime CreationDate { get; set; }
public required Mage Mage { get; set; }
}
}

View File

@ -0,0 +1,10 @@
namespace Liber_Incantamentum.Domain.Filter
{
public class MageFilter
{
public Guid? Id { get; set; }
public string? Name { get; set; }
public string? Rank { get; set; }
public string? Specialisation { get; set; }
}
}

View File

@ -0,0 +1,12 @@
namespace Liber_Incantamentum.Domain.Filter
{
public class SpellFilter
{
public Guid? Id { get; set; }
public string? Name { get; set; }
public string? Description { get; set; }
public string? Type { get; set; }
public DateTime? CreationDate { get; set; }
public MageFilter? Mage { get; set; }
}
}

View File

@ -7,11 +7,15 @@
</PropertyGroup>
<ItemGroup>
<Folder Include="Entities\" />
<Folder Include="Exceptions\" />
<Folder Include="DomainEvents\" />
<Folder Include="ValueObjects\" />
<Folder Include="Repositories\" />
<Compile Remove="DomainEvents\**" />
<Compile Remove="Exceptions\**" />
<Compile Remove="ValueObjects\**" />
<EmbeddedResource Remove="DomainEvents\**" />
<EmbeddedResource Remove="Exceptions\**" />
<EmbeddedResource Remove="ValueObjects\**" />
<None Remove="DomainEvents\**" />
<None Remove="Exceptions\**" />
<None Remove="ValueObjects\**" />
</ItemGroup>
</Project>

View File

@ -0,0 +1,13 @@
using Liber_Incantamentum.Domain.Entities;
using Liber_Incantamentum.Domain.Filter;
namespace Liber_Incantamentum.Domain.Repositories
{
public interface IMageRepository
{
Task<ICollection<Mage>?> GetAllMageAsync(MageFilter filter);
Task<bool> UpdateMageAsync(MageFilter filter);
Task<bool> DeleteMageAsync(Guid id);
Task<bool> AddMageAsync(Mage entity);
}
}

View File

@ -0,0 +1,13 @@
using Liber_Incantamentum.Domain.Entities;
using Liber_Incantamentum.Domain.Filter;
namespace Liber_Incantamentum.Domain.Repositories
{
public interface ISpellRepository
{
Task<ICollection<Spell>?> GetAllSpellAsync(SpellFilter filter);
Task<bool> UpdateSpellAsync(SpellFilter filter);
Task<bool> DeleteSpellAsync(Guid id);
Task<bool> AddSpellAsync(Spell entity);
}
}

View File

@ -7,8 +7,12 @@
</PropertyGroup>
<ItemGroup>
<Folder Include="Data\" />
<Folder Include="Repositories\" />
<Compile Remove="Data\**" />
<Compile Remove="Repositories\**" />
<EmbeddedResource Remove="Data\**" />
<EmbeddedResource Remove="Repositories\**" />
<None Remove="Data\**" />
<None Remove="Repositories\**" />
</ItemGroup>
</Project>

View File

@ -7,8 +7,12 @@
</PropertyGroup>
<ItemGroup>
<Folder Include="IntegrationTests\" />
<Folder Include="UnitTests\" />
<Compile Remove="IntegrationTests\**" />
<Compile Remove="UnitTests\**" />
<EmbeddedResource Remove="IntegrationTests\**" />
<EmbeddedResource Remove="UnitTests\**" />
<None Remove="IntegrationTests\**" />
<None Remove="UnitTests\**" />
</ItemGroup>
</Project>

View File

@ -7,12 +7,18 @@
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.5" />
<Compile Remove="Controllers\**" />
<Compile Remove="Middlewares\**" />
<Content Remove="Controllers\**" />
<Content Remove="Middlewares\**" />
<EmbeddedResource Remove="Controllers\**" />
<EmbeddedResource Remove="Middlewares\**" />
<None Remove="Controllers\**" />
<None Remove="Middlewares\**" />
</ItemGroup>
<ItemGroup>
<Folder Include="Controllers\" />
<Folder Include="Middlewares\" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.5" />
</ItemGroup>
</Project>