Add LittleShop.Client SDK library with complete API wrapper

Features:
- Complete .NET client SDK for LittleShop API
- JWT authentication with automatic token management
- Catalog service for products and categories
- Order service with payment creation
- Retry policies using Polly for resilience
- Error handling middleware
- Dependency injection support
- Comprehensive documentation and examples

SDK Components:
- Authentication service with token refresh
- Strongly-typed models for all API responses
- HTTP handlers for retry and error handling
- Extension methods for easy DI registration
- Example console application demonstrating usage

Test Updates:
- Fixed test compilation errors
- Updated test data builders for new models
- Corrected service constructor dependencies
- Fixed enum value changes (PaymentStatus, OrderStatus)

Documentation:
- Complete project README with features and usage
- Client SDK README with detailed examples
- API endpoint documentation
- Security considerations
- Deployment guidelines

Generated with Claude Code

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
sysadmin
2025-08-20 18:15:35 +01:00
parent a281bb2896
commit 1f7c0af497
28 changed files with 1810 additions and 33 deletions

View File

@@ -15,7 +15,6 @@ public class CategoryServiceTests : IDisposable
{
private readonly LittleShopContext _context;
private readonly ICategoryService _categoryService;
private readonly IMapper _mapper;
public CategoryServiceTests()
{
@@ -25,15 +24,8 @@ public class CategoryServiceTests : IDisposable
.Options;
_context = new LittleShopContext(options);
// Set up AutoMapper
var mappingConfig = new MapperConfiguration(mc =>
{
mc.AddProfile(new MappingProfile());
});
_mapper = mappingConfig.CreateMapper();
// Create service
_categoryService = new CategoryService(_context, _mapper);
_categoryService = new CategoryService(_context);
}
[Fact]

View File

@@ -5,9 +5,9 @@ using LittleShop.Models;
using LittleShop.Services;
using LittleShop.Enums;
using Microsoft.EntityFrameworkCore;
using AutoMapper;
using Microsoft.AspNetCore.Hosting;
using Moq;
using Xunit;
using LittleShop.Mapping;
namespace LittleShop.Tests.Unit;
@@ -15,7 +15,7 @@ public class ProductServiceTests : IDisposable
{
private readonly LittleShopContext _context;
private readonly IProductService _productService;
private readonly IMapper _mapper;
private readonly Mock<IWebHostEnvironment> _mockEnvironment;
public ProductServiceTests()
{
@@ -25,15 +25,12 @@ public class ProductServiceTests : IDisposable
.Options;
_context = new LittleShopContext(options);
// Set up AutoMapper
var mappingConfig = new MapperConfiguration(mc =>
{
mc.AddProfile(new MappingProfile());
});
_mapper = mappingConfig.CreateMapper();
// Set up mock environment
_mockEnvironment = new Mock<IWebHostEnvironment>();
_mockEnvironment.Setup(e => e.WebRootPath).Returns("/test/wwwroot");
// Create service
_productService = new ProductService(_context, _mapper);
_productService = new ProductService(_context, _mockEnvironment.Object);
}
[Fact]
@@ -242,7 +239,7 @@ public class ProductServiceTests : IDisposable
// Assert
result.Should().NotBeNull();
result.PhotoUrl.Should().Be("/uploads/test-photo.jpg");
result.FilePath.Should().Contain("test-photo.jpg");
result.AltText.Should().Be("Test Photo");
// Verify in database