{"id":36586636,"url":"https://github.com/kjanat/chatlogger-api-go","last_synced_at":"2026-01-12T08:03:59.566Z","repository":{"id":289016060,"uuid":"969738497","full_name":"kjanat/chatlogger-api-go","owner":"kjanat","description":"Go backend for the multi-tenant ChatLogger API.","archived":false,"fork":false,"pushed_at":"2025-07-06T20:07:51.000Z","size":700,"stargazers_count":2,"open_issues_count":1,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-07-06T20:19:07.836Z","etag":null,"topics":["api","automation","chatlogger","devops","golang","server"],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/kjanat.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":".github/CODEOWNERS","security":"SECURITY.md","support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2025-04-20T20:28:56.000Z","updated_at":"2025-06-13T02:41:44.000Z","dependencies_parsed_at":"2025-05-07T12:33:43.735Z","dependency_job_id":"f2bfd486-233c-4d3f-9438-2073393064cf","html_url":"https://github.com/kjanat/chatlogger-api-go","commit_stats":null,"previous_names":["kjanat/chatlogger-api-go"],"tags_count":39,"template":false,"template_full_name":null,"purl":"pkg:github/kjanat/chatlogger-api-go","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjanat%2Fchatlogger-api-go","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjanat%2Fchatlogger-api-go/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjanat%2Fchatlogger-api-go/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjanat%2Fchatlogger-api-go/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/kjanat","download_url":"https://codeload.github.com/kjanat/chatlogger-api-go/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/kjanat%2Fchatlogger-api-go/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28337007,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-12T06:09:07.588Z","status":"ssl_error","status_checked_at":"2026-01-12T06:05:18.301Z","response_time":98,"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":["api","automation","chatlogger","devops","golang","server"],"created_at":"2026-01-12T08:03:59.492Z","updated_at":"2026-01-12T08:03:59.557Z","avatar_url":"https://github.com/kjanat.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ChatLogger API (Go)\n\u003c!-- ![ChatLogger API](https://raw.githubusercontent.com/kjanat/chatlogger-api-go/master/assets/logo.png) --\u003e\n\n[![Go version](https://img.shields.io/github/go-mod/go-version/kjanat/chatlogger-api-go?logo=Go\u0026logoColor=white)](go.mod)\n[![Go Doc](https://godoc.org/github.com/kjanat/chatlogger-api-go?status.svg)][Package documentation]\n[![Go Report Card](https://goreportcard.com/badge/github.com/kjanat/chatlogger-api-go)][Go report] \u003c!-- WTF Can't I Capitalize GO?... [![Go Report](https://img.shields.io/badge/Go%20report-A+-brightgreen.svg)][Go report] --\u003e\n[![Static Badge](https://img.shields.io/badge/Bump.sh-API--Docs-blue?logo=data%3Aimage%2Fsvg%2Bxml%3Bbase64%2CPHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIGZpbGw9Im5vbmUiIHZpZXdCb3g9IjAgMCAyNTYgMjU2Ij48ZyBjbGlwLXBhdGg9InVybCgjcHJlZml4X19hKSI%2BPHBhdGggZmlsbD0iI2ZmZiIgZD0iTTI1NC43MzQgMTAwLjQ2NWMtLjE2Ny0zNi4yMS0yNi4xNC01OC4zMS02My4zODItNTguMzEtMzcuMjQzIDAtNjMuMTEzIDIyLjQzNi02My4xNTIgNTguMDkxIDAgMS42MzktLjE0MiAxNC41MDktLjMyMyAzMS4wMzMtLjAxMyAxLjI3OC0xLjgyIDEuNTEtMi4xNTUuMjcxLTYuOTA3LTI2LjIwNS0zMC4xNDMtNDEuNjMyLTYxLjI2Ny00MS42MzItMzcuMzg1IDAtNjMuMTY0IDIyLjQ3NS02My4xNjQgNTguMTk1IDAgLjc0OC0xLjI5MSA2NS43MzItMS4yOTEgNjUuNzMyaDI1NnMtMS4wMDctMTA4LjgzNi0xLjI1Mi0xMTMuMzh6Ii8%2BPC9nPjxkZWZzPjxjbGlwUGF0aCBpZD0icHJlZml4X19hIj48cGF0aCBmaWxsPSIjZmZmIiBkPSJNMCAwaDI1NnYyNTZIMHoiLz48L2NsaXBQYXRoPjwvZGVmcz48L3N2Zz4%3D\u0026link=https%3A%2F%2Fchatlogger-api-docs.kjanat.com%2F)][API Docs]\n[![Tag](https://img.shields.io/github/v/tag/kjanat/chatlogger-api-go?sort=semver\u0026label=Tag)](https://github.com/kjanat/chatlogger-api-go/tags)\n[![Release Date](https://img.shields.io/github/release-date/kjanat/chatlogger-api-go?label=Release%20date)][Latest release]\n[![License: MIT](https://img.shields.io/github/license/kjanat/chatlogger-api-go?label=License)](LICENSE)\n[![Commit activity](https://img.shields.io/github/commit-activity/m/kjanat/chatlogger-api-go?label=Commit%20activity)][Commits]\n[![Last commit](https://img.shields.io/github/last-commit/kjanat/chatlogger-api-go?label=Last%20commit)][Commits]\n[![CI](https://img.shields.io/github/actions/workflow/status/kjanat/chatlogger-api-go/chatlogger-pipeline.yml?logo=github\u0026label=CI)][Build]\n[![Codecov](https://img.shields.io/codecov/c/gh/kjanat/chatlogger-api-go?token=QUop5QdCOv\u0026logo=codecov\u0026logoColor=%23F01F7A\u0026label=Coverage)][Codecov] \u003c!-- https://codecov.io/gh/kjanat/chatlogger-api-go/graph/badge.svg?token=QUop5QdCOv --\u003e\n[![Issues](https://img.shields.io/github/issues/kjanat/chatlogger-api-go?label=Issues)][Issues]\n\u003c!-- [![autofix enabled](https://shields.io/badge/autofix.ci-yes-success?logo=data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjZmZmIiB2aWV3Qm94PSIwIDAgMTI4IDEyOCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj48cGF0aCB0cmFuc2Zvcm09InNjYWxlKDAuMDYxLC0wLjA2MSkgdHJhbnNsYXRlKC0yNTAsLTE3NTApIiBkPSJNMTMyNSAtMzQwcS0xMTUgMCAtMTY0LjUgMzIuNXQtNDkuNSAxMTQuNXEwIDMyIDUgNzAuNXQxMC41IDcyLjV0NS41IDU0djIyMHEtMzQgLTkgLTY5LjUgLTE0dC03MS41IC01cS0xMzYgMCAtMjUxLjUgNjJ0LTE5MSAxNjl0LTkyLjUgMjQxcS05MCAxMjAgLTkwIDI2NnEwIDEwOCA0OC41IDIwMC41dDEzMiAxNTUuNXQxODguNSA4MXExNSA5OSAxMDAuNSAxODAuNXQyMTcgMTMwLjV0MjgyLjUgNDlxMTM2IDAgMjU2LjUgLTQ2IHQyMDkgLTEyNy41dDEyOC41IC0xODkuNXExNDkgLTgyIDIyNyAtMjEzLjV0NzggLTI5OS41cTAgLTEzNiAtNTggLTI0NnQtMTY1LjUgLTE4NC41dC0yNTYuNSAtMTAzLjVsLTI0MyAtMzAwdi01MnEwIC0yNyAzLjUgLTU2LjV0Ni41IC01Ny41dDMgLTUycTAgLTg1IC00MS41IC0xMTguNXQtMTU3LjUgLTMzLjV6TTEzMjUgLTI2MHE3NyAwIDk4IDE0LjV0MjEgNTcuNXEwIDI5IC0zIDY4dC02LjUgNzN0LTMuNSA0OHY2NGwyMDcgMjQ5IHEtMzEgMCAtNjAgNS41dC01NCAxMi41bC0xMDQgLTEyM3EtMSAzNCAtMiA2My41dC0xIDU0LjVxMCA2OSA5IDEyM2wzMSAyMDBsLTExNSAtMjhsLTQ2IC0yNzFsLTIwNSAyMjZxLTE5IC0xNSAtNDMgLTI4LjV0LTU1IC0yNi41bDIxOSAtMjQydi0yNzZxMCAtMjAgLTUuNSAtNjB0LTEwLjUgLTc5dC01IC01OHEwIC00MCAzMCAtNTMuNXQxMDQgLTEzLjV6TTEyNjIgNjE2cS0xMTkgMCAtMjI5LjUgMzQuNXQtMTkzLjUgOTYuNWw0OCA2NCBxNzMgLTU1IDE3MC41IC04NXQyMDQuNSAtMzBxMTM3IDAgMjQ5IDQ1LjV0MTc5IDEyMXQ2NyAxNjUuNWg4MHEwIC0xMTQgLTc3LjUgLTIwNy41dC0yMDggLTE0OXQtMjg5LjUgLTU1LjV6TTgwMyA1OTVxODAgMCAxNDkgMjkuNXQxMDggNzIuNWwyMjEgLTY3bDMwOSA4NnE0NyAtMzIgMTA0LjUgLTUwdDExNy41IC0xOHE5MSAwIDE2NSAzOHQxMTguNSAxMDMuNXQ0NC41IDE0Ni41cTAgNzYgLTM0LjUgMTQ5dC05NS41IDEzNHQtMTQzIDk5IHEtMzcgMTA3IC0xMTUuNSAxODMuNXQtMTg2IDExNy41dC0yMzAuNSA0MXEtMTAzIDAgLTE5Ny41IC0yNnQtMTY5IC03Mi41dC0xMTcuNSAtMTA4dC00MyAtMTMxLjVxMCAtMzQgMTQuNSAtNjIuNXQ0MC41IC01MC41bC01NSAtNTlxLTM0IDI5IC01NCA2NS41dC0yNSA4MS41cS04MSAtMTggLTE0NSAtNzB0LTEwMSAtMTI1LjV0LTM3IC0xNTguNXEwIC0xMDIgNDguNSAtMTgwLjV0MTI5LjUgLTEyM3QxNzkgLTQ0LjV6Ii8+PC9zdmc+)](https://autofix.ci) --\u003e\n\nA multi-tenant backend API for logging and managing chat sessions, supporting both authenticated and unauthenticated usage with analytics capabilities.\n\n## 🚀 Features\n\n- **Multi-tenancy**: Separate organizations with isolated data\n- **Dual Authentication**: API key for chat plugins and JWT for dashboard users\n- **Role-based Access Control**: Superadmin, admin, user, and viewer roles with specific permissions\n- **Analytics**: Usage metrics per organization with customizable reporting\n- **Export Capabilities**: Export chat data in multiple formats (CSV, JSON) with both sync and async options\n- **Clean Architecture**: Separation of concerns with layered design (handler → service → repository)\n- **Strategy Pattern**: Used for exporter formats (JSON, CSV) and other pluggable components\n- **Dependency Injection**: Constructor-based DI for improved testability and maintainability\n- **Asynchronous Jobs**: Background processing with Redis and Asynq for resource-intensive tasks\n\n## Documentation\n\nThe API is documented using Swagger/OpenAPI:\n\n1. Generate documentation: `./scripts/docs_generate.sh` or `./scripts/docs_generate.ps1`\n2. Start the server: `go run cmd/server/main.go`\n3. Open browser: [`http://localhost:8080/openapi/index.html`](http://localhost:8080/openapi/index.html)\n\n\u003e [!TIP]\n\u003e View the package documentation for more details on the API endpoints and usage.\n\u003e [godoc.org][Package documentation]\n\u003e The API documentation is also available online at [chatlogger-api-docs.kjanat.com][API Docs].\n\n## 🛠️ Tech Stack\n\n- **Language**: [Go 1.24.2+](https://github.com/kjanat/chatlogger-api-go/blob/master/go.mod#L3)\n- **Web Framework**: [Gin][Gin]\n- **ORM**: [GORM][Gorm] with PostgreSQL\n- **Authentication**: JWT using [golang-jwt/jwt][JWT]\n- **Password Hashing**: bcrypt\n- **Configuration**: Environment-based loading\n- **Queue System**: [Asynq][Asynq] with Redis (for async exports)\n- **Containerization**: Docker \u0026 Docker Compose\n\n## 📋 Prerequisites\n\n- Go 1.24.2 or higher\n- PostgreSQL 14+\n- Redis (optional, for async exports)\n- Docker \u0026 Docker Compose (optional for containerized deployment)\n\n## 🚀 Quick Start\n\n### Running with Docker\n\nThe easiest way to get started is using Docker Compose:\n\n```bash\n# Clone the repository\ngit clone https://github.com/kjanat/chatlogger-api-go.git\ncd chatlogger-api-go\n\n# Start the application and database\ndocker-compose up -d\n```\n\nThe API will be available at `http://localhost:8080`.\n\n### Running Locally\n\n```bash\n# Clone the repository\ngit clone https://github.com/kjanat/chatlogger-api-go.git\ncd chatlogger-api-go\n\n# Install dependencies\ngo mod download\n\n# Setup environment variables (copy example and modify)\ncp .env.example .env\n# Edit .env with your database credentials and settings\n\n# Run migrations\npsql -U postgres -d chatlogger -f migrations/001_initial_schema.sql\npsql -U postgres -d chatlogger -f migrations/002_ensure_defaults.sql\npsql -U postgres -d chatlogger -f migrations/003_add_exports_table.sql\n\n# Run the server\ngo run cmd/server/main.go\n\n# Run the worker (optional, for async exports)\ngo run cmd/worker/main.go\n```\n\n## 🔑 Authentication\n\n### Chat Plugin (Public API)\n\nUses API key authentication via the `x-organization-api-key` header:\n\n```bash\ncurl -X POST \\\n  http://localhost:8080/v1/orgs/acme/chats \\\n  -H 'x-organization-api-key: your-api-key' \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"title\": \"Support Chat\",\n    \"tags\": [\"support\", \"billing\"],\n    \"metadata\": {\n      \"browser\": \"Chrome\",\n      \"platform\": \"Windows\"\n    }\n  }'\n```\n\n### Dashboard (User Authentication)\n\nUses email/password login with JWT authentication:\n\n```bash\n# Login and get JWT cookie\ncurl -X POST \\\n  http://localhost:8080/auth/login \\\n  -H 'Content-Type: application/json' \\\n  -d '{\n    \"email\": \"admin@example.com\",\n    \"password\": \"your-password\"\n  }' \\\n  -c cookies.txt\n\n# Use the JWT cookie for authenticated requests\ncurl -X GET \\\n  http://localhost:8080/users/me \\\n  -b cookies.txt\n```\n\n## 🔒 Role-Based Access Control\n\nThe API implements a comprehensive role-based access control system:\n\n| Role         | Description                                        | Capabilities                                             |\n| :----------- | :------------------------------------------------- | :------------------------------------------------------- |\n| `superadmin` | System-wide administrator with unrestricted access | Full access to all endpoints and organizations           |\n| `admin`      | Organization administrator                         | Full access within their organization including API keys |\n| `user`       | Regular organization user                          | Access to own chats/messages and basic functionality     |\n| `viewer`     | Read-only user                                     | View-only access to permitted resources                  |\n\nRBAC is implemented via middleware that checks the user's role before allowing access to protected resources.\n\n## 📁 Project Structure\n\n```plaintext\n/cmd\n  /server                → Main API server entry point\n  /tools                 → Utility tools\n  /worker                → Background job worker for async exports\n/internal\n  /api                   → Gin router and setup\n  /config                → Configuration loading\n  /domain                → Core models and interfaces\n  /handler               → Request handlers\n  /hash                  → Password hashing utilities\n  /jobs                  → Queue and processor for async tasks\n  /middleware            → Auth, RBAC, logging middleware\n  /repository            → Database access layer\n  /service               → Business logic layer\n  /strategy              → Strategy pattern implementations (exporters)\n  /version               → Version information\n/migrations              → SQL schema migrations\n/scripts                 → Utility scripts\n```\n\n## 📊 API Endpoints\n\n### System Endpoints\n\n| Method | Endpoint        | Description              |\n| :----- | :-------------- | :----------------------- |\n| `GET`  | `/health`       | Health check endpoint    |\n| `GET`  | `/version`      | API version information  |\n| `GET`  | `/openapi/*any` | Swagger UI documentation |\n| `GET`  | `/openapi/*any` | OpenAPI documentation    |\n\n### Auth Endpoints\n\n| Method | Endpoint         | Description                 |\n| :----- | :--------------- | :-------------------------- |\n| `POST` | `/auth/login`    | Login and get JWT cookie    |\n| `POST` | `/auth/register` | Register a new user         |\n| `POST` | `/auth/logout`   | Logout and clear JWT cookie |\n\n### Dashboard API (Authenticated with JWT)\n\n| Method   | Endpoint                     | Description                    |\n| :------- | :--------------------------- | :----------------------------- |\n| `GET`    | `/v1/users/me`               | Get current user profile       |\n| `PATCH`  | `/v1/users/me`               | Update current user profile    |\n| `POST`   | `/v1/users/me/password`      | Change current user's password |\n| `POST`   | `/v1/chats`                  | Create a new chat              |\n| `GET`    | `/v1/chats`                  | List user's chats              |\n| `GET`    | `/v1/chats/:chatID`          | Get a specific chat            |\n| `PATCH`  | `/v1/chats/:chatID`          | Update a chat                  |\n| `DELETE` | `/v1/chats/:chatID`          | Delete a chat                  |\n| `GET`    | `/v1/chats/:chatID/messages` | Get messages from a chat       |\n| `GET`    | `/v1/analytics/messages`     | Get message analytics          |\n\n### Admin-Only Endpoints (JWT + Admin Role)\n\n| Method   | Endpoint                  | Description                |\n| :------- | :------------------------ | :------------------------- |\n| `GET`    | `/v1/orgs/me/apikeys`     | List organization API keys |\n| `POST`   | `/v1/orgs/me/apikeys`     | Generate a new API key     |\n| `DELETE` | `/v1/orgs/me/apikeys/:id` | Revoke an API key          |\n\n### Export Endpoints (JWT Auth)\n\n| Method | Endpoint                   | Description               |\n| :----- | :------------------------- | :------------------------ |\n| `POST` | `/v1/exports`              | Create async export job   |\n| `GET`  | `/v1/exports`              | List export jobs          |\n| `GET`  | `/v1/exports/:id`          | Get export job status     |\n| `GET`  | `/v1/exports/:id/download` | Download completed export |\n| `POST` | `/v1/exports/sync`         | Create synchronous export |\n\n### Public API (API Key Auth)\n\n| Method | Endpoint                                | Description               |\n| :----- | :-------------------------------------- | :------------------------ |\n| `POST` | `/v1/orgs/:slug/chats`                  | Create a new chat session |\n| `POST` | `/v1/orgs/:slug/chats/:chatID/messages` | Add a message to a chat   |\n\n## 🔧 Configuration\n\nThe application is configured using environment variables:\n\n| Variable       | Description                     | Default          |\n| :------------- | :------------------------------ | :--------------- |\n| `PORT`         | Server port                     | `8080`           |\n| `DATABASE_URL` | PostgreSQL connection string    | Required         |\n| `JWT_SECRET`   | Secret for JWT signing          | Required         |\n| `REDIS_ADDR`   | Redis address for job queue     | `localhost:6379` |\n| `EXPORT_DIR`   | Directory to store export files | `./exports`      |\n\n## ⚙️ Export System\n\nThe application supports both synchronous and asynchronous exports:\n\n### Synchronous Exports\n\n- Immediate response with download\n- Good for small data sets\n- Available at `/exports/orgs/me/sync`\n- Works without Redis\n\n### Asynchronous Exports\n\n- Queued processing with status tracking\n- Better for large data sets\n- Requires Redis and worker process\n- Creates a job at `/exports/orgs/me`\n- Check status at `/exports/orgs/me/:id`\n- Download at `/exports/orgs/me/:id/download`\n\nBoth export types support JSON and CSV formats.\n\n## 🧪 Testing\n\n```bash\n# Run all tests\ngo test ./...\n\n# Run tests with coverage\ngo test -coverprofile=coverage.out ./...\ngo tool cover -html=coverage.out\n\n# Run linting checks\ngolangci-lint run\n```\n\n## 🚢 Deployment\n\n### Version Information\n\nThe application includes version information that can be injected during build:\n\n```bash\n# Build with version information\ndocker build -t chatlogger-api \\\n  --build-arg VERSION=0.5.0 \\\n  --build-arg BUILD_TIME=$(date -u +\"%Y-%m-%dT%H:%M:%SZ\") \\\n  --build-arg GIT_COMMIT=$(git rev-parse HEAD) \\\n  .\n```\n\n### Image Verification\n\nAll container images are signed using [Sigstore cosign](https://github.com/sigstore/cosign). You can verify the authenticity of the images using the following command:\n\n```bash\n# Verify the container image signature\ncosign verify \\\n    --key=cosign.pub \\\n    ghcr.io/kjanat/chatlogger-api-server:0.5.0\n\n# Or use the public key URL\ncosign verify \\\n    --key=https://raw.githubusercontent.com/kjanat/chatlogger-api-go/master/cosign.pub \\\n    ghcr.io/kjanat/chatlogger-api-worker:0.5.0\n```\n\nThe public key for verification ([`cosign.pub`](cosign.pub)) is available in the root of the repository. For production deployments, we recommend verifying image signatures as part of your CI/CD pipeline to ensure supply chain security.\n\n### CI/CD\n\nThe project includes GitHub Actions workflows for CI/CD:\n\n- **Build Workflow**: Builds, tests, and tags versions on pushes to main\n- **Release Workflow**: Creates GitHub releases when tags are pushed\n\n## 📝 Next Steps and Enhancements\n\nHere are some potential enhancements planned for future development:\n\n- [x] **Export Features**: Implemented export functionality as a strategy pattern (JSON/CSV)\n- [x] **Async Exports**: Added background processing for large exports\n- [x] **Documentation**: Generated API documentation with Swagger/OpenAPI\n- [ ] **Pagination**: Add cursor-based pagination to list endpoints\n- [ ] **Enhanced Testing**: Expand unit and integration test coverage\n- [ ] **Monitoring**: Add structured logging and metrics collection\n- [ ] **Real-time notifications**: Add WebSocket support for live updates\n- [ ] **Multi-factor Authentication**: Add 2FA support for dashboard users\n- [ ] **Improved Analytics**: More detailed analytics dashboards and reports\n- [ ] **Search Capabilities**: Add full-text search for chat messages\n\n## 📄 License\n\nThis project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details.\n\n## 🤝 Contributing\n\nContributions are welcome! Please feel free to submit a Pull Request.\n\n1. Fork the repository\n2. Create your feature branch (`git checkout -b feature/amazing-feature`)\n3. Commit your changes (`git commit -m 'Add some amazing feature'`)\n4. Push to the branch (`git push origin feature/amazing-feature`)\n5. Open a Pull Request\n\n[Commits]: https://github.com/kjanat/chatlogger-api-go/commits/master/\n[Latest release]: https://github.com/kjanat/chatlogger-api-go/releases/latest\n[Issues]: https://github.com/kjanat/chatlogger-api-go/issues\n[Go report]: https://goreportcard.com/report/github.com/kjanat/chatlogger-api-go\n[Gin]: https://github.com/gin-gonic/gin\n[Gorm]: https://gorm.io/\n[JWT]: https://github.com/golang-jwt/jwt/tree/v5\n[Asynq]: https://github.com/hibiken/asynq\n[Codecov]: https://codecov.io/gh/kjanat/chatlogger-api-go\n[Build]: https://github.com/kjanat/chatlogger-api-go/actions/workflows/chatlogger-pipeline.yml\n[Package documentation]: https://godoc.org/github.com/kjanat/chatlogger-api-go\n[API Docs]: https://chatlogger-api-docs.kjanat.com/\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkjanat%2Fchatlogger-api-go","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fkjanat%2Fchatlogger-api-go","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fkjanat%2Fchatlogger-api-go/lists"}