# Definieren des Basisverzeichnisses der Solution $solutionRoot = Get-Location Write-Host "Starte Dateierstellung im Verzeichnis: $solutionRoot" -ForegroundColor Green # --- Hilfsfunktionen --- function New-CSharpFile { param ( [string]$ProjectName, [string]$RelativePath, # Pfad relativ zum Projekt (z.B. "Controllers/Admin") [string]$FileName, [string]$Type, # "class" oder "interface" [string]$BaseNamespace # Z.B. "Webshop.Application" ) # Korrigierte Join-Path-Verwendung: Kein "src" hier, da Projekte direkt unter solutionRoot liegen $projectSpecificDir = Join-Path -Path $solutionRoot -ChildPath $ProjectName # Wenn RelativePath leer ist, ist fullDirPath gleich projectSpecificDir if ([string]::IsNullOrEmpty($RelativePath)) { $fullDirPath = $projectSpecificDir } else { $fullDirPath = Join-Path -Path $projectSpecificDir -ChildPath $RelativePath } $fullFilePath = Join-Path -Path $fullDirPath -ChildPath $FileName # Sicherstellen, dass der Zielordner existiert if (-not (Test-Path $fullDirPath)) { New-Item -ItemType Directory -Path $fullDirPath -Force | Out-Null Write-Host "Ordner erstellt: $fullDirPath" -ForegroundColor DarkGray } # Den vollständigen Namespace berechnen (z.B. Webshop.Application.Services.Admin) $fullNamespace = $BaseNamespace if (-not [string]::IsNullOrEmpty($RelativePath)) { $namespaceParts = $RelativePath.Replace('/', '.') $fullNamespace = "$BaseNamespace.$namespaceParts" } $nameWithoutExtension = [System.IO.Path]::GetFileNameWithoutExtension($FileName) $fileContent = "" # Initialisiere als leeren String # Standard-Usings, die fast immer benötigt werden $commonUsings = @" using System; using System.Collections.Generic; using System.Threading.Tasks; "@ # Spezielle Inhalte für Controller if ($ProjectName -eq "Webshop.Api" -and $RelativePath.StartsWith("Controllers")) { $controllerSpecificUsings = "" # Korrektur der Route: Das letzte Segment des RelativePath wird als Basis für den Controller-Namen verwendet $routeBaseSegment = $RelativePath.Split('/')[-1].ToLower() # Wenn es sich um einen Top-Level Controller handelt (z.B. AuthController direkt in Controllers, nicht in Unterordner) # AuthController wird manuell gehandhabt, da die Route `api/v1/[controller]` ist. # Alle anderen Controller in Unterordnern haben `api/v1/subfolder/[controller]` if ($routeBaseSegment -eq "controllers") { # Dies sollte eigentlich nicht mehr vorkommen nach der Umstrukturierung $controllerAttributes = "[ApiController]`n [Route(`"api/v1/[controller]"")]" } else { $controllerAttributes = "[ApiController]`n [Route(`"api/v1/$routeBaseSegment/[controller]"")]" } # Autorisierungsattribute if ($RelativePath -like "*Admin") { $controllerSpecificUsings += "using Microsoft.AspNetCore.Authorization;`n" $controllerAttributes += "`n [Authorize(Roles = `"Admin`")]" } elseif ($RelativePath -like "*Customer") { $controllerSpecificUsings += "using Microsoft.AspNetCore.Authorization;`n" $controllerAttributes += "`n [Authorize(Roles = `"Customer`")]" } elseif ($RelativePath -like "*Public") { $controllerSpecificUsings += "using Microsoft.AspNetCore.Authorization;`n" $controllerAttributes += "`n [AllowAnonymous]" } # Bei Auth-Controllern keine Autorisierung als Standard, und Route spezifisch if ($RelativePath -eq "Controllers/Auth") { $controllerAttributes = "[ApiController]`n [Route(`"api/v1/[controller]"")]" # Auth-Controller haben oft eine eigene Route $controllerSpecificUsings += "using Microsoft.AspNetCore.Authorization;`n" # Trotzdem für AllowAnonymous $controllerSpecificUsings += "using Webshop.Application.DTOs.Auth;`nusing Webshop.Application.Services.Auth;`n" $controllerContentBody = @" private readonly IAuthService _authService; public AuthController(IAuthService authService) { _authService = authService; } [HttpPost(""register"")] [AllowAnonymous] public async Task Register([FromBody] RegisterRequestDto request) { if (!ModelState.IsValid) return BadRequest(ModelState); var result = await _authService.RegisterUserAsync(request); if (!result.IsAuthSuccessful) return BadRequest(new { Message = result.ErrorMessage }); return Ok(result); } [HttpPost(""login/customer"")] [AllowAnonymous] public async Task LoginCustomer([FromBody] LoginRequestDto request) { if (!ModelState.IsValid) return BadRequest(ModelState); var result = await _authService.LoginUserAsync(request); if (!result.IsAuthSuccessful) return Unauthorized(new { Message = result.ErrorMessage }); return Ok(result); } [HttpPost(""login/admin"")] [AllowAnonymous] public async Task LoginAdmin([FromBody] LoginRequestDto request) { if (!ModelState.IsValid) return BadRequest(ModelState); var result = await _authService.LoginAdminAsync(request); if (!result.IsAuthSuccessful) return Unauthorized(new { Message = result.ErrorMessage }); return Ok(result); } "@ } # End AuthController elseif ($RelativePath -eq "Controllers/Public" -and $nameWithoutExtension -eq "ProductsController") { $controllerSpecificUsings += "using Webshop.Application.DTOs;`nusing Webshop.Application.Services.Public;`n" $controllerContentBody = @" private readonly ProductService _productService; // ServiceName nach Ihrer Konvention beibehalten public ProductsController(ProductService productService) { _productService = productService; } [HttpGet] public async Task>> GetAllProducts() { var products = await _productService.GetAllProductsAsync(); return Ok(products); } "@ } # End ProductsController (Public) elseif ($RelativePath -eq "Controllers/Admin" -and $nameWithoutExtension -eq "AdminProductsController") { $controllerSpecificUsings += "using Webshop.Application.DTOs;`nusing Webshop.Application.Services.Admin;`n" $controllerContentBody = @" private readonly AdminProductService _adminProductService; public AdminProductsController(AdminProductService adminProductService) { _adminProductService = adminProductService; } [HttpGet] public async Task>> GetAdminProducts() { var products = await _adminProductService.GetAllAdminProductsAsync(); return Ok(products); } [HttpGet(""{id}"")] public async Task> GetAdminProduct(Guid id) { var product = await _adminProductService.GetAdminProductByIdAsync(id); if (product == null) return NotFound(); return Ok(product); } [HttpPost] public async Task> CreateAdminProduct([FromBody] AdminProductDto productDto) { if (!ModelState.IsValid) return BadRequest(ModelState); var createdProduct = await _adminProductService.CreateAdminProductAsync(productDto); return CreatedAtAction(nameof(GetAdminProduct), new { id = createdProduct.Id }, createdProduct); } [HttpPut(""{id}"")] public async Task UpdateAdminProduct(Guid id, [FromBody] AdminProductDto productDto) { if (id != productDto.Id) return BadRequest(); if (!ModelState.IsValid) return BadRequest(ModelState); var success = await _adminProductService.UpdateAdminProductAsync(productDto); if (!success) return NotFound(); return NoContent(); } [HttpDelete(""{id}"")] public async Task DeleteAdminProduct(Guid id) { var success = await _adminProductService.DeleteAdminProductAsync(id); if (!success) return NotFound(); return NoContent(); } "@ } # End AdminProductsController elseif ($RelativePath -eq "Controllers/Admin" -and $nameWithoutExtension -eq "AdminUsersController") { $controllerSpecificUsings += "using Webshop.Application.DTOs.Users;`nusing Webshop.Application.Services.Admin;`n" $controllerContentBody = @" private readonly AdminUserService _adminUserService; public AdminUsersController(AdminUserService adminUserService) { _adminUserService = adminUserService; } [HttpGet] public async Task>> GetAllUsers() { var users = await _adminUserService.GetAllUsersAsync(); return Ok(users); } [HttpGet(""{userId}"")] public async Task> GetUserById(string userId) { var user = await _adminUserService.GetUserByIdAsync(userId); if (user == null) return NotFound(); return Ok(user); } "@ } # End AdminUsersController elseif ($RelativePath -eq "Controllers/Admin" -and $nameWithoutExtension -eq "AdminSuppliersController") { $controllerSpecificUsings += "using Webshop.Application.DTOs;`nusing Webshop.Application.Services.Admin;`n" $controllerContentBody = @" private readonly AdminSupplierService _adminSupplierService; public AdminSuppliersController(AdminSupplierService adminSupplierService) { _adminSupplierService = adminSupplierService; } [HttpGet] public async Task>> GetAllSuppliers() { var suppliers = await _adminSupplierService.GetAllSuppliersAsync(); return Ok(suppliers); } [HttpPost] public async Task> CreateSupplier([FromBody] SupplierDto supplierDto) { if (!ModelState.IsValid) return BadRequest(ModelState); var createdSupplier = await _adminSupplierService.CreateSupplierAsync(supplierDto); return CreatedAtAction(nameof(GetSupplierById), new { id = createdSupplier.Id }, createdSupplier); } [HttpGet(""{id}"")] public async Task> GetSupplierById(Guid id) { var supplier = await _adminSupplierService.GetSupplierByIdAsync(id); if (supplier == null) return NotFound(); return Ok(supplier); } "@ } # End AdminSuppliersController elseif ($RelativePath -eq "Controllers/Customer" -and $nameWithoutExtension -eq "OrdersController") { $controllerContentBody = @" [HttpGet(""my-orders"")] public async Task GetMyOrders() { return Ok(new { Message = ""Dies ist Ihr persönlicher Bestellverlauf (Platzhalter)."" }); } "@ } # End OrdersController (Customer) # Weitere Controller-Inhalte können hier hinzugefügt werden $fileContent = @" // Auto-generiert von CreateWebshopFiles.ps1 using Microsoft.AspNetCore.Mvc; $controllerSpecificUsings $commonUsings namespace $fullNamespace { $controllerAttributes public class $nameWithoutExtension : ControllerBase { $controllerContentBody } } "@ } # Ende Controller Sektion # Spezielle Inhalte für Repositories (Basiskonstruktor) elseif ($ProjectName -eq "Webshop.Infrastructure" -and $RelativePath -eq "Repositories" -and $Type -eq "class") { $interfaceName = "I" + $nameWithoutExtension $fileContent = @" // Auto-generiert von CreateWebshopFiles.ps1 using Microsoft.EntityFrameworkCore; using Webshop.Domain.Entities; using Webshop.Domain.Interfaces; using Webshop.Infrastructure.Data; $commonUsings namespace $fullNamespace { public class $nameWithoutExtension : $interfaceName { private readonly ApplicationDbContext _context; public $nameWithoutExtension(ApplicationDbContext context) { _context = context; } // Fügen Sie hier Repository-Methoden hinzu // Beispiel: // public async Task> GetAllAsync() { return await _context.Set().ToListAsync(); } // public async Task GetByIdAsync(Guid id) { return await _context.Set().FindAsync(id); } // public async Task AddAsync(T entity) { _context.Set().Add(entity); await _context.SaveChangesAsync(); } // public async Task UpdateAsync(T entity) { _context.Set().Update(entity); await _context.SaveChangesAsync(); } // public async Task DeleteAsync(Guid id) { var entity = await _context.Set().FindAsync(id); if (entity != null) { _context.Set().Remove(entity); await _context.SaveChangesAsync(); } } } } "@ } # Ende Repositories Sektion # Spezielle Inhalte für Services (Basiskonstruktor und Interface-Implementierung) elseif ($ProjectName -eq "Webshop.Application" -and $RelativePath.StartsWith("Services") -and $Type -eq "class") { $interfaceName = "I" + $nameWithoutExtension $serviceSpecificUsings = "" $serviceContentBody = @" // Fügen Sie hier Abhängigkeiten per Dependency Injection hinzu (z.B. Repositories) // public $nameWithoutExtension(IYourRepository repository) { } // Fügen Sie hier Service-Methoden hinzu "@ # Abhängigkeiten und spezifischer Content für AuthService if ($nameWithoutExtension -eq "AuthService") { $serviceSpecificUsings += "using Microsoft.AspNetCore.Identity;`nusing Microsoft.Extensions.Configuration;`nusing Microsoft.IdentityModel.Tokens;`nusing System.IdentityModel.Tokens.Jwt;`nusing System.Security.Claims;`nusing System.Text;`n" $serviceSpecificUsings += "using Webshop.Application.DTOs.Auth;`n" $serviceContentBody = @" private readonly UserManager _userManager; private readonly SignInManager _signInManager; private readonly IConfiguration _configuration; private readonly RoleManager _roleManager; public AuthService( UserManager userManager, SignInManager signInManager, IConfiguration configuration, RoleManager roleManager) { _userManager = userManager; _signInManager = signInManager; _configuration = configuration; _roleManager = roleManager; } // HIER KOMMT DER VORHERIGE AUTHSERVICE CODE HIN (Register, LoginUser, LoginAdmin, GenerateJwtToken) // DIESER TEIL IST ZU LANG FÜR DIE PS1, ABER WIRD MANUELL EINGEFÜGT. // Die Methoden Signaturen müssen mit IAuthService übereinstimmen! // Hier sind Platzhalter-Implementierungen, die Sie durch den vollständigen Code ersetzen müssen: public async Task RegisterUserAsync(RegisterRequestDto request) { return new AuthResponseDto { IsAuthSuccessful = false, ErrorMessage = ""Not implemented"" }; } public async Task LoginUserAsync(LoginRequestDto request) { return new AuthResponseDto { IsAuthSuccessful = false, ErrorMessage = ""Not implemented"" }; } public async Task LoginAdminAsync(LoginRequestDto request) { return new AuthResponseDto { IsAuthSuccessful = false, ErrorMessage = ""Not implemented"" }; } private Task GenerateJwtToken(IdentityUser user, IList roles) { return Task.FromResult(""""); } "@ } # End AuthService specific content # Abhängigkeiten und spezifischer Content für AdminProductService elseif ($nameWithoutExtension -eq "AdminProductService") { $serviceSpecificUsings += "using Webshop.Application.DTOs;`n" # AdminProductDto $serviceSpecificUsings += "using Webshop.Domain.Entities;`nusing Webshop.Domain.Interfaces;`n" # Entities, IProductRepository $serviceContentBody = @" private readonly IProductRepository _productRepository; public AdminProductService(IProductRepository productRepository) { _productRepository = productRepository; } // HIER KOMMT DER VORHERIGE ADMINPRODUCTSERVICE CODE HIN (GetAllAdminProductsAsync, CreateAdminProductAsync etc.) // Hier sind Platzhalter-Implementierungen, die Sie durch den vollständigen Code ersetzen müssen: public async Task> GetAllAdminProductsAsync() { return new List(); } public async Task GetAdminProductByIdAsync(Guid id) { return null; } public async Task CreateAdminProductAsync(AdminProductDto productDto) { return null; } public async Task UpdateAdminProductAsync(AdminProductDto productDto) { return false; } public async Task DeleteAdminProductAsync(Guid id) { return false; } "@ } # End AdminProductService specific content # Abhängigkeiten und spezifischer Content für AdminUserService elseif ($nameWithoutExtension -eq "AdminUserService") { $serviceSpecificUsings += "using Webshop.Application.DTOs.Users;`n" # UserDto $serviceSpecificUsings += "using Microsoft.AspNetCore.Identity;`nusing Microsoft.EntityFrameworkCore;`n" # UserManager, ToListAsync $serviceContentBody = @" private readonly UserManager _userManager; public AdminUserService(UserManager userManager) { _userManager = userManager; } // HIER KOMMT DER VORHERIGE ADMINUSERSERVICE CODE HIN (GetAllUsersAsync, GetUserByIdAsync etc.) // Hier sind Platzhalter-Implementierungen, die Sie durch den vollständigen Code ersetzen müssen: public async Task> GetAllUsersAsync() { return new List(); } public async Task GetUserByIdAsync(string userId) { return null; } "@ } # End AdminUserService specific content # Abhängigkeiten und spezifischer Content für ProductService (Public) elseif ($nameWithoutExtension -eq "ProductService" -and $RelativePath -eq "Services/Public") { $serviceSpecificUsings += "using Webshop.Application.DTOs;`n" # ProductDto $serviceSpecificUsings += "using Webshop.Domain.Interfaces;`n" # IProductRepository $serviceSpecificUsings += "using Webshop.Domain.Entities;`n" # Product Entity $serviceContentBody = @" private readonly IProductRepository _productRepository; public ProductService(IProductRepository productRepository) { _productRepository = productRepository; } // HIER KOMMT DER VORHERIGE PRODUCTSERVICE CODE HIN (GetAllProductsAsync, CreateProductAsync etc.) // Hier sind Platzhalter-Implementierungen, die Sie durch den vollständigen Code ersetzen müssen: public async Task> GetAllProductsAsync() { return new List(); } public async Task CreateProductAsync(ProductDto productDto) { return null; } "@ } # End ProductService specific content # Abhängigkeiten und spezifischer Content für AdminSupplierService elseif ($nameWithoutExtension -eq "AdminSupplierService") { $serviceSpecificUsings += "using Webshop.Application.DTOs;`n" # SupplierDto $serviceSpecificUsings += "using Webshop.Domain.Entities;`nusing Webshop.Domain.Interfaces;`n" # Entities, ISupplierRepository $serviceContentBody = @" private readonly ISupplierRepository _supplierRepository; public AdminSupplierService(ISupplierRepository supplierRepository) { _supplierRepository = supplierRepository; } // HIER KOMMT DER VORHERIGE ADMINSUPPLIERSERVICE CODE HIN (GetAllSuppliersAsync, CreateSupplierAsync etc.) // Hier sind Platzhalter-Implementierungen, die Sie durch den vollständigen Code ersetzen müssen: public async Task> GetAllSuppliersAsync() { return new List(); } public async Task GetSupplierByIdAsync(Guid id) { return null; } public async Task CreateSupplierAsync(SupplierDto supplierDto) { return null; } "@ } # End AdminSupplierService specific content $fileContent = @" // Auto-generiert von CreateWebshopFiles.ps1 $commonUsings $serviceSpecificUsings namespace $fullNamespace { public class $nameWithoutExtension : $interfaceName { $serviceContentBody } } "@ } # Ende Services Sektion # Spezielle Inhalte für Interfaces (leere Implementierung) elseif ($Type -eq "interface") { $interfaceSpecificUsings = "" $fileContentBody = "// Fügen Sie hier Methodensignaturen hinzu" # Standard-Inhalt für Interface if ($ProjectName -eq "Webshop.Domain" -and $RelativePath -eq "Interfaces") { $interfaceSpecificUsings += "using Webshop.Domain.Entities;`n" # Beispiel für IProductRepository Methoden if ($nameWithoutExtension -eq "IProductRepository") { $fileContentBody = @" Task GetProductByIdAsync(Guid id); Task> GetAllProductsAsync(); Task AddProductAsync(Product product); Task UpdateProductAsync(Product product); Task DeleteProductAsync(Guid id); "@ } elseif ($nameWithoutExtension -eq "ISupplierRepository") { $fileContentBody = @" Task> GetAllSuppliersAsync(); Task GetSupplierByIdAsync(Guid id); Task AddSupplierAsync(Supplier supplier); Task UpdateSupplierAsync(Supplier supplier); Task DeleteSupplierAsync(Guid id); "@ } # Weitere Repository-Interfaces hier } elseif ($ProjectName -eq "Webshop.Application" -and $RelativePath -like "Services/*") { $interfaceSpecificUsings += "using Webshop.Application.DTOs;`n" $interfaceSpecificUsings += "using Webshop.Application.DTOs.Auth;`n" $interfaceSpecificUsings += "using Webshop.Application.DTOs.Users;`n" # Beispiel für IAuthService if ($nameWithoutExtension -eq "IAuthService") { $fileContentBody = @" Task RegisterUserAsync(RegisterRequestDto request); Task LoginUserAsync(LoginRequestDto request); Task LoginAdminAsync(LoginRequestDto request); "@ } } $fileContent = @" // Auto-generiert von CreateWebshopFiles.ps1 $commonUsings $interfaceSpecificUsings namespace $fullNamespace { public interface $nameWithoutExtension { $fileContentBody } } "@ } # Ende Interfaces Sektion # Spezielle Inhalte für DTOs elseif ($ProjectName -eq "Webshop.Application" -and $RelativePath.StartsWith("DTOs") -and $Type -eq "class") { $extraUsings = "" $properties = @" public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = string.Empty; // Fügen Sie hier weitere Eigenschaften hinzu "@ if ($nameWithoutExtension -eq "ProductDto") { $properties = @" public Guid Id { get; set; } public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public string SKU { get; set; } = string.Empty; public decimal Price { get; set; } public bool IsActive { get; set; } public bool IsInStock { get; set; } public int StockQuantity { get; set; } public string? ImageUrl { get; set; } "@ } elseif ($nameWithoutExtension -eq "AdminProductDto") { $properties = @" public Guid Id { get; set; } public string Name { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public string SKU { get; set; } = string.Empty; public decimal Price { get; set; } public decimal? OldPrice { get; set; } public bool IsActive { get; set; } = true; public bool IsInStock { get; set; } = true; public int StockQuantity { get; set; } public decimal? Weight { get; set; } public string? ImageUrl { get; set; } public string Slug { get; set; } = string.Empty; public DateTimeOffset CreatedDate { get; set; } = DateTimeOffset.UtcNow; public DateTimeOffset? LastModifiedDate { get; set; } public Guid? SupplierId { get; set; } public decimal? PurchasePrice { get; set; } "@ } elseif ($nameWithoutExtension -eq "SupplierDto") { $properties = @" public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = string.Empty; public string? ContactPerson { get; set; } public string? Email { get; set; } public string? PhoneNumber { get; set; } public Guid? AddressId { get; set; } public string? Notes { get; set; } "@ } elseif ($nameWithoutExtension -eq "LoginRequestDto" -or $nameWithoutExtension -eq "RegisterRequestDto") { $extraUsings += "using System.ComponentModel.DataAnnotations;`n" if ($nameWithoutExtension -eq "LoginRequestDto") { $properties = @" [Required(ErrorMessage = `"E-Mail ist erforderlich.`")] [EmailAddress(ErrorMessage = `"Ungültiges E-Mail-Format.`")] public string Email { get; set; } = string.Empty; [Required(ErrorMessage = `"Passwort ist erforderlich.`")] public string Password { get; set; } = string.Empty; "@ } elseif ($nameWithoutExtension -eq "RegisterRequestDto") { $properties = @" [Required(ErrorMessage = `"E-Mail ist erforderlich.`")] [EmailAddress(ErrorMessage = `"Ungültiges E-Mail-Format.`")] public string Email { get; set; } = string.Empty; [Required(ErrorMessage = `"Passwort ist erforderlich.`")] [MinLength(6, ErrorMessage = `"Passwort muss mindestens 6 Zeichen lang sein.`")] public string Password { get; set; } = string.Empty; [Required(ErrorMessage = `"Passwortbestätigung ist erforderlich.`")] [Compare(`"Password`", ErrorMessage = `"Passwörter stimmen nicht überein.`")] public string ConfirmPassword { get; set; } = string.Empty; public string? FirstName { get; set; } public string? LastName { get; set; } "@ } } elseif ($nameWithoutExtension -eq "AuthResponseDto") { $properties = @" public bool IsAuthSuccessful { get; set; } public string ErrorMessage { get; set; } = string.Empty; public string Token { get; set; } = string.Empty; public string UserId { get; set; } = string.Empty; public string Email { get; set; } = string.Empty; public List Roles { get; set; } = new List(); "@ } elseif ($nameWithoutExtension -eq "UserDto") { $properties = @" public string Id { get; set; } = string.Empty; public string Email { get; set; } = string.Empty; public string UserName { get; set; } = string.Empty; public List Roles { get; set; } = new List(); public DateTimeOffset CreatedDate { get; set; } public bool EmailConfirmed { get; set; } "@ } elseif ($nameWithoutExtension -eq "AddressDto") { $extraUsings += "using Webshop.Domain.Enums;`n" $properties = @" public Guid Id { get; set; } public string Street { get; set; } = string.Empty; public string HouseNumber { get; set; } = string.Empty; public string City { get; set; } = string.Empty; public string PostalCode { get; set; } = string.Empty; public string Country { get; set; } = string.Empty; public AddressType Type { get; set; } "@ } elseif ($nameWithoutExtension -eq "CategoryDto") { $properties = @" public Guid Id { get; set; } public string Name { get; set; } = string.Empty; public string Slug { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public Guid? ParentCategoryId { get; set; } public string? ImageUrl { get; set; } public bool IsActive { get; set; } public int DisplayOrder { get; set; } "@ } elseif ($nameWithoutExtension -eq "CreateCategoryDto") { $properties = @" public string Name { get; set; } = string.Empty; public string Slug { get; set; } = string.Empty; public string Description { get; set; } = string.Empty; public Guid? ParentCategoryId { get; set; } public string? ImageUrl { get; set; } public bool IsActive { get; set; } = true; public int DisplayOrder { get; set; } = 0; "@ } elseif ($nameWithoutExtension -eq "CustomerDto") { $properties = @" public Guid Id { get; set; } public string UserId { get; set; } = string.Empty; public string FirstName { get; set; } = string.Empty; public string LastName { get; set; } = string.Empty; public string Email { get; set; } = string.Empty; public string? PhoneNumber { get; set; } public Guid? DefaultShippingAddressId { get; set; } public Guid? DefaultBillingAddressId { get; set; } "@ } elseif ($nameWithoutExtension -eq "DiscountDto") { $extraUsings += "using Webshop.Domain.Enums;`n" $properties = @" public Guid Id { get; set; } public string Name { get; set; } = string.Empty; public DiscountType Type { get; set; } public decimal Value { get; set; } public string? CouponCode { get; set; } public DateTimeOffset StartDate { get; set; } public DateTimeOffset EndDate { get; set; } public bool IsActive { get; set; } public int? MaxUses { get; set; } public int CurrentUses { get; set; } public string? Description { get; set; } "@ } elseif ($nameWithoutExtension -eq "OrderSummaryDto") { $extraUsings += "using Webshop.Domain.Enums;`n" $properties = @" public Guid Id { get; set; } public string OrderNumber { get; set; } = string.Empty; public DateTimeOffset OrderDate { get; set; } public OrderStatus Status { get; set; } public decimal TotalAmount { get; set; } public PaymentStatus PaymentStatus { get; set; } public string PaymentMethodName { get; set; } = string.Empty; public string ShippingMethodName { get; set; } = string.Empty; "@ } elseif ($nameWithoutExtension -eq "OrderDetailDto") { $extraUsings += "using Webshop.Domain.Enums;`n" $properties = @" public Guid Id { get; set; } public string OrderNumber { get; set; } = string.Empty; public Guid CustomerId { get; set; } public DateTimeOffset OrderDate { get; set; } public OrderStatus Status { get; set; } public decimal TotalAmount { get; set; } public Guid ShippingAddressId { get; set; } public Guid BillingAddressId { get; set; } public Guid PaymentMethodId { get; set; } public string? ShippingTrackingNumber { get; set; } public DateTimeOffset? ShippedDate { get; set; } public DateTimeOffset? DeliveredDate { get; set; } public PaymentStatus PaymentStatus { get; set; } public List OrderItems { get; set; } = new List(); "@ } elseif ($nameWithoutExtension -eq "OrderItemDto") { $properties = @" public Guid Id { get; set; } public Guid OrderId { get; set; } // Foreign Key zu Order public Guid ProductId { get; set; } public Guid? ProductVariantId { get; set; } public string ProductName { get; set; } = string.Empty; public string ProductSKU { get; set; } = string.Empty; public int Quantity { get; set; } public decimal UnitPrice { get; set; } public decimal TotalPrice { get; set; } "@ } elseif ($nameWithoutExtension -eq "CreateOrderDto") { $properties = @" public Guid? CustomerId { get; set; } // Nullable für Gastbestellung public string? GuestEmail { get; set; } public string? GuestPhoneNumber { get; set; } public Guid ShippingAddressId { get; set; } public Guid BillingAddressId { get; set; } public Guid PaymentMethodId { get; set; } public Guid ShippingMethodId { get; set; } public List Items { get; set; } = new List(); "@ } elseif ($nameWithoutExtension -eq "CreateOrderItemDto") { $properties = @" public Guid ProductId { get; set; } public Guid? ProductVariantId { get; set; } public int Quantity { get; set; } "@ } elseif ($nameWithoutExtension -eq "ReviewDto") { $properties = @" public Guid Id { get; set; } public Guid ProductId { get; set; } public Guid? CustomerId { get; set; } public int Rating { get; set; } public string? Title { get; set; } public string Comment { get; set; } = string.Empty; public DateTimeOffset ReviewDate { get; set; } public bool IsApproved { get; set; } "@ } elseif ($nameWithoutExtension -eq "CreateReviewDto") { $properties = @" public Guid ProductId { get; set; } public int Rating { get; set; } public string? Title { get; set; } public string Comment { get; set; } = string.Empty; "@ } elseif ($nameWithoutExtension -eq "SettingDto") { $properties = @" public string Key { get; set; } = string.Empty; public string Value { get; set; } = string.Empty; public string? Description { get; set; } public DateTimeOffset LastModifiedDate { get; set; } "@ } elseif ($nameWithoutExtension -eq "PaymentMethodDto") { $extraUsings += "using Webshop.Domain.Enums;`n" $properties = @" public Guid Id { get; set; } public string Name { get; set; } = string.Empty; public string? Description { get; set; } public bool IsActive { get; set; } public PaymentGatewayType GatewayType { get; set; } public decimal? ProcessingFee { get; set; } "@ } elseif ($nameWithoutExtension -eq "ShippingMethodDto") { $properties = @" public Guid Id { get; set; } public string Name { get; set; } = string.Empty; public string? Description { get; set; } public decimal Cost { get; set; } public bool IsActive { get; set; } public int MinDeliveryDays { get; set; } public int MaxDeliveryDays { get; set; } "@ } elseif ($nameWithoutExtension -eq "ProductVariantDto") { $properties = @" public Guid Id { get; set; } public Guid ProductId { get; set; } public string Name { get; set; } = string.Empty; public string Value { get; set; } = string.Empty; public string? SKU { get; set; } public decimal PriceAdjustment { get; set; } public int StockQuantity { get; set; } public string? ImageUrl { get; set; } public bool IsActive { get; set; } "@ } elseif ($nameWithoutExtension -eq "SupplierDto") { $properties = @" public Guid Id { get; set; } = Guid.NewGuid(); public string Name { get; set; } = string.Empty; public string? ContactPerson { get; set; } public string? Email { get; set; } public string? PhoneNumber { get; set; } public Guid? AddressId { get; set; } public string? Notes { get; set; } "@ } # End DTO specific content $fileContent = @" // Auto-generiert von CreateWebshopFiles.ps1 $commonUsings $extraUsings namespace $fullNamespace { public class $nameWithoutExtension { $properties } } "@ } # Ende DTO Sektion # Standardfall für eine Klasse, wenn keine spezielle Logik zutrifft (z.B. Domain Entities) elseif ($Type -eq "class") { $fileContent = @" // Auto-generiert von CreateWebshopFiles.ps1 $commonUsings namespace $fullNamespace { public class $nameWithoutExtension { public Guid Id { get; set; } = Guid.NewGuid(); // Fügen Sie hier weitere Eigenschaften hinzu } } "@ } Set-Content -Path $fullFilePath -Value $fileContent Write-Host "Datei erstellt: $fullFilePath" -ForegroundColor Cyan } # --- Dateiliste --- # 1. Projekt: Webshop.Domain # Interfaces New-CSharpFile -ProjectName "Webshop.Domain" -RelativePath "Interfaces" -FileName "ICategoryRepository.cs" -Type "interface" -BaseNamespace "Webshop.Domain" New-CSharpFile -ProjectName "Webshop.Domain" -RelativePath "Interfaces" -FileName "ICustomerRepository.cs" -Type "interface" -BaseNamespace "Webshop.Domain" New-CSharpFile -ProjectName "Webshop.Domain" -RelativePath "Interfaces" -FileName "IDiscountRepository.cs" -Type "interface" -BaseNamespace "Webshop.Domain" New-CSharpFile -ProjectName "Webshop.Domain" -RelativePath "Interfaces" -FileName "IOrderRepository.cs" -Type "interface" -BaseNamespace "Webshop.Domain" New-CSharpFile -ProjectName "Webshop.Domain" -RelativePath "Interfaces" -FileName "IReviewRepository.cs" -Type "interface" -BaseNamespace "Webshop.Domain" New-CSharpFile -ProjectName "Webshop.Domain" -RelativePath "Interfaces" -FileName "ISettingRepository.cs" -Type "interface" -BaseNamespace "Webshop.Domain" New-CSharpFile -ProjectName "Webshop.Domain" -RelativePath "Interfaces" -FileName "IPaymentMethodRepository.cs" -Type "interface" -BaseNamespace "Webshop.Domain" New-CSharpFile -ProjectName "Webshop.Domain" -RelativePath "Interfaces" -FileName "IShippingMethodRepository.cs" -Type "interface" -BaseNamespace "Webshop.Domain" New-CSharpFile -ProjectName "Webshop.Domain" -RelativePath "Interfaces" -FileName "ISupplierRepository.cs" -Type "interface" -BaseNamespace "Webshop.Domain" New-CSharpFile -ProjectName "Webshop.Domain" -RelativePath "Interfaces" -FileName "IProductRepository.cs" -Type "interface" -BaseNamespace "Webshop.Domain" # 2. Projekt: Webshop.Application # DTOs # Auth DTOs (bereits in Unterordnern, aber ich füge die Aufrufe hier für Konsistenz hinzu) New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs/Auth" -FileName "AuthResponseDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs/Auth" -FileName "LoginRequestDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs/Auth" -FileName "RegisterRequestDto.cs" -Type "class" -BaseNamespace "Webshop.Application" # User DTOs (bereits in Unterordnern) New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs/Users" -FileName "UserDto.cs" -Type "class" -BaseNamespace "Webshop.Application" # DTOs direkt im DTOs-Ordner New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "AddressDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "CategoryDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "CreateCategoryDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "CustomerDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "DiscountDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "OrderSummaryDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "OrderDetailDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "OrderItemDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "CreateOrderDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "CreateOrderItemDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "ReviewDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "CreateReviewDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "SettingDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "PaymentMethodDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "ShippingMethodDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "ProductVariantDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "SupplierDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "AdminProductDto.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "DTOs" -FileName "ProductDto.cs" -Type "class" -BaseNamespace "Webshop.Application" # Services (Interfaces und Implementierungen) # Admin/ New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Admin" -FileName "IAdminCategoryService.cs" -Type "interface" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Admin" -FileName "AdminCategoryService.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Admin" -FileName "IAdminOrderService.cs" -Type "interface" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Admin" -FileName "AdminOrderService.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Admin" -FileName "IAdminDiscountService.cs" -Type "interface" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Admin" -FileName "AdminDiscountService.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Admin" -FileName "IAdminSettingService.cs" -Type "interface" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Admin" -FileName "AdminSettingService.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Admin" -FileName "AdminProductService.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Admin" -FileName "AdminUserService.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Admin" -FileName "AdminSupplierService.cs" -Type "class" -BaseNamespace "Webshop.Application" # Public/ New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Public" -FileName "ICategoryService.cs" -Type "interface" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Public" -FileName "CategoryService.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Public" -FileName "ProductService.cs" -Type "class" -BaseNamespace "Webshop.Application" # Customer/ New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Customer" -FileName "IOrderService.cs" -Type "interface" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Customer" -FileName "OrderService.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Customer" -FileName "ICheckoutService.cs" -Type "interface" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Customer" -FileName "CheckoutService.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Customer" -FileName "IReviewService.cs" -Type "interface" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Customer" -FileName "ReviewService.cs" -Type "class" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Customer" -FileName "ICustomerService.cs" -Type "interface" -BaseNamespace "Webshop.Application" New-CSharpFile -ProjectName "Webshop.Application" -RelativePath "Services/Customer" -FileName "CustomerService.cs" -Type "class" -BaseNamespace "Webshop.Application" # 3. Projekt: Webshop.Infrastructure # Repositories New-CSharpFile -ProjectName "Webshop.Infrastructure" -RelativePath "Repositories" -FileName "CategoryRepository.cs" -Type "class" -BaseNamespace "Webshop.Infrastructure" New-CSharpFile -ProjectName "Webshop.Infrastructure" -RelativePath "Repositories" -FileName "CustomerRepository.cs" -Type "class" -BaseNamespace "Webshop.Infrastructure" New-CSharpFile -ProjectName "Webshop.Infrastructure" -RelativePath "Repositories" -FileName "DiscountRepository.cs" -Type "class" -BaseNamespace "Webshop.Infrastructure" New-CSharpFile -ProjectName "Webshop.Infrastructure" -RelativePath "Repositories" -FileName "OrderRepository.cs" -Type "class" -BaseNamespace "Webshop.Infrastructure" New-CSharpFile -ProjectName "Webshop.Infrastructure" -RelativePath "Repositories" -FileName "ReviewRepository.cs" -Type "class" -BaseNamespace "Webshop.Infrastructure" New-CSharpFile -ProjectName "Webshop.Infrastructure" -RelativePath "Repositories" -FileName "SettingRepository.cs" -Type "class" -BaseNamespace "Webshop.Infrastructure" New-CSharpFile -ProjectName "Webshop.Infrastructure" -RelativePath "Repositories" -FileName "PaymentMethodRepository.cs" -Type "class" -BaseNamespace "Webshop.Infrastructure" New-CSharpFile -ProjectName "Webshop.Infrastructure" -RelativePath "Repositories" -FileName "ShippingMethodRepository.cs" -Type "class" -BaseNamespace "Webshop.Infrastructure" New-CSharpFile -ProjectName "Webshop.Infrastructure" -RelativePath "Repositories" -FileName "SupplierRepository.cs" -Type "class" -BaseNamespace "Webshop.Infrastructure" New-CSharpFile -ProjectName "Webshop.Infrastructure" -RelativePath "Repositories" -FileName "ProductRepository.cs" -Type "class" -BaseNamespace "Webshop.Infrastructure" # 4. Projekt: Webshop.Api # Controllers # Admin/ New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Admin" -FileName "AdminCategoriesController.cs" -Type "class" -BaseNamespace "Webshop.Api" New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Admin" -FileName "AdminDiscountsController.cs" -Type "class" -BaseNamespace "Webshop.Api" New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Admin" -FileName "AdminSettingsController.cs" -Type "class" -BaseNamespace "Webshop.Api" New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Admin" -FileName "AdminOrdersController.cs" -Type "class" -BaseNamespace "Webshop.Api" New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Admin" -FileName "AdminProductsController.cs" -Type "class" -BaseNamespace "Webshop.Api" New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Admin" -FileName "AdminUsersController.cs" -Type "class" -BaseNamespace "Webshop.Api" New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Admin" -FileName "AdminSuppliersController.cs" -Type "class" -BaseNamespace "Webshop.Api" # Public/ New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Public" -FileName "CategoriesController.cs" -Type "class" -BaseNamespace "Webshop.Api" New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Public" -FileName "ProductsController.cs" -Type "class" -BaseNamespace "Webshop.Api" # Customer/ New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Customer" -FileName "OrdersController.cs" -Type "class" -BaseNamespace "Webshop.Api" New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Customer" -FileName "CheckoutController.cs" -Type "class" -BaseNamespace "Webshop.Api" New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Customer" -FileName "ReviewsController.cs" -Type "class" -BaseNamespace "Webshop.Api" New-CSharpFile -ProjectName "Webshop.Api" -RelativePath "Controllers/Customer" -FileName "ProfileController.cs" -Type "class" -BaseNamespace "Webshop.Api" Write-Host "Dateierstellung abgeschlossen." -ForegroundColor Green