Skip to content

E-commerce

Le template E-commerce genere une plateforme de vente en ligne complete avec gestion de catalogue, panier, commandes et paiement.

Creation

bash
rvr new MaShop --template ecommerce
cd MaShop

Modules inclus

ModuleRole
CoreEntites de base, repositories, specifications
SecurityAuthentification JWT, autorisation
BillingIntegration Stripe pour le paiement
ExportExport PDF des factures, Excel du catalogue
JobsTaches planifiees (nettoyage panier, relances)
CachingCache Redis pour le catalogue
WebhooksNotifications de commande

Entites metier

csharp
public class Product : AggregateRoot<Guid>
{
    public string Name { get; private set; }
    public string Description { get; private set; }
    public Money Price { get; private set; }
    public string Sku { get; private set; }
    public int StockQuantity { get; private set; }
    public Guid CategoryId { get; private set; }
    public bool IsActive { get; private set; }

    public void DecreaseStock(int quantity)
    {
        if (StockQuantity < quantity)
            throw new InsufficientStockException(Id, quantity, StockQuantity);
        StockQuantity -= quantity;
        AddDomainEvent(new StockDecreasedEvent(Id, quantity, StockQuantity));
    }
}

public class Order : AggregateRoot<Guid>
{
    public Guid CustomerId { get; private set; }
    public OrderStatus Status { get; private set; }
    public Address ShippingAddress { get; private set; }
    public Money TotalAmount { get; private set; }
    private readonly List<OrderLine> _lines = new();
    public IReadOnlyList<OrderLine> Lines => _lines.AsReadOnly();

    public void AddLine(Guid productId, string productName, Money unitPrice, int quantity)
    {
        _lines.Add(new OrderLine(productId, productName, unitPrice, quantity));
        RecalculateTotal();
        AddDomainEvent(new OrderLineAddedEvent(Id, productId, quantity));
    }
}

public class Cart : AggregateRoot<Guid>
{
    public Guid? CustomerId { get; private set; }
    public string SessionId { get; private set; }
    public DateTime ExpiresAt { get; private set; }
    private readonly List<CartItem> _items = new();
    public IReadOnlyList<CartItem> Items => _items.AsReadOnly();
}

public record Address(
    string Street,
    string City,
    string PostalCode,
    string Country
) : ValueObject;

API Endpoints

MethodeEndpointDescription
GET/api/v1/productsCatalogue avec pagination et filtres
GET/api/v1/products/:idDetail produit
GET/api/v1/categoriesCategories
POST/api/v1/cart/itemsAjouter au panier
DELETE/api/v1/cart/items/:idRetirer du panier
GET/api/v1/cartContenu du panier
POST/api/v1/ordersCreer une commande
GET/api/v1/ordersHistorique des commandes
POST/api/v1/orders/:id/payPayer une commande (Stripe)
GET/api/v1/orders/:id/invoiceTelecharger la facture PDF

Configuration

json
{
  "Ecommerce": {
    "Cart": {
      "ExpirationMinutes": 1440,
      "MaxItems": 50
    },
    "Catalog": {
      "CacheDurationSeconds": 300,
      "DefaultPageSize": 20
    }
  },
  "Stripe": {
    "SecretKey": "sk_test_...",
    "PublishableKey": "pk_test_...",
    "WebhookSecret": "whsec_..."
  }
}

Demarrage

bash
# 1. Lancer l'infrastructure
docker compose up -d

# 2. Appliquer les migrations
rvr migrate apply

# 3. Seeder le catalogue de demo
rvr seed --profile demo

# 4. Lancer l'API
dotnet run --project src/MaShop.Api

Le seeder demo cree 50 produits, 5 categories et un utilisateur de test.

Architecture

MaShop/
  src/
    MaShop.Domain/
      Products/         # Product, Category, Sku (Value Object)
      Orders/           # Order, OrderLine, OrderStatus
      Carts/            # Cart, CartItem
      Customers/        # Customer, Address (Value Object)
    MaShop.Application/
      Products/
        Queries/        # GetProducts, GetProductById, SearchProducts
      Orders/
        Commands/       # CreateOrder, PayOrder, CancelOrder
        Queries/        # GetOrders, GetOrderById
      Carts/
        Commands/       # AddToCart, RemoveFromCart, ClearCart
    MaShop.Infrastructure/
      Persistence/      # DbContext, Configurations EF Core
      Stripe/           # PaymentService
      Cache/            # CatalogCacheService
    MaShop.Api/
      Controllers/      # ProductController, OrderController, CartController

Taches planifiees

Le template inclut des jobs Hangfire preconfigures :

JobFrequenceDescription
CleanExpiredCartsToutes les heuresSupprime les paniers expires
SendAbandonedCartEmailsToutes les 6hRelance les paniers abandonnes
SyncStripePaymentsToutes les 15minSynchronise les statuts de paiement
GenerateAnalyticsReportChaque jour a 2hGenere le rapport de ventes

Etape suivante

Released under the MIT License.