Example CRUD project applying Hexagonal Architecture, Domain-Driven Design (DDD), Event-Driven Architecture (EDA), Command Query Responsibility Segregation (CQRS), Behavior-Driven Development (BDD), Continuous Integration (CI), and more... in Go.
Showcase
Usage
Docker (Demo)
[!NOTE]
- System Requirements
- In the Demo version, the link to confirm the account is sent through the Terminal.
- "Hi <username>, please confirm your account through this link: <link>"
- We can define our own SMTP configuration in the .env.demo file by simply modifying the
CODEXGO_SMTP_*
variables, then we will be able to receive the links by mail.
make demo
Features
Project Layout
Git
- Go: staticcheck and gofmt.
- templ: templ fmt.
- Gherkin: Cucumber extension.
- Others: Prettier cli/extension.
Scanners
Testing Packages
Releases
GitHub
- Actions for:
- Setup Languages and Dependencies
- Workflows running:
- Automatically (Triggered by Push or Pull requests):
- Manually (Using the Actions tab on GitHub):
- Upgrade Dependencies
- Automate Release
- Issue Templates (Defaults).
Devcontainer
- Multiple Features already pre-configured:
- Extensions and their respective settings to work with:
- Go
- templ
- Cucumber
- Prettier
- Better Comments
- Todo Tree
- cSpell
Docker
- Dockerfile
- Multi-stage builds:
- Development
- Testing
- Build
- Production
- Compose
Message Broker
Security
- Form validation at the client using Fomantic - Form Validation.
- On the server, the validations are performed using the Value Objects defined in the Context.
- Data authentication via JWT managed by Session Cookies.
- Account confirmation via Mail or Terminal.
- Password hashing using Bcrypt.
- Requests Rate Limiting.
- Server log files.
Scripts
- syncenv
- Synchronize all .env* files in the directory using an .env model.
- copydeps
- Copies the files required by the browser dependencies from the node_modules folder and places them inside the static folder on the server.
- upgrade
- Perform the following steps to upgrade the project:
- Upgrade Go, Node and Tools.
- Linting and Testing.
- Commit upgrades.
- run
- Display the logs and redirect them to a file whose name depends on the time at which the service was run.
- Used in Production Image.
Basic Workflow (Domain > (Infrastructure | Application) > Presentation)
Bounded Context (App/Business/Department) > Modules (Troubleshooting) > Layers (Domain, Infrastructure & Application)
- Domain (Logic Core)
- Value Objects (Entities)
- Mother Creators
- Unit Tests
- Messages (Event/Command)
- Aggregates (Sets of Entities)
- Aggregate Root (Core Set)
- Mother Creators
- Role Interfaces (Ports)
- Model Interfaces
- Use Cases
- Handlers/Consumers
- Services (Abstract Logic)
- Errors (Management)
- Infrastructure (Port Adapters)
- Persistence
- Repository Mocks
- Implementations (Adapters)
- Integration Tests
- Communication
- Broker Mocks
- Implementations (Adapters)
- Integration Tests
- Application (Orchestration of Domain Logic)
- Use Cases
- Commands
- Queries/Responses
- Handlers/Consumers
- Implementations
- Unit Tests
App > Server > (Presentation)
- Presentation (Consumers of Bounded Context Modules)
- Services (Mapping)
- Server
- Templates
- Handlers
- Routes
- Features (Gherkin)
Idiomatic
- Domain
errors.New*()
, errors.BubbleUp()
& errors.Panic()
- Only in the "Domain" can we throw a
panic()
.
- Infrastructure
Open()
& Close()
errors.New*()
& errors.BubbleUp()
- Application
Run()
, Handle()
& On()
errors.New*()
& errors.BubbleUp()
- Modules
Start()
& Stop()
errors.BubbleUp()
- Services / Apps
Up()
& Down()
errors.New*()
& errors.BubbleUp()
- Main
log.Fatal()
& log.[Wrap]()
- Only
main()
can use log.Fatal()
.
- Logs
[embed]
- We use
[]
to "embed" external values such as error messages, fields, etc... inside our messages.
First Steps
Clone
HTTPS
git clone https://github.com/bastean/codexgo.git && cd codexgo
SSH
git clone git@github.com:bastean/codexgo.git && cd codexgo
Initialize
Dev Container (recommended)
-
System Requirements
-
Start VS Code
code .
-
Open Command Palette
-
Run
Dev Containers: Reopen in Container
Locally
-
System Requirements
-
Run
make init
ZIP
[!NOTE]
curl -sSfLO https://github.com/bastean/codexgo/archive/refs/heads/main.zip \
&& unzip main.zip \
&& mv codexgo-main <repository> \
&& rm main.zip \
&& cd <repository> \
&& make genesis \
&& git commit -m "chore: add codexgo" \
&& git branch -M main \
&& git remote add github https://github.com/<user>/<repository>.git \
&& git push -u github main \
&& git status
GitHub Repository
[!IMPORTANT]
These settings are necessary to be able to execute the Actions Workflows.
Settings tab
Actions
-
General
-
Workflow permissions
- Read and write permissions
Secrets and variables
Run
ENVs
[!IMPORTANT]
Before running it, we must initialize the following environment variable files:
- .env.example
- We will have to create a
.env.(dev|test|prod)
for each runtime environment.
- In the .env.example.demo file, we can see the values that can be used.
In case we only want to run the Integration or Acceptance tests, in addition to having the .env.test
file, we must have the following files created:
Development
make compose-dev
Tests
Unit
make test-unit
Integration
make compose-test-integration
Acceptance
make compose-test-acceptance
Unit/Integration/Acceptance
make compose-tests
Production
make compose-prod
Tech Stack
Base
Please see
Contributing
- Contributions and Feedback are always welcome!
License