0.1.0 #2

Merged
mfnefd merged 38 commits from dev into main 2024-12-09 04:27:05 +04:00
7 changed files with 171 additions and 2 deletions
Showing only changes of commit f7de7ab197 - Show all commits

View File

@ -7,6 +7,6 @@ public interface IUserRepo
{
public Task<UserDto?> Get(UserSearch search);
public Task<UserDto> Create(UserDto user);
public Task<UserDto> Update(UserDto user);
public Task<UserDto> Delete(UserSearch search);
public Task<UserDto?> Update(UserDto user);
public Task<UserDto?> Delete(UserSearch search);
}

View File

@ -0,0 +1,15 @@
using Infrastructure.Models;
using Microsoft.EntityFrameworkCore;
namespace Infrastructure;
public class DatabaseContext : DbContext
{
public DatabaseContext(DbContextOptions<DatabaseContext> options)
: base(options)
{
Database.EnsureCreated();
}
public DbSet<User> Users { get; set; } = null!;
}

View File

@ -0,0 +1,20 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
namespace Infrastructure;
public class DbContextFactory : IDbContextFactory<DatabaseContext>
{
private readonly IServiceProvider _serviceProvider;
public DbContextFactory(IServiceProvider serviceProvider)
{
_serviceProvider = serviceProvider;
}
public DatabaseContext CreateDbContext()
{
var scope = _serviceProvider.CreateScope();
return scope.ServiceProvider.GetRequiredService<DatabaseContext>();
}
}

View File

@ -1,5 +1,17 @@
<Project Sdk="Microsoft.NET.Sdk">
<ItemGroup>
<ProjectReference Include="..\Contracts\Contracts.csproj" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.0">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="9.0.1" />
</ItemGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>

View File

@ -0,0 +1,25 @@
using System.Reflection.Metadata.Ecma335;
using Contracts.DTO;
namespace Infrastructure.Models;
public class User
{
public Guid Id { get; set; }
public string Name { get; set; } = null!;
public string Password { get; set; } = null!;
public decimal Balance { get; set; }
public void Update(UserDto userDto)
{
Id = userDto.Id;
if (!string.IsNullOrWhiteSpace(userDto.Name))
{
Name = userDto.Name;
}
if (!string.IsNullOrWhiteSpace(userDto.Password))
{
Password = userDto.Password;
}
}
}

View File

@ -0,0 +1,72 @@
using Contracts.DTO;
using Contracts.Repositories;
using Contracts.SearchModels;
using Infrastructure.Support.Mappers;
using Microsoft.EntityFrameworkCore;
namespace Infrastructure.Repositories;
public class UserRepo : IUserRepo
{
public readonly DbContextFactory _factory;
public UserRepo(DbContextFactory factory)
{
_factory = factory;
}
public async Task<UserDto> Create(UserDto user)
{
using var context = _factory.CreateDbContext();
var createdUser = await context.Users.AddAsync(user.ToModel());
await context.SaveChangesAsync();
return createdUser.Entity.ToDto();
}
public async Task<UserDto?> Delete(UserSearch search)
{
using var context = _factory.CreateDbContext();
var user = await context.Users
.FirstOrDefaultAsync(x => x.Id == search.Id
|| x.Name == search.Name);
if (user == null)
{
return null;
}
context.Users.Remove(user);
await context.SaveChangesAsync();
return user.ToDto();
}
public async Task<UserDto?> Get(UserSearch search)
{
using var context = _factory.CreateDbContext();
var user = await context.Users
.FirstOrDefaultAsync(x => x.Id == search.Id
|| x.Name == search.Name);
return user?.ToDto();
}
public async Task<UserDto?> Update(UserDto user)
{
using var context = _factory.CreateDbContext();
var existingUser = await context.Users.FirstOrDefaultAsync(x => x.Id == user.Id);
if (existingUser == null)
{
return null;
}
existingUser.Update(user);
context.Users.Update(existingUser);
await context.SaveChangesAsync();
return existingUser.ToDto();
}
}

View File

@ -0,0 +1,25 @@
using Contracts.DTO;
using Infrastructure.Models;
namespace Infrastructure.Support.Mappers;
public static class UserMapper
{
public static UserDto ToDto(this User user)
=> new()
{
Id = user.Id,
Name = user.Name,
Balance = user.Balance,
Password = user.Password
};
public static User ToModel(this UserDto user)
=> new()
{
Id = user.Id,
Name = user.Name,
Balance = user.Balance,
Password = user.Password
};
}