add version 0.17.21.34 , fix payment issues

release
Amir Hossein Khademi 2024-04-01 13:05:11 +03:30
parent 54312efb3b
commit 34f2efa128
32 changed files with 409 additions and 215 deletions

View File

@ -1 +1 @@
0.17.20.33
0.17.21.34

View File

@ -17,8 +17,8 @@
"TaxesFee": 9
},
"SiteSettings": {
"BaseUrl": "http://192.168.88.251:32770",
"AdminPanelBaseUrl": "https://admin.vesmook.com",
"BaseUrl": "http://localhost:32770",
"AdminPanelBaseUrl": "https://admin.vesmeh.com",
"KaveNegarApiKey": "3735494B4143727A794346457461576A2B4B6668414973424E333561505A694B",
"UserSetting": {
"Username": "netinashop",

View File

@ -6,38 +6,9 @@ public class SeedController : ICarterModule
{
public void AddRoutes(IEndpointRouteBuilder app)
{
var group = app.NewVersionedApi("Seed")
.MapGroup("api/seed");
//var group = app.NewVersionedApi("Seed")
// .MapGroup("api/seed");
group.MapGet("test1", () =>
{
return TypedResults.BadRequest(new ApiResult(false, ApiResultStatusCode.ServerError,
"Server Error 1 ( BAD REQUEST )"));
})
.WithDisplayName("SeedCategoriesAsync")
.HasApiVersion(1.0);
group.MapGet("test2", () =>
{
throw new Exception("Server Error 2 ( EXCEPTION THROWN )");
})
.WithDisplayName("SeedCategoriesAsync")
.HasApiVersion(1.0);
group.MapGet("test3", () =>
{
return TypedResults.Problem("Server Error 2 ( EXCEPTION THROWN )");
})
.WithDisplayName("SeedCategoriesAsync")
.HasApiVersion(1.0);
group.MapGet("test3", () =>
{
return TypedResults.StatusCode(500);
})
.WithDisplayName("SeedCategoriesAsync")
.HasApiVersion(1.0);
//group.MapPost("categories", SeedCategoriesAsync)
// .WithDisplayName("SeedCategoriesAsync")

View File

@ -1,6 +1,4 @@
using System.Reflection;
using System.Text.Json;
using NetinaShop.Repository.Repositories.Entity.Abstracts;
using System.Text.Json;
namespace NetinaShop.Api.Controller;
@ -9,43 +7,25 @@ public class SettingController : ICarterModule
public void AddRoutes(IEndpointRouteBuilder app)
{
var group = app.NewVersionedApi("Setting")
.MapGroup("api/setting")
.RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser());
.MapGroup("api/setting");
group.MapGet("{settingName}", GetSettingAsync)
.WithDisplayName("GetSetting")
.RequireAuthorization(builder=>builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser())
.HasApiVersion(1.0);
group.MapPost("{settingName}", PostSettingAsync)
.WithDisplayName("PostSettingAsync")
.RequireAuthorization(builder => builder.AddAuthenticationSchemes("Bearer").RequireAuthenticatedUser())
.HasApiVersion(1.0);
}
public async Task<IResult> GetSettingAsync(string settingName, [FromServices] IMartenRepository martenRepository, CancellationToken cancellationToken)
public async Task<IResult> GetSettingAsync(string settingName, [FromServices] ISettingService settingService, CancellationToken cancellationToken)
=> TypedResults.Ok(await settingService.GetSettingAsync(settingName, cancellationToken));
public async Task<IResult> PostSettingAsync(string settingName, [FromBody]JsonDocument settingObj, [FromServices]ISettingService settingService, CancellationToken cancellationToken)
{
var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"NetinaShop.Domain.Entities.Settings.{settingName}");
if (type == null)
throw new AppException("Setting not found", ApiResultStatusCode.NotFound);
var setting = await ((dynamic)martenRepository.GetType()?.GetMethod("GetEntityAsync")
?.MakeGenericMethod(type)
.Invoke(martenRepository,new object[]{ cancellationToken })!);
if (setting == null)
setting = Activator.CreateInstance(type);
return TypedResults.Ok(setting);
}
public async Task<IResult> PostSettingAsync(string settingName, [FromBody]JsonDocument settingObj, [FromServices] IMartenRepository martenRepository, CancellationToken cancellationToken)
{
var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"NetinaShop.Domain.Entities.Settings.{settingName}");
if (type == null)
throw new AppException("Setting not found", ApiResultStatusCode.NotFound);
var setting = settingObj.Deserialize(type);
if (setting == null)
throw new AppException("Setting not found", ApiResultStatusCode.NotFound);
await ((dynamic)martenRepository.GetType().GetMethod("AddOrUpdateEntityAsync")
?.MakeGenericMethod(type).Invoke(martenRepository, new[] { setting , cancellationToken })!);
await settingService.CreateOrUpdateSettingAsync(settingName, settingObj,cancellationToken);
return TypedResults.Ok();
}
}

