DWUL .NET Backend
Full-Stack2023

DWUL.NETBACKEND

.NET Core 3.1 clean architecture — 20 controllers, Stripe, EF Core MySQL, JWT + Google OAuth, S3, SendGrid.

20
API controllers
100+
HTTP endpoints
6
RBAC authorization policies
SCROLL
Client
Misty Interactive Studios
Domain
API / Full-Stack
Platform
ASP.NET Core
Duration
Jan 2023 — May 2025
Core Stack
.NET · MySQL · Stripe
The Brief

THE
PROBLEM

Before the Next.js rewrite, DWUL ran on a .NET Core 3.1 monolith — carts, subscriptions, childcare programs, messaging threads, notifications, and provider payouts all flowed through one Stripe integration and a shared MySQL schema.

Four-layer ASP.NET Core Web API — controllers, services, Unit of Work repositories, entities — JWT + Google OAuth with six RBAC policies, Stripe cart services, S3 uploads, SendGrid mail, Swagger + NLog hardened for production operations.

Core Engineering Challenge

PaymentIntent flows had to be idempotent under webhook retries; program and experience payloads needed JSON flexibility inside relational tables; and specialized repositories had to call stored procedures via Dapper without fighting EF Core change tracking.

100 routes+
Surface
Extended stack
backend
.NET Core
database
MySQL
backend
Stripe
.NET API
.NET API
How we built it

THE ARCHITECTURE

01
Layered architecture

Controllers thin; services own orchestration; repositories isolate SQL.

.NET CoreClean Architecture
02
Auth & policies

JWT bearer + Google ID token validation with six authorization policies.

JWTGoogle OAuth
03
Stripe cart service

PaymentIntent creation, customer lookup by email, client secret handoff to frontends.

StripeMySQL
04
EF + Dapper mix

EF Core for most CRUD; Dapper for stored procedures and reporting paths.

EF CoreDapper
05
Files & mail

AWS SDK for S3 objects; SendGrid for transactional templates.

AWS S3SendGrid
06
Ops hardening

Swagger for integrators; NLog sinks; deployment configs for Misty’s environments.

NLogDevOps
System Data Flow
Ingestion
CrawlerContent Hash10K+ pages
Processing
ChunkerDeduplicatorEmbedding API
Storage
pgvectorPostgreSQLRedis Cache
Auth
Identity ProviderJWT BridgeSessions
Query
HNSW SearchRe-rankerLLM Stream
Delivery
Web AppMobile AppUsers
What we delivered

THE RESULTS

100 routes+

Twenty controllers spanning accounts, programs, carts, subscriptions, messaging, reviews, and payouts — enough coverage that the mobile and web clients could share one API while Stripe and MySQL invariants stayed centralized in services.

100 routes+
Surface

Twenty controllers spanning accounts, programs, carts, subscriptions, messaging, reviews, and payouts — enough coverage that the mobile and web clients could share one API while Stripe and MySQL invariants stayed centralized in services.

Engineering decisions

TECH
DEEP DIVE

UOW
Unit of Work

Transactional boundaries around multi-table childcare writes.

Dapper escape hatches avoided EF migrations for vendor stored procedures.

PI
Stripe PaymentIntent

Client-side confirmation with server-side idempotency keys on webhook replay.

JSON columns let programs evolve faster than weekly schema releases.

Next Case Study
Blockchain
MessariSubgraphs

Seven production DeFi subgraphs

The GraphTypeScript
Start a project

LET'S
BUILD
SOMETHING.

We take on a small number of projects at a time. If the problem is hard, we're interested.

Email
hello@techmusketeers.com
Response time
Within 24 hours
Availability
Open for new projects · 2025