feat : add version 0.25.27.48 , add CS system

release
Amir Hossein Khademi 2024-04-25 02:47:50 +03:30
parent 5f615ea13b
commit 0e2b99d85e
28 changed files with 300 additions and 72 deletions

View File

@ -1 +1 @@
0.24.27.47
0.25.27.48

View File

@ -17,7 +17,7 @@
"TaxesFee": 9
},
"SiteSettings": {
"BaseUrl": "http://localhost:32770",
"BaseUrl": "http://192.168.1.12:32770",
"WebSiteUrl": "https://vesmeh.com",
"AdminPanelBaseUrl": "https://admin.vesmeh.com",
"StorageBaseUrl": "https://storage.vesmeh.com",

View File

@ -22,10 +22,6 @@ public class DiscountController : ICarterModule
.RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageDiscounts, ApplicationPermission.ViewDiscounts))
.HasApiVersion(1.0);
group.MapGet("corporate", GetCorporateDiscountAsync)
.WithDisplayName("GetDiscount")
.HasApiVersion(1.0);
group.MapPost("", Post)
.HasApiVersion(1.0)
.RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageDiscounts));
@ -39,10 +35,6 @@ public class DiscountController : ICarterModule
.RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser().RequireClaim(CustomClaimType.Permission, ApplicationPermission.ManageDiscounts));
}
private async Task<IResult> GetCorporateDiscountAsync([FromQuery] Guid? corporateUserId, [FromServices] IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await mediator.Send(
new CreateSaleCooperationDiscount(CorporateUserId: corporateUserId ?? default), cancellationToken));
// GET:Get All Entity
private async Task<IResult> GetAllAsync([FromQuery] int page, IMediator mediator,
CancellationToken cancellationToken)

View File

@ -1,6 +1,4 @@
using MD.PersianDateTime.Standard;
using Netina.Common.Models.Api;
using Netina.Core.BaseServices.Abstracts;
namespace Netina.Api.Controller;

View File

@ -0,0 +1,47 @@
using Netina.Domain.MartenEntities.Settings;
namespace Netina.Api.Controller;
public class MarketerController : ICarterModule
{
public void AddRoutes(IEndpointRouteBuilder app)
{
var group = app.NewVersionedApi("Marketer")
.MapGroup("api/marketer")
.RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser());
group.MapGet("", GetMarketersAsync)
.WithDisplayName("GetAllMarketers")
.RequireAuthorization(builder=>builder.RequireClaim(CustomClaimType.Permission,ApplicationPermission.ManageUsers , ApplicationPermission.ViewUsers))
.HasApiVersion(1.0);
group.MapGet("profile", GetMarketerProfileAsync)
.WithDisplayName("GetAllMarketers")
.HasApiVersion(1.0);
group.MapPost("signup", SignUpMarketerAsync)
.WithDisplayName("SignUpMarketer")
.HasApiVersion(1.0);
group.MapGet("signup/contract", GetSignUpMarketerContractAsync)
.WithDisplayName("SignUpMarketerContract")
.HasApiVersion(1.0);
}
private async Task<IResult> GetMarketerProfileAsync(IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await mediator.Send(new GetMarketerProfileQuery(), cancellationToken));
private async Task<IResult> GetSignUpMarketerContractAsync([FromServices] ISettingService settingService,CancellationToken cancellationToken)
{
var setting = await settingService.GetSettingAsync(nameof(MarketerSetting), cancellationToken);
if (setting is MarketerSetting marketerSetting)
return TypedResults.Ok(marketerSetting.ContractTerms);
throw new AppException("MarketerSetting not found");
}
private async Task<IResult> SignUpMarketerAsync([FromBody] SignUpMarketerCommand request, [FromServices] IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await mediator.Send(request, cancellationToken));
private async Task<IResult> GetMarketersAsync([FromQuery] int page, [FromServices] IMediator mediator, CancellationToken cancellationToken)
=> TypedResults.Ok(await mediator.Send(new GetMarketersQuery(page), cancellationToken));
}

View File