View File

@ -6,43 +6,43 @@
<ImplicitUsings>enable</ImplicitUsings>
<InvariantGlobalization>true</InvariantGlobalization>
<DockerDefaultTargetOS>Linux</DockerDefaultTargetOS>
<AssemblyVersion>0.17.20.33</AssemblyVersion>
<FileVersion>0.17.20.33</FileVersion>
<AssemblyVersion>0.17.21.34</AssemblyVersion>
<FileVersion>0.17.21.34</FileVersion>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.1" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="8.0.3" />
<PackageReference Include="Asp.Versioning.Http" Version="8.0.0" />
<PackageReference Include="Asp.Versioning.Http" Version="8.1.0" />
<PackageReference Include="Ben.BlockingDetector" Version="0.0.4" />
<PackageReference Include="Carter" Version="8.0.0" />
<PackageReference Include="FluentValidation" Version="11.9.0" />
<PackageReference Include="FluentValidation.DependencyInjectionExtensions" Version="11.9.0" />
<PackageReference Include="MediatR.Extensions.Autofac.DependencyInjection" Version="12.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="8.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.1">
<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="8.0.3" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" Version="8.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.1">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Autofac" Version="8.0.0" />
<PackageReference Include="Autofac.Extensions.DependencyInjection" Version="9.0.0" />
<PackageReference Include="Elmah.Io.AspNetCore.Serilog" Version="5.0.17" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.1" />
<PackageReference Include="Microsoft.AspNetCore.Authentication.JwtBearer" Version="8.0.3" />
<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="8.0.0" />
<PackageReference Include="Microsoft.VisualStudio.Azure.Containers.Tools.Targets" Version="1.19.6" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.2" />
<PackageReference Include="Microsoft.Extensions.Configuration.Abstractions" Version="8.0.0" />
<PackageReference Include="Sentry.Serilog" Version="4.0.1" />
<PackageReference Include="Sentry.Serilog" Version="4.2.1" />
<PackageReference Include="Serilog" Version="3.1.1" />
<PackageReference Include="Serilog.AspNetCore" Version="8.0.1" />
<PackageReference Include="Serilog.Sinks.Console" Version="5.0.1" />
<PackageReference Include="Serilog.Sinks.PostgreSQL" Version="2.3.0" />
<PackageReference Include="Serilog.Sinks.Seq" Version="6.0.0" />
<PackageReference Include="Serilog.Sinks.Seq" Version="7.0.0" />
<PackageReference Include="Serilog.Sinks.ElmahIo" Version="5.0.38" />
<PackageReference Include="Serilog.Sinks.File" Version="5.0.0" />
<PackageReference Include="StackExchange.Redis.Extensions.AspNetCore" Version="10.2.0" />
@ -50,9 +50,9 @@
<PackageReference Include="StackExchange.Redis.Extensions.Newtonsoft" Version="10.2.0" />
<PackageReference Include="Swashbuckle.AspNetCore" Version="6.5.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="6.5.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="8.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="8.0.1" />
<PackageReference Include="System.Data.SqlClient" Version="4.8.6" />
<PackageReference Include="System.Drawing.Common" Version="8.0.1" />
<PackageReference Include="System.Drawing.Common" Version="8.0.3" />
</ItemGroup>
<ItemGroup>

View File

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

View File

@ -0,0 +1,9 @@
namespace NetinaShop.Common.Models.Entity;
public interface IMartenEntity
{
string CreatedBy { get; }
string ModifiedBy { get; }
DateTime CreatedAt { get; }
DateTime ModifiedAt { get; }
}

View File

@ -0,0 +1,41 @@
namespace NetinaShop.Common.Models.Entity;
public class MartenEntity : IMartenEntity
{
public Guid Id { get; set; }
[Display(Name = "تاریخ ساخت")]
public DateTime CreatedAt { get; set; }
[Display(Name = "ساخته شده توسط")]
public string CreatedBy { get; set; } = string.Empty;
[Display(Name = "اخرین تغییر در")]
public DateTime ModifiedAt { get; set; }
[Display(Name = "اخرین تغییر توسط")]
public string ModifiedBy { get; set; } = string.Empty;
public bool Equals(ApiEntity other)
{
if (ReferenceEquals(null, other)) return false;
if (ReferenceEquals(this, other)) return true;
return Id.Equals(other.Id);
}
public override bool Equals(object obj)
{
if (ReferenceEquals(null, obj)) return false;
if (ReferenceEquals(this, obj)) return true;
if (obj.GetType() != this.GetType()) return false;
return Equals((ApiEntity)obj);
}
public override int GetHashCode()
{
return Id.GetHashCode();
}
}

