- Overview
- Project structure
- Dependencies
- Developer Setup
- Running Test
- Starting server and swagger openapi for Frontend development
- Running in local cluster minikube
- Useful Command/Makefile
- Database Schema
- Design choice
Buy Better Admin API is an admin backend to handle the admin task like category matching, product matching,
user managment etc. including a helper for web scraping part.
Currently, only category matching is available.
NOTE: This project is for learning purpose and not fully complete yet
├── .gen # auto generated by jet-db
│ ├── buy-better-admin
├── .github
│ ├── workflows
├── bin # go binary
├── cmd
│ ├── api # main package for api server
│ ├── dbhelper # a dev tool for database helper
│ └── tokengen # a dev tool for paseto generator
├── data # the sql file using for seed or test db
├── internal
│ ├── middleware # api middleware
│ ├── store # database logic
│ ├── utils # global utilities
│ └── v1
│ ├── category # category handler
│ ├── probe # liveness & readiness handler
│ └── user # user handler
├── k8s
│ ├── base # kustomize base
│ │ └── admin-api
│ ├── dev # patch kustomize
│ │ └── admin-api
│ └── secret # bitnami sealed secrets
│ └── dev
├── migrations # generated by migrate tool
└── spec # openapi v3 spec
- docker / docker-compose
- minikube
- kubectl / kustomize
- helm
- kubeseal
- CLI mockery
- Create environment variable store in
.envfile at root directory
WEB_SERVICE_ENV="dev"
WEB_ADDR=":3000"
WEB_READ_TIMEOUT=5
WEB_WRITE_TIMEOUT=40
WEB_IDLE_TIMEOUT=120
WEB_SHUTDOWN_TIMEOUT=20
DB_DRIVER="postgres"
DB_DSN="postgresql://postgres:admin1234@localhost:5432/buy-better-admin?sslmode=disable"
DB_MAX_OPEN_CONNS=25
DB_MAX_IDLE_CONNS=25
DB_MAX_IDLE_TIME="15m"
TOKEN_ENCODED="1c0021bc344fa16c72fc522c53bfe9f77a2a597507374e56e3a275759c4c1562"
For
TOKEN_ENCODED, you can random generate using this and use 64 digits
- Create postgres environment variable in
.postgres.envfile at root directory. This will be used bydocker-compose.
POSTGRES_USER="postgres"
POSTGRES_PASSWORD="admin1234"
POSTGRES_DB="buy-better-admin"
postgres environment variables must be match with Makefile
- Visit
MakefileThere are 4 important variables for local development. Feel free to edit.
DB_DSN
DB_NAME
DB_USERNAME
CONTAINER_NAME
-
Start the development postgres db
make dev-db-upthis command does follow- docker-compose with postgres image
- sleep for 3 seconds
- migrate up
- seed the fake data with
dbhelpertool
-
go run cmd/apistart the server with port:3000
- Run only unit test
make test-unit-v - Run only integration test
make test-integr-v - Run all test
make test-all-v
make server upstarting postgres db, swagger and buy better admin serverlocalhost:3000- buy better admin serverlocalhost:8081- swagger openapi
make server downshutting postgres db and swagger down
- create
encoded-secret.yamlunder k8s/secret/dev
apiVersion: v1
kind: Secret
metadata:
name: admin-api-secret
namespace: buy-better
type: Opaque
data:
TOKEN_ENCODED: "your base64 encode to TOKEN_ENCODED"
-
make dev-up-all- starting postgres db -> migration -> seed fake data
- starting minikube
- apply
bitnami-sealed-secretscontroller
-
minikbue tunnelto expose load balancer -
make dev-apply- go mod tidy
- building an image with docker
- kustomize apply resources
- generate and apply bitnami secret
- restart deployment (due to bitnami seal secret controller changing certificate everytime when starting a new cluster)
Please visit Makefile for the full command.
make token-gen-buildbuild a binary of paseto token generator for testingmake token-gen-validgenerate a valid token with 1 hour expiration and user_id 1make token-gen-expiregenerate an expired token with user_id 1
make jet-gengenerate a type safe from database. run this command everytime there is a change in database schema.mockerygenerate a mock file. please visit.mockery.yamlfor the settingmake dev-db-resetrestart the postgres container. run when you want to reset the database
Most of the tools and 3rd party libraries are for learning purpose and convenience. I will try to explain some libraries.
go migratea go native migration tool with go SDK So it can run programmatic migration. It's useful when run integration test withdockertestginit has many useful features likevalidatorand middleware. Yes, I can usechirouter but eventually I will usevalidatorpackage. So I pickedginwhich already had built-invalidator.testifya test suite feature is the reason. I planned to separate a unit and integration test with test suite.jet-dba type safe sql builder. very good dx for dynamic queries from my research. which is the best match for this project. I also prefer SQL style rather than ORMpasetoinstead of jwt. This is related to the frontend development. I planned to store token for both localstorage and cookies (token and refresh token). both storage have pros and cons. So I spread the risk into 2 storage (cookies and localstorage). Since paseto is an encrypted token. It made it very difficult to encrypted if the token is leaked.

