{"id":21762845,"url":"https://github.com/lccodder/nodejs-hexagonal-architecture-boilerplate","last_synced_at":"2025-07-23T12:08:18.925Z","repository":{"id":251529161,"uuid":"837388630","full_name":"LCcodder/nodejs-hexagonal-architecture-boilerplate","owner":"LCcodder","description":"Hexagonal architecture template (URL shortener) written in Express.js using Cassandra and Redis","archived":false,"fork":false,"pushed_at":"2024-11-26T17:58:07.000Z","size":99,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-13T13:48:27.123Z","etag":null,"topics":["backend","boilerplate","expressjs","hexagonal-architecture","nodejs","rest-api","template","typescript"],"latest_commit_sha":null,"homepage":"","language":"TypeScript","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/LCcodder.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":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-08-02T21:23:37.000Z","updated_at":"2025-01-21T16:35:24.000Z","dependencies_parsed_at":"2025-04-13T13:51:58.446Z","dependency_job_id":null,"html_url":"https://github.com/LCcodder/nodejs-hexagonal-architecture-boilerplate","commit_stats":null,"previous_names":["lccodder/nodejs-hexagonal-architecture-template","lccodder/nodejs-hexagonal-architecture-boilerplate"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/LCcodder/nodejs-hexagonal-architecture-boilerplate","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LCcodder%2Fnodejs-hexagonal-architecture-boilerplate","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LCcodder%2Fnodejs-hexagonal-architecture-boilerplate/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LCcodder%2Fnodejs-hexagonal-architecture-boilerplate/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LCcodder%2Fnodejs-hexagonal-architecture-boilerplate/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/LCcodder","download_url":"https://codeload.github.com/LCcodder/nodejs-hexagonal-architecture-boilerplate/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/LCcodder%2Fnodejs-hexagonal-architecture-boilerplate/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":266673578,"owners_count":23966375,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-07-23T02:00:09.312Z","response_time":66,"last_error":null,"robots_txt_status":null,"robots_txt_updated_at":null,"robots_txt_url":"https://github.com/robots.txt","online":true,"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":["backend","boilerplate","expressjs","hexagonal-architecture","nodejs","rest-api","template","typescript"],"created_at":"2024-11-26T12:13:18.498Z","updated_at":"2025-07-23T12:08:18.896Z","avatar_url":"https://github.com/LCcodder.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"# `Express.js` hexagonal architecture boilerplate *(URL shortener)*\r\n\r\n![NodeJS](https://img.shields.io/badge/node.js-6DA55F?style=for-the-badge\u0026logo=node.js\u0026logoColor=white)\r\n![TypeScript](https://img.shields.io/badge/typescript-%23007ACC.svg?style=for-the-badge\u0026logo=typescript\u0026logoColor=white)\r\n![Express.js](https://img.shields.io/badge/express.js-%23404d59.svg?style=for-the-badge\u0026logo=express\u0026logoColor=%2361DAFB)\r\n![JWT](https://img.shields.io/badge/JWT-black?style=for-the-badge\u0026logo=JSON%20web%20tokens)\r\n\r\n\r\n![ApacheCassandra](https://img.shields.io/badge/cassandra-%231287B1.svg?style=for-the-badge\u0026logo=apache-cassandra\u0026logoColor=white)\r\n![Redis](https://img.shields.io/badge/redis-%23DD0031.svg?style=for-the-badge\u0026logo=redis\u0026logoColor=white)\r\n![Docker](https://img.shields.io/badge/docker-%230db7ed.svg?style=for-the-badge\u0026logo=docker\u0026logoColor=white)\r\n\r\n### `REST API` written in `Express.js` with `TypeScript` *using hexagonal architecture* pattern. **Project:** *URL shortener with registration, authorization, URL redirection with caching and URL uses counter*\r\n\r\n## Endpoints:\r\n1. `POST:/users` - Registrates new user and returns created row\r\n\r\n    Usage: \r\n    ```JSON\r\n    \"email\": \"email@gmail.com\",\r\n    \"password\": \"AJSFa*Fya97GFAD\",\r\n    \"username\": \"Example username\"\r\n    ```\r\n    Response:\r\n    ```JSON\r\n    \"email\": \"email@gmail.com\",\r\n    \"username\": \"Example username\",\r\n    \"createdAt\": \"2024-08-05T12:44:11.705Z\"\r\n    ```\r\n2. `POST:/auth` - Authorizes user and returns **JWT** token\r\n\r\n    Usage: \r\n    ```JSON\r\n    \"email\": \"email@gmail.com\",\r\n    \"password\": \"AJSFa*Fya97GFAD\"\r\n    ```\r\n    Response:\r\n    ```JSON\r\n    \"token\":\"afnajkfjoajf87dsf89asuf89asfu89as7f8a7f89asd7fya8d9uf8a9d7fa8d97f89adfd9\",\r\n    \"expiresIn\": \"24h\"\r\n    ```\r\n3. `GET:/users/me` (requires JWT in `Bearer` header) - Returns user profile\r\n\r\n    Authorization:\r\n    ```\r\n    Bearer afnajkfjoajf87dsf89asuf89asfu89as7f8a7f89asd7fya8d9uf8a9d7fa8d97f89adfd9\r\n    ```\r\n4. `POST:/urls` (**optional** JWT in `Bearer` header) - Creates url short-link\r\n\r\n    Authorization (**optional**):\r\n    ```\r\n    Bearer afnajkfjoajf87dsf89asuf89asfu89as7f8a7f89asd7fya8d9uf8a9d7fa8d97f89adfd9\r\n    ```\r\n    Usage: \r\n    ```JSON\r\n    \"to\": \"https://github.com/LCcodder/typing-assets\"\r\n    ```\r\n    Response:\r\n    ```JSON\r\n    \"id\": \"Sf531d\",\r\n    \"to\": \"https://github.com/LCcodder/typing-assets\",\r\n    \"createdAt\": \"2024-08-05T12:44:11.705Z\",\r\n    \"usesCount\": 0\r\n    ```\r\n5. `GET:/r/:id` - Redirects to initial URL by id param\r\n6. `GET:/urls/:id` - Returns URL object\r\n    Response:\r\n    ```JSON\r\n    \"id\": \"Sf531d\",\r\n    \"to\": \"https://github.com/LCcodder/typing-assets\",\r\n    \"createdAt\": \"2024-08-05T12:44:11.705Z\",\r\n    \"usesCount\": 0\r\n    ```\r\n7. `GET:/urls/my` (requires JWT in `Bearer` header) - Returns created URLs\r\n\r\n    Authorization:\r\n    ```\r\n    Bearer afnajkfjoajf87dsf89asuf89asfu89as7f8a7f89asd7fya8d9uf8a9d7fa8d97f89adfd9\r\n    ```\r\n    Response:\r\n    ```JSON\r\n    [\r\n        \"id\": \"Sf531d\",\r\n        \"to\": \"https://github.com/LCcodder/typing-assets\",\r\n        \"createdAt\": \"2024-08-05T12:44:11.705Z\",\r\n        \"ownerEmail\": \"email@gmail.com\",\r\n        \"usesCount\": 0\r\n    ]\r\n    ```\r\n## Usage:\r\n+ Make sure that `docker` and `docker compose` are installed on your system\r\n\r\nTo launch application run: \r\n```\r\ndocker compose up --build\r\n```\r\n\r\n+ If app throws cassandra connection error reload app container\r\n\r\n+ If you want launch app without docker you can find keyspace creation statements in `init_keyspace.cql` file\r\n\r\n---\r\n### Made by [LCcodder](https://github.com/LCcodder)","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flccodder%2Fnodejs-hexagonal-architecture-boilerplate","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flccodder%2Fnodejs-hexagonal-architecture-boilerplate","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flccodder%2Fnodejs-hexagonal-architecture-boilerplate/lists"}