View File

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<!--<PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
@ -11,10 +11,10 @@
<PackageReference Include="MD.PersianDateTime.Standard" Version="2.5.0" />
<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>-->
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.4.1" />
</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,10 +1,8 @@
using NetinaShop.Domain.Entities.Pages;
namespace NetinaShop.Core.CoreServices.Abstracts;
namespace NetinaShop.Core.CoreServices.Abstracts;
public interface IPageService : IScopedDependency
{
Task<BasePageEntitySDto> GetPageAsync(Guid? id = null, string? pageName = null, string? pageSlug = null,string? type = null, CancellationToken cancellationToken=default);
Task<List<BasePageEntitySDto>> GetPagesAsync(CancellationToken cancellationToken = default);
Task<BasePageSDto> GetPageAsync(Guid? id = null, string? pageName = null, string? pageSlug = null,string? type = null, CancellationToken cancellationToken=default);
Task<List<BasePageSDto>> GetPagesAsync(CancellationToken cancellationToken = default);
Task<bool> CreatePageAsync(PageActionRequestDto entity, CancellationToken cancellationToken = default);
}

View File

@ -0,0 +1,7 @@
namespace NetinaShop.Core.CoreServices.Abstracts;
public interface ISettingService : IScopedDependency
{
public Task<object> GetSettingAsync(string settingName, CancellationToken cancellationToken = default);
public Task CreateOrUpdateSettingAsync(string settingName, JsonDocument settingObj, CancellationToken cancellationToken = default);
}

View File

