Checkout Shopping List API

Tooling

Required

ASP.NET Core 2.0

Optional

Docker - Tested on Docker client 17.04.0-ce, Docker server 17.05.0-ce, Docker Machine 0.10.0 and Docker Compose 1.12.0

Kubernetes - Tested on Kubernetes v1.7.0, kubectl v1.7.0 and Minikube v0.21.0

Note that you may need to increase your VM memory limit to 4GB or higher.

Build

$ ./build.ps1

Run

$ ./run.ps1

Test

$ ./tests.ps1

Docker

Build Image

$ dotnet restore $ dotnet publish -o build -c Release $ docker build -t fkhoda/checkout-shoppinglist-api .

Run with Docker Compose

With ELK monitoring:

$ docker-compose -f docker-compose-with-monitoring.yml up

Without ELK monitoring:

$ docker-compose up

Access

API: http://{docker-machine-ip}:8080

Elasticsearch: http://{docker-machine-ip}:9200

Kibana: http://{docker-machine-ip}:5601 Please allow Kibana a few minutes to optimize its assets before accessing the dashboard.



Kubernetes

Push Docker Image to Registry

$ docker push fkhoda/checkout-shoppinglist-api

Deploy to Minikube Cluster

Deploy ELK for monitoring (Optional)

$ git clone https://github.com/fkhoda/elk-kubernetes.git $ cd elk-kubernetes $ kubectl create -f .\kubefiles\ -R --namespace=default

Deploy Shopping List API with ELK monitoring

$ kubectl create -f ./kubefiles/sl-deployment-with-monitoring.yaml --namespace=default $ kubectl create -f ./kubefiles/sl-service.yaml --namespace=default

Deploy Shopping List API without ELK monitoring

$ kubectl create -f ./kubefiles/sl-deployment.yaml --namespace=default $ kubectl create -f ./kubefiles/sl-service.yaml --namespace=default

Access

API: http://{minikube-ip}:30080

Elasticsearch: http://{minikube-ip}:30920

Kibana: http://{minikube-ip}:31601 Please allow Kibana a few minutes to optimize its assets before accessing the dashboard.



Architecture

Onion Architecture

Actor Model with in-memory Event Sourcing and Snapshotting using Proto Actor (http://proto.actor)

Feature Highlights

Validation using Fluent Validation (https://github.com/JeremySkinner/FluentValidation)

Dead Simple Authentication Middleware

Actor Monitoring using ELK stack

Native .NET Core Dependency Injection

Basic Pagination

Endpoints

Add Item

Method: POST

URI: /api/shoppingLists/{customerId}/items

Get All Items

Method: GET

URI: /api/shoppingLists/{customerId}/items[?pageNumber=1&pageSize=10]

Get Item

Method: GET

URI: /api/shoppingLists/{customerId}/items/{itemName}

Method: PUT

URI: api/shoppingLists/{customerId}/items/{itemName}

Delete Item

Method: DELETE

URI: api/shoppingLists/{customerId}/items/{itemName}

Notes