gitextract_ok2u674f/ ├── .github/ │ └── workflows/ │ └── main_skinet-course.yml ├── .gitignore ├── .vscode/ │ └── settings.json ├── API/ │ ├── API.csproj │ ├── API.http │ ├── Controllers/ │ │ ├── AccountController.cs │ │ ├── AdminController.cs │ │ ├── BaseApiController.cs │ │ ├── BuggyController.cs │ │ ├── CartController.cs │ │ ├── CouponsController.cs │ │ ├── FallbackController.cs │ │ ├── OrdersController.cs │ │ ├── PaymentsController.cs │ │ ├── ProductsController.cs │ │ └── WeatherForecastController.cs │ ├── DTOs/ │ │ ├── AddressDto.cs │ │ ├── CreateOrderDto.cs │ │ ├── CreateProductDto.cs │ │ ├── OrderDto.cs │ │ ├── OrderItemDto.cs │ │ └── RegisterDto.cs │ ├── Errors/ │ │ └── ApiErrorResponse.cs │ ├── Extensions/ │ │ ├── AddressMappingExtensions.cs │ │ ├── ClaimsPrincipalExtensions.cs │ │ └── OrderMappingExtensions.cs │ ├── Middleware/ │ │ └── ExceptionMiddleware.cs │ ├── Program.cs │ ├── Properties/ │ │ └── launchSettings.json │ ├── RequestHelpers/ │ │ ├── CachedAttribute.cs │ │ ├── InvalidateCacheAttribute.cs │ │ └── Pagination.cs │ ├── SignalR/ │ │ └── NotificationHub.cs │ ├── WeatherForecast.cs │ ├── appsettings.Development.json │ └── wwwroot/ │ ├── 3rdpartylicenses.txt │ ├── chunk-6SXQ2FRE.js │ ├── chunk-76XFCVV7.js │ ├── chunk-BU6XFQYD.js │ ├── chunk-HJYZM75B.js │ ├── chunk-LMQANEB2.js │ ├── chunk-MIKQGBUF.js │ ├── chunk-NEILRAN2.js │ ├── chunk-PEWDZYDO.js │ ├── chunk-SP3SSILU.js │ ├── chunk-TEKFR3M2.js │ ├── chunk-VOFQZSPR.js │ ├── chunk-WAIB6SCQ.js │ ├── chunk-YYNGFOZ2.js │ ├── chunk-Z2NTM2YJ.js │ ├── index.html │ ├── main-627RABRE.js │ ├── polyfills-B6TNHZQ6.js │ ├── prerendered-routes.json │ └── styles-COVWXBF4.css ├── Core/ │ ├── Core.csproj │ ├── Entities/ │ │ ├── Address.cs │ │ ├── AppCoupon.cs │ │ ├── AppUser.cs │ │ ├── BaseEntity.cs │ │ ├── CartItem.cs │ │ ├── DeliveryMethod.cs │ │ ├── OrderAggregate/ │ │ │ ├── Order.cs │ │ │ ├── OrderItem.cs │ │ │ ├── OrderStatus.cs │ │ │ ├── PaymentSummary.cs │ │ │ ├── ProductItemOrdered.cs │ │ │ └── ShippingAddress.cs │ │ ├── Product.cs │ │ └── ShoppingCart.cs │ ├── Interfaces/ │ │ ├── ICartService.cs │ │ ├── ICouponService.cs │ │ ├── IDtoConvertible.cs │ │ ├── IGenericRepository.cs │ │ ├── IPaymentService.cs │ │ ├── IProductRepository.cs │ │ ├── IResponseCacheService.cs │ │ ├── ISpecification.cs │ │ └── IUnitOfWork.cs │ └── Specifications/ │ ├── BaseSpecification.cs │ ├── BrandListSpecification.cs │ ├── OrderSpecParams.cs │ ├── OrderSpecification.cs │ ├── PagingParams.cs │ ├── ProductSpecParams.cs │ ├── ProductSpecification.cs │ └── TypeListSpecification.cs ├── Infrastructure/ │ ├── Config/ │ │ ├── DeliveryMethodConfiguration.cs │ │ ├── OrderConfiguration.cs │ │ ├── OrderItemConfiguration.cs │ │ ├── ProductConfiguration.cs │ │ └── RoleConfiguration.cs │ ├── Data/ │ │ ├── GenericRepository.cs │ │ ├── ProductRepository.cs │ │ ├── SeedData/ │ │ │ ├── delivery.json │ │ │ └── products.json │ │ ├── SpecificationEvaluator.cs │ │ ├── StoreContext.cs │ │ ├── StoreContextSeed.cs │ │ └── UnitOfWork.cs │ ├── Infrastructure.csproj │ ├── Migrations/ │ │ ├── 20250622053300_InitialCreate.Designer.cs │ │ ├── 20250622053300_InitialCreate.cs │ │ ├── 20250629083129_IdentityAdded.Designer.cs │ │ ├── 20250629083129_IdentityAdded.cs │ │ ├── 20250629085927_AddressAdded.Designer.cs │ │ ├── 20250629085927_AddressAdded.cs │ │ ├── 20250630014631_DeliveryMethodsAdded.Designer.cs │ │ ├── 20250630014631_DeliveryMethodsAdded.cs │ │ ├── 20250630074200_OrderEntityAdded.Designer.cs │ │ ├── 20250630074200_OrderEntityAdded.cs │ │ ├── 20250701034848_CouponsAdded.Designer.cs │ │ ├── 20250701034848_CouponsAdded.cs │ │ ├── 20250701045119_RolesAdded.Designer.cs │ │ ├── 20250701045119_RolesAdded.cs │ │ └── StoreContextModelSnapshot.cs │ └── Services/ │ ├── CartService.cs │ ├── CouponService.cs │ ├── PaymentService.cs │ └── ResponseCacheService.cs ├── README.MD ├── client/ │ ├── .editorconfig │ ├── .gitignore │ ├── .postcssrc.json │ ├── .vscode/ │ │ ├── extensions.json │ │ ├── launch.json │ │ └── tasks.json │ ├── README.md │ ├── angular.json │ ├── package.json │ ├── src/ │ │ ├── app/ │ │ │ ├── app.component.html │ │ │ ├── app.component.scss │ │ │ ├── app.component.ts │ │ │ ├── app.config.ts │ │ │ ├── app.routes.ts │ │ │ ├── app.spec.ts │ │ │ ├── core/ │ │ │ │ ├── guards/ │ │ │ │ │ ├── admin-guard.ts │ │ │ │ │ ├── auth-guard.ts │ │ │ │ │ ├── empty-cart-guard.ts │ │ │ │ │ └── order-complete-guard.ts │ │ │ │ ├── interceptors/ │ │ │ │ │ ├── auth-interceptor.ts │ │ │ │ │ ├── error-interceptor.ts │ │ │ │ │ └── loading-interceptor.ts │ │ │ │ └── services/ │ │ │ │ ├── account.service.ts │ │ │ │ ├── admin.service.ts │ │ │ │ ├── busy.service.ts │ │ │ │ ├── cart.service.ts │ │ │ │ ├── checkout.service.ts │ │ │ │ ├── dialog.service.ts │ │ │ │ ├── init.service.ts │ │ │ │ ├── order.service.ts │ │ │ │ ├── shop.service.ts │ │ │ │ ├── signalr.service.ts │ │ │ │ ├── snackbar.service.ts │ │ │ │ └── stripe.service.ts │ │ │ ├── features/ │ │ │ │ ├── account/ │ │ │ │ │ ├── login/ │ │ │ │ │ │ ├── login.component.html │ │ │ │ │ │ ├── login.component.scss │ │ │ │ │ │ └── login.component.ts │ │ │ │ │ ├── register/ │ │ │ │ │ │ ├── register.component.html │ │ │ │ │ │ ├── register.component.scss │ │ │ │ │ │ └── register.component.ts │ │ │ │ │ └── routes.ts │ │ │ │ ├── admin/ │ │ │ │ │ ├── admin.component.html │ │ │ │ │ ├── admin.component.scss │ │ │ │ │ └── admin.component.ts │ │ │ │ ├── cart/ │ │ │ │ │ ├── cart-item/ │ │ │ │ │ │ ├── cart-item.component.html │ │ │ │ │ │ ├── cart-item.component.scss │ │ │ │ │ │ └── cart-item.component.ts │ │ │ │ │ ├── cart.component.html │ │ │ │ │ ├── cart.component.scss │ │ │ │ │ └── cart.component.ts │ │ │ │ ├── checkout/ │ │ │ │ │ ├── checkout-delivery/ │ │ │ │ │ │ ├── checkout-delivery.component.html │ │ │ │ │ │ ├── checkout-delivery.component.scss │ │ │ │ │ │ └── checkout-delivery.component.ts │ │ │ │ │ ├── checkout-review/ │ │ │ │ │ │ ├── checkout-review.component.html │ │ │ │ │ │ ├── checkout-review.component.scss │ │ │ │ │ │ └── checkout-review.component.ts │ │ │ │ │ ├── checkout-success/ │ │ │ │ │ │ ├── checkout-success.component.html │ │ │ │ │ │ ├── checkout-success.component.scss │ │ │ │ │ │ └── checkout-success.component.ts │ │ │ │ │ ├── checkout.component.html │ │ │ │ │ ├── checkout.component.scss │ │ │ │ │ ├── checkout.component.ts │ │ │ │ │ └── routes.ts │ │ │ │ ├── home/ │ │ │ │ │ ├── home.component.html │ │ │ │ │ ├── home.component.scss │ │ │ │ │ └── home.component.ts │ │ │ │ ├── orders/ │ │ │ │ │ ├── order-detailed/ │ │ │ │ │ │ ├── order-detailed.component.html │ │ │ │ │ │ ├── order-detailed.component.scss │ │ │ │ │ │ └── order-detailed.component.ts │ │ │ │ │ ├── order.component.html │ │ │ │ │ ├── order.component.scss │ │ │ │ │ ├── order.component.ts │ │ │ │ │ └── routes.ts │ │ │ │ ├── shop/ │ │ │ │ │ ├── filters-dialog/ │ │ │ │ │ │ ├── filters-dialog.component.html │ │ │ │ │ │ ├── filters-dialog.component.scss │ │ │ │ │ │ └── filters-dialog.component.ts │ │ │ │ │ ├── product-details/ │ │ │ │ │ │ ├── product-details.component.html │ │ │ │ │ │ ├── product-details.component.scss │ │ │ │ │ │ └── product-details.component.ts │ │ │ │ │ ├── product-item/ │ │ │ │ │ │ ├── product-item.component.html │ │ │ │ │ │ ├── product-item.component.scss │ │ │ │ │ │ └── product-item.component.ts │ │ │ │ │ ├── shop.component.html │ │ │ │ │ ├── shop.component.scss │ │ │ │ │ └── shop.component.ts │ │ │ │ └── test-error/ │ │ │ │ ├── test-error.component.html │ │ │ │ ├── test-error.component.scss │ │ │ │ └── test-error.component.ts │ │ │ ├── layout/ │ │ │ │ └── header/ │ │ │ │ ├── header.component.html │ │ │ │ ├── header.component.scss │ │ │ │ └── header.component.ts │ │ │ └── shared/ │ │ │ ├── components/ │ │ │ │ ├── confirmation-dialog/ │ │ │ │ │ ├── confirmation-dialog.component.html │ │ │ │ │ ├── confirmation-dialog.component.scss │ │ │ │ │ └── confirmation-dialog.component.ts │ │ │ │ ├── empty-state/ │ │ │ │ │ ├── empty-state.component.html │ │ │ │ │ ├── empty-state.component.scss │ │ │ │ │ └── empty-state.component.ts │ │ │ │ ├── not-found/ │ │ │ │ │ ├── not-found.component.html │ │ │ │ │ ├── not-found.component.scss │ │ │ │ │ └── not-found.component.ts │ │ │ │ ├── order-summary/ │ │ │ │ │ ├── order-summary.component.html │ │ │ │ │ ├── order-summary.component.scss │ │ │ │ │ └── order-summary.component.ts │ │ │ │ ├── server-error/ │ │ │ │ │ ├── server-error.component.html │ │ │ │ │ ├── server-error.component.scss │ │ │ │ │ └── server-error.component.ts │ │ │ │ └── text-input/ │ │ │ │ ├── text-input.component.html │ │ │ │ ├── text-input.component.scss │ │ │ │ └── text-input.component.ts │ │ │ ├── directives/ │ │ │ │ └── is-admin.ts │ │ │ ├── models/ │ │ │ │ ├── cart.ts │ │ │ │ ├── deliveryMethod.ts │ │ │ │ ├── order.ts │ │ │ │ ├── orderParams.ts │ │ │ │ ├── pagination.ts │ │ │ │ ├── product.ts │ │ │ │ ├── shopParams.ts │ │ │ │ └── user.ts │ │ │ └── pipes/ │ │ │ ├── address-pipe.ts │ │ │ └── payment-card-pipe.ts │ │ ├── environments/ │ │ │ ├── environment.development.ts │ │ │ └── environment.ts │ │ ├── index.html │ │ ├── main.ts │ │ ├── styles.scss │ │ └── tailwind.css │ ├── ssl/ │ │ ├── localhost-key.pem │ │ └── localhost.pem │ ├── tsconfig.app.json │ ├── tsconfig.json │ └── tsconfig.spec.json ├── docker-compose.yml └── skinet.sln