From 95d68e9481ef4bebf18f5093123c9bef7c20b113 Mon Sep 17 00:00:00 2001 From: ulflow_phattt2901 Date: Thu, 5 Jun 2025 21:21:28 +0700 Subject: [PATCH] Initial commit --- .air.toml | 58 ++ .dockerignore | 62 ++ .env.example | 32 + .feature-flags.json | 5 + .gitea/commit-template.txt | 14 + .gitea/hooks/pre-commit | 48 ++ .gitea/hooks/prepare-commit-msg | 34 + .gitea/workflows/ci.yml | 126 ++++ .gitea/workflows/docker.yml | 135 ++++ .gitignore | 50 ++ Dockerfile | 102 +++ Dockerfile.local | 32 + LICENSE | 21 + Makefile | 198 ++++++ Readme.md | 192 ++++++ cmd/app/main.go | 176 +++++ configs/config.yaml | 76 +++ configs/security.example.yaml | 89 +++ coverage | 24 + docker-compose.prod.yml | 83 +++ docker-compose.yml | 85 +++ docs/.obsidian/app.json | 1 + docs/.obsidian/appearance.json | 1 + docs/.obsidian/core-plugins.json | 31 + docs/.obsidian/workspace.json | 184 ++++++ docs/AUTHENTICATION.md | 209 ++++++ docs/adapter.md | 149 +++++ docs/architecture.md | 234 +++++++ docs/changelog.md | 63 ++ docs/general.md | 79 +++ docs/review.md | 80 +++ docs/roadmap.md | 98 +++ docs/secrets.md | 136 ++++ docs/session_20240524.md | 32 + docs/spec.md | 130 ++++ docs/testing.md | 119 ++++ docs/unit-testing.md | 174 +++++ docs/ux.md | 57 ++ docs/workflow.md | 84 +++ go.mod | 75 +++ go.sum | 600 ++++++++++++++++++ .../adapter/persistence/role_repository.go | 54 ++ .../adapter/persistence/user_repository.go | 106 ++++ internal/domain/role/repository.go | 24 + internal/domain/role/role.go | 25 + internal/domain/user/repository.go | 38 ++ internal/domain/user/user.go | 50 ++ internal/helper/config/load.go | 131 ++++ internal/helper/config/types.go | 100 +++ internal/helper/database/database.go | 154 +++++ internal/helper/feature/feature.go | 75 +++ internal/helper/logger/README.md | 118 ++++ internal/helper/logger/logger.go | 291 +++++++++ internal/helper/logger/logger_test.go | 252 ++++++++ internal/pkg/lifecycle/lifecycle.go | 142 +++++ internal/service/auth_service.go | 236 +++++++ internal/service/auth_service_test.go | 339 ++++++++++ internal/transport/http/dto/error_response.go | 8 + internal/transport/http/dto/user_dto.go | 70 ++ .../transport/http/handler/auth_handler.go | 149 +++++ .../http/handler/auth_register_test.go | 221 +++++++ .../transport/http/handler/health_handler.go | 70 ++ .../http/handler/health_handler_test.go | 308 +++++++++ internal/transport/http/middleware/auth.go | 126 ++++ .../transport/http/middleware/auth_test.go | 336 ++++++++++ internal/transport/http/middleware/logger.go | 43 ++ .../transport/http/middleware/middleware.go | 76 +++ .../http/middleware/middleware_test.go | 182 ++++++ internal/transport/http/router.go | 91 +++ internal/transport/http/server.go | 105 +++ migrations/000000_initial_extensions.down.sql | 1 + migrations/000000_initial_extensions.up.sql | 1 + migrations/000001_create_roles_table.down.sql | 1 + migrations/000001_create_roles_table.up.sql | 14 + migrations/000002_create_users_table.down.sql | 1 + migrations/000002_create_users_table.up.sql | 17 + .../000003_create_user_roles_table.down.sql | 1 + .../000003_create_user_roles_table.up.sql | 26 + templates/.env.example | 32 + templates/config.example.yaml | 31 + tomb.yaml | 55 ++ 81 files changed, 8278 insertions(+) create mode 100644 .air.toml create mode 100644 .dockerignore create mode 100644 .env.example create mode 100644 .feature-flags.json create mode 100644 .gitea/commit-template.txt create mode 100644 .gitea/hooks/pre-commit create mode 100644 .gitea/hooks/prepare-commit-msg create mode 100644 .gitea/workflows/ci.yml create mode 100644 .gitea/workflows/docker.yml create mode 100644 .gitignore create mode 100644 Dockerfile create mode 100644 Dockerfile.local create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 Readme.md create mode 100644 cmd/app/main.go create mode 100644 configs/config.yaml create mode 100644 configs/security.example.yaml create mode 100644 coverage create mode 100644 docker-compose.prod.yml create mode 100644 docker-compose.yml create mode 100644 docs/.obsidian/app.json create mode 100644 docs/.obsidian/appearance.json create mode 100644 docs/.obsidian/core-plugins.json create mode 100644 docs/.obsidian/workspace.json create mode 100644 docs/AUTHENTICATION.md create mode 100644 docs/adapter.md create mode 100644 docs/architecture.md create mode 100644 docs/changelog.md create mode 100644 docs/general.md create mode 100644 docs/review.md create mode 100644 docs/roadmap.md create mode 100644 docs/secrets.md create mode 100644 docs/session_20240524.md create mode 100644 docs/spec.md create mode 100644 docs/testing.md create mode 100644 docs/unit-testing.md create mode 100644 docs/ux.md create mode 100644 docs/workflow.md create mode 100644 go.mod create mode 100644 go.sum create mode 100644 internal/adapter/persistence/role_repository.go create mode 100644 internal/adapter/persistence/user_repository.go create mode 100644 internal/domain/role/repository.go create mode 100644 internal/domain/role/role.go create mode 100644 internal/domain/user/repository.go create mode 100644 internal/domain/user/user.go create mode 100644 internal/helper/config/load.go create mode 100644 internal/helper/config/types.go create mode 100644 internal/helper/database/database.go create mode 100644 internal/helper/feature/feature.go create mode 100644 internal/helper/logger/README.md create mode 100644 internal/helper/logger/logger.go create mode 100644 internal/helper/logger/logger_test.go create mode 100644 internal/pkg/lifecycle/lifecycle.go create mode 100644 internal/service/auth_service.go create mode 100644 internal/service/auth_service_test.go create mode 100644 internal/transport/http/dto/error_response.go create mode 100644 internal/transport/http/dto/user_dto.go create mode 100644 internal/transport/http/handler/auth_handler.go create mode 100644 internal/transport/http/handler/auth_register_test.go create mode 100644 internal/transport/http/handler/health_handler.go create mode 100644 internal/transport/http/handler/health_handler_test.go create mode 100644 internal/transport/http/middleware/auth.go create mode 100644 internal/transport/http/middleware/auth_test.go create mode 100644 internal/transport/http/middleware/logger.go create mode 100644 internal/transport/http/middleware/middleware.go create mode 100644 internal/transport/http/middleware/middleware_test.go create mode 100644 internal/transport/http/router.go create mode 100644 internal/transport/http/server.go create mode 100644 migrations/000000_initial_extensions.down.sql create mode 100644 migrations/000000_initial_extensions.up.sql create mode 100644 migrations/000001_create_roles_table.down.sql create mode 100644 migrations/000001_create_roles_table.up.sql create mode 100644 migrations/000002_create_users_table.down.sql create mode 100644 migrations/000002_create_users_table.up.sql create mode 100644 migrations/000003_create_user_roles_table.down.sql create mode 100644 migrations/000003_create_user_roles_table.up.sql create mode 100644 templates/.env.example create mode 100644 templates/config.example.yaml create mode 100644 tomb.yaml diff --git a/.air.toml b/.air.toml new file mode 100644 index 0000000..820a766 --- /dev/null +++ b/.air.toml @@ -0,0 +1,58 @@ +# Air Tomb Configuration for ULFlow Starter Kit +root = "." +tmp_dir = "tmp" + +[build] +# Just plain old shell command. You could use `make` as well. +cmd = "go build -o ./tmp/main.exe ./cmd/app" +# Binary file yields from `cmd`. +bin = "tmp/main.exe" +# Customize binary. +full_bin = "./tmp/main.exe" +# Watch these filename extensions. +include_ext = ["go", "tpl", "tmpl", "html"] +# Ignore these filename extensions or directories. +exclude_dir = ["assets", "tmp", "vendor", ".git", "node_modules"] +# Watch these directories if you specified. +include_dir = [] +# Exclude files. +exclude_file = [] +# This log file places in your tmp_dir. +log = "air.log" +# It's not necessary to trigger build each time file changes if it's too frequent. +delay = 1000 # ms +# Stop running old binary when build errors occur. +stop_on_error = true +# Send Interrupt signal before killing process (windows does not support this feature) +send_interrupt = true +# Delay after sending Interrupt signal +kill_delay = 500 # ms + +[log] +# Show log time +time = true + +[color] +# Customize each part's color. +main = "magenta" +watcher = "cyan" +build = "yellow" +runner = "green" + +[misc] +# Delete tmp directory on exit +clean_on_exit = true + +[screen] +clear_on_rebuild = true +keep_scroll = true + +[tomb] +# Enable Tomb for graceful shutdown +enabled = true +# Kill signal to use for graceful shutdown +signal = "SIGTERM" +# Timeout for graceful shutdown +timeout = "5s" +# Path to the tomb config file +config = "./tomb.yaml" diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000..da3acec --- /dev/null +++ b/.dockerignore @@ -0,0 +1,62 @@ +# Version control +.git +.gitignore +.gitattributes + +# Build artifacts +/bin/ +/dist/ + +# IDE specific files +.vscode/ +.idea/ +*.swp +*.swo + +# Environment files (except .env.example) +.env +!.env.example + +# Log files +*.log +logs/ + +# OS generated files +.DS_Store +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Test files +*_test.go +/test/ +/coverage.txt + +# Dependency directories +/vendor/ +/node_modules/ + +# Local development files +docker-compose.override.yml + +# Build cache +.cache/ +.air.toml + +# Temporary files +*.tmp +*.temp + +# Local configuration overrides +configs/local.* + +# Documentation +/docs/ +*.md + +# Ignore Dockerfile and docker-compose files (if you're building from source) +# !Dockerfile +# !docker-compose*.yml diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..b7266f9 --- /dev/null +++ b/.env.example @@ -0,0 +1,32 @@ +# App Configuration +APP_NAME="ULFlow Starter Kit" +APP_VERSION="0.1.0" +APP_ENVIRONMENT="development" +APP_TIMEZONE="Asia/Ho_Chi_Minh" + +# Logger Configuration +LOG_LEVEL="info" # debug, info, warn, error + +# Server Configuration +SERVER_HOST="0.0.0.0" +SERVER_PORT=3000 +SERVER_READ_TIMEOUT=15 +SERVER_WRITE_TIMEOUT=15 +SERVER_SHUTDOWN_TIMEOUT=30 + +# Database Configuration +DB_DRIVER="postgres" +DB_HOST="localhost" +DB_PORT=5432 +DB_USERNAME="postgres" +DB_PASSWORD="your_password_here" +DB_NAME="ulflow" +DB_SSLMODE="disable" + +# JWT Configuration +JWT_SECRET="your-32-byte-base64-encoded-secret-key-here" +JWT_ACCESS_TOKEN_EXPIRE=15 # in minutes +JWT_REFRESH_TOKEN_EXPIRE=10080 # in minutes (7 days) +JWT_ALGORITHM="HS256" +JWT_ISSUER="ulflow-starter-kit" +JWT_AUDIENCE="ulflow-web" diff --git a/.feature-flags.json b/.feature-flags.json new file mode 100644 index 0000000..49be960 --- /dev/null +++ b/.feature-flags.json @@ -0,0 +1,5 @@ +{ + "enable_database": { + "enabled": true + } + } \ No newline at end of file diff --git a/.gitea/commit-template.txt b/.gitea/commit-template.txt new file mode 100644 index 0000000..c1b5a6b --- /dev/null +++ b/.gitea/commit-template.txt @@ -0,0 +1,14 @@ +# : + +# + +#