{"id":31692406,"url":"https://github.com/gftf2011/url-shortener","last_synced_at":"2026-02-22T00:38:09.444Z","repository":{"id":248430715,"uuid":"818451560","full_name":"gftf2011/url-shortener","owner":"gftf2011","description":"TinyURL Backend CLONE made with Nest.Js, built with Clean Architecture using Design Patterns and D.D.D. that runs in REST a server","archived":false,"fork":false,"pushed_at":"2025-04-23T18:25:45.000Z","size":300,"stargazers_count":1,"open_issues_count":0,"forks_count":1,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-10-08T14:14:21.680Z","etag":null,"topics":["cache","clean-architecture","clean-code","cqs","design-patterns","docker","docker-compose","dockerfile","javascript","mysql","nestjs","nodejs","redis","rest","rest-api","typescript"],"latest_commit_sha":null,"homepage":"https://github.com/gftf2011","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/gftf2011.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-06-21T22:23:21.000Z","updated_at":"2025-04-23T18:25:49.000Z","dependencies_parsed_at":null,"dependency_job_id":"6e158647-eb5a-4810-9632-a25e27c07f4e","html_url":"https://github.com/gftf2011/url-shortener","commit_stats":null,"previous_names":["gftf2011/url-shortener"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/gftf2011/url-shortener","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gftf2011%2Furl-shortener","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gftf2011%2Furl-shortener/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gftf2011%2Furl-shortener/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gftf2011%2Furl-shortener/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/gftf2011","download_url":"https://codeload.github.com/gftf2011/url-shortener/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/gftf2011%2Furl-shortener/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":29700886,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-02-21T23:35:04.139Z","status":"ssl_error","status_checked_at":"2026-02-21T23:35:03.832Z","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":["cache","clean-architecture","clean-code","cqs","design-patterns","docker","docker-compose","dockerfile","javascript","mysql","nestjs","nodejs","redis","rest","rest-api","typescript"],"created_at":"2025-10-08T14:06:21.495Z","updated_at":"2026-02-22T00:38:09.429Z","avatar_url":"https://github.com/gftf2011.png","language":"TypeScript","funding_links":[],"categories":[],"sub_categories":[],"readme":"\u003cdiv align=\"center\"\u003e\n\t\u003ch1\u003eCLEAN Nest.JS URL-SHORTNER\u003c/h1\u003e\n\u003c/div\u003e\n\n\u003cbr/\u003e\n\n\u003cp align=\"center\"\u003e\n  \u003ca href=\"http://nestjs.com/\" target=\"blank\"\u003e\u003cimg src=\"https://nestjs.com/img/logo-small.svg\" width=\"200\" alt=\"Nest Logo\" /\u003e\u003c/a\u003e\n\u003c/p\u003e\n\n\u003cbr/\u003e\n\n\u003cp align=\"center\"\u003eA progressive \u003ca href=\"http://nodejs.org\" target=\"_blank\"\u003eNode.js\u003c/a\u003e framework for building efficient and scalable server-side applications.\u003c/p\u003e\n\u003cp align=\"center\"\u003e\n\n\u003cbr/\u003e\n\n\u003cdiv align=\"center\"\u003e\n  \u003ca href=\"#page_facing_up-about\"\u003eAbout\u003c/a\u003e •\n  \u003ca href=\"#hammer_and_wrench-supported-os\"\u003eSupported OS\u003c/a\u003e • \n  \u003ca href=\"#large_blue_diamond-design-patterns\"\u003eDesign Patterns\u003c/a\u003e •\n  \u003ca href=\"#blue_book-principles\"\u003ePrinciples\u003c/a\u003e •\n  \u003ca href=\"#building_construction-business-rules\"\u003eBusiness Rules\u003c/a\u003e •\n  \u003ca href=\"#orange_book-adrs---architecture-decision-records\"\u003eADRs\u003c/a\u003e •\n  \u003ca href=\"#clipboard-required-tools\"\u003eRequired Tools\u003c/a\u003e •\n  \u003ca href=\"#racing_car-running-project\"\u003eRunning Project\u003c/a\u003e •\n  \u003ca href=\"#test_tube-running-tests\"\u003eRunning Tests\u003c/a\u003e •\n  \u003ca href=\"#memo-license\"\u003eLicense\u003c/a\u003e\n\u003c/div\u003e\n\n## :page_facing_up: About\n\nThis a backend APP from a URL-SHORTENER Nest.JS typescript project.\n\nIt is a study project used to see how would be implemented a incremental version of a URL-SHORTENER.\nThe best approach for this problem it is not this one presented, again it is just a study repo !\n\nTo see an implementation using the incremental version see the branch \"incremental-short-url\".\n\nTo see an implementation using the incremental version, with sync data replication, see the branch \"dev\", W.I.P. (Work In Progress)\n\nThe objective from this project was to explore the framework by creating a well defined set of APIs with a decoupled architecture using Clean Architecture and D.D.D. - (Domain Driven Design) and exploring architecture capabilities like caching and design capabilities with several design patterns.\n\n\u003cbr/\u003e\n\n## :hammer_and_wrench: Supported OS\n\n- [x] Mac OS\n- [x] Linux\n- [x] Windows - WSL \n\n\u003cbr/\u003e\n\n## :large_blue_diamond: Design Patterns\n\n### Creational\n\n- [Factory Method](https://refactoring.guru/design-patterns/factory-method)\n- [Singleton](https://refactoring.guru/design-patterns/singleton)\n\n### Structural\n\n- [Adapter](https://refactoring.guru/design-patterns/adapter)\n- [Decorator](https://refactoring.guru/design-patterns/decorator)\n- [Proxy](https://refactoring.guru/design-patterns/proxy)\n\n\u003cbr/\u003e\n\n## :blue_book: Principles\n\n- [Single Responsibility Principle (SRP)](https://en.wikipedia.org/wiki/Single-responsibility_principle)\n- [Open Closed Principle (OCP)](https://en.wikipedia.org/wiki/Open%E2%80%93closed_principle)\n- [Liskov Substitution Principle (LSP)](https://en.wikipedia.org/wiki/Liskov_substitution_principle)\n- [Interface Segregation Principle (ISP)](https://en.wikipedia.org/wiki/Interface_segregation_principle)\n- [Dependency Inversion Principle (DIP)](https://en.wikipedia.org/wiki/Dependency_inversion_principle)\n- [Separation of Concerns (SOC)](https://en.wikipedia.org/wiki/Separation_of_concerns)\n- [Don't Repeat Yourself (DRY)](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)\n- [You Aren't Gonna Need It (YAGNI)](https://en.wikipedia.org/wiki/You_aren%27t_gonna_need_it)\n- [Keep It Simple, Stupid (KISS)](https://en.wikipedia.org/wiki/KISS_principle)\n- [Composition Over Inheritance](https://en.wikipedia.org/wiki/Composition_over_inheritance)\n\n\u003cbr/\u003e\n\n## :building_construction: Business Rules\n\n- **Clients**\n  - [Create Account](https://github.com/gftf2011/url-shrtener/tree/main/docs/requirements/clients/create-account.md)\n  - [Login](https://github.com/gftf2011/url-shrtener/tree/main/docs/requirements/clients/login.md)\n\n- **Short URLs**\n  - [Redirect](https://github.com/gftf2011/url-shrtener/tree/main/docs/requirements/short-urls/redirect.md)\n  - [Create Short URL](https://github.com/gftf2011/url-shrtener/tree/main/docs/requirements/short-urls/create-short-url.md)\n  - [Delete Short URL](https://github.com/gftf2011/url-shrtener/tree/main/docs/requirements/short-urls/delete-short-url.md)\n\n\u003cbr/\u003e\n\n## :orange_book: ADRs - Architecture Decision Records\n\n- ['Short URL' ID Definition](https://github.com/gftf2011/url-shortener/tree/main/docs/ADRs/short-url-id-definition.md)\n- [Soft Delete](https://github.com/gftf2011/url-shortener/tree/main/docs/ADRs/soft-delete.md)\n- [MySQL Core Databse](https://github.com/gftf2011/url-shortener/tree/main/docs/ADRs/mysql-core-database.md)\n- [LRU Cache](https://github.com/gftf2011/url-shortener/tree/main/docs/ADRs/lru-cache.md)\n\n\u003cbr/\u003e\n\n## :clipboard: Required Tools\n\n- [x] Nest - [http://nestjs.com/](http://nestjs.com/)\n  - Nest version: 10.3.2\n- [x] Node - [https://nodejs.org/](https://nodejs.org/)\n  - Node version: 20.11.0\n  - npm version: 10.2.x\n- [x] Docker - [https://www.docker.com/](https://www.docker.com/)\n\n\u003cbr/\u003e\n\n## :racing_car: Running Project\n\n**DEVELOPMENT**\n\n```sh\n  $ npm i\n  $ npm run start:dev\n```\n\n**DEBUG**\n\n```sh\n  $ npm i\n  $ npm run start:debug\n```\n\nOBS.: After the server is UP and Running use __api.http__ file to do your requests using **VS Code**\n\n\u003cbr/\u003e\n\n## :test_tube: Running Tests\n\n\u003e ### Full Test\n```sh\n  $ npm run test\n```\n\n\u003cbr/\u003e\n\n## :memo: License\n\nThis project is under MIT license. See the [LICENSE](https://github.com/gftf2011/url-shortener/blob/main/LICENSE) file for more details.\n\n---\n\nMade with lots of :heart: by [Gabriel Ferrari Tarallo Ferraz](https://www.linkedin.com/in/gabriel-ferrari-tarallo-ferraz/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgftf2011%2Furl-shortener","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgftf2011%2Furl-shortener","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgftf2011%2Furl-shortener/lists"}