@ -6,8 +6,8 @@
<ImplicitUsings>enable</ImplicitUsings>
<InvariantGlobalization>true</InvariantGlobalization>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<AssemblyVersion>0.24.27.47</AssemblyVersion>
<FileVersion>0.24.27.47</FileVersion>
<AssemblyVersion>0.25.27.48</AssemblyVersion>
<FileVersion>0.25.27.48</FileVersion>
</PropertyGroup>
<ItemGroup>

View File

@ -8,7 +8,7 @@ string env = builder.Environment.IsDevelopment() == true ? "Development" : "Prod
builder.Host.UseContentRoot(Directory.GetCurrentDirectory());
if (builder.Environment.IsDevelopment())
{
string projectName = "Hamyan";
string projectName = "Vesmeh";
builder.Configuration.AddJsonFile($"AppSettings/appsettings.json").AddJsonFile($"AppSettings/appsettings.{env}{projectName}.json");
}

View File

@ -145,7 +145,7 @@ public class ExceptionHandlerMiddleware
});
if (httpStatusCode == HttpStatusCode.InternalServerError)
context.Response.StatusCode = 501;
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
else
context.Response.StatusCode = (int)httpStatusCode;
context.Response.ContentType = "application/json";
@ -174,7 +174,7 @@ public class ExceptionHandlerMiddleware
});
if (httpStatusCode == HttpStatusCode.InternalServerError)
context.Response.StatusCode = 501;
context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
else
context.Response.StatusCode = (int)httpStatusCode;
context.Response.ContentType = "application/json";

View File

@ -36,6 +36,9 @@ namespace Netina.Common.Models.Api
[Display(Name = "در ارسال درخواست به سرورهای دیگر مشکلی رخ داده است")]
RefitError = 8
RefitError = 8,
[Display(Name = "بازاریاب پیدا نشد یا ثبت نام نکرده است")]
MarketerNotFound = 9,
}
}

View File

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!--<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
@ -12,9 +12,9 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.5.1" />
</ItemGroup>
</ItemGroup>-->
<!--<PropertyGroup>
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<LangVersion>10</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
@ -25,7 +25,7 @@
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.3.1" />
</ItemGroup>-->
</ItemGroup>
<ItemGroup>
<Using Include="MD.PersianDateTime.Standard" />

View File

@ -1,11 +1,4 @@
using Netina.Common.Models.Api;
using Netina.Common.Models.Exception;
using Netina.Core.CoreServices.Abstracts;
using Netina.Domain;
using Netina.Domain.MartenEntities.Settings;
using Netina.Repository.Repositories.Marten;
namespace Netina.Core.CoreServices;
namespace Netina.Core.CoreServices;
public class SettingService : ISettingService

View File

