feat(MartenDB) , feat(Brew) , feat(BrewService)
-Add MartentDB and MartenEntity -Add MartenRepository -Add BaseBrew entity and CoffeBrew -Add BrewService for manage brews entitymaster
parent
91a73cbcef
commit
8bb2713069
|
@ -1,7 +1,8 @@
|
||||||
{
|
{
|
||||||
"ConnectionStrings": {
|
"ConnectionStrings": {
|
||||||
"PostgresServer": "Host=185.220.227.123;port=5432;Username=postgres;Password=ub0J7sFFThkSBmkc0TzSKsCfheRnQpyu;Database=BrizcoDB",
|
"PostgresServer": "Host=185.220.227.123;port=5432;Username=postgres;Password=ub0J7sFFThkSBmkc0TzSKsCfheRnQpyu;Database=BrizcoDB",
|
||||||
"Postgres": "Host=pg-0,pg-1;Username=igarsonAgent;Password=xHTpBf4wC+bBeNg2pL6Ga7VEWKFJx7VPEUpqxwPFfOc2YYTVwFQuHfsiqoVeT9+6;Database=BrizcoDB;Load Balance Hosts=true;Target Session Attributes=primary;Application Name=iGLS"
|
"Postgres": "Host=pg-0,pg-1;Username=igarsonAgent;Password=xHTpBf4wC+bBeNg2pL6Ga7VEWKFJx7VPEUpqxwPFfOc2YYTVwFQuHfsiqoVeT9+6;Database=BrizcoDB;Load Balance Hosts=true;Target Session Attributes=primary;Application Name=iGLS",
|
||||||
|
"MartenDB": "Host=pg-0,pg-1;Username=igarsonAgent;Password=xHTpBf4wC+bBeNg2pL6Ga7VEWKFJx7VPEUpqxwPFfOc2YYTVwFQuHfsiqoVeT9+6;Database=BrizcoMartenDB;"
|
||||||
},
|
},
|
||||||
"Logging": {
|
"Logging": {
|
||||||
"LogLevel": {
|
"LogLevel": {
|
||||||
|
|
|
@ -56,20 +56,36 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Using Include="Autofac" />
|
<Using Include="Autofac" />
|
||||||
<Using Include="Autofac.Extensions.DependencyInjection" />
|
<Using Include="Autofac.Extensions.DependencyInjection" />
|
||||||
|
<Using Include="Brizco.Api.WebFramework.ScalarUi" />
|
||||||
|
<Using Include="Brizco.Api.WebFramework.Swagger" />
|
||||||
|
<Using Include="Brizco.Common.Models" />
|
||||||
|
<Using Include="Brizco.Common.Models.Api" />
|
||||||
<Using Include="Brizco.Common.Models.Claims" />
|
<Using Include="Brizco.Common.Models.Claims" />
|
||||||
<Using Include="Brizco.Common.Models.Entity" />
|
<Using Include="Brizco.Common.Models.Entity" />
|
||||||
<Using Include="Brizco.Common.Models.Exception" />
|
<Using Include="Brizco.Common.Models.Exception" />
|
||||||
<Using Include="Brizco.Common.Models.Mapper" />
|
<Using Include="Brizco.Common.Models.Mapper" />
|
||||||
|
<Using Include="Brizco.Core" />
|
||||||
<Using Include="Brizco.Core.CoreServices.Abstracts" />
|
<Using Include="Brizco.Core.CoreServices.Abstracts" />
|
||||||
<Using Include="Brizco.Core.EntityServices.Abstracts" />
|
<Using Include="Brizco.Core.EntityServices.Abstracts" />
|
||||||
|
<Using Include="Brizco.Core.Models.Api" />
|
||||||
|
<Using Include="Brizco.Domain" />
|
||||||
<Using Include="Brizco.Domain.CommandQueries.Commands" />
|
<Using Include="Brizco.Domain.CommandQueries.Commands" />
|
||||||
<Using Include="Brizco.Domain.CommandQueries.Queries" />
|
<Using Include="Brizco.Domain.CommandQueries.Queries" />
|
||||||
<Using Include="Brizco.Domain.Dtos.RequestDtos" />
|
<Using Include="Brizco.Domain.Dtos.RequestDtos" />
|
||||||
<Using Include="Brizco.Domain.Entities" />
|
<Using Include="Brizco.Domain.Entities" />
|
||||||
|
<Using Include="Brizco.Domain.Entities.User" />
|
||||||
|
<Using Include="Brizco.Domain.Models.Settings" />
|
||||||
|
<Using Include="Brizco.Infrastructure" />
|
||||||
|
<Using Include="Brizco.Repository" />
|
||||||
|
<Using Include="Brizco.Repository.Extensions" />
|
||||||
|
<Using Include="Brizco.Repository.Models" />
|
||||||
<Using Include="Brizco.Repository.Repositories.Base.Contracts" />
|
<Using Include="Brizco.Repository.Repositories.Base.Contracts" />
|
||||||
<Using Include="Carter" />
|
<Using Include="Carter" />
|
||||||
|
<Using Include="FluentValidation" />
|
||||||
<Using Include="Mapster" />
|
<Using Include="Mapster" />
|
||||||
<Using Include="MediatR" />
|
<Using Include="MediatR" />
|
||||||
|
<Using Include="MediatR.Extensions.Autofac.DependencyInjection" />
|
||||||
|
<Using Include="MediatR.Extensions.Autofac.DependencyInjection.Builder" />
|
||||||
<Using Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
|
<Using Include="Microsoft.AspNetCore.Authentication.JwtBearer" />
|
||||||
<Using Include="Microsoft.AspNetCore.Authorization" />
|
<Using Include="Microsoft.AspNetCore.Authorization" />
|
||||||
<Using Include="Microsoft.AspNetCore.Identity" />
|
<Using Include="Microsoft.AspNetCore.Identity" />
|
||||||
|
|
|
@ -0,0 +1,35 @@
|
||||||
|
using Marten;
|
||||||
|
using System.Text.Json;
|
||||||
|
|
||||||
|
namespace Brizco.Api.Controllers;
|
||||||
|
|
||||||
|
public class RecipeController : ICarterModule
|
||||||
|
{
|
||||||
|
public void AddRoutes(IEndpointRouteBuilder app)
|
||||||
|
{
|
||||||
|
var group = app.NewVersionedApi("Brews")
|
||||||
|
.MapGroup("api/brew");
|
||||||
|
|
||||||
|
group.MapGet("{recipeName}/latest", GetLatestBrewAsync)
|
||||||
|
.WithDisplayName("Get Latest Brew")
|
||||||
|
.WithDescription("Get latest brew that has been set for day , you have pass recipe name in route")
|
||||||
|
.HasApiVersion(1.0);
|
||||||
|
|
||||||
|
group.MapPost("{recipeName}", AddBrewAsync)
|
||||||
|
.WithDisplayName("Add Brew")
|
||||||
|
.WithDescription("Add latest brew that has been set for day , you have pass recipe model")
|
||||||
|
.HasApiVersion(1.0);
|
||||||
|
}
|
||||||
|
|
||||||
|
private async Task<IResult> GetLatestBrewAsync([FromRoute] string recipeName,
|
||||||
|
[FromServices] IBrewService brewService, CancellationToken cancellationToken)
|
||||||
|
=> TypedResults.Ok(await brewService.GetLastBrewAsync(recipeName, cancellationToken));
|
||||||
|
|
||||||
|
private async Task<IResult> AddBrewAsync([FromRoute] string recipeName,
|
||||||
|
[FromBody] JsonDocument recipeObj, [FromServices] IBrewService brewService,
|
||||||
|
CancellationToken cancellationToken)
|
||||||
|
{
|
||||||
|
await brewService.AddBrewAsync(recipeName, recipeObj, cancellationToken);
|
||||||
|
return TypedResults.Ok();
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,19 +1,20 @@
|
||||||
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
|
#See https://aka.ms/customizecontainer to learn how to customize your debug container and how Visual Studio uses this Dockerfile to build your images for faster debugging.
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
|
FROM mcr.microsoft.com/dotnet/aspnet:8.0 AS base
|
||||||
|
ENV ASPNETCORE_URLS=https://0.0.0.0:8010
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
EXPOSE 80
|
EXPOSE 8010
|
||||||
|
|
||||||
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
FROM mcr.microsoft.com/dotnet/sdk:8.0 AS build
|
||||||
WORKDIR /src
|
WORKDIR /src
|
||||||
COPY ["Berizco.Api/Berizco.Api.csproj", "Berizco.Api/"]
|
COPY ["Brizco.Api.csproj", "Brizco.Api/"]
|
||||||
RUN dotnet restore "Berizco.Api/Berizco.Api.csproj"
|
RUN dotnet restore "Brizco.Api/Brizco.Api.csproj"
|
||||||
COPY . .
|
COPY . .
|
||||||
WORKDIR "/src/Berizco.Api"
|
WORKDIR "/src/Brizco.Api"
|
||||||
RUN dotnet build "Berizco.Api.csproj" -c Release -o /app/build
|
RUN dotnet build "Brizco.Api.csproj" -c Release -o /app/build
|
||||||
|
|
||||||
FROM build AS publish
|
FROM build AS publish
|
||||||
RUN dotnet publish "Berizco.Api.csproj" -c Release -o /app/publish /p:UseAppHost=false
|
RUN dotnet publish "Brizco.Api.csproj" -c Release -o /app/publish /p:UseAppHost=false
|
||||||
|
|
||||||
FROM base AS final
|
FROM base AS final
|
||||||
WORKDIR /app
|
WORKDIR /app
|
||||||
|
|
|
@ -1,18 +1,3 @@
|
||||||
using Brizco.Api.WebFramework.Configurations;
|
|
||||||
using Brizco.Api.WebFramework.Swagger;
|
|
||||||
using Brizco.Common.Models;
|
|
||||||
using Brizco.Core;
|
|
||||||
using Brizco.Domain;
|
|
||||||
using Brizco.Domain.Models.Settings;
|
|
||||||
using Brizco.Infrastructure;
|
|
||||||
using Brizco.Repository;
|
|
||||||
using System.Configuration;
|
|
||||||
using Brizco.Api.WebFramework.ScalarUi;
|
|
||||||
using Carter;
|
|
||||||
using FluentValidation;
|
|
||||||
using MediatR.Extensions.Autofac.DependencyInjection;
|
|
||||||
using MediatR.Extensions.Autofac.DependencyInjection.Builder;
|
|
||||||
|
|
||||||
var builder = WebApplication.CreateBuilder(args);
|
var builder = WebApplication.CreateBuilder(args);
|
||||||
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
|
builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());
|
||||||
builder.Host.UseSerilog();
|
builder.Host.UseSerilog();
|
||||||
|
@ -51,6 +36,7 @@ builder.Services.AddJwtCustomAuthentication(siteSetting.JwtSettings);
|
||||||
builder.Services.AddMvcCore().AddRazorPages().AddRazorViewEngine().AddViews();
|
builder.Services.AddMvcCore().AddRazorPages().AddRazorViewEngine().AddViews();
|
||||||
builder.Services.AddCustomIdentity();
|
builder.Services.AddCustomIdentity();
|
||||||
builder.Services.AddCustomDbContext(configuration);
|
builder.Services.AddCustomDbContext(configuration);
|
||||||
|
builder.Services.AddMarten(configuration, builder.Environment);
|
||||||
builder.Services.AddCarter();
|
builder.Services.AddCarter();
|
||||||
|
|
||||||
|
|
||||||
|
@ -101,16 +87,10 @@ builder.Host.ConfigureContainer<ContainerBuilder>(builder =>
|
||||||
|
|
||||||
var app = builder.Build();
|
var app = builder.Build();
|
||||||
|
|
||||||
// Configure the HTTP request pipeline.
|
// Configure the HTTP request pipeline
|
||||||
if (app.Environment.IsDevelopment())
|
|
||||||
{
|
|
||||||
//app.UseCustomSwagger(siteSetting.BaseUrl);
|
|
||||||
//app.UseSwagger();
|
|
||||||
//app.UseSwaggerUI();
|
|
||||||
}
|
|
||||||
app.UseCors("CorsPolicy");
|
app.UseCors("CorsPolicy");
|
||||||
|
|
||||||
//app.UseCustomSwagger(siteSetting.BaseUrl);
|
|
||||||
app.UseSwagger();
|
app.UseSwagger();
|
||||||
app.MapScalarUi();
|
app.MapScalarUi();
|
||||||
|
|
||||||
|
|
|
@ -2,16 +2,11 @@
|
||||||
using Asp.Versioning;
|
using Asp.Versioning;
|
||||||
using AspNetCoreRateLimit;
|
using AspNetCoreRateLimit;
|
||||||
using AspNetCoreRateLimit.Redis;
|
using AspNetCoreRateLimit.Redis;
|
||||||
using Brizco.Common.Models.Api;
|
using Marten;
|
||||||
using Brizco.Core.Models.Api;
|
|
||||||
using Brizco.Domain.Entities.User;
|
|
||||||
using Brizco.Domain.Models.Settings;
|
|
||||||
using Brizco.Repository.Extensions;
|
|
||||||
using Brizco.Repository.Models;
|
|
||||||
using Microsoft.AspNetCore.ResponseCompression;
|
using Microsoft.AspNetCore.ResponseCompression;
|
||||||
using Newtonsoft.Json.Serialization;
|
|
||||||
using StackExchange.Redis.Extensions.Core.Configuration;
|
using StackExchange.Redis.Extensions.Core.Configuration;
|
||||||
using StackExchange.Redis.Extensions.Newtonsoft;
|
using StackExchange.Redis.Extensions.Newtonsoft;
|
||||||
|
using Weasel.Core;
|
||||||
using Task = System.Threading.Tasks.Task;
|
using Task = System.Threading.Tasks.Task;
|
||||||
|
|
||||||
namespace Brizco.Api.WebFramework.Configurations;
|
namespace Brizco.Api.WebFramework.Configurations;
|
||||||
|
@ -99,6 +94,17 @@ public static class ServiceExtensions
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static void AddMarten(this IServiceCollection serviceCollection, IConfigurationRoot configuration, IWebHostEnvironment environment)
|
||||||
|
{
|
||||||
|
var marten = serviceCollection.AddMarten(options =>
|
||||||
|
{
|
||||||
|
options.Connection(configuration.GetConnectionString("MartenDB")!);
|
||||||
|
if (environment.IsDevelopment())
|
||||||
|
options.AutoCreateSchemaObjects = AutoCreate.All;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public static void AddCustomController(this IServiceCollection serviceCollection)
|
public static void AddCustomController(this IServiceCollection serviceCollection)
|
||||||
{
|
{
|
||||||
serviceCollection.AddControllers(options => { options.Filters.Add(new AuthorizeFilter()); })
|
serviceCollection.AddControllers(options => { options.Filters.Add(new AuthorizeFilter()); })
|
||||||
|
|
|
@ -1,20 +1,20 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<!--<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<LangVersion>10</LangVersion>
|
<LangVersion>10</LangVersion>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="MD.PersianDateTime.Standard" Version="2.5.0" />
|
<PackageReference Include="MD.PersianDateTime.Standard" Version="2.5.0" />
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
|
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
|
||||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.5.1" />
|
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.5.1" />
|
||||||
</ItemGroup>-->
|
</ItemGroup>
|
||||||
|
|
||||||
<PropertyGroup>
|
<!--<PropertyGroup>
|
||||||
<TargetFramework>net5.0</TargetFramework>
|
<TargetFramework>net5.0</TargetFramework>
|
||||||
<LangVersion>10</LangVersion>
|
<LangVersion>10</LangVersion>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
|
@ -25,11 +25,11 @@
|
||||||
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
<PackageReference Include="Newtonsoft.Json" Version="13.0.3" />
|
||||||
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
|
<PackageReference Include="System.ComponentModel.Annotations" Version="5.0.0" />
|
||||||
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.0.3" />
|
<PackageReference Include="System.IdentityModel.Tokens.Jwt" Version="7.0.3" />
|
||||||
</ItemGroup>
|
</ItemGroup>-->
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Using Include="MD.PersianDateTime.Standard" />
|
<Using Include="MD.PersianDateTime.Standard" />
|
||||||
<Using Include="System.ComponentModel.DataAnnotations" />
|
<Using Include="System.ComponentModel.DataAnnotations" />
|
||||||
<Using Include="System.ComponentModel.DataAnnotations.Schema" />
|
<Using Include="System.ComponentModel.DataAnnotations.Schema" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -3,6 +3,22 @@
|
||||||
namespace Brizco.Common.Models.Claims;
|
namespace Brizco.Common.Models.Claims;
|
||||||
public static class ApplicationClaims
|
public static class ApplicationClaims
|
||||||
{
|
{
|
||||||
|
|
||||||
|
public static ClaimDto ManageRecipes { get; } = new ClaimDto
|
||||||
|
{
|
||||||
|
Type = CustomClaimType.Permission,
|
||||||
|
Value = ApplicationPermission.ManageRecipes,
|
||||||
|
Title = "دسترسی کامل به رسپی ها",
|
||||||
|
Detail = "دسترسی به افزودن و مدیریت مجموعه های سیستم"
|
||||||
|
};
|
||||||
|
public static ClaimDto ViewRecipes { get; } = new ClaimDto
|
||||||
|
{
|
||||||
|
Type = CustomClaimType.Permission,
|
||||||
|
Value = ApplicationPermission.ViewRecipes,
|
||||||
|
Title = "مشاهده رسپی ها",
|
||||||
|
Detail = "دسترسی به مشاهده مجموعه ها"
|
||||||
|
};
|
||||||
|
|
||||||
public static ClaimDto ManageComplexes { get; } = new ClaimDto
|
public static ClaimDto ManageComplexes { get; } = new ClaimDto
|
||||||
{
|
{
|
||||||
Type = CustomClaimType.Permission,
|
Type = CustomClaimType.Permission,
|
||||||
|
@ -207,6 +223,9 @@ public static class ApplicationClaims
|
||||||
|
|
||||||
public static List<ClaimDto> AllClaimDtos = new List<ClaimDto>
|
public static List<ClaimDto> AllClaimDtos = new List<ClaimDto>
|
||||||
{
|
{
|
||||||
|
ManageRecipes,
|
||||||
|
ViewRecipes,
|
||||||
|
|
||||||
ManageActivities,
|
ManageActivities,
|
||||||
ViewTasks,
|
ViewTasks,
|
||||||
ManageTasks,
|
ManageTasks,
|
||||||
|
@ -241,6 +260,9 @@ public static class ApplicationClaims
|
||||||
|
|
||||||
public static List<Claim> AllClaims = new List<Claim>
|
public static List<Claim> AllClaims = new List<Claim>
|
||||||
{
|
{
|
||||||
|
ManageRecipes.GetClaim,
|
||||||
|
ViewRecipes.GetClaim,
|
||||||
|
|
||||||
ManageStaffs.GetClaim,
|
ManageStaffs.GetClaim,
|
||||||
ViewStaffs.GetClaim,
|
ViewStaffs.GetClaim,
|
||||||
ManageReports.GetClaim,
|
ManageReports.GetClaim,
|
||||||
|
@ -282,6 +304,9 @@ public static class ApplicationClaims
|
||||||
|
|
||||||
public static List<Claim> ManagerClaims = new List<Claim>
|
public static List<Claim> ManagerClaims = new List<Claim>
|
||||||
{
|
{
|
||||||
|
ManageRecipes.GetClaim,
|
||||||
|
ViewRecipes.GetClaim,
|
||||||
|
|
||||||
ManageStaffs.GetClaim,
|
ManageStaffs.GetClaim,
|
||||||
ViewStaffs.GetClaim,
|
ViewStaffs.GetClaim,
|
||||||
ManageReports.GetClaim,
|
ManageReports.GetClaim,
|
||||||
|
@ -319,6 +344,8 @@ public static class ApplicationClaims
|
||||||
|
|
||||||
public static List<Claim> ViewerOwnerClaims = new List<Claim>
|
public static List<Claim> ViewerOwnerClaims = new List<Claim>
|
||||||
{
|
{
|
||||||
|
ViewRecipes.GetClaim,
|
||||||
|
|
||||||
ManageReports.GetClaim,
|
ManageReports.GetClaim,
|
||||||
|
|
||||||
ViewStaffs.GetClaim,
|
ViewStaffs.GetClaim,
|
||||||
|
@ -346,6 +373,9 @@ public static class ApplicationClaims
|
||||||
|
|
||||||
public static List<Claim> SuperVisorClaims = new List<Claim>
|
public static List<Claim> SuperVisorClaims = new List<Claim>
|
||||||
{
|
{
|
||||||
|
ManageRecipes.GetClaim,
|
||||||
|
ViewRecipes.GetClaim,
|
||||||
|
|
||||||
ManageActivities.GetClaim,
|
ManageActivities.GetClaim,
|
||||||
ChangeActivityStatus.GetClaim,
|
ChangeActivityStatus.GetClaim,
|
||||||
ViewMineActivities.GetClaim,
|
ViewMineActivities.GetClaim,
|
||||||
|
@ -369,6 +399,8 @@ public static class ApplicationClaims
|
||||||
|
|
||||||
public static List<Claim> StaffClaims = new List<Claim>
|
public static List<Claim> StaffClaims = new List<Claim>
|
||||||
{
|
{
|
||||||
|
ViewRecipes.GetClaim,
|
||||||
|
|
||||||
ChangeActivityStatus.GetClaim,
|
ChangeActivityStatus.GetClaim,
|
||||||
ViewMineActivities.GetClaim,
|
ViewMineActivities.GetClaim,
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,9 @@
|
||||||
namespace Brizco.Common.Models.Claims;
|
namespace Brizco.Common.Models.Claims;
|
||||||
public static class ApplicationPermission
|
public static class ApplicationPermission
|
||||||
{
|
{
|
||||||
|
public const string ViewRecipes = nameof(ViewRecipes);
|
||||||
|
public const string ManageRecipes = nameof(ManageRecipes);
|
||||||
|
|
||||||
public const string ManageReports = nameof(ManageReports);
|
public const string ManageReports = nameof(ManageReports);
|
||||||
public const string ManageRoles = nameof(ManageRoles);
|
public const string ManageRoles = nameof(ManageRoles);
|
||||||
public const string ViewRoles = nameof(ViewRoles);
|
public const string ViewRoles = nameof(ViewRoles);
|
||||||
|
|
|
@ -0,0 +1,9 @@
|
||||||
|
namespace Brizco.Common.Models.Entity;
|
||||||
|
|
||||||
|
public interface IMartenEntity
|
||||||
|
{
|
||||||
|
string CreatedBy { get; }
|
||||||
|
string ModifiedBy { get; }
|
||||||
|
DateTime CreatedAt { get; }
|
||||||
|
DateTime ModifiedAt { get; }
|
||||||
|
}
|
|
@ -0,0 +1,42 @@
|
||||||
|
namespace Brizco.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();
|
||||||
|
}
|
||||||
|
}
|
|
@ -31,7 +31,6 @@
|
||||||
<Using Include="Brizco.Common.Models.Claims" />
|
<Using Include="Brizco.Common.Models.Claims" />
|
||||||
<Using Include="Brizco.Common.Models.Exception" />
|
<Using Include="Brizco.Common.Models.Exception" />
|
||||||
<Using Include="Brizco.Core.Abstracts" />
|
<Using Include="Brizco.Core.Abstracts" />
|
||||||
<Using Include="Brizco.Core.BaseServices.Abstracts" />
|
|
||||||
<Using Include="Brizco.Core.CoreServices.Abstracts" />
|
<Using Include="Brizco.Core.CoreServices.Abstracts" />
|
||||||
<Using Include="Brizco.Core.CoreServices.ReportServices.Commands" />
|
<Using Include="Brizco.Core.CoreServices.ReportServices.Commands" />
|
||||||
<Using Include="Brizco.Core.EntityServices.Abstracts" />
|
<Using Include="Brizco.Core.EntityServices.Abstracts" />
|
||||||
|
@ -46,8 +45,11 @@
|
||||||
<Using Include="Brizco.Domain.Entities.User" />
|
<Using Include="Brizco.Domain.Entities.User" />
|
||||||
<Using Include="Brizco.Domain.Enums" />
|
<Using Include="Brizco.Domain.Enums" />
|
||||||
<Using Include="Brizco.Domain.Mappers" />
|
<Using Include="Brizco.Domain.Mappers" />
|
||||||
|
<Using Include="Brizco.Domain.MartenEntities.Brews" />
|
||||||
|
<Using Include="Brizco.Domain.Models.Settings" />
|
||||||
<Using Include="Brizco.Repository.Abstracts" />
|
<Using Include="Brizco.Repository.Abstracts" />
|
||||||
<Using Include="Brizco.Repository.Repositories.Base.Contracts" />
|
<Using Include="Brizco.Repository.Repositories.Base.Contracts" />
|
||||||
|
<Using Include="Brizco.Repository.Repositories.Marten" />
|
||||||
<Using Include="Mapster" />
|
<Using Include="Mapster" />
|
||||||
<Using Include="MediatR" />
|
<Using Include="MediatR" />
|
||||||
<Using Include="Microsoft.AspNetCore.Identity" />
|
<Using Include="Microsoft.AspNetCore.Identity" />
|
||||||
|
@ -57,6 +59,7 @@
|
||||||
<Using Include="NPOI.SS.Util" />
|
<Using Include="NPOI.SS.Util" />
|
||||||
<Using Include="NPOI.XSSF.UserModel" />
|
<Using Include="NPOI.XSSF.UserModel" />
|
||||||
<Using Include="System.Security.Claims" />
|
<Using Include="System.Security.Claims" />
|
||||||
|
<Using Include="System.Text.Json" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
namespace Brizco.Core.BaseServices.Abstracts;
|
namespace Brizco.Core.CoreServices.Abstracts;
|
||||||
|
|
||||||
public interface IJwtService : IScopedDependency
|
public interface IJwtService : IScopedDependency
|
||||||
{
|
{
|
||||||
Task<AccessToken<TUser>> Generate<TUser>(TUser user, Guid complexId,Guid roleId) where TUser : ApplicationUser;
|
Task<AccessToken<TUser>> Generate<TUser>(TUser user, Guid complexId, Guid roleId) where TUser : ApplicationUser;
|
||||||
Task<AccessToken<TUser>> Generate<TUser>(TUser user, Guid complexId) where TUser : ApplicationUser;
|
Task<AccessToken<TUser>> Generate<TUser>(TUser user, Guid complexId) where TUser : ApplicationUser;
|
||||||
Task<AccessToken<TUser>> Generate<TUser>(TUser user) where TUser : ApplicationUser;
|
Task<AccessToken<TUser>> Generate<TUser>(TUser user) where TUser : ApplicationUser;
|
||||||
|
|
|
@ -1,16 +1,8 @@
|
||||||
using Brizco.Common.Models.Claims;
|
using Microsoft.Extensions.Options;
|
||||||
using Brizco.Core.BaseServices.Abstracts;
|
|
||||||
using Brizco.Domain.Models.Settings;
|
|
||||||
using Mapster;
|
|
||||||
using Microsoft.AspNetCore.Identity;
|
|
||||||
using Microsoft.Extensions.Options;
|
|
||||||
using Microsoft.IdentityModel.Tokens;
|
|
||||||
using System.IdentityModel.Tokens.Jwt;
|
using System.IdentityModel.Tokens.Jwt;
|
||||||
using System.Security.Claims;
|
|
||||||
using System.Text;
|
using System.Text;
|
||||||
using Brizco.Common.Extensions;
|
|
||||||
|
|
||||||
namespace Brizco.Core.BaseServices;
|
namespace Brizco.Core.CoreServices;
|
||||||
|
|
||||||
public class JwtService : IJwtService
|
public class JwtService : IJwtService
|
||||||
{
|
{
|
||||||
|
@ -33,7 +25,7 @@ public class JwtService : IJwtService
|
||||||
var claims = await GetClaims(user, tokenId, roleId.ToString());
|
var claims = await GetClaims(user, tokenId, roleId.ToString());
|
||||||
claims.Add(new Claim("ComplexId", complexId.ToString()));
|
claims.Add(new Claim("ComplexId", complexId.ToString()));
|
||||||
|
|
||||||
var token = BaseGenerate<TUser>(user, claims);
|
var token = BaseGenerate(user, claims);
|
||||||
token.Permissions = claims.Where(c => c.Type == "Permission").Select(c => c.Value).ToList();
|
token.Permissions = claims.Where(c => c.Type == "Permission").Select(c => c.Value).ToList();
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
@ -64,10 +56,10 @@ public class JwtService : IJwtService
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
public async Task<AccessToken<TUserDto,TRole>> Generate<TUserDto, TUser, TRole>(TUser user, Guid complexId, Guid roleId) where TUser : ApplicationUser
|
public async Task<AccessToken<TUserDto, TRole>> Generate<TUserDto, TUser, TRole>(TUser user, Guid complexId, Guid roleId) where TUser : ApplicationUser
|
||||||
{
|
{
|
||||||
var tokenId = StringExtensions.GetId(8);
|
var tokenId = StringExtensions.GetId(8);
|
||||||
var claims = await GetClaims(user, tokenId,roleId.ToString());
|
var claims = await GetClaims(user, tokenId, roleId.ToString());
|
||||||
claims.Add(new Claim("ComplexId", complexId.ToString()));
|
claims.Add(new Claim("ComplexId", complexId.ToString()));
|
||||||
|
|
||||||
return BaseGenerate<TUserDto, TUser, TRole>(user, claims);
|
return BaseGenerate<TUserDto, TUser, TRole>(user, claims);
|
||||||
|
@ -132,7 +124,7 @@ public class JwtService : IJwtService
|
||||||
return token;
|
return token;
|
||||||
}
|
}
|
||||||
|
|
||||||
private AccessToken<TUserDto,TRole> BaseGenerate<TUserDto, TUser, TRole>(TUser user, List<Claim> claims) where TUser : ApplicationUser
|
private AccessToken<TUserDto, TRole> BaseGenerate<TUserDto, TUser, TRole>(TUser user, List<Claim> claims) where TUser : ApplicationUser
|
||||||
{
|
{
|
||||||
var secretKey = Encoding.UTF8.GetBytes(_siteSettings.JwtSettings.SecretKey);
|
var secretKey = Encoding.UTF8.GetBytes(_siteSettings.JwtSettings.SecretKey);
|
||||||
var signingCredintial = new SigningCredentials(new SymmetricSecurityKey(secretKey), SecurityAlgorithms.HmacSha512Signature);
|
var signingCredintial = new SigningCredentials(new SymmetricSecurityKey(secretKey), SecurityAlgorithms.HmacSha512Signature);
|
||||||
|
@ -157,7 +149,7 @@ public class JwtService : IJwtService
|
||||||
|
|
||||||
private async Task<List<Claim>> GetClaims<TUser>(TUser baseUser, string jwtId) where TUser : ApplicationUser
|
private async Task<List<Claim>> GetClaims<TUser>(TUser baseUser, string jwtId) where TUser : ApplicationUser
|
||||||
{
|
{
|
||||||
var clFac = (await _signInManager.ClaimsFactory.CreateAsync(baseUser));
|
var clFac = await _signInManager.ClaimsFactory.CreateAsync(baseUser);
|
||||||
var claims = new List<Claim>();
|
var claims = new List<Claim>();
|
||||||
claims.Add(new Claim("JwtID", jwtId));
|
claims.Add(new Claim("JwtID", jwtId));
|
||||||
claims.Add(new Claim(ClaimTypes.Name, baseUser.UserName));
|
claims.Add(new Claim(ClaimTypes.Name, baseUser.UserName));
|
||||||
|
@ -175,10 +167,10 @@ public class JwtService : IJwtService
|
||||||
var applicationRole = await _roleManager.FindByIdAsync(roleId);
|
var applicationRole = await _roleManager.FindByIdAsync(roleId);
|
||||||
var roleClaims = await _roleManager.GetClaimsAsync(applicationRole);
|
var roleClaims = await _roleManager.GetClaimsAsync(applicationRole);
|
||||||
var claims = new List<Claim>();
|
var claims = new List<Claim>();
|
||||||
claims.Add(new Claim("SignUpStatus",((int)baseUser.SignUpStatus).ToString()));
|
claims.Add(new Claim("SignUpStatus", ((int)baseUser.SignUpStatus).ToString()));
|
||||||
claims.Add(new Claim(ClaimTypes.Name, baseUser.UserName));
|
claims.Add(new Claim(ClaimTypes.Name, baseUser.UserName));
|
||||||
claims.Add(new Claim(ClaimTypes.NameIdentifier, baseUser.Id.ToString()));
|
claims.Add(new Claim(ClaimTypes.NameIdentifier, baseUser.Id.ToString()));
|
||||||
claims.Add(new Claim(ClaimTypes.Role,applicationRole.EnglishName));
|
claims.Add(new Claim(ClaimTypes.Role, applicationRole.EnglishName));
|
||||||
claims.Add(new Claim("RoleId", applicationRole.Id.ToString()));
|
claims.Add(new Claim("RoleId", applicationRole.Id.ToString()));
|
||||||
if (baseUser.Email != null)
|
if (baseUser.Email != null)
|
||||||
claims.Add(new Claim(ClaimTypes.Email, baseUser.Email));
|
claims.Add(new Claim(ClaimTypes.Email, baseUser.Email));
|
|
@ -1,5 +1,4 @@
|
||||||
using Brizco.Domain.Dtos.LargeDtos;
|
using Brizco.Domain.Entities.Task;
|
||||||
using Brizco.Domain.Entities.Task;
|
|
||||||
using Task = System.Threading.Tasks.Task;
|
using Task = System.Threading.Tasks.Task;
|
||||||
|
|
||||||
namespace Brizco.Core.CoreServices.ReportServices;
|
namespace Brizco.Core.CoreServices.ReportServices;
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
namespace Brizco.Core.EntityServices.Abstracts;
|
||||||
|
|
||||||
|
public interface IBrewService : IScopedDependency
|
||||||
|
{
|
||||||
|
public Task<object> GetLastBrewAsync(string recipeName, CancellationToken cancellationToken = default);
|
||||||
|
public Task<BaseRecipeLDto> GetBrewAsync(string recipeName , CancellationToken cancellationToken = default);
|
||||||
|
public Task AddBrewAsync(string recipeName,JsonDocument recipeObj, CancellationToken cancellationToken = default);
|
||||||
|
}
|
|
@ -0,0 +1,116 @@
|
||||||
|
using Newtonsoft.Json;
|
||||||
|
using System.Reflection;
|
||||||
|
using Brizco.Domain;
|
||||||
|
|
||||||
|
namespace Brizco.Core.EntityServices;
|
||||||
|
|
||||||
|
public class BrewService : IBrewService
|
||||||
|
{
|
||||||
|
private readonly IMartenRepositoryWrapper _martenRepositoryWrapper;
|
||||||
|
private readonly ICurrentUserService _currentUserService;
|
||||||
|
|
||||||
|
public BrewService(IMartenRepositoryWrapper martenRepositoryWrapper,ICurrentUserService currentUserService)
|
||||||
|
{
|
||||||
|
_martenRepositoryWrapper = martenRepositoryWrapper;
|
||||||
|
_currentUserService = currentUserService;
|
||||||
|
}
|
||||||
|
public async Task<object> GetLastBrewAsync(string recipeName, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"Brizco.Domain.MartenEntities.Recipes.{recipeName}");
|
||||||
|
if (type == null)
|
||||||
|
throw new AppException("Recipe not found", ApiResultStatusCode.NotFound);
|
||||||
|
if (_currentUserService.ComplexId == null)
|
||||||
|
throw new BaseApiException(ApiResultStatusCode.BadRequest,"Complex id is null");
|
||||||
|
if (!Guid.TryParse(_currentUserService.ComplexId, out Guid complexId))
|
||||||
|
throw new BaseApiException(ApiResultStatusCode.BadRequest, "Complex id is wrong");
|
||||||
|
|
||||||
|
var baseRecipe = await _martenRepositoryWrapper.SetRepository<BaseBrew>()
|
||||||
|
.GetEntityAsync(s => s.ComplexId == complexId && s.Name == recipeName, cancellationToken);
|
||||||
|
object? recipe;
|
||||||
|
if (baseRecipe == null)
|
||||||
|
recipe = Activator.CreateInstance(type);
|
||||||
|
else
|
||||||
|
recipe = JsonConvert.DeserializeObject(baseRecipe.CurrentBrewJson, type) ?? Activator.CreateInstance(type);
|
||||||
|
|
||||||
|
if (recipe == null)
|
||||||
|
throw new AppException("Recipe type or base is wrong");
|
||||||
|
|
||||||
|
return recipe;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task<BaseRecipeLDto> GetBrewAsync(string recipeName, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"Brizco.Domain.MartenEntities.Recipes.{recipeName}");
|
||||||
|
if (type == null)
|
||||||
|
throw new AppException("Recipe not found", ApiResultStatusCode.NotFound);
|
||||||
|
if (_currentUserService.ComplexId == null)
|
||||||
|
throw new BaseApiException(ApiResultStatusCode.BadRequest, "Complex id is null");
|
||||||
|
if (!Guid.TryParse(_currentUserService.ComplexId, out Guid complexId))
|
||||||
|
throw new BaseApiException(ApiResultStatusCode.BadRequest, "Complex id is wrong");
|
||||||
|
|
||||||
|
var baseRecipe = await _martenRepositoryWrapper.SetRepository<BaseBrew>()
|
||||||
|
.GetEntityAsync(s =>s.ComplexId==complexId && s.Name == recipeName, cancellationToken);
|
||||||
|
object? recipe;
|
||||||
|
if (baseRecipe == null)
|
||||||
|
{
|
||||||
|
recipe = Activator.CreateInstance(type);
|
||||||
|
baseRecipe = new BaseBrew();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
recipe = JsonConvert.DeserializeObject(baseRecipe.CurrentBrewJson, type) ?? Activator.CreateInstance(type);
|
||||||
|
|
||||||
|
if (recipe == null)
|
||||||
|
throw new AppException("Recipe type or base is wrong");
|
||||||
|
|
||||||
|
var pastRecipes = new List<object>();
|
||||||
|
foreach (var json in baseRecipe.PastBrewsJson)
|
||||||
|
{
|
||||||
|
var pastRecipe = JsonConvert.DeserializeObject(json, type) ?? Activator.CreateInstance(type);
|
||||||
|
if (pastRecipe != null)
|
||||||
|
pastRecipes.Add(pastRecipe);
|
||||||
|
}
|
||||||
|
|
||||||
|
var dto = new BaseRecipeLDto
|
||||||
|
{
|
||||||
|
CurrentRecipe = recipe,
|
||||||
|
Name = recipeName,
|
||||||
|
PastRecipes = pastRecipes
|
||||||
|
};
|
||||||
|
|
||||||
|
return dto;
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task AddBrewAsync(string recipeName, JsonDocument recipeObj, CancellationToken cancellationToken = default)
|
||||||
|
{
|
||||||
|
var type = Assembly.GetAssembly(typeof(DomainConfig))?.GetType($"Brizco.Domain.MartenEntities.Recipes.{recipeName}");
|
||||||
|
if (type == null)
|
||||||
|
throw new AppException("Recipe not found", ApiResultStatusCode.NotFound);
|
||||||
|
|
||||||
|
if (_currentUserService.ComplexId == null)
|
||||||
|
throw new BaseApiException(ApiResultStatusCode.BadRequest, "Complex id is null");
|
||||||
|
if (!Guid.TryParse(_currentUserService.ComplexId, out Guid complexId))
|
||||||
|
throw new BaseApiException(ApiResultStatusCode.BadRequest, "Complex id is wrong");
|
||||||
|
|
||||||
|
var baseRecipe = await _martenRepositoryWrapper.SetRepository<BaseBrew>()
|
||||||
|
.GetEntityAsync(s =>s.ComplexId == complexId && s.Name == recipeName, cancellationToken);
|
||||||
|
|
||||||
|
if (baseRecipe == null)
|
||||||
|
{
|
||||||
|
baseRecipe = new BaseBrew()
|
||||||
|
{
|
||||||
|
CurrentBrewJson = JsonConvert.SerializeObject(recipeObj.Deserialize(type)),
|
||||||
|
Name = recipeName,
|
||||||
|
DotnetType = type.FullName ?? $"Brizco.Domain.MartenEntities.Recipes.{recipeName}",
|
||||||
|
ComplexId = complexId
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
baseRecipe.PastBrewsJson.Add(baseRecipe.CurrentBrewJson);
|
||||||
|
baseRecipe.CurrentBrewJson = JsonConvert.SerializeObject(recipeObj.Deserialize(type));
|
||||||
|
}
|
||||||
|
|
||||||
|
await _martenRepositoryWrapper.SetRepository<BaseBrew>()
|
||||||
|
.AddOrUpdateEntityAsync(baseRecipe, cancellationToken);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,6 +1,4 @@
|
||||||
using Brizco.Domain.CommandQueries.Commands;
|
using Brizco.Domain.Entities.Shift;
|
||||||
using Brizco.Domain.CommandQueries.Queries;
|
|
||||||
using Brizco.Domain.Entities.Shift;
|
|
||||||
|
|
||||||
namespace Brizco.Core.EntityServices;
|
namespace Brizco.Core.EntityServices;
|
||||||
|
|
||||||
|
|
|
@ -1,9 +1,5 @@
|
||||||
using Brizco.Common.Extensions;
|
using Microsoft.AspNetCore.Mvc;
|
||||||
using Brizco.Common.Models.Api;
|
|
||||||
using Microsoft.AspNetCore.Http;
|
|
||||||
using Microsoft.AspNetCore.Mvc;
|
|
||||||
using Newtonsoft.Json;
|
using Newtonsoft.Json;
|
||||||
using Newtonsoft.Json.Linq;
|
|
||||||
|
|
||||||
namespace Brizco.Core.Models.Api;
|
namespace Brizco.Core.Models.Api;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<Project Sdk="Microsoft.NET.Sdk">
|
<Project Sdk="Microsoft.NET.Sdk">
|
||||||
|
|
||||||
<PropertyGroup>
|
<PropertyGroup>
|
||||||
<TargetFramework>net8.0</TargetFramework>
|
<TargetFramework>net8.0</TargetFramework>
|
||||||
<ImplicitUsings>enable</ImplicitUsings>
|
<ImplicitUsings>enable</ImplicitUsings>
|
||||||
<Nullable>enable</Nullable>
|
<Nullable>enable</Nullable>
|
||||||
|
|
|
@ -0,0 +1,10 @@
|
||||||
|
namespace Brizco.Domain.MartenEntities.Brews;
|
||||||
|
|
||||||
|
public class BaseBrew : MartenEntity
|
||||||
|
{
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
public string CurrentBrewJson { get; set; } = string.Empty;
|
||||||
|
public string DotnetType { get; set; } = string.Empty;
|
||||||
|
public List<string> PastBrewsJson { get; set; } = new();
|
||||||
|
public Guid ComplexId { get; set; }
|
||||||
|
}
|
|
@ -0,0 +1,8 @@
|
||||||
|
namespace Brizco.Domain.MartenEntities.Brews;
|
||||||
|
|
||||||
|
public class BaseRecipeLDto
|
||||||
|
{
|
||||||
|
public string Name { get; set; } = string.Empty;
|
||||||
|
public object CurrentRecipe { get; set; } = string.Empty;
|
||||||
|
public List<object> PastRecipes { get; set; } = new();
|
||||||
|
}
|
|
@ -0,0 +1,11 @@
|
||||||
|
namespace Brizco.Domain.MartenEntities.Brews;
|
||||||
|
|
||||||
|
public class CoffeeBrew
|
||||||
|
{
|
||||||
|
public DateTime LogAt { get; set; }
|
||||||
|
public string LogBy { get; set; } = string.Empty;
|
||||||
|
|
||||||
|
public float Ratio { get; set; }
|
||||||
|
public int ExtractionTime { get; set; }
|
||||||
|
public float FinalYield { get; set; }
|
||||||
|
}
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<PackageReference Include="Refit" Version="7.0.0" />
|
<PackageReference Include="Refit" Version="7.0.0" />
|
||||||
|
<PackageReference Include="Marten" Version="7.8.0" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
|
@ -23,14 +24,17 @@
|
||||||
<ItemGroup>
|
<ItemGroup>
|
||||||
<Using Include="Brizco.Common.Models" />
|
<Using Include="Brizco.Common.Models" />
|
||||||
<Using Include="Brizco.Common.Models.Api" />
|
<Using Include="Brizco.Common.Models.Api" />
|
||||||
|
<Using Include="Brizco.Common.Models.Entity" />
|
||||||
<Using Include="Brizco.Common.Models.Exception" />
|
<Using Include="Brizco.Common.Models.Exception" />
|
||||||
<Using Include="Brizco.Core.Abstracts" />
|
<Using Include="Brizco.Core.Abstracts" />
|
||||||
<Using Include="Brizco.Domain.Models.Settings" />
|
<Using Include="Brizco.Domain.Models.Settings" />
|
||||||
<Using Include="Brizco.Infrastructure.Models" />
|
<Using Include="Brizco.Infrastructure.Models" />
|
||||||
<Using Include="Brizco.Infrastructure.RestServices" />
|
<Using Include="Brizco.Infrastructure.RestServices" />
|
||||||
|
<Using Include="Brizco.Repository.Repositories.Marten" />
|
||||||
<Using Include="Microsoft.Extensions.Logging" />
|
<Using Include="Microsoft.Extensions.Logging" />
|
||||||
<Using Include="Microsoft.Extensions.Options" />
|
<Using Include="Microsoft.Extensions.Options" />
|
||||||
<Using Include="Refit" />
|
<Using Include="Refit" />
|
||||||
|
<Using Include="System.Linq.Expressions" />
|
||||||
</ItemGroup>
|
</ItemGroup>
|
||||||
|
|
||||||
</Project>
|
</Project>
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
using Marten;
|
||||||
|
|
||||||
|
namespace Brizco.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 entity, CancellationToken cancellation)
|
||||||
|
{
|
||||||
|
if (entity == null)
|
||||||
|
throw new AppException($"{nameof(entity)} is null", ApiResultStatusCode.BadRequest);
|
||||||
|
|
||||||
|
await using var session = _documentStore.LightweightSession();
|
||||||
|
session.Store(entity);
|
||||||
|
await session.SaveChangesAsync(cancellation);
|
||||||
|
}
|
||||||
|
|
||||||
|
public async Task RemoveEntityAsync(TMartenEntity entity, CancellationToken cancellation)
|
||||||
|
{
|
||||||
|
if (entity == null)
|
||||||
|
throw new AppException($"{nameof(entity)} is null", ApiResultStatusCode.BadRequest);
|
||||||
|
await using var session = _documentStore.LightweightSession();
|
||||||
|
session.Delete(entity);
|
||||||
|
await session.SaveChangesAsync(cancellation);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
using Marten;
|
||||||
|
|
||||||
|
namespace Brizco.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);
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
using System.Linq.Expressions;
|
||||||
|
|
||||||
|
namespace Brizco.Repository.Repositories.Marten;
|
||||||
|
|
||||||
|
public interface IMartenRepository<TMartenEntity> : IScopedDependency where TMartenEntity : IMartenEntity
|
||||||
|
{
|
||||||
|
Task<List<TMartenEntity>> GetEntitiesAsync(CancellationToken cancellation = default);
|
||||||
|
Task<List<TMartenEntity>> GetEntitiesAsync(Expression<Func<TMartenEntity, bool>> expression, CancellationToken cancellation = default);
|
||||||
|
|
||||||
|
Task<TMartenEntity> GetEntityAsync(Guid id, CancellationToken cancellation = default);
|
||||||
|
Task<TMartenEntity?> GetEntityAsync(Expression<Func<TMartenEntity, bool>> expression, CancellationToken cancellation = default);
|
||||||
|
|
||||||
|
Task AddOrUpdateEntityAsync(TMartenEntity entity, CancellationToken cancellation = default);
|
||||||
|
Task RemoveEntityAsync(TMartenEntity entity, CancellationToken cancellation = default);
|
||||||
|
}
|
|
@ -0,0 +1,6 @@
|
||||||
|
namespace Brizco.Repository.Repositories.Marten;
|
||||||
|
|
||||||
|
public interface IMartenRepositoryWrapper : IScopedDependency
|
||||||
|
{
|
||||||
|
IMartenRepository<TMartenEntity> SetRepository<TMartenEntity>() where TMartenEntity : IMartenEntity;
|
||||||
|
}
|
Loading…
Reference in New Issue