Rebadge the rest of the files

This commit is contained in:
lumijiez
2025-06-03 18:24:40 +03:00
parent 1b6f69fcf9
commit 6a675ac111
77 changed files with 5931 additions and 0 deletions

View File

@@ -0,0 +1,46 @@
using Imprink.Application.Products.Commands;
using Imprink.Application.Products.Dtos;
using Imprink.Application.Products.Queries;
using MediatR;
using Microsoft.AspNetCore.Mvc;
namespace Imprink.WebApi.Controllers;
[ApiController]
[Route("api/[controller]")]
public class CategoriesController(IMediator mediator) : ControllerBase
{
[HttpGet]
public async Task<ActionResult<IEnumerable<CategoryDto>>> GetCategories(
[FromQuery] bool? isActive = null,
[FromQuery] bool rootCategoriesOnly = false)
{
var query = new GetCategoriesQuery
{
IsActive = isActive,
RootCategoriesOnly = rootCategoriesOnly
};
var result = await mediator.Send(query);
return Ok(result);
}
[HttpPost]
public async Task<ActionResult<CategoryDto>> CreateCategory([FromBody] CreateCategoryCommand command)
{
var result = await mediator.Send(command);
return CreatedAtAction(nameof(CreateCategory), new { id = result.Id }, result);
}
[HttpDelete("{id:guid}")]
public async Task<ActionResult> DeleteCategory(Guid id)
{
var command = new DeleteCategoryCommand { Id = id };
var result = await mediator.Send(command);
if (!result)
return NotFound();
return NoContent();
}
}

View File

@@ -0,0 +1,48 @@
using Imprink.Application.Products.Commands;
using Imprink.Application.Products.Dtos;
using Imprink.Application.Products.Queries;
using MediatR;
using Microsoft.AspNetCore.Mvc;
namespace Imprink.WebApi.Controllers;
[ApiController]
[Route("api/[controller]")]
public class ProductVariantsController(IMediator mediator) : ControllerBase
{
[HttpGet]
public async Task<ActionResult<IEnumerable<ProductVariantDto>>> GetProductVariants(
[FromQuery] Guid? productId = null,
[FromQuery] bool? isActive = null,
[FromQuery] bool inStockOnly = false)
{
var query = new GetProductVariantsQuery
{
ProductId = productId,
IsActive = isActive,
InStockOnly = inStockOnly
};
var result = await mediator.Send(query);
return Ok(result);
}
[HttpPost]
public async Task<ActionResult<ProductVariantDto>> CreateProductVariant([FromBody] CreateProductVariantCommand command)
{
var result = await mediator.Send(command);
return CreatedAtAction(nameof(CreateProductVariant), new { id = result.Id }, result);
}
[HttpDelete("{id:guid}")]
public async Task<ActionResult> DeleteProductVariant(Guid id)
{
var command = new DeleteProductVariantCommand { Id = id };
var result = await mediator.Send(command);
if (!result)
return NotFound();
return NoContent();
}
}

View File

@@ -0,0 +1,65 @@
using Imprink.Application.Products.Commands;
using Imprink.Application.Products.Dtos;
using Imprink.Application.Products.Queries;
using Imprink.Domain.Common.Models;
using MediatR;
using Microsoft.AspNetCore.Mvc;
namespace Imprink.WebApi.Controllers;
[ApiController]
[Route("api/[controller]")]
public class ProductsController(IMediator mediator) : ControllerBase
{
[HttpGet]
public async Task<ActionResult<PagedResultDto<ProductDto>>> GetProducts(
[FromQuery] int pageNumber = 1,
[FromQuery] int pageSize = 10,
[FromQuery] string? searchTerm = null,
[FromQuery] Guid? categoryId = null,
[FromQuery] decimal? minPrice = null,
[FromQuery] decimal? maxPrice = null,
[FromQuery] bool? isActive = true,
[FromQuery] bool? isCustomizable = null,
[FromQuery] string sortBy = "Name",
[FromQuery] string sortDirection = "ASC")
{
var filterParameters = new ProductFilterParameters
{
PageNumber = pageNumber,
PageSize = pageSize,
SearchTerm = searchTerm,
CategoryId = categoryId,
MinPrice = minPrice,
MaxPrice = maxPrice,
IsActive = isActive,
IsCustomizable = isCustomizable,
SortBy = sortBy,
SortDirection = sortDirection
};
var query = new GetProductsQuery { FilterParameters = filterParameters };
var result = await mediator.Send(query);
return Ok(result);
}
[HttpPost]
public async Task<ActionResult<ProductDto>> CreateProduct([FromBody] CreateProductCommand command)
{
var result = await mediator.Send(command);
return CreatedAtAction(nameof(CreateProduct), new { id = result.Id }, result);
}
[HttpDelete("{id:guid}")]
public async Task<ActionResult> DeleteProduct(Guid id)
{
var command = new DeleteProductCommand { Id = id };
var result = await mediator.Send(command);
if (!result)
return NotFound();
return NoContent();
}
}

View File

@@ -0,0 +1,24 @@
<Project Sdk="Microsoft.NET.Sdk.Web">
<PropertyGroup>
<TargetFramework>net9.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
</PropertyGroup>
<ItemGroup>
<PackageReference Include="MediatR" Version="12.5.0" />
<PackageReference Include="Microsoft.AspNetCore.OpenApi" Version="9.0.0" />
<PackageReference Include="Microsoft.EntityFrameworkCore.Design" Version="9.0.4">
<IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets>
<PrivateAssets>all</PrivateAssets>
</PackageReference>
<PackageReference Include="Swashbuckle.AspNetCore" Version="8.1.1" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\Imprink.Application\Imprink.Application.csproj" />
<ProjectReference Include="..\Imprink.Infrastructure\Imprink.Infrastructure.csproj" />
</ItemGroup>
</Project>