@ -1,22 +1,25 @@
using Microsoft.EntityFrameworkCore;
namespace Netina.Core.EntityServices.MarketerHandlers;
namespace Netina.Repository.Handlers.Discounts;
public class CreateSaleCooperationDiscountHandler : IRequestHandler<CreateSaleCooperationDiscount,string>
public class CreateMarketerDiscountCommandHandler : IRequestHandler<CreateMarketerDiscountCommand, string>
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly ICurrentUserService _currentUserService;
private readonly ISettingService _settingService;
public CreateSaleCooperationDiscountHandler(UserManager<ApplicationUser> userManager,IRepositoryWrapper repositoryWrapper,ICurrentUserService currentUserService)
public CreateMarketerDiscountCommandHandler(UserManager<ApplicationUser> userManager,
IRepositoryWrapper repositoryWrapper,
ICurrentUserService currentUserService,
ISettingService settingService)
{
_userManager = userManager;
_repositoryWrapper = repositoryWrapper;
_currentUserService = currentUserService;
_settingService = settingService;
}
public async Task<string> Handle(CreateSaleCooperationDiscount request, CancellationToken cancellationToken)
public async Task<string> Handle(CreateMarketerDiscountCommand request, CancellationToken cancellationToken)
{
var userId = request.CorporateUserId;
var userId = request.MarketerUserId;
if (userId == default)
{
if (_currentUserService.UserId == null)
@ -34,16 +37,20 @@ public class CreateSaleCooperationDiscountHandler : IRequestHandler<CreateSaleCo
if (marketer == null)
throw new AppException("Marketer not found", ApiResultStatusCode.NotFound);
var foundedDiscount = await _repositoryWrapper.SetRepository<Discount>()
.TableNoTracking
.FirstOrDefaultAsync(d => d.IsForSaleCooperation && d.MarketerId == marketer.Id, cancellationToken);
if (foundedDiscount == null)
{
var setting = await _settingService.GetSettingAsync(nameof(MarketerSetting), cancellationToken);
int discountPercent = 10;
if (setting is MarketerSetting marketerSetting)
discountPercent = marketerSetting.DiscountPercent;
var code = StringExtensions.GetId();
foundedDiscount = Discount.Create(code,$"کد مخصوص همکاری در فروش برای کاربر - {user.FirstName} {user.LastName}", 10, 0, true,
foundedDiscount = Discount.Create(code, $"کد مخصوص همکاری در فروش برای کاربر - {user.FirstName} {user.LastName}", discountPercent, 0, true,
DiscountAmountType.Percent, DiscountType.All, 0, true, DateTime.Today, DateTime.Today.AddYears(10), 0,
false, 0, false, true, 0, false, false,false);
false, 0, false, true, 0, false, false, false);
foundedDiscount.SetCorporate(marketer.Id);
_repositoryWrapper.SetRepository<Discount>().Add(foundedDiscount);

View File

@ -0,0 +1,72 @@
using System.Net;
namespace Netina.Core.EntityServices.MarketerHandlers;
public class GetMarketerProfileQueryHandler : IRequestHandler<GetMarketerProfileQuery, MarketerProfileResponseDto>
{
private readonly IRepositoryWrapper _repositoryWrapper;
private readonly ICurrentUserService _currentUserService;
private readonly ISettingService _settingService;
public GetMarketerProfileQueryHandler(IRepositoryWrapper repositoryWrapper, ICurrentUserService currentUserService,ISettingService settingService)
{
_repositoryWrapper = repositoryWrapper;
_currentUserService = currentUserService;
_settingService = settingService;
}
public async Task<MarketerProfileResponseDto> Handle(GetMarketerProfileQuery request, CancellationToken cancellationToken)
{
Guid marketerId;
Marketer? marketer;
if (request.MarketerId != null)
{
marketerId = request.MarketerId.Value;
marketer = await _repositoryWrapper.SetRepository<Marketer>()
.TableNoTracking
.FirstOrDefaultAsync(m => m.Id == marketerId, cancellationToken);
}
else
{
if (_currentUserService.UserId == null)
throw new BaseApiException("User id is null");
if (!Guid.TryParse(_currentUserService.UserId, out Guid userId))
throw new BaseApiException("User id is wrong");
marketer = await _repositoryWrapper.SetRepository<Marketer>()
.TableNoTracking
.FirstOrDefaultAsync(m => m.UserId == userId, cancellationToken);
}
if (marketer == null)
throw new BaseApiException(ApiResultStatusCode.MarketerNotFound,"Marketer not found" ,HttpStatusCode.NotFound);
var discount = await _repositoryWrapper.SetRepository<Discount>()
.TableNoTracking
.FirstOrDefaultAsync(d => d.MarketerId == marketer.Id, cancellationToken);
if (discount == null)
throw new BaseApiException("Marketer has no discount");
var setting = (await _settingService.GetSettingAsync(nameof(MarketerSetting), cancellationToken)) as MarketerSetting;
if (setting == null)
throw new BaseApiException("MarketerSetting is null");
var response = new MarketerProfileResponseDto();
var orderCount = await _repositoryWrapper.SetRepository<Order>()
.TableNoTracking
.CountAsync(o => o.DiscountCode == discount.Code, cancellationToken);
response.OrderCount = orderCount;
var newTotalProductPrice = await _repositoryWrapper.SetRepository<Order>()
.TableNoTracking
.Where(o => o.DiscountCode == discount.Code && o.OrderAt.Date > marketer.LastSettlement.Date)
.SumAsync(o => o.TotalProductsPrice, cancellationToken);
response.Balance = (long)(newTotalProductPrice / 100) * setting.ProfitPercent;
response.DiscountCode = discount.Code;
response.LastSettlementAt = marketer.LastSettlement;
return response;
}
}

View File

@ -0,0 +1,53 @@
namespace Netina.Core.EntityServices.MarketerHandlers;
public class SignUpMarketerCommandHandler : IRequestHandler<SignUpMarketerCommand,MarketerProfileResponseDto>
{
private readonly UserManager<ApplicationUser> _userManager;
private readonly IMediator _mediator;
private readonly ICurrentUserService _currentUserService;
private readonly IRepositoryWrapper _repositoryWrapper;
public SignUpMarketerCommandHandler(UserManager<ApplicationUser> userManager,IMediator mediator,ICurrentUserService currentUserService,IRepositoryWrapper repositoryWrapper)
{
_userManager = userManager;
_mediator = mediator;
_currentUserService = currentUserService;
_repositoryWrapper = repositoryWrapper;
}
public async Task<MarketerProfileResponseDto> Handle(SignUpMarketerCommand request, CancellationToken cancellationToken)
{
if (_currentUserService.UserId == null)
throw new AppException("User id is null");
if (!Guid.TryParse(_currentUserService.UserId, out Guid userId))
throw new AppException("User id is wrong");
var user = await _userManager.FindByIdAsync(_currentUserService.UserId);
if (user == null)
throw new AppException("User not found");
var marketer = await _repositoryWrapper.SetRepository<Marketer>()
.TableNoTracking
.FirstOrDefaultAsync(m => m.UserId == userId, cancellationToken);
if (marketer != null)
return await _mediator.Send(new GetMarketerProfileQuery(MarketerId: marketer.Id), cancellationToken);
marketer = new Marketer
{
UserId = user.Id,
FatherName = request.FatherName,
Shaba = request.Shaba,
};
_repositoryWrapper.SetRepository<Marketer>()
.Add(marketer);
await _repositoryWrapper.SaveChangesAsync(cancellationToken);
user.BirthDate = DateTimeExtensions.UnixTimeStampToDateTime(request.BirthDate);
user.NationalId = request.NationalId;
await _userManager.UpdateAsync(user);
await _mediator.Send(new CreateMarketerDiscountCommand(userId), cancellationToken);
return await _mediator.Send(new GetMarketerProfileQuery(marketer.Id), cancellationToken);
}
}

View File

@ -0,0 +1,24 @@
using FluentValidation;
namespace Netina.Core.EntityServices.MarketerHandlers.Validators;
public class SignUpMarketerCommandValidator : AbstractValidator<SignUpMarketerCommand>
{
public SignUpMarketerCommandValidator()
{
RuleFor(command => command.FatherName)
.NotNull()
.NotEmpty()
.WithMessage("نام پدر را وارد کنید");
RuleFor(command => command.BirthDate)
.NotNull()
.NotEqual(0)
.WithMessage("تاریخ تولد را وارد کنید");
RuleFor(command => command.Shaba)
.NotNull()
.NotEmpty()
.WithMessage("شماره شبا را وارد کنید");
}
}

View File

@ -1,18 +1,4 @@
using Netina.Common.Extensions;
using Netina.Common.Models.Api;
using Netina.Common.Models.Exception;
using Netina.Core.Abstracts;
using Netina.Core.EntityServices.Abstracts;
using Netina.Domain.Dtos.RequestDtos;
using Netina.Domain.Dtos.ResponseDtos;
using Netina.Domain.Dtos.SmallDtos;
using Netina.Domain.Entities.Users;
using Netina.Domain.Enums;
using Netina.Domain.Models.Claims;
using Netina.Repository.Abstracts;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Core.EntityServices;
namespace Netina.Core.EntityServices;
public class UserService : IUserService
@ -94,7 +80,7 @@ public class UserService : IUserService
}
var returnUser = users.Where(r => r.FullName.Trim() != "همه کاره سیستم").ToList();
return returnUser;
return returnUser;
}
public async Task<ApplicationUserSDto> GetUserAsync(Guid userId, CancellationToken cancellationToken = default)
@ -103,6 +89,12 @@ public class UserService : IUserService
if (user == null)
throw new AppException("User not found", ApiResultStatusCode.NotFound);
var dto = user.AdaptToSDto();
dto.IsMarketer = await _repositoryWrapper.SetRepository<Marketer>()
.TableNoTracking
.AnyAsync(m => m.UserId == userId, cancellationToken);
dto.IsManager = await _repositoryWrapper.SetRepository<Manager>()
.TableNoTracking
.AnyAsync(m => m.UserId == userId, cancellationToken);
var roles = await _userManager.GetRolesAsync(user);
foreach (var roleName in roles)
{

View File

@ -48,7 +48,6 @@ public sealed record UpdateDiscountCommand(
Guid ProductId,
Guid CategoryId) : IRequest<bool>;
public sealed record CreateSaleCooperationDiscount(Guid CorporateUserId) : IRequest<string>;
public sealed record DeleteDiscountCommand(Guid Id) : IRequest<bool>;

View File

@ -0,0 +1,5 @@
namespace Netina.Domain.CommandQueries.Commands;
public sealed record SignUpMarketerCommand(string FatherName , long BirthDate, string Shaba , string NationalId) : IRequest<MarketerProfileResponseDto>;
public sealed record CreateMarketerDiscountCommand(Guid MarketerUserId) : IRequest<string>;

View File

@ -0,0 +1,5 @@
namespace Netina.Domain.CommandQueries.Queries;
public sealed record GetMarketerProfileQuery(Guid? MarketerId = null) : IRequest<MarketerProfileResponseDto>;
public sealed record GetMarketersQuery(int Page , string? PhoneNumber = null , string? FullName = null) : IRequest<List<MarketerSDto>>;

View File

@ -0,0 +1,9 @@
namespace Netina.Domain.Dtos.ResponseDtos;
public class MarketerProfileResponseDto
{
public string DiscountCode { get; set; } = string.Empty;
public DateTime LastSettlementAt { get; set; }
public int OrderCount { get; set; }
public long Balance { get; set; }
}

View File

@ -14,6 +14,9 @@ public class ApplicationUserSDto : BaseDto<ApplicationUserSDto, ApplicationUser>
public string FullName => FirstName + " " + LastName;
public string RoleName { get; set; } = string.Empty;
public bool IsMarketer { get; set; }
public bool IsManager { get; set; }
public List<Guid> RoleIds { get; set; } = new();
public long BirthDateTimeStamp => BirthDate.Year > 1970 ? DateTimeExtensions.DateTimeToUnixTimeStamp(BirthDate) : 0;
}

View File

@ -54,6 +54,8 @@ namespace Netina.Domain.Mappers
SignUpStatus = p4.SignUpStatus,
NationalId = p4.NationalId,
Email = p4.Email,
IsMarketer = p4.Marketer != null,
IsManager = p4.Manager != null,
Id = p4.Id
};
}
@ -73,6 +75,8 @@ namespace Netina.Domain.Mappers
result.SignUpStatus = p5.SignUpStatus;
result.NationalId = p5.NationalId;
result.Email = p5.Email;
result.IsMarketer = p5.Marketer != null;
result.IsManager = p5.Manager != null;
result.Id = p5.Id;
return result;
@ -87,6 +91,8 @@ namespace Netina.Domain.Mappers
SignUpStatus = p7.SignUpStatus,
NationalId = p7.NationalId,
Email = p7.Email,
IsMarketer = p7.Marketer != null,
IsManager = p7.Manager != null,
Id = p7.Id
};
}