@ -1,36 +1,35 @@
using System.Reflection;
using System.Text.Json;
using Microsoft.AspNetCore.Mvc.RazorPages;
using NetinaShop.Domain;
using NetinaShop.Domain.Entities.Pages;
using NetinaShop.Repository.Repositories.Entity.Abstracts;
using NetinaShop.Domain.MartenEntities.Pages;
using NetinaShop.Repository.Repositories.Marten;
namespace NetinaShop.Core.CoreServices;
public class PageService : IPageService
{
private readonly IMartenRepository _martenRepository;
private readonly IMartenRepositoryWrapper _martenRepositoryWrapper;
public PageService(IMartenRepository martenRepository)
public PageService(IMartenRepositoryWrapper martenRepositoryWrapperWrapper)
{
_martenRepository = martenRepository;
_martenRepositoryWrapper = martenRepositoryWrapperWrapper;
}
public async Task<BasePageEntitySDto> GetPageAsync(Guid? id = null, string? pageName = null, string? pageSlug = null, string? type = null, CancellationToken cancellationToken = default)
public async Task<BasePageSDto> GetPageAsync(Guid? id = null, string? pageName = null, string? pageSlug = null, string? type = null, CancellationToken cancellationToken = default)
{
BasePageEntity? page = null;
BasePage? page = null;
if (id != null)
page = await _martenRepository.GetEntityAsync<BasePageEntity>(id.Value, cancellationToken);
page = await _martenRepositoryWrapper.SetRepository<BasePage>().GetEntityAsync(id.Value, cancellationToken);
else if (pageSlug != null)
page = await _martenRepository.GetEntityAsync<BasePageEntity>(entity => entity.Slug == pageSlug, cancellationToken);
page = await _martenRepositoryWrapper.SetRepository<BasePage>().GetEntityAsync(entity => entity.Slug == pageSlug, cancellationToken);
else if (pageName != null)
page = await _martenRepository.GetEntityAsync<BasePageEntity>(entity => entity.Name == pageName, cancellationToken);
page = await _martenRepositoryWrapper.SetRepository<BasePage>().GetEntityAsync(entity => entity.Name == pageName, cancellationToken);
else if (type != null)
page = await _martenRepository.GetEntityAsync<BasePageEntity>(entity => entity.Type == type, cancellationToken);
page = await _martenRepositoryWrapper.SetRepository<BasePage>().GetEntityAsync(entity => entity.Type == type, cancellationToken);
if (page == null)
throw new AppException("Page not found", ApiResultStatusCode.NotFound);
var entityType = Assembly.GetAssembly(typeof(DomainConfig))?.GetType(page.Type);
var dto = new BasePageEntitySDto
var dto = new BasePageSDto
{
Content = page.Content,
Description = page.Description,
@ -45,15 +44,15 @@ public class PageService : IPageService
return dto;
}
public async Task<List<BasePageEntitySDto>> GetPagesAsync(CancellationToken cancellationToken = default)
public async Task<List<BasePageSDto>> GetPagesAsync(CancellationToken cancellationToken = default)
{
List<BasePageEntitySDto> sDtos = new List<BasePageEntitySDto>();
var pages = await _martenRepository.GetEntitiesAsync<BasePageEntity>(cancellationToken);
List<BasePageSDto> sDtos = new List<BasePageSDto>();
var pages = await _martenRepositoryWrapper.SetRepository<BasePage>().GetEntitiesAsync(cancellationToken);
foreach (var page in pages)
{
var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType(page.Type);
var dto = new BasePageEntitySDto
var dto = new BasePageSDto
{
Content = page.Content,
Description = page.Description,
@ -71,7 +70,7 @@ public class PageService : IPageService
public async Task<bool> CreatePageAsync(PageActionRequestDto entity, CancellationToken cancellationToken = default)
{
var basePage = new BasePageEntity
var basePage = new BasePage
{
Content = entity.Content,
Description = entity.Description,
@ -84,7 +83,7 @@ public class PageService : IPageService
};
var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType(entity.Type);
basePage.Data = JsonConvert.SerializeObject(((JsonElement)entity.Data).Deserialize(type));
await _martenRepository.AddOrUpdateEntityAsync(basePage, cancellationToken);
await _martenRepositoryWrapper.SetRepository<BasePage>().AddOrUpdateEntityAsync(basePage, cancellationToken);
return true;
}
}

View File

@ -0,0 +1,59 @@
namespace NetinaShop.Core.CoreServices;
public class SettingService : ISettingService
{
private readonly IMartenRepositoryWrapper _martenRepositoryWrapper;
public SettingService(IMartenRepositoryWrapper martenRepositoryWrapper)
{
_martenRepositoryWrapper = martenRepositoryWrapper;
}
public async Task<object> GetSettingAsync(string settingName, CancellationToken cancellationToken = default)
{
var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"NetinaShop.Domain.MartenEntities.Settings.{settingName}");
if (type == null)
throw new AppException("Setting not found", ApiResultStatusCode.NotFound);
var baseSetting = await _martenRepositoryWrapper.SetRepository<BaseSetting>()
.GetEntityAsync(s => s.Name == settingName, cancellationToken);
object? setting;
if (baseSetting == null)
setting = Activator.CreateInstance(type);
else
setting = JsonConvert.DeserializeObject(baseSetting.JsonData, type) ?? Activator.CreateInstance(type);
if (setting == null)
throw new AppException("Setting type or base is wrong");
return setting;
}
public async Task CreateOrUpdateSettingAsync(string settingName, JsonDocument settingObj, CancellationToken cancellationToken = default)
{
var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"NetinaShop.Domain.MartenEntities.Settings.{settingName}");
if (type == null)
throw new AppException("Setting not found", ApiResultStatusCode.NotFound);
var baseSetting = await _martenRepositoryWrapper.SetRepository<BaseSetting>()
.GetEntityAsync(s => s.Name == settingName, cancellationToken);
if (baseSetting == null)
{
baseSetting = new BaseSetting
{
JsonData = JsonConvert.SerializeObject(settingObj.Deserialize(type)),
Name = settingName,
DotnetType = type.FullName ?? $"NetinaShop.Domain.MartenEntities.Settings.{settingName}"
};
}
else
{
baseSetting.JsonData = JsonConvert.SerializeObject(settingObj.Deserialize(type));
}
await _martenRepositoryWrapper.SetRepository<BaseSetting>()
.AddOrUpdateEntityAsync(baseSetting, cancellationToken);
}
}

View File

@ -10,11 +10,11 @@
<ItemGroup>
<PackageReference Include="AspNetCoreRateLimit" Version="5.0.0" />
<PackageReference Include="AspNetCoreRateLimit.Redis" Version="2.0.0" />
<PackageReference Include="Autofac.Extras.Quartz" Version="9.0.0" />
<PackageReference Include="Autofac.Extras.Quartz" Version="10.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Core" Version="2.2.5" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.2" />
<PackageReference Include="Quartz" Version="3.8.0" />
<PackageReference Include="Syncfusion.Pdf.Net.Core" Version="24.2.8" />
<PackageReference Include="SixLabors.ImageSharp" Version="3.1.3" />
<PackageReference Include="Quartz" Version="3.8.1" />
<PackageReference Include="Syncfusion.Pdf.Net.Core" Version="25.1.35" />
</ItemGroup>
@ -48,6 +48,7 @@
<Using Include="NetinaShop.Core.BaseServices.Abstracts" />
<Using Include="NetinaShop.Core.CoreServices.Abstracts" />
<Using Include="NetinaShop.Core.EntityServices.Abstracts" />
<Using Include="NetinaShop.Domain" />
<Using Include="NetinaShop.Domain.CommandQueries.Commands" />
<Using Include="NetinaShop.Domain.CommandQueries.Queries" />
<Using Include="NetinaShop.Domain.Dtos.DashboardDtos" />
@ -60,14 +61,18 @@
<Using Include="NetinaShop.Domain.Entities.Users" />
<Using Include="NetinaShop.Domain.Enums" />
<Using Include="NetinaShop.Domain.Mappers" />
<Using Include="NetinaShop.Domain.MartenEntities.Settings" />
<Using Include="NetinaShop.Domain.Models.Claims" />
<Using Include="NetinaShop.Domain.Models.Settings" />
<Using Include="NetinaShop.Repository.Abstracts" />
<Using Include="NetinaShop.Repository.Repositories.Base.Contracts" />
<Using Include="NetinaShop.Repository.Repositories.Marten" />
<Using Include="Newtonsoft.Json" />
<Using Include="System.IdentityModel.Tokens.Jwt" />
<Using Include="System.Reflection" />
<Using Include="System.Security.Claims" />
<Using Include="System.Text" />
<Using Include="System.Text.Json" />
</ItemGroup>
</Project>

View File

@ -1,9 +1,9 @@
using NetinaShop.Domain.Entities.Pages;
using NetinaShop.Domain.MartenEntities.Pages;
using Newtonsoft.Json;
namespace NetinaShop.Domain.Dtos.SmallDtos;
public class BasePageEntitySDto : BaseDto<BasePageEntitySDto,BasePageEntity>
public class BasePageSDto : BaseDto<BasePageSDto,BasePage>
{
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;

View File

@ -1,10 +1,7 @@
using System.Text.Json;
namespace NetinaShop.Domain.MartenEntities.Pages;
namespace NetinaShop.Domain.Entities.Pages;
public class BasePageEntity
public class BasePage : MartenEntity
{
public Guid Id { get; set; }
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public string Content { get; set; } = string.Empty;

View File

@ -1,5 +1,5 @@
namespace NetinaShop.Domain.Entities.Pages;
namespace NetinaShop.Domain.MartenEntities.Pages;
[PageClassDisplay("FAQPage", "صفحه سوالات متداول")]
public class FAQPage
{

View File

@ -0,0 +1,8 @@
namespace NetinaShop.Domain.MartenEntities.Settings;
public class BaseSetting : MartenEntity
{
public string Name { get; set; } = string.Empty;
public string JsonData { get; set; } = string.Empty;
public string DotnetType { get; set; } = string.Empty;
}

View File

@ -1,8 +1,7 @@
namespace NetinaShop.Domain.Entities.Settings;
namespace NetinaShop.Domain.MartenEntities.Settings;
public class PaymentSetting
{
public Guid Id { get; set; }
public string ZarinPalApiKey { get; set; } = string.Empty;
public string PayPalApiKey { get; set; } = string.Empty;
public string BehPardakhtApiKey { get; set; } = string.Empty;

View File

@ -0,0 +1,12 @@
namespace NetinaShop.Domain.MartenEntities.Settings;
public class ShopSetting
{
public string Name { get; set; } = string.Empty;
public string Description { get; set; } = string.Empty;
public string Slogan { get; set; } = string.Empty;
public double LocationLat { get; set; }
public double LocationLon { get; set; }
public string Address { get; set; } = string.Empty;
public string SupportPhoneNumber { get; set; } = string.Empty;
}

View File

@ -1,6 +1,6 @@
<Project Sdk="Microsoft.NET.Sdk">
<!--<PropertyGroup>
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
@ -12,11 +12,11 @@
<PackageReference Include="Mapster" Version="7.4.0" />
<PackageReference Include="Mapster.Core" Version="1.2.1" />
<PackageReference Include="MediatR" Version="12.2.0" />
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="8.0.1" />
<PackageReference Include="Microsoft.Extensions.Identity.Stores" Version="8.0.3" />
<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

@ -0,0 +1,58 @@
using Marten;
namespace NetinaShop.Infrastructure.Marten;
public class MartenRepository<TMartenEntity> : IMartenRepository<TMartenEntity> where TMartenEntity : IMartenEntity
{
private readonly IDocumentStore _documentStore;
public MartenRepository(IDocumentStore documentStore)
{
_documentStore = documentStore;
}
public async Task<List<TMartenEntity>> GetEntitiesAsync(CancellationToken cancellation)
{
await using var session = _documentStore.QuerySession();
var entities = await session.Query<TMartenEntity>().ToListAsync(cancellation);
return entities.ToList();
}
public async Task<List<TMartenEntity>> GetEntitiesAsync(Expression<Func<TMartenEntity, bool>> expression, CancellationToken cancellation)
{
await using var session = _documentStore.QuerySession();
var entities = await session.Query<TMartenEntity>().Where(expression).ToListAsync(cancellation);
return entities.ToList();
}
public async Task<TMartenEntity> GetEntityAsync(Guid id, CancellationToken cancellation)
{
await using var session = _documentStore.QuerySession();
var setting = await session.LoadAsync<TMartenEntity>(id, cancellation);
if (setting == null)
throw new AppException($"{nameof(setting)} not found", ApiResultStatusCode.NotFound);
return setting;
}
public async Task<TMartenEntity?> GetEntityAsync(Expression<Func<TMartenEntity, bool>> expression, CancellationToken cancellation)
{
await using var session = _documentStore.QuerySession();
var entity = await session.Query<TMartenEntity>().FirstOrDefaultAsync(expression, cancellation);
return entity;
}
public async Task AddOrUpdateEntityAsync(TMartenEntity setting, CancellationToken cancellation)
{
if (setting == null)
throw new AppException($"{nameof(setting)} is null", ApiResultStatusCode.BadRequest);
await using var session = _documentStore.LightweightSession();
session.Store(setting);
await session.SaveChangesAsync(cancellation);
}
public Task RemoveEntityAsync(CancellationToken cancellation)
{
throw new NotImplementedException();
}
}

View File

@ -0,0 +1,16 @@
using Marten;
namespace NetinaShop.Infrastructure.Marten;
public class MartenRepositoryWrapper : IMartenRepositoryWrapper
{
private readonly IDocumentStore _documentStore;
public MartenRepositoryWrapper(IDocumentStore documentStore)
{
_documentStore = documentStore;
}
public IMartenRepository<TMartenEntity> SetRepository<TMartenEntity>() where TMartenEntity : IMartenEntity
=> new MartenRepository<TMartenEntity>(_documentStore);
}

View File

@ -8,7 +8,8 @@
<ItemGroup>
<PackageReference Include="AWSSDK.S3" Version="3.7.305.22" />
<PackageReference Include="Marten" Version="7.4.0" />
<PackageReference Include="AWSSDK.S3" Version="3.7.307.2" />
<PackageReference Include="Refit" Version="7.0.0" />
</ItemGroup>
@ -27,12 +28,15 @@
<Using Include="NetinaShop.Common.Extensions" />
<Using Include="NetinaShop.Common.Models" />
<Using Include="NetinaShop.Common.Models.Api" />
<Using Include="NetinaShop.Common.Models.Entity" />
<Using Include="NetinaShop.Common.Models.Exception" />
<Using Include="NetinaShop.Core.Abstracts" />
<Using Include="NetinaShop.Domain.Models.Settings" />
<Using Include="NetinaShop.Infrastructure.Models.RestApi.KaveNegar" />
<Using Include="NetinaShop.Infrastructure.RestServices" />
<Using Include="NetinaShop.Repository.Repositories.Marten" />
<Using Include="Refit" />
<Using Include="System.Linq.Expressions" />
</ItemGroup>

View File

@ -3,7 +3,6 @@ using NetinaShop.Domain.Dtos.ScraperDtos.Response;
using NetinaShop.Domain.Dtos.SmallDtos;
using NetinaShop.Domain.Entities.Products;
using NetinaShop.Repository.Repositories.Base.Contracts;
using System.Linq;
using MediatR;
using Microsoft.EntityFrameworkCore;
using Microsoft.IdentityModel.Tokens;

View File

@ -23,7 +23,7 @@ public class ZarinpalService : IPaymentService
{
description = $"پرداخت {amount.ToString("N0")} ریال توسط {fullName} با شماره تماس {phoneNumber} برای سفارش با شماره {factorNumber}",
amount = (int)amount,
callback_url = Path.Combine("https://api.vesmook.com", "api", "accounting", "pay", "verify"),
callback_url = Path.Combine(_siteSettings.BaseUrl, "api", "accounting", "pay", "verify"),
merchant_id = "4292b845-b510-4d1d-8ee2-097499b198e5",
metadata = new ZarinaplPaymentLinkRequestMetadata { mobile = phoneNumber }
};

View File

@ -0,0 +1,82 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<ImplicitUsings>enable</ImplicitUsings>
<Nullable>enable</Nullable>
</PropertyGroup>
x
<PackageReference Include="Marten" Version="7.4.0" /> <ItemGroup>
<PackageReference Include="MediatR" Version="12.2.0" />
<PackageReference Include="FluentValidation" Version="11.9.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Pluralize.NET" Version="1.0.2" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.3" />
<PackageReference Include="StackExchange.Redis" Version="2.7.33" />
<PackageReference Include="StackExchange.Redis.Extensions.Core" Version="10.2.0" />
</ItemGroup>
<ItemGroup>
<Folder Include="Models\" />
<Folder Include="Extensions\" />
<Folder Include="Repositories\Marten\Abstracts\" />
<Folder Include="Services\Abstracts\" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\NetinaShop.Domain\NetinaShop.Domain.csproj" />
</ItemGroup>
<ItemGroup>
<Using Include="Mapster" />
<Using Include="MediatR" />
<Using Include="Microsoft.AspNetCore.Builder" />
<Using Include="Microsoft.AspNetCore.Identity" />
<Using Include="Microsoft.Extensions.DependencyInjection" />
<Using Include="Microsoft.Extensions.Logging" />
<Using Include="Microsoft.Extensions.Options" />
<Using Include="NetinaShop.Common.Extensions" />
<Using Include="NetinaShop.Common.Models" />
<Using Include="NetinaShop.Common.Models.Api" />
<Using Include="NetinaShop.Common.Models.Entity" />
<Using Include="NetinaShop.Common.Models.Exception" />
<Using Include="NetinaShop.Domain.CommandQueries.Commands" />
<Using Include="NetinaShop.Domain.CommandQueries.Queries" />
<Using Include="NetinaShop.Domain.Dtos.LargDtos" />
<Using Include="NetinaShop.Domain.Dtos.ResponseDtos" />
<Using Include="NetinaShop.Domain.Dtos.SmallDtos" />
<Using Include="NetinaShop.Domain.Entities.Discounts" />
<Using Include="NetinaShop.Domain.Entities.ProductCategories" />
<Using Include="NetinaShop.Domain.Entities.Products" />
<Using Include="NetinaShop.Domain.Entities.Users" />
<Using Include="NetinaShop.Domain.Enums" />
<Using Include="NetinaShop.Domain.Mappers" />
<Using Include="NetinaShop.Domain.Models.Claims" />
<Using Include="NetinaShop.Domain.Models.Settings" />
<Using Include="NetinaShop.Repository.Abstracts" />
<Using Include="NetinaShop.Repository.Extensions" />
<Using Include="NetinaShop.Repository.Models" />
<Using Include="NetinaShop.Repository.Repositories.Base" />
<Using Include="NetinaShop.Repository.Repositories.Base.Contracts" />
<Using Include="NetinaShop.Repository.Repositories.Entity.Abstracts" />
<Using Include="NetinaShop.Repository.Services.Abstracts" />
<Using Include="Pluralize.NET" />
<Using Include="System.Diagnostics" />
<Using Include="System.Reflection" />
</ItemGroup>
</Project>

View File

@ -8,23 +8,22 @@
<ItemGroup>
<PackageReference Include="Marten" Version="7.0.0-beta.5" />
<PackageReference Include="MediatR" Version="12.2.0" />
<PackageReference Include="FluentValidation" Version="11.9.0" />
<PackageReference Include="Microsoft.AspNetCore" Version="2.2.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.1" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.1">
<PackageReference Include="Microsoft.EntityFrameworkCore" Version="8.0.3" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="8.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.1">
<PackageReference Include="Microsoft.EntityFrameworkCore.Tools" Version="8.0.3">
<PrivateAssets>all</PrivateAssets>
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
</PackageReference>
<PackageReference Include="Pluralize.NET" Version="1.0.2" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.0" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.1" />
<PackageReference Include="StackExchange.Redis" Version="2.7.17" />
<PackageReference Include="Npgsql.EntityFrameworkCore.PostgreSQL" Version="8.0.2" />
<PackageReference Include="Microsoft.AspNetCore.Identity.EntityFrameworkCore" Version="8.0.3" />
<PackageReference Include="StackExchange.Redis" Version="2.7.33" />
<PackageReference Include="StackExchange.Redis.Extensions.Core" Version="10.2.0" />
</ItemGroup>
@ -70,7 +69,6 @@
<Using Include="NetinaShop.Repository.Models" />
<Using Include="NetinaShop.Repository.Repositories.Base" />
<Using Include="NetinaShop.Repository.Repositories.Base.Contracts" />
<Using Include="NetinaShop.Repository.Repositories.Entity.Abstracts" />
<Using Include="NetinaShop.Repository.Services.Abstracts" />
<Using Include="Pluralize.NET" />
<Using Include="System.Diagnostics" />

View File

@ -1,15 +0,0 @@
using System.Linq.Expressions;
namespace NetinaShop.Repository.Repositories.Entity.Abstracts;
public interface IMartenRepository : IScopedDependency
{
Task<List<TSetting>> GetEntitiesAsync<TSetting>(CancellationToken cancellation) where TSetting : notnull;
Task<List<TSetting>> GetEntitiesAsync<TSetting>(Expression<Func<TSetting,bool>> expression,CancellationToken cancellation) where TSetting : notnull;
Task<TSetting> GetEntityAsync<TSetting>(Guid id,CancellationToken cancellation) where TSetting : notnull;
Task<TSetting> GetEntityAsync<TSetting>(Expression<Func<TSetting, bool>> expression, CancellationToken cancellation) where TSetting : notnull;
Task AddOrUpdateEntityAsync<TSetting>(TSetting setting, CancellationToken cancellation) where TSetting : notnull;
Task RemoveEntityAsync<TSetting>(CancellationToken cancellation);
}

View File

@ -1,60 +0,0 @@
using System.Linq.Expressions;
using Marten;
namespace NetinaShop.Repository.Repositories.Entity;
public class MartenRepository : IMartenRepository
{
private readonly IDocumentStore _documentStore;
public MartenRepository(IDocumentStore documentStore)
{
_documentStore = documentStore;
}
public async Task<List<TSetting>> GetEntitiesAsync<TSetting>(CancellationToken cancellation) where TSetting : notnull
{
await using var session = _documentStore.QuerySession();
var entities = await session.Query<TSetting>().ToListAsync(cancellation);
return entities.ToList();
}
public async Task<List<TSetting>> GetEntitiesAsync<TSetting>(Expression<Func<TSetting, bool>> expression, CancellationToken cancellation) where TSetting : notnull
{
await using var session = _documentStore.QuerySession();
var entities = await session.Query<TSetting>().Where(expression).ToListAsync(cancellation);
return entities.ToList();
}
public async Task<TSetting> GetEntityAsync<TSetting>(Guid id,CancellationToken cancellation) where TSetting : notnull
{
await using var session = _documentStore.QuerySession();
var setting = await session.LoadAsync<TSetting>(id,cancellation);
if (setting == null)
throw new AppException($"{nameof(setting)} not found", ApiResultStatusCode.NotFound);
return setting;
}
public async Task<TSetting> GetEntityAsync<TSetting>(Expression<Func<TSetting, bool>> expression, CancellationToken cancellation) where TSetting : notnull
{
await using var session = _documentStore.QuerySession();
var entity = await session.Query<TSetting>().FirstOrDefaultAsync(expression,cancellation);
if (entity == null)
throw new AppException($"{nameof(entity)} not found", ApiResultStatusCode.NotFound);
return entity;
}
public async Task AddOrUpdateEntityAsync<TSetting>(TSetting setting, CancellationToken cancellation) where TSetting : notnull
{
if (setting == null)
throw new AppException($"{nameof(setting)} is null", ApiResultStatusCode.BadRequest);
await using var session = _documentStore.LightweightSession();
session.Store(setting);
await session.SaveChangesAsync(cancellation);
}
public Task RemoveEntityAsync<TSetting>(CancellationToken cancellation)
{
throw new NotImplementedException();
}
}

View File

@ -0,0 +1,15 @@
using System.Linq.Expressions;
namespace NetinaShop.Repository.Repositories.Marten;
public interface IMartenRepository<TMartenEntity> : IScopedDependency where TMartenEntity : IMartenEntity
{
Task<List<TMartenEntity>> GetEntitiesAsync(CancellationToken cancellation);
Task<List<TMartenEntity>> GetEntitiesAsync(Expression<Func<TMartenEntity, bool>> expression, CancellationToken cancellation);
Task<TMartenEntity> GetEntityAsync(Guid id, CancellationToken cancellation);
Task<TMartenEntity?> GetEntityAsync(Expression<Func<TMartenEntity, bool>> expression, CancellationToken cancellation);
Task AddOrUpdateEntityAsync(TMartenEntity setting, CancellationToken cancellation);
Task RemoveEntityAsync(CancellationToken cancellation);
}

View File

@ -0,0 +1,6 @@
namespace NetinaShop.Repository.Repositories.Marten;
public interface IMartenRepositoryWrapper : IScopedDependency
{
IMartenRepository<TMartenEntity> SetRepository<TMartenEntity>() where TMartenEntity : IMartenEntity;
}