View File

@@ -0,0 +1,11 @@
using Imprink.WebApi;
var builder = WebApplication.CreateBuilder(args);
Startup.ConfigureServices(builder);
var app = builder.Build();
Startup.Configure(app, app.Environment);
app.Run();

View File

@@ -0,0 +1,23 @@
{
"$schema": "https://json.schemastore.org/launchsettings.json",
"profiles": {
"http": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "http://localhost:5220",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
},
"https": {
"commandName": "Project",
"dotnetRunMessages": true,
"launchBrowser": false,
"applicationUrl": "https://localhost:7277;http://localhost:5220",
"environmentVariables": {
"ASPNETCORE_ENVIRONMENT": "Development"
}
}
}
}

View File

@@ -0,0 +1,128 @@
using Imprink.Application;
using Imprink.Application.Products.Handlers;
using Imprink.Domain.Entities.Users;
using Imprink.Domain.Repositories;
using Imprink.Infrastructure;
using Imprink.Infrastructure.Database;
using Imprink.Infrastructure.Repositories;
using Microsoft.AspNetCore.Identity;
using Microsoft.EntityFrameworkCore;
namespace Imprink.WebApi;
public static class Startup
{
public static void ConfigureServices(WebApplicationBuilder builder)
{
var services = builder.Services;
services.AddScoped<IProductRepository, ProductRepository>();
services.AddScoped<IProductVariantRepository, ProductVariantRepository>();
services.AddScoped<ICategoryRepository, CategoryRepository>();
services.AddScoped<IUnitOfWork, UnitOfWork>();
services.AddDbContext<ApplicationDbContext>(options =>
options.UseSqlServer(
builder.Configuration.GetConnectionString("DefaultConnection"),
b => b.MigrationsAssembly(typeof(ApplicationDbContext).Assembly.FullName)));
services.AddMediatR(cfg =>
{
cfg.RegisterServicesFromAssembly(typeof(CreateProductHandler).Assembly);
});
services.AddIdentity<ApplicationUser, ApplicationRole>(options =>
{
options.Password.RequireDigit = true;
options.Password.RequireLowercase = true;
options.Password.RequireUppercase = true;
options.Password.RequireNonAlphanumeric = true;
options.Password.RequiredLength = 8;
options.Password.RequiredUniqueChars = 1;
options.Lockout.DefaultLockoutTimeSpan = TimeSpan.FromMinutes(30);
options.Lockout.MaxFailedAccessAttempts = 5;
options.Lockout.AllowedForNewUsers = true;
options.User.AllowedUserNameCharacters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789-._@+";
options.User.RequireUniqueEmail = true;
options.SignIn.RequireConfirmedEmail = true;
options.SignIn.RequireConfirmedPhoneNumber = false;
})
.AddEntityFrameworkStores<ApplicationDbContext>()
.AddDefaultTokenProviders();
services.ConfigureApplicationCookie(options =>
{
options.Cookie.HttpOnly = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(60);
options.LoginPath = "/Account/Login";
options.AccessDeniedPath = "/Account/AccessDenied";
options.SlidingExpiration = true;
});
services.Configure<DataProtectionTokenProviderOptions>(options =>
{
options.TokenLifespan = TimeSpan.FromHours(24);
});
services.AddAuthorizationBuilder()
.AddPolicy("AdminPolicy", policy =>
policy.RequireRole("Administrator"))
.AddPolicy("OrderManagementPolicy", policy =>
policy.RequireRole("Administrator", "OrderManager"))
.AddPolicy("ProductManagementPolicy", policy =>
policy.RequireRole("Administrator", "ProductManager"))
.AddPolicy("CustomerPolicy", policy =>
policy.RequireRole("Customer", "Administrator", "OrderManager", "ProductManager"));
services.AddControllers();
services.AddSwaggerGen();
}
public static void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (app is WebApplication application)
{
using var scope = application.Services.CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
try
{
dbContext.Database.Migrate();
Console.WriteLine("Database migrations applied successfully");
}
catch (Exception ex)
{
Console.WriteLine($"An error occurred while applying migrations: {ex.Message}");
}
}
// if (env.IsDevelopment())
// {
// app.UseSwagger();
// app.UseSwaggerUI();
// app.UseDeveloperExceptionPage();
// }
// else
// {
// app.UseExceptionHandler("/Error");
// app.UseHsts();
// app.UseHttpsRedirection();
// }
app.UseSwagger();
app.UseSwaggerUI();
app.UseDeveloperExceptionPage();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}

View File

@@ -0,0 +1,15 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Debug",
"Microsoft.EntityFrameworkCore": "Information"
}
},
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=Printbase;Encrypt=false;Trusted_Connection=True;TrustServerCertificate=true;MultipleActiveResultSets=true;"
},
"DatabaseOptions": {
"ApplyMigrationsAtStartup": true
}
}

View File

@@ -0,0 +1,15 @@
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Debug",
"Microsoft.EntityFrameworkCore": "Information"
}
},
"ConnectionStrings": {
"DefaultConnection": "Server=localhost;Database=Printbase;Encrypt=false;TrustServerCertificate=true;Trusted_Connection=True;MultipleActiveResultSets=true;"
},
"DatabaseOptions": {
"ApplyMigrationsAtStartup": true
}
}