View File

@ -7,7 +7,7 @@ public class MapsterRegister : IRegister
public void Register(TypeAdapterConfig config)
{
config.NewConfig<Blog, BlogSDto>()
.Map("MainImage", o => o.Files.Count > 0 && o.Files.Any(f=>f.IsPrimary) ? o.Files.FirstOrDefault(f=>f.IsPrimary)!.FileName : string.Empty)
.Map("MainImage", o => o.Files.Count > 0 && o.Files.Any(f => f.IsPrimary) ? o.Files.FirstOrDefault(f => f.IsPrimary)!.FileName : string.Empty)
.TwoWays();
config.NewConfig<Blog, BlogLDto>()
@ -36,7 +36,7 @@ public class MapsterRegister : IRegister
.TwoWays();
config.NewConfig<Product, ProductSDto>()
.Map("MainImage",o=>o.Files.FirstOrDefault(f=>f.IsPrimary) != null ? o.Files.FirstOrDefault(f => f.IsPrimary).FileLocation : o.Files.Count>0 ? o.Files.FirstOrDefault().FileLocation : string.Empty)
.Map("MainImage", o => o.Files.FirstOrDefault(f => f.IsPrimary) != null ? o.Files.FirstOrDefault(f => f.IsPrimary).FileLocation : o.Files.Count > 0 ? o.Files.FirstOrDefault().FileLocation : string.Empty)
.Map("CategoryName", o => o.Category == null ? null : o.Category.Name)
.Map("BrandName", o => o.Brand == null ? null : o.Brand.PersianName)
.IgnoreNullValues(false)
@ -100,6 +100,10 @@ public class MapsterRegister : IRegister
private void ConfigUserMappers(TypeAdapterConfig config)
{
config.NewConfig<ApplicationUser, ApplicationUserSDto>()
.Map("IsMarketer", o => o.Marketer != null)
.Map("IsManager", o => o.Manager != null)
.TwoWays();
config.NewConfig<Manager, ManagerSDto>()
.Map("PhoneNumber", o => o.User != null ? o.User.PhoneNumber : string.Empty)

View File

@ -4,4 +4,5 @@ public class MarketerSetting
{
public int ProfitPercent { get; set; }
public string ContractTerms { get; set; } = string.Empty;
public int DiscountPercent { get; set; }
}

View File

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<!--<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
@ -14,9 +14,9 @@
<PackageReference Include="MediatR" Version="12.2.0" />
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="8.0.4" />
<PackageReference Include="PropertyChanged.Fody" Version="4.1.0" />
</ItemGroup>
</ItemGroup>-->
<!--<PropertyGroup>
<PropertyGroup>
<TargetFramework>net5.0</TargetFramework>
<LangVersion>10</LangVersion>
<ImplicitUsings>enable</ImplicitUsings>
@ -32,7 +32,7 @@
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="5.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="5.0.0" />
<PackageReference Include="PropertyChanged.Fody" Version="4.1.0" />
</ItemGroup>-->
</ItemGroup>
<ItemGroup>

View File

@ -1,11 +1,4 @@
using Microsoft.EntityFrameworkCore;
using Netina.Common.Models.Api;
using Netina.Common.Models.Exception;
using Netina.Domain.CommandQueries.Queries;
using Netina.Domain.Dtos.SmallDtos;
using Netina.Domain.Entities.Users;
using Netina.Repository.Abstracts;
using Netina.Repository.Repositories.Base.Contracts;
namespace Netina.Repository.Handlers.Addresses;

View File

@ -1,6 +1,4 @@
using FluentValidation;
using Netina.Domain.CommandQueries.Commands;
using Netina.Domain.Enums;
namespace Netina.Repository.Handlers.Discounts.Validators;

View File

@ -0,0 +1,24 @@
using Microsoft.EntityFrameworkCore;
namespace Netina.Repository.Handlers.Marketers;
public class GetMarketersQueryHandler : IRequestHandler<GetMarketersQuery,List<MarketerSDto>>
{
private readonly IRepositoryWrapper _repositoryWrapper;
public GetMarketersQueryHandler(IRepositoryWrapper repositoryWrapper)
{
_repositoryWrapper = repositoryWrapper;
}
public async Task<List<MarketerSDto>> Handle(GetMarketersQuery request, CancellationToken cancellationToken)
{
var query = _repositoryWrapper.SetRepository<Marketer>()
.TableNoTracking;
return await query.OrderByDescending(q => q.CreatedAt)
.Skip(request.Page * 20)
.Take(20)
.Select(MarketerMapper.ProjectToSDto)
.ToListAsync(cancellationToken);
}
}