{"id":37116953,"url":"https://github.com/racibaz/go-arch","last_synced_at":"2026-01-14T13:41:56.528Z","repository":{"id":299580493,"uuid":"1002833207","full_name":"racibaz/go-arch","owner":"racibaz","description":"Go-Arch — Clean-Architecture \u0026 DDD starter for Go / Hexagonal + REST + gRPC template A starter boilerplate for building scalable REST/gRPC services with Domain-Driven Design,modular structure and clean architecture in Go.","archived":false,"fork":false,"pushed_at":"2025-12-26T17:15:33.000Z","size":3443,"stargazers_count":1,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-12-28T06:43:43.436Z","etag":null,"topics":["domain-driven-design","elasticsearch","gin","golang","golang-api","gorm-orm","graceful-shutdown","grafana","grpc-go","hexagonal-architecture","jaeger","kibana","kubernetes","postgresql","prometheus","rabbitmq","restful","swagger","test-driven-development","twillo"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/racibaz.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":"CONTRIBUTING.md","funding":null,"license":"LICENSE","code_of_conduct":"CODE_OF_CONDUCT.md","threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-06-16T08:04:42.000Z","updated_at":"2025-12-28T00:07:55.000Z","dependencies_parsed_at":"2025-06-17T09:34:04.220Z","dependency_job_id":"bb13ea3e-4640-40a2-a0dd-53d5bfe9ec25","html_url":"https://github.com/racibaz/go-arch","commit_stats":null,"previous_names":["racibaz/go-arch"],"tags_count":5,"template":true,"template_full_name":null,"purl":"pkg:github/racibaz/go-arch","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/racibaz%2Fgo-arch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/racibaz%2Fgo-arch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/racibaz%2Fgo-arch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/racibaz%2Fgo-arch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/racibaz","download_url":"https://codeload.github.com/racibaz/go-arch/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/racibaz%2Fgo-arch/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28421706,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-14T13:30:50.153Z","status":"ssl_error","status_checked_at":"2026-01-14T13:29:08.907Z","response_time":107,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["domain-driven-design","elasticsearch","gin","golang","golang-api","gorm-orm","graceful-shutdown","grafana","grpc-go","hexagonal-architecture","jaeger","kibana","kubernetes","postgresql","prometheus","rabbitmq","restful","swagger","test-driven-development","twillo"],"created_at":"2026-01-14T13:41:55.706Z","updated_at":"2026-01-14T13:41:56.516Z","avatar_url":"https://github.com/racibaz.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cp align=\"center\"\u003e\n\n\n\n\u003ca href=\"https://github.com/racibaz/go-arch/actions\"\u003e\n    \u003cimg src=\"https://img.shields.io/github/actions/workflow/status/racibaz/go-arch/ci.yaml\" alt=\"CI\" /\u003e\n\u003c/a\u003e\n\n\u003ca href=\"https://goreportcard.com/report/github.com/racibaz/go-arch\"\u003e\n    \u003cimg src=\"https://goreportcard.com/badge/github.com/racibaz/go-arch\" alt=\"Go Report Card\" /\u003e\n\u003c/a\u003e\n\n\u003cimg src=\"https://img.shields.io/github/go-mod/go-version/racibaz/go-arch\" alt=\"Go Version\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/docker/pulls/racibaz/go-arch\" alt=\"Docker Image\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/github/license/racibaz/go-arch\" alt=\"License\" /\u003e\n\n\u003cimg src=\"https://img.shields.io/github/languages/code-size/racibaz/go-arch\" alt=\"Repo Size\" /\u003e\n\n\u003ca href=\"https://codecov.io/github/racibaz/go-arch\" \u003e \n    \u003cimg src=\"https://codecov.io/github/racibaz/go-arch/graph/badge.svg?token=2YAP23FY1G\" alt=\"codecov\"/\u003e \n\u003c/a\u003e\n\n\n\u003c/p\u003e\n\n# Go-Arch\nGo-Arch provides a full-featured template for building modern backend services in Go, combining:\n- Hexagonal (ports \u0026 adapters) architecture + Domain-Driven Design (DDD)\n- Modular monolith structure\n- Module code generator for rapid development\n- RESTful APIs and gRPC support\n- Database integration via Gorm + PostgreSQL + migrations\n- Message queue support (RabbitMQ) \u0026 async notifications\n- Swagger UI for API documentation + auto-generated docs / protos\n- Built-in config management, logging, graceful shutdown, and Docker / docker-compose setup — ready for production or microservice environments.\n\nUse Go-Arch as a starting point boilerplate to launch Go services rapidly: fork, configure, build — and go.\n\n## 📚 Table of Contents\n\n- [📖 Overview](#-overview)\n- [📝 Notes](#-notes)\n- [🐳 Docker Hub Link](#-docker-hub-link)\n- [🔐 GitHub Secrets](#-github-secrets)\n- [🐳 Run with Docker (air for live reload)](#-run-with-docker)\n- [🧩 Create Your First Module](#-create-your-first-module)\n    - [Step 1: Generate the Module](#step-1-generate-the-module)\n    - [Step 2: Register Routes](#step-2-register-routes)\n    - [Step 3: Add Database Migrations](#step-3-add-database-migrations)\n    - [Step 4: Implement Module Logic](#step-4-implement-module-logic)\n    - [Step 5: Generate Swagger Documentation](#step-5-generate-swagger-documentation)\n    - [Module Creation Flow](#module-creation-flow)\n- [⚙️ Application Runtime Modes](#-application-runtime-modes)\n- [🪲 Local Debugging Mode](#-local-debugging-mode)\n- [🚀 GitHub Actions CI Workflow](#-github-actions-ci-workflow)\n- [🔧 Makefile Commands](#-makefile-commands)\n- [📂 Project Structure](#-project-structure)\n- [⚙️ Generate gRPC Code](#-generate-grpc-code)\n    - [ gRPC Client Example](#-grpc-client-example)\n- [📑 Swagger Documentation UI](#-swagger-documentation-ui)\n    - [Generate Swagger Documentation](#generate-swagger-documentation)\n- [📬 RabbitMQ UI](#rabbitmq-ui)\n- [📡 Prometheus UI](#prometheus-ui)\n- [📊 Grafana UI](#grafana-ui)\n- [🔎 Jaeger UI](#jaeger-ui)\n- [🗄️ Elasticsearch](#elasticsearch)\n- [🌐 Kibana UI](#kibana-ui)\n- [📦 Dependencies](#-dependencies)\n- [📂 Project Structure](#-project-structure)\n- [📑 Architecture Decision Log (ADL)](#-architecture-decision-log-adl)\n- [🛠 Roadmap / TODO](#-roadmap--todo)\n- [🚪 API Requests](#-api-requests)\n- [📬 Postman Collection](#-postman-collection)\n- [❌ Validation Error Example](#-validation-error-example)\n- [✔️ Linters](#-linters)\n- [🧪 Test](#-tests)\n- [🤝 Code of Conduct](#-code-of-conduct)\n- [👥 Contributing](#-contributing)\n- [📜 License](#-license)\n\n\n## 📖 Overview\nThis project demonstrates clean architectural principles in Go, including:\n\n- **Hexagonal Architecture** for separation of concerns\n- **DDD** for domain modeling\n- **Modular Monolith Structure**\n- **TDD** for reliable, testable code\n- **RESTful APIs** \n- **gRPC APIs**\n- **Swagger UI** for API exploration\n- **PostgreSQL with Gorm ORM**\n- **RabbitMQ** for messaging\n- **Prometheus** for metrics\n- **Grafana** for visualization\n- **OpenTelemetry** for tracing\n- **Jaeger** for distributed tracing\n- **Twilio** for notifications\n- Graceful Shutdown\n- Configuration Management\n- **Logging** with Zap\n- Docker and Docker Compose\n- **Live Reload** with Air\n- **Database Migrations** with Golang-Migrate\n- **Mocking** with Mockery\n- Comprehensive Documentation\n- **Makefile** for common tasks\n- **Postman Collection** for API testing\n- **EFK Stack** for logging\n- CI with GitHub Actions\n- **Build Docker Images** and **Push to Docker Hub**\n- **Module Generator** for rapid module creation\n- **Hateoas** for API responses\n- **CodeQL Analysis** for security\n- **Codecov** coverage reports\n- **Interface Assertions** for better type safety\n- **Migration** and **Seeder** mechanisms\n- **Golangci-lint** for more linters\n- **Architecture Decision Log (ADL)** for documenting architectural decisions\n- And more...\n\n\n## 📝 Notes\n- There are two config files that are .env and config.yaml. You can override config.yaml values with environment variables defined in the .env file.\n\n    1. Using golang-migrate package via Makefile commands.\n       The Command examples:\n        - name=init_schema make db_create_migration\n        - make db_migrate_up\n        - make db_migrate_down\n        - make db_migrate_force\n        - make db_migrate_drop\n        - make db_migrate_version\n       \n    2. If you want to use air (live reload), you can change the `entrypoint.sh` file in the root directory.\n          - change the command `make run` to `exec air` or `exec air -d` \n\n\n### 🐳 Docker Hub Link\n👉 https://hub.docker.com/r/racibaz/go-arch\n\n\n### 🔐 GitHub Secrets\nTo enable automatic Docker image builds and pushes to Docker Hub via GitHub Actions, set the following secrets in your GitHub repository settings:\n- `DOCKERHUB_USERNAME`: Your Docker Hub username.\n- `DOCKERHUB_PASSWORD`: Your Docker Hub password or access token.\n- `DOCKERHUB_REPOSITORY`: The name of your Docker Hub repository (e.g., `racibaz/go-arch`).\n- `DOCKERHUB_IMAGE_TAG`: The tag for the Docker image (e.g., `latest` or a specific version).\n- `CODECOV_TOKEN`: Your Codecov token for code coverage reporting.\n\n\n### 🐳 Run with Docker\n```bash\ngit clone https://github.com/racibaz/go-arch.git\n\ncd go-arch\n\ncp .env.example .env\n\ndocker compose up --build\n```\nTo access the running container shell:\n```bash\ndocker exec -it Blog-app sh\n```\nTo run database migrations using Makefile commands inside the container shell:\n```bash\nmake db_migrate_up\nmake seed\n```\nElasticsearch Enrollment Token \u0026 Kibana Verification Code:\n```bash\ndocker exec -it elasticsearch bin/elasticsearch-create-enrollment-token --scope kibana\ndocker exec -it kibana bin/kibana-verification-code\n```\n\n\n## 🧩 Create Your First Module\n\nFollow the steps below to create and integrate a new module into the application.\n\n---\n\n### Step 1: Generate the Module\n\nRun the following command from the project root:\n\n```bash\nmake module name=YourModuleName\n```\n\nThis command generates the standard module skeleton under:\n\n`internal/modules/YourModuleName/`\n\n\n\n### Step 2: Register Routes\n\nModules are not registered automatically.\nYou must explicitly add their routes to the main router registry.\n\nLocation:\n\n`internal/providers/routers/router.go`\n\n- Add HTTP routes to the RegisterRoutes function\n- Add gRPC routes (if any) to the RegisterGrpcRoutes function\n\nThis keeps routing centralized and predictable.\n\n### Step 3: Add Database Migrations\n\nIf your module introduces database changes, add your SQL migration files to:\n\n`migrations/`\n\nMake sure to follow the existing migration naming and versioning conventions.\nand run the migration commands to apply them:\n\n```bash\nmake db_migrate_up\n``` \n\n### Step 4: Implement Module Logic\n\nImplement your module inside the generated directory:\n\n`internal/modules/YourModuleName/`\n\nFollow the structure of existing modules (for example, the post module).\n\nTypical responsibilities include:\n\n- Handlers for HTTP/gRPC/other protocols\n- CommandHandler (business logic), QueryHandler\n- Repository\n- DTOs and validation logic\n\nStep 5: Generate Swagger Documentation\n\nAfter adding or modifying API endpoints, update the Swagger documentation:\n\n`make generate_swagger`\n\nSee [Generate Swagger Documentation](#generate-swagger-documentation) for details.\n\n### Module Creation Flow\n\n    Generate module\n        ↓\n    Register routes\n        ↓\n    Add migrations\n        ↓\n    Implement logic\n        ↓\n    Generate Swagger\n\n\n\n### ⚙️ Application Runtime Modes\nYou can set the application environment by changing the `APP_ENV` variable in the `.env` file.\n\n\n| **APP_ENV** | **Gin Mode** | **Description**                                                                |\n| ----------- | ------------ | ------------------------------------------------------------------------------ |\n| `local`     | `debug`      | Local development mode with full debug logs and detailed error output.         |\n| `dev`       | `debug`      | Development mode; debugging features and verbose logs are enabled.             |\n| `test`      | `test`       | Test mode with minimal logs, optimized for automated tests.                    |\n| `prod`      | `release`    | Production mode; highest performance with simplified logs and no debug output. |\n\n\n### 🪲 Local Debugging Mode\n\nIf you want to debug the application locally with your IDE or command line, follow these steps:\n\n- Stop the app container if it's running.\n- Edit the `.env` file to set `APP_ENV` to `local`.\n- In the main.go file, uncomment the following line:\n```go\n\t//cmd.Execute() // if you want  use  cobra cli\n\tbootstrap.Serve() //uncomment this line, if you want to local debugging \n```\n- Debug it with your IDE or command line.\n- Use the url `localhost:3000` instead of `localhost:3001`.\n- Such as: `localhost:3000/api/v1/posts`\n\n\n\n\n### 🚀 GitHub Actions CI Workflow\nThe project includes a GitHub Actions workflow for continuous integration (CI). The workflow is defined in the `.github/workflows/ci.yaml` file and includes the following steps:\n#### Step 1 - (push and release):\n- Checkout code\n- Set up Go environment\n- Install dependencies\n- Run linters\n- Run tests\n\n#### Step 2 - If you give tag to your repository, it will trigger the release job:\n- Build the application\n- Build Docker image\n- Push Docker image to Docker Hub\n \n\n\n### 🔧 Makefile Commands\n```bash\nmake run\n```\n```bash\nname=init_schema make db_create_migration\n```\n```bash\nmake db_migrate_up\n```\n```bash\nmake db_migrate_down\n```\n```bash\nmake db_migrate_force\n```\n```bash\nmake db_migrate_drop\n```\n```bash\nmake db_migrate_version\n```\n```bash\nmake seed\n```\n```bash\nmake mock\n```\n```bash\nmake coverage\n```\n```bash\nmake test\n```\n```bash\nmake lint\n```\n```bash\nmake ci-lint\n```\n```bash\nmake fmt\n```\n\n#### 🛠️ Generate gRPC Code\n```bash\n make generate_proto DIR=yourPath\n```\nExample:\n```bash\n make generate_proto DIR=internal/modules/post/presentation/grpc/proto\n```\n\n#### 🧪 gRPC Client Example\n```   \n\npackage main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"github.com/racibaz/go-arch/internal/modules/post/presentation/grpc/proto\"\n\t\"github.com/racibaz/go-arch/pkg/config\"\n\t\"google.golang.org/grpc\"\n\t\"google.golang.org/grpc/credentials/insecure\"\n\t\"log\"\n)\n\nconst (\n\tPostAggregate = \"posts.Post\"\n)\n\nfunc main() {\n\n\tconfig.Set(\"./../config\", \"./../.env\")\n\tconfig := config.Get()\n\n\taddr := fmt.Sprintf(\"%s:%s\", config.Grpc.Host, config.Grpc.Port)\n\n\tconn, err := grpc.NewClient(addr, grpc.WithTransportCredentials(insecure.NewCredentials()))\n\tif err != nil {\n\t\tlog.Fatalf(\"did not connect: %v\", err)\n\t}\n\n\tif err != nil {\n\t\tlog.Fatalf(\"Couldn't connect to grpc client: %v\\n\", err)\n\t}\n\n\tdefer conn.Close()\n\tc := proto.NewPostServiceClient(conn)\n\n\tCreatePost(c)\n\n}\n\n// CreatePost creates a new post via gRPC client\nfunc CreatePost(c proto.PostServiceClient) string {\n\n\tvar payload = \u0026proto.CreatePostInput{\n\t\tUserID:      \"7b3a4d03-bcb9-47ce-b721-a156edd406f0\",\n\t\tTitle:       \"test title title title grpc\",\n\t\tDescription: \"test description description grpc\",\n\t\tContent:     \"test content content content grpc\",\n\t}\n\n\tres, err := c.CreatePost(context.Background(), payload)\n\n\tif err != nil {\n\t\tlog.Fatalf(\"Could not create post: %v\\n\", err)\n\t}\n\n\tlog.Printf(\"Post has been created with ID: %s\\n\", res.GetId())\n\n\treturn res.GetId()\n}\n``` \n\n### 📘 Swagger Documentation UI\nhttp://127.0.0.1:3001/swagger/index.html#\n\n#### 🧬 Generate Swagger Documentation\n```bash\n  make generate_swagger\n```\n\n![Swagger UI](https://github.com/user-attachments/assets/2fd68ccb-5e1e-406f-a30f-744aa51a836a)\n\n\n### RabbitMQ UI\nhttp://localhost:15672/#/\n\n#### Username: guest\n#### Password: guest\n\n![RabbitMQ UI](https://github.com/user-attachments/assets/76b78666-c44a-487b-91e9-a6d8fc72d980)\n![RabbitMQ UI](https://github.com/user-attachments/assets/6642d40c-dfa2-416d-a512-0069c05de376)\n\n\n### Prometheus UI\n#### http://localhost:9090/\n#### http://localhost:3001/metrics\n\n![Prometheus UI](https://github.com/user-attachments/assets/ca863e64-cb7f-4d2e-92bb-d64892ae3f37)\n\n### Grafana UI\nhttp://localhost:3002/login\n\n#### Username: admin\n#### Password: admin\n\n![Grafana UI](https://github.com/user-attachments/assets/fa8d87e5-2257-4267-aba7-9823ecbc6774)\n\n### Jaeger UI\n\nhttp://localhost:16686/search\n\n![Jaeger UI](https://github.com/user-attachments/assets/74793b87-2adc-4974-abe2-d894c95e2e39)\n\n### Elasticsearch\nhttp://localhost:9200/\n\n\n### Kibana UI\nhttp://127.0.0.1:5601/app/home#/\n\n\n![Jaeger UI](https://github.com/user-attachments/assets/ffe97ba4-e9c1-49d2-98cd-94656bfe8cc9)\n\n\n\n\n## 📦 Dependencies\n- uuid: `github.com/google/uuid`\n- cli: `github.com/spf13/cobra`\n- config: `github.com/spf13/viper`\n- framework: `github.com/gin-gonic/gin`\n- protobuf: `github.com/golang/protobuf`\n- grpc: `google.golang.org/grpc`\n- grpc-gen: `google.golang.org/genproto/googleapis/rpc`\n- orm: `gorm.io/gorm`\n- live reload: `github.com/air-verse/air`\n- open api: `github.com/swaggo/swag`\n- open api gin: `github.com/swaggo/gin-swagger`\n- testing: `github.com/stretchr/testify`\n- mocking: `github.com/vektra/mockery`\n- logger: `github.com/uber-go/zap`\n- twilio: `github.com/twilio/twilio-go`\n- rabbitmq: `github.com/rabbitmq/amqp091-go`\n- migrations: `github.com/golang-migrate/migrate/v4`\n- prometheus: `github.com/prometheus/client_golang`\n- open telemetry: `go.opentelemetry.io/otel`\n- jaeger: `go.opentelemetry.io/otel/exporters/jaeger`\n- golangci-lint: `github.com/golangci/golangci-lint/cmd/golangci-lint`\n\n## 📂 Project Structure\n\nMinimal Structure\n\n```lua\n├── Dockerfile\n├── LICENSE\n├── Makefile\n├── README.md\n├── cmd\n├── config\n├── deployments\n├── docker-compose.yml\n├── docs\n├── entrypoint.sh\n├── go.mod\n├── go.sum\n├── internal\n│   ├── database\n│   │   ├── migration\n│   │   └── seeder\n│   ├── modules\n│   │   ├── post                          # Your module directory\n│   │   │   ├── application         # The application bussiness logics live here such as services, command, queries, so on.\n│   │   │   ├── domain              # The core business logic and entities\n│   │   │   ├── infrastructure      # (Outbound Adapter) You can implemenet 3. party services integration here such as PostgreSQL and  Mysql implementation\n│   │   │   ├── module.go           # The module's main entry point for registration\n│   │   │   ├── presentation        # (Inbound Adapter) Handles HTTP and gRPC requests and responses\n│   │   │   └── testing             # Mocks and Integration tests for the module\n│   │   └── shared                        # Shared module for common functionalities across modules\n│   │       ├── domain\n│   │       ├── infrastructure\n│   │       └── presentation\n│   │       └── testing\n│   └── providers                                \n├── main.go\n├── migrations\n├── pkg\n```\n\nExpanded Structure\n\n```lua\n├── cmd\n├── internal\n│   ├── database\n│   │   ├── migration\n│   │   └── seeder\n│   ├── modules\n│   │   ├── post\n│   │   │   ├── application\n│   │   │   │   ├── command\n│   │   │   │   ├── dtos\n│   │   │   │   ├── handlers\n│   │   │   │   ├── ports\n│   │   │   │   └── queries\n│   │   │   ├── domain\n│   │   │   ├── infrastructure\n│   │   │   │   ├── messaging\n│   │   │   │   │   └── rabbitmq\n│   │   │   │   ├── notification\n│   │   │   │   │   └── sms\n│   │   │   │   └── persistence\n│   │   │   │       ├── gorm\n│   │   │   │       │   ├── entities\n│   │   │   │       │   ├── mappers\n│   │   │   │       │   └── repositories\n│   │   │   │       └── in_memory\n│   │   │   ├── module.go\n│   │   │   ├── presentation\n│   │   │   │   ├── grpc\n│   │   │   │   │   └── proto\n│   │   │   │   ├── http\n│   │   │   └── testing\n│   │   │       └── mocks\n│   │   │       └── integration\n│   │   └── shared\n│   │       ├── domain\n│   │       ├── infrastructure\n│   │       └── presentation\n│   │       └── testing\n│   └── providers\n├── main.go\n├── migrations\n├── pkg\n│   ├── bootstrap\n│   │   ├── seed.go\n│   │   └── serve.go\n│   ├── config\n│   ├── database\n│   ├── ddd\n│   ├── env\n│   ├── error\n│   ├── es\n│   ├── grpc\n│   ├── helper\n│   ├── logger\n│   ├── messaging\n│   ├── notification\n│   ├── prometheus\n│   ├── registry\n│   ├── routing\n│   ├── trace\n│   ├── uuid\n│   └── validator\n\n\n```\n\n## 📑 Architecture Decision Log (ADL)\n\nThe Architecture Decision Log (ADL) for this project can be found in the `docs/adl` directory. It contains records of significant architectural decisions made during the development of this project.\nIf you need to add new adr, you can use [template.md](docs/adl/template.md) file.\n\n- [ADL.md](docs/adl/adl.md) 👈 index\n\n\n\n\n## 🛠 Roadmap / TODO\n- [x] Implement state-change pattern\n- [x] Module Code Generator\n- [x] Push Docker Image to Docker Hub via GitHub Actions\n- [x] Grafana \u0026 Prometheus integration\n- [x] OpenTelemetry \u0026 Jaeger integration\n- [x] Tracing with Jaeger\n- [x] EFK Stack for logging\n- [x] Single environment (override config.yaml file with .env file)\n- [x] Alternative migration usage with cmd/migrate CLI app and golang-migrate package\n- [x] GitHub Actions Workflow for CI\n- [ ] Add more unit tests\n- [ ] Add more integration tests\n- [ ] Add more end-to-end tests\n- [ ] Extend documentation\n- [ ] Add GraphQL API\n- [ ] Add more gRPC services\n- [ ] MongoDB integration\n- [ ] Add correlationId support\n- [ ] Add Auth Module\n- [ ] Kubernetes deployment manifests\n- [ ] Helm charts for easy deployment\n- [ ] Support for more notification channels (e.g., Email, Push Notifications)\n- [ ] Implement rate limiting\n- [ ] Implement API versioning\n- [ ] Implement feature toggles\n- [ ] Implement vertical slice architecture\n\n\n## 🚪 API Requests\n\n| Endpoint                    | HTTP Method |    Description    |\n|-----------------------------|:-----------:|:-----------------:|\n| `/api/v1/posts`             |   `POST`    |  `Create a post`  |\n| `/api/v1/posts/{{post_id}}` |    `GET`    |   `Get a post`    |\n| `/api/health`               |    `GET`    | `Health endpoint` |\n| `/metrics`                  |    `GET`    |  `List metrics`   |\n\n## 📬 Postman Collection\n[Download](docs/postman/baz-arch.postman_collection.json)\n\n## ❌ Validation Error Example\nWhen sending a POST request to create a post with invalid data, you might receive a validation error response like this:\n```\n{\n    \"status\": 422,\n    \"type\": \"validation error\",\n    \"message\": \"post validation request body does not validate\",\n    \"cause\": {\n        \"Description\": [\n            \"required\"\n        ],\n        \"Title\": [\n            \"required\"\n        ]\n    }\n}\n\n```\n\n\n## 🧹 Linters\n```bash\nmake lint\n```\n\n## 🧪 Tests\nFor testing, when you are working in you local, change the APP_ENV variable to \"test\" in the .env file.\n```bash \nAPP_ENV=\"test\" \n```\n```bash\nmake test\n```\n```bash\nmake coverage\n```\n\n\n## 🤝 Code of Conduct\n\nPlease note that this project is governed by a [Code of Conduct](CODE_OF_CONDUCT.md). By participating, you are expected to uphold this code.\n\n## 👥 Contributing\n\nPlease see the [CONTRIBUTING](CONTRIBUTING.md) file.\n\n## 📜 License\n\nThis project is licensed under the Apache 2.0 License. For further details, please see the [LICENSE](LICENSE) file.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fracibaz%2Fgo-arch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fracibaz%2Fgo-arch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fracibaz%2Fgo-arch/lists"}