From 66560bbcd56c5886468da128b4483ab4217a06a1 Mon Sep 17 00:00:00 2001 From: romai Date: Sun, 8 Dec 2024 22:57:55 +0400 Subject: [PATCH] =?UTF-8?q?=D0=9F=D1=80=D0=B5=D0=B4=D0=B2=D0=B0=D1=80?= =?UTF-8?q?=D0=B8=D0=B5=D0=BB=D1=8C=D0=BD=D1=8B=D0=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Address Directory/Address Directory.sln | 26 ++++++- Address Directory/Contracts/CityDTO.cs | 8 ++ Address Directory/Contracts/Contracts.csproj | 13 ++++ Address Directory/Contracts/RegionDTO.cs | 8 ++ Address Directory/Contracts/StreetDTO.cs | 9 +++ Address Directory/Domain/Class1.cs | 7 -- Address Directory/Domain/Entities/City.cs | 6 +- Address Directory/Domain/Entities/Region.cs | 2 + Address Directory/Domain/Entities/Street.cs | 6 +- .../Domain/Repository/ICityRepository.cs | 13 ++++ .../Domain/Repository/IRegionRepository.cs | 13 ++++ .../Domain/Repository/IStreetRepository.cs | 13 ++++ .../Configurations/CityConfiguration.cs | 29 ++++++++ .../Configurations/RegionConfiguration.cs | 26 +++++++ .../Configurations/StreetConfiguration.cs | 34 +++++++++ .../Persistence/Persistence.csproj | 22 ++++++ .../Repositories/CityRepository.cs | 48 ++++++++++++ .../Repositories/RegionRepository.cs | 47 ++++++++++++ .../Repositories/StreetRepository.cs | 46 ++++++++++++ .../Persistence/RepositoryDbContext.cs | 32 ++++++++ .../Services.Abstractions/ICityService.cs | 13 ++++ .../Services.Abstractions/IRegionService.cs | 13 ++++ .../Services.Abstractions/IStreetService.cs | 13 ++++ .../Services.Abstractions.csproj | 13 ++++ Address Directory/Services/CityService.cs | 33 +++++++++ .../Services/Profiles/MappingProfile.cs | 24 ++++++ Address Directory/Services/RegionService.cs | 73 +++++++++++++++++++ Address Directory/Services/Services.csproj | 17 +++++ 28 files changed, 597 insertions(+), 10 deletions(-) create mode 100644 Address Directory/Contracts/CityDTO.cs create mode 100644 Address Directory/Contracts/Contracts.csproj create mode 100644 Address Directory/Contracts/RegionDTO.cs create mode 100644 Address Directory/Contracts/StreetDTO.cs delete mode 100644 Address Directory/Domain/Class1.cs create mode 100644 Address Directory/Domain/Repository/ICityRepository.cs create mode 100644 Address Directory/Domain/Repository/IRegionRepository.cs create mode 100644 Address Directory/Domain/Repository/IStreetRepository.cs create mode 100644 Address Directory/Persistence/Configurations/CityConfiguration.cs create mode 100644 Address Directory/Persistence/Configurations/RegionConfiguration.cs create mode 100644 Address Directory/Persistence/Configurations/StreetConfiguration.cs create mode 100644 Address Directory/Persistence/Persistence.csproj create mode 100644 Address Directory/Persistence/Repositories/CityRepository.cs create mode 100644 Address Directory/Persistence/Repositories/RegionRepository.cs create mode 100644 Address Directory/Persistence/Repositories/StreetRepository.cs create mode 100644 Address Directory/Persistence/RepositoryDbContext.cs create mode 100644 Address Directory/Services.Abstractions/ICityService.cs create mode 100644 Address Directory/Services.Abstractions/IRegionService.cs create mode 100644 Address Directory/Services.Abstractions/IStreetService.cs create mode 100644 Address Directory/Services.Abstractions/Services.Abstractions.csproj create mode 100644 Address Directory/Services/CityService.cs create mode 100644 Address Directory/Services/Profiles/MappingProfile.cs create mode 100644 Address Directory/Services/RegionService.cs create mode 100644 Address Directory/Services/Services.csproj diff --git a/Address Directory/Address Directory.sln b/Address Directory/Address Directory.sln index d10ce19..551f1ff 100644 --- a/Address Directory/Address Directory.sln +++ b/Address Directory/Address Directory.sln @@ -3,7 +3,15 @@ Microsoft Visual Studio Solution File, Format Version 12.00 # Visual Studio Version 17 VisualStudioVersion = 17.11.35312.102 MinimumVisualStudioVersion = 10.0.40219.1 -Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Domain", "Domain\Domain.csproj", "{08EF65A6-323C-4B7D-8B2E-97914E137B21}" +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Domain", "Domain\Domain.csproj", "{08EF65A6-323C-4B7D-8B2E-97914E137B21}" +EndProject +Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Persistence", "Persistence\Persistence.csproj", "{DDC46759-F840-4F65-BE42-18F8E7595E1F}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Services.Abstractions", "Services.Abstractions\Services.Abstractions.csproj", "{8A734C61-6870-4549-9FFD-9981BCE9205C}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Contracts", "Contracts\Contracts.csproj", "{973F121B-D227-46A0-9078-A0D6D6CADC56}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Services", "Services\Services.csproj", "{4CCFADCD-9E80-4B66-A6D8-B6FC5490A0C0}" EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution @@ -15,6 +23,22 @@ Global {08EF65A6-323C-4B7D-8B2E-97914E137B21}.Debug|Any CPU.Build.0 = Debug|Any CPU {08EF65A6-323C-4B7D-8B2E-97914E137B21}.Release|Any CPU.ActiveCfg = Release|Any CPU {08EF65A6-323C-4B7D-8B2E-97914E137B21}.Release|Any CPU.Build.0 = Release|Any CPU + {DDC46759-F840-4F65-BE42-18F8E7595E1F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {DDC46759-F840-4F65-BE42-18F8E7595E1F}.Debug|Any CPU.Build.0 = Debug|Any CPU + {DDC46759-F840-4F65-BE42-18F8E7595E1F}.Release|Any CPU.ActiveCfg = Release|Any CPU + {DDC46759-F840-4F65-BE42-18F8E7595E1F}.Release|Any CPU.Build.0 = Release|Any CPU + {8A734C61-6870-4549-9FFD-9981BCE9205C}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {8A734C61-6870-4549-9FFD-9981BCE9205C}.Debug|Any CPU.Build.0 = Debug|Any CPU + {8A734C61-6870-4549-9FFD-9981BCE9205C}.Release|Any CPU.ActiveCfg = Release|Any CPU + {8A734C61-6870-4549-9FFD-9981BCE9205C}.Release|Any CPU.Build.0 = Release|Any CPU + {973F121B-D227-46A0-9078-A0D6D6CADC56}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {973F121B-D227-46A0-9078-A0D6D6CADC56}.Debug|Any CPU.Build.0 = Debug|Any CPU + {973F121B-D227-46A0-9078-A0D6D6CADC56}.Release|Any CPU.ActiveCfg = Release|Any CPU + {973F121B-D227-46A0-9078-A0D6D6CADC56}.Release|Any CPU.Build.0 = Release|Any CPU + {4CCFADCD-9E80-4B66-A6D8-B6FC5490A0C0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {4CCFADCD-9E80-4B66-A6D8-B6FC5490A0C0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {4CCFADCD-9E80-4B66-A6D8-B6FC5490A0C0}.Release|Any CPU.ActiveCfg = Release|Any CPU + {4CCFADCD-9E80-4B66-A6D8-B6FC5490A0C0}.Release|Any CPU.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE diff --git a/Address Directory/Contracts/CityDTO.cs b/Address Directory/Contracts/CityDTO.cs new file mode 100644 index 0000000..85d8650 --- /dev/null +++ b/Address Directory/Contracts/CityDTO.cs @@ -0,0 +1,8 @@ +using Domain.Entities; + +namespace Contracts +{ + public record CityDto(Guid Id, string Name, Guid RegionId, List Streets); + public record CityDtoForCreate(string Name, Guid RegionId); + public record CityDtoForUpdate(Guid Id, string Name, Guid RegionId, List Streets); +} diff --git a/Address Directory/Contracts/Contracts.csproj b/Address Directory/Contracts/Contracts.csproj new file mode 100644 index 0000000..dff2c04 --- /dev/null +++ b/Address Directory/Contracts/Contracts.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/Address Directory/Contracts/RegionDTO.cs b/Address Directory/Contracts/RegionDTO.cs new file mode 100644 index 0000000..b9faff5 --- /dev/null +++ b/Address Directory/Contracts/RegionDTO.cs @@ -0,0 +1,8 @@ +using Domain.Entities; + +namespace Contracts +{ + public record RegionDto(Guid Id, string Name, int Code); + public record RegionDtoForCreate(string Name, int Code); + public record RegionDtoForUpdate(string Name, int Code, List? Cities); +} diff --git a/Address Directory/Contracts/StreetDTO.cs b/Address Directory/Contracts/StreetDTO.cs new file mode 100644 index 0000000..50fddd1 --- /dev/null +++ b/Address Directory/Contracts/StreetDTO.cs @@ -0,0 +1,9 @@ +namespace Contracts +{ + public record StreetDto(Guid Id, string Name, List HouseNumbers, + int Index, int OkatoCode, int TaxCode, Guid CityId); + public record StreetDtoForCreate(string Name, List HouseNumbers, + int Index, int OkatoCode, int TaxCode, Guid CityId); + public record StreetDtoForUpdate(string Name, List HouseNumbers, + int Index, int OkatoCode, int TaxCode, Guid CityId); +} diff --git a/Address Directory/Domain/Class1.cs b/Address Directory/Domain/Class1.cs deleted file mode 100644 index eb40a3e..0000000 --- a/Address Directory/Domain/Class1.cs +++ /dev/null @@ -1,7 +0,0 @@ -namespace Domain -{ - public class Class1 - { - - } -} diff --git a/Address Directory/Domain/Entities/City.cs b/Address Directory/Domain/Entities/City.cs index 0013635..c8d80ab 100644 --- a/Address Directory/Domain/Entities/City.cs +++ b/Address Directory/Domain/Entities/City.cs @@ -1,9 +1,13 @@ namespace Domain.Entities { - public class City // города и населённые пункты * + public class City { public Guid Id { get; set; } public string Name { get; set; } = string.Empty; + public Guid RegionId { get; set; } + public Region Region { get; set; } = null!; + + public List Streets { get; set; } = new List(); } } diff --git a/Address Directory/Domain/Entities/Region.cs b/Address Directory/Domain/Entities/Region.cs index 71b5e3e..0a0b5cb 100644 --- a/Address Directory/Domain/Entities/Region.cs +++ b/Address Directory/Domain/Entities/Region.cs @@ -5,5 +5,7 @@ public Guid Id { get; set; } public string Name { get; set; } = string.Empty; public int Code { get; set; } + + public List Cities { get; set; } = new List(); } } diff --git a/Address Directory/Domain/Entities/Street.cs b/Address Directory/Domain/Entities/Street.cs index 610ebda..7332a30 100644 --- a/Address Directory/Domain/Entities/Street.cs +++ b/Address Directory/Domain/Entities/Street.cs @@ -4,9 +4,13 @@ { public Guid Id { get; set; } public string Name { get; set; } = string.Empty; - public List HouseNumbers { get; set; } + public List HouseNumbers { get; set; } = new List(); public int Index { get; set; } public int OkatoCode { get; set; } public int TaxCode { get; set; } + + public Guid CityId { get; set; } + public City City { get; set; } = null!; + } } diff --git a/Address Directory/Domain/Repository/ICityRepository.cs b/Address Directory/Domain/Repository/ICityRepository.cs new file mode 100644 index 0000000..9f7452a --- /dev/null +++ b/Address Directory/Domain/Repository/ICityRepository.cs @@ -0,0 +1,13 @@ +using Domain.Entities; + +namespace Domain.Repository +{ + public interface ICityRepository + { + Task GetByIdAsync(Guid id); + Task> GetAllAsync(); + Task AddAsync(City city); + Task UpdateAsync(City city); + Task DeleteAsync(City city); + } +} diff --git a/Address Directory/Domain/Repository/IRegionRepository.cs b/Address Directory/Domain/Repository/IRegionRepository.cs new file mode 100644 index 0000000..63946da --- /dev/null +++ b/Address Directory/Domain/Repository/IRegionRepository.cs @@ -0,0 +1,13 @@ +using Domain.Entities; + +namespace Domain.Repository +{ + public interface IRegionRepository + { + Task GetByIdAsync(Guid id); + Task> GetAllAsync(); + Task AddAsync(Region region); + Task UpdateAsync(Region region); + Task DeleteAsync(Region region); + } +} diff --git a/Address Directory/Domain/Repository/IStreetRepository.cs b/Address Directory/Domain/Repository/IStreetRepository.cs new file mode 100644 index 0000000..4b20f5c --- /dev/null +++ b/Address Directory/Domain/Repository/IStreetRepository.cs @@ -0,0 +1,13 @@ +using Domain.Entities; + +namespace Domain.Repository +{ + public interface IStreetRepository + { + Task GetByIdAsync(Guid id); + Task> GetAllAsync(); + Task AddAsync(Street street); + Task UpdateAsync(Street street); + Task DeleteAsync(Street street); + } +} diff --git a/Address Directory/Persistence/Configurations/CityConfiguration.cs b/Address Directory/Persistence/Configurations/CityConfiguration.cs new file mode 100644 index 0000000..84ea2bd --- /dev/null +++ b/Address Directory/Persistence/Configurations/CityConfiguration.cs @@ -0,0 +1,29 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Persistence.Configurations +{ + public class CityConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(c => c.Id); + + builder.Property(c => c.Name) + .IsRequired() + .HasMaxLength(100); + + builder.HasOne(c => c.Region) + .WithMany(r => r.Cities) + .HasForeignKey(c => c.RegionId) + .OnDelete(DeleteBehavior.Cascade); ; + + builder.HasMany(c => c.Streets) + .WithOne(s => s.City) + .HasForeignKey(s => s.CityId) + .OnDelete(DeleteBehavior.Cascade); ; + + } + } +} diff --git a/Address Directory/Persistence/Configurations/RegionConfiguration.cs b/Address Directory/Persistence/Configurations/RegionConfiguration.cs new file mode 100644 index 0000000..3e2ea2c --- /dev/null +++ b/Address Directory/Persistence/Configurations/RegionConfiguration.cs @@ -0,0 +1,26 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; + +namespace Persistence.Configurations +{ + public class RegionConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(r => r.Id); + + builder.Property(r => r.Name) + .IsRequired() + .HasMaxLength(100); + + builder.Property(r => r.Code) + .IsRequired(); + + builder.HasMany(r => r.Cities) + .WithOne(c => c.Region) + .HasForeignKey(c => c.RegionId) + .OnDelete(DeleteBehavior.Cascade); ; + } + } +} diff --git a/Address Directory/Persistence/Configurations/StreetConfiguration.cs b/Address Directory/Persistence/Configurations/StreetConfiguration.cs new file mode 100644 index 0000000..89e1ee3 --- /dev/null +++ b/Address Directory/Persistence/Configurations/StreetConfiguration.cs @@ -0,0 +1,34 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Metadata.Builders; +using Microsoft.Extensions.Logging; + +namespace Persistence.Configurations +{ + public class StreetConfiguration : IEntityTypeConfiguration + { + public void Configure(EntityTypeBuilder builder) + { + builder.HasKey(s => s.Id); + + builder.Property(s => s.Name) + .IsRequired() + .HasMaxLength(100); + + builder.Property(s => s.Index) + .IsRequired(); + + builder.Property(s => s.OkatoCode) + .IsRequired(); + + builder.Property(s => s.TaxCode) + .IsRequired(); + + builder.HasOne(s => s.City) + .WithMany(c => c.Streets) + .HasForeignKey(s => s.CityId) + .OnDelete(DeleteBehavior.Cascade); ; + } + } +} + diff --git a/Address Directory/Persistence/Persistence.csproj b/Address Directory/Persistence/Persistence.csproj new file mode 100644 index 0000000..1fdc6e1 --- /dev/null +++ b/Address Directory/Persistence/Persistence.csproj @@ -0,0 +1,22 @@ + + + + net8.0 + enable + enable + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/Address Directory/Persistence/Repositories/CityRepository.cs b/Address Directory/Persistence/Repositories/CityRepository.cs new file mode 100644 index 0000000..e590a18 --- /dev/null +++ b/Address Directory/Persistence/Repositories/CityRepository.cs @@ -0,0 +1,48 @@ +using Domain.Entities; +using Domain.Repository; +using Microsoft.EntityFrameworkCore; + +namespace Persistence.Repositories +{ + public class CityRepository : ICityRepository + { + public readonly RepositoryDbContext _dbContext; + public CityRepository(RepositoryDbContext dbContext) + { + _dbContext = dbContext; + } + public async Task AddAsync(City city) + { + await _dbContext.Cities.AddAsync(city); + await _dbContext.SaveChangesAsync(); + } + + public async Task DeleteAsync(City city) + { + _dbContext.Cities.Remove(city); + await _dbContext.SaveChangesAsync(); + } + + public async Task> GetAllAsync() + { + return await _dbContext.Cities + .Include(c => c.Region) + .Include(c => c.Streets) + .ToListAsync(); + } + + public async Task GetByIdAsync(Guid id) + { + return await _dbContext.Cities + .Include(c => c.Region) + .Include(c => c.Streets) + .FirstOrDefaultAsync(c => c.Id == id); + } + + public async Task UpdateAsync(City city) + { + _dbContext.Cities.Update(city); + await _dbContext.SaveChangesAsync(); + } + } +} diff --git a/Address Directory/Persistence/Repositories/RegionRepository.cs b/Address Directory/Persistence/Repositories/RegionRepository.cs new file mode 100644 index 0000000..4daa84f --- /dev/null +++ b/Address Directory/Persistence/Repositories/RegionRepository.cs @@ -0,0 +1,47 @@ +using Domain.Entities; +using Domain.Repository; +using Microsoft.EntityFrameworkCore; + +namespace Persistence.Repositories +{ + public class RegionRepository : IRegionRepository + { + public readonly RepositoryDbContext _dbContext; + public RegionRepository(RepositoryDbContext dbContext) + { + _dbContext = dbContext; + } + + public async Task AddAsync(Region region) + { + await _dbContext.Regions.AddAsync(region); + await _dbContext.SaveChangesAsync(); + } + + public async Task DeleteAsync(Region region) + { + _dbContext.Regions.Remove(region); + await _dbContext.SaveChangesAsync(); + } + + public async Task> GetAllAsync() + { + return await _dbContext.Regions + .Include(r => r.Cities) + .ToListAsync(); + } + + public async Task GetByIdAsync(Guid id) + { + return await _dbContext.Regions + .Include(r => r.Cities) + .FirstOrDefaultAsync(r => r.Id == id); + } + + public async Task UpdateAsync(Region region) + { + _dbContext.Regions.Update(region); + await _dbContext.SaveChangesAsync(); + } + } +} diff --git a/Address Directory/Persistence/Repositories/StreetRepository.cs b/Address Directory/Persistence/Repositories/StreetRepository.cs new file mode 100644 index 0000000..27e38e2 --- /dev/null +++ b/Address Directory/Persistence/Repositories/StreetRepository.cs @@ -0,0 +1,46 @@ +using Domain.Entities; +using Domain.Repository; +using Microsoft.EntityFrameworkCore; + +namespace Persistence.Repositories +{ + public class StreetRepository : IStreetRepository + { + public readonly RepositoryDbContext _dbContext; + public StreetRepository(RepositoryDbContext dbContext) + { + _dbContext = dbContext; + } + public async Task AddAsync(Street street) + { + await _dbContext.Streets.AddAsync(street); + await _dbContext.SaveChangesAsync(); + } + + public async Task DeleteAsync(Street street) + { + _dbContext.Streets.Remove(street); + await _dbContext.SaveChangesAsync(); + } + + public async Task> GetAllAsync() + { + return await _dbContext.Streets + .Include(s => s.City) + .ToListAsync(); + } + + public async Task GetByIdAsync(Guid id) + { + return await _dbContext.Streets + .Include(s => s.City) + .FirstOrDefaultAsync(s => s.Id == id); + } + + public async Task UpdateAsync(Street street) + { + _dbContext.Streets.Update(street); + await _dbContext.SaveChangesAsync(); + } + } +} diff --git a/Address Directory/Persistence/RepositoryDbContext.cs b/Address Directory/Persistence/RepositoryDbContext.cs new file mode 100644 index 0000000..7b9f22c --- /dev/null +++ b/Address Directory/Persistence/RepositoryDbContext.cs @@ -0,0 +1,32 @@ +using Domain.Entities; +using Microsoft.EntityFrameworkCore; + +namespace Persistence +{ + public class RepositoryDbContext : DbContext + { + public RepositoryDbContext(DbContextOptions options) : base(options) { } + protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) + { + if (optionsBuilder.IsConfigured == false) + { + optionsBuilder.UseNpgsql(@" + Host=localhost; + Port=5432; + Database=AdressDirectory; + Username=postgres; + Password=postgres"); + } + + base.OnConfiguring(optionsBuilder); + } + + public DbSet Regions { get; set; } + public DbSet Cities { get; set; } + public DbSet Streets { get; set; } + protected override void OnModelCreating(ModelBuilder modelBuilder) + { + modelBuilder.ApplyConfigurationsFromAssembly(typeof(RepositoryDbContext).Assembly); + } + } +} diff --git a/Address Directory/Services.Abstractions/ICityService.cs b/Address Directory/Services.Abstractions/ICityService.cs new file mode 100644 index 0000000..5957713 --- /dev/null +++ b/Address Directory/Services.Abstractions/ICityService.cs @@ -0,0 +1,13 @@ +using Contracts; + +namespace Services.Abstractions +{ + public interface ICityService + { + Task GetByIdAsync(Guid id); + Task> GetAllAsync(); + Task CreateAsync(CityDtoForCreate cityDto); + Task UpdateAsync(Guid cityId, CityDtoForUpdate city); + Task DeleteAsync(Guid cityId); + } +} diff --git a/Address Directory/Services.Abstractions/IRegionService.cs b/Address Directory/Services.Abstractions/IRegionService.cs new file mode 100644 index 0000000..70eee41 --- /dev/null +++ b/Address Directory/Services.Abstractions/IRegionService.cs @@ -0,0 +1,13 @@ +using Contracts; + +namespace Services.Abstractions +{ + public interface IRegionService + { + Task GetByIdAsync(Guid id); + Task> GetAllAsync(); + Task CreateAsync(RegionDtoForCreate regionDto); + Task UpdateAsync(Guid regionId, RegionDtoForUpdate regionDto); + Task DeleteAsync(Guid regionId); + } +} diff --git a/Address Directory/Services.Abstractions/IStreetService.cs b/Address Directory/Services.Abstractions/IStreetService.cs new file mode 100644 index 0000000..2246740 --- /dev/null +++ b/Address Directory/Services.Abstractions/IStreetService.cs @@ -0,0 +1,13 @@ +using Contracts; + +namespace Services.Abstractions +{ + public interface IStreetService + { + Task GetByIdAsync(Guid id); + Task> GetAllAsync(); + Task CreateAsync(StreetDtoForCreate streetDto); + Task UpdateAsync(Guid streetId, StreetDtoForUpdate street); + Task DeleteAsync(Guid streetId); + } +} diff --git a/Address Directory/Services.Abstractions/Services.Abstractions.csproj b/Address Directory/Services.Abstractions/Services.Abstractions.csproj new file mode 100644 index 0000000..1d1cdeb --- /dev/null +++ b/Address Directory/Services.Abstractions/Services.Abstractions.csproj @@ -0,0 +1,13 @@ + + + + net8.0 + enable + enable + + + + + + + diff --git a/Address Directory/Services/CityService.cs b/Address Directory/Services/CityService.cs new file mode 100644 index 0000000..e1e186e --- /dev/null +++ b/Address Directory/Services/CityService.cs @@ -0,0 +1,33 @@ +using Domain.Entities; +using Domain.Repository; + +namespace Services +{ + public class CityService : ICityRepository + { + public Task AddAsync(City city) + { + throw new NotImplementedException(); + } + + public Task DeleteAsync(City city) + { + throw new NotImplementedException(); + } + + public Task> GetAllAsync() + { + throw new NotImplementedException(); + } + + public Task GetByIdAsync(Guid id) + { + throw new NotImplementedException(); + } + + public Task UpdateAsync(City city) + { + throw new NotImplementedException(); + } + } +} diff --git a/Address Directory/Services/Profiles/MappingProfile.cs b/Address Directory/Services/Profiles/MappingProfile.cs new file mode 100644 index 0000000..a417ed9 --- /dev/null +++ b/Address Directory/Services/Profiles/MappingProfile.cs @@ -0,0 +1,24 @@ +using AutoMapper; +using Contracts; +using Domain.Entities; + +namespace Services.Profiles +{ + public class MappingProfile : Profile + { + public MappingProfile() + { + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + CreateMap().ReverseMap(); + } + } +} diff --git a/Address Directory/Services/RegionService.cs b/Address Directory/Services/RegionService.cs new file mode 100644 index 0000000..7fffac6 --- /dev/null +++ b/Address Directory/Services/RegionService.cs @@ -0,0 +1,73 @@ +using AutoMapper; +using Contracts; +using Domain.Entities; +using Domain.Repository; +using Services.Abstractions; + +namespace Services +{ + public class RegionService : IRegionService + { + private readonly IRegionRepository _regionRepository; + + private readonly IMapper _mapper; + public RegionService(IRegionRepository regionRepository, IMapper mapper) + { + _regionRepository = regionRepository; + _mapper = mapper; + } + + public async Task CreateAsync(RegionDtoForCreate regionDto) + { + var region = _mapper.Map(regionDto); + await _regionRepository.AddAsync(region); + + return _mapper.Map(region); + + //создавать сразу с городами ? + } + + public async Task DeleteAsync(Guid regionId) + { + var region = await _regionRepository.GetByIdAsync(regionId); + if (region == null) + { + throw new KeyNotFoundException("Region not found"); + } + + await _regionRepository.DeleteAsync(region); + } + + public async Task> GetAllAsync() + { + var regions = await _regionRepository.GetAllAsync(); + + return _mapper.Map>(regions); + } + + public async Task GetByIdAsync(Guid id) + { + var region = await _regionRepository.GetByIdAsync(id); + if (region == null) + { + throw new KeyNotFoundException("Region not found."); + } + return _mapper.Map(region); + } + + public async Task UpdateAsync(Guid regionId, RegionDtoForUpdate regionDto) + { + var region = await _regionRepository.GetByIdAsync(regionId); + + if (region == null) + { + throw new KeyNotFoundException("Region not found."); + } + region.Name = regionDto.Name; + region.Code = regionDto.Code; + + //дописать добавление городов + region.Cities.Add + } + } +} diff --git a/Address Directory/Services/Services.csproj b/Address Directory/Services/Services.csproj new file mode 100644 index 0000000..5bad235 --- /dev/null +++ b/Address Directory/Services/Services.csproj @@ -0,0 +1,17 @@ + + + + net8.0 + enable + enable + + + + + + + + + + +