{"id":15035254,"url":"https://github.com/mariocarrion/todo-api-microservice-example","last_synced_at":"2025-05-14T19:10:34.965Z","repository":{"id":37935792,"uuid":"338872875","full_name":"MarioCarrion/todo-api-microservice-example","owner":"MarioCarrion","description":"Go microservice tutorial project using Domain Driven Design and Onion Architecture!","archived":false,"fork":false,"pushed_at":"2025-05-07T03:38:21.000Z","size":5033,"stargazers_count":1235,"open_issues_count":1,"forks_count":174,"subscribers_count":15,"default_branch":"main","last_synced_at":"2025-05-07T04:30:06.421Z","etag":null,"topics":["domain-driven-design","golang","microservices","onion-architecture","tutorial"],"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/MarioCarrion.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":".github/FUNDING.yml","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},"funding":{"github":"MarioCarrion"}},"created_at":"2021-02-14T18:28:08.000Z","updated_at":"2025-05-07T03:38:23.000Z","dependencies_parsed_at":"2024-01-01T23:56:03.391Z","dependency_job_id":"d888b023-baaf-4d61-b6af-c7eb00ede772","html_url":"https://github.com/MarioCarrion/todo-api-microservice-example","commit_stats":{"total_commits":440,"total_committers":3,"mean_commits":"146.66666666666666","dds":0.3363636363636363,"last_synced_commit":"2bd66a5622fc16f69710999c0663d54be1d96d8c"},"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarioCarrion%2Ftodo-api-microservice-example","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarioCarrion%2Ftodo-api-microservice-example/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarioCarrion%2Ftodo-api-microservice-example/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MarioCarrion%2Ftodo-api-microservice-example/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MarioCarrion","download_url":"https://codeload.github.com/MarioCarrion/todo-api-microservice-example/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254209859,"owners_count":22032897,"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","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","golang","microservices","onion-architecture","tutorial"],"created_at":"2024-09-24T20:27:59.119Z","updated_at":"2025-05-14T19:10:32.814Z","avatar_url":"https://github.com/MarioCarrion.png","language":"Go","funding_links":["https://github.com/sponsors/MarioCarrion"],"categories":[],"sub_categories":[],"readme":"# \"ToDo API\" Microservice Example\n\n[![codecov](https://codecov.io/gh/MarioCarrion/todo-api-microservice-example/branch/main/graph/badge.svg)](https://codecov.io/gh/MarioCarrion/todo-api-microservice-example)\n\n## Introduction\n\nWelcome! 👋\n\nThis is an educational repository that includes a microservice written in Go. It is used as the principal example of my video series: [Building Microservices in Go](https://www.youtube.com/playlist?list=PL7yAAGMOat_Fn8sAXIk0WyBfK_sT1pohu).\n\nThis repository **is not** a template **nor** a framework, it's a **collection of patterns and guidelines** I've successfully used to deliver enterprise microservices when using Go, and just like with everything in Software Development some trade-offs were made.\n\nMy end goal with this project is to help you learn another way to structure your Go project with 3 final goals:\n\n1. It is _enterprise_, meant to last for years,\n1. It allows a team to collaborate efficiently with little friction, and\n1. It is as idiomatic as possible.\n\nJoin the fun at [https://youtube.com/MarioCarrion](https://www.youtube.com/c/MarioCarrion).\n\n## Domain Driven Design\n\nThis project uses a lot of the ideas introduced by Eric Evans in his book [Domain Driven Design](https://www.domainlanguage.com/), I do encourage reading that book but before I think reading [Domain-Driven Design Distilled](https://smile.amazon.com/Domain-Driven-Design-Distilled-Vaughn-Vernon/dp/0134434420/) makes more sense, also there's a free to download [DDD Reference](https://www.domainlanguage.com/ddd/reference/) available as well.\n\nOn YouTube I created [a playlist](https://www.youtube.com/playlist?list=PL7yAAGMOat_GJqfTdM9PBdTRSH7jXs6mI) that includes some of my favorite talks and webinars, feel free to explore that as well.\n\n## Project Structure\n\nTalking specifically about microservices **only**, the structure I like to recommend is the following, everything using `\u003c` and `\u003e` depends on the domain being implemented and the bounded context being defined.\n\n- [ ] `build/`: defines the code used for creating infrastructure as well as docker containers.\n  - [ ] `\u003ccloud-providers\u003e/`: define concrete cloud provider.\n  - [ ] `\u003cexecutableN\u003e/`: contains a Dockerfile used for building the binary.\n- [ ] `cmd/`\n  - [ ] `\u003cprimary-server\u003e/`: uses primary database.\n  - [ ] `\u003creplica-server\u003e/`: uses readonly databases.\n  - [ ] `\u003cbinaryN\u003e/`\n- [X] `db/`\n  - [X] `migrations/`: contains database migrations.\n  - [ ] `seeds/`: contains file meant to populate basic database values.\n- [ ] `internal/`: defines the _core domain_.\n  - [ ] `\u003cdatastoreN\u003e/`: a concrete _repository_ used by the domain, for example `postgresql`\n  - [ ] `http/`: defines HTTP Handlers.\n  - [ ] `service/`: orchestrates use cases and manages transactions.\n- [X] `pkg/` public API meant to be imported by other Go package.\n\nThere are cases where requiring a new bounded context is needed, in those cases the recommendation would be to\ndefine a package like `internal/\u003cbounded-context\u003e` that then should follow the same structure, for example:\n\n* `internal/\u003cbounded-context\u003e/`\n  * `internal/\u003cbounded-context\u003e/\u003cdatastoreN\u003e`\n  * `internal/\u003cbounded-context\u003e/http`\n  * `internal/\u003cbounded-context\u003e/service`\n\n## Tools\n\nPlease refer to the documentation in [internal/tools/](internal/tools/README.md).\n\n## Features\n\nIcons meaning:\n\n* \u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e means a link to Youtube video.\n* \u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e means a link to Blog post.\n\nIn no particular order:\n\n- [X] Project Layout [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/LUvid5TJ81Y) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/03/21/golang-microservices-domain-driven-design-project-layout.html)\n- [X] Dependency Injection [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/Z89UU4vSayY)\n- [X] [Secure Configuration](docs/SECURE\\_CONFIGURATION.md)\n  - [X] Using [Hashicorp Vault](https://www.hashicorp.com/products/vault) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/7UmJR0dOkjM)\n  - [X] Using [AWS SSM](https://aws.amazon.com/systems-manager/features/#Parameter_Store) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2019/11/20/golang-aws-ssm-env-vars-package.html)\n- [ ] Infrastructure as code\n- [X] [Metrics, Traces and Logging using OpenTelemetry](docs/METRICS\\_TRACES\\_LOGGING.md) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/bytCFQJ43DE)\n- [ ] Caching\n  - [X] Memcached [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/yKI-sy70PwA) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/01/30/tips-building-microservices-in-go-golang-caching-memcached.html)\n  - [ ] Redis [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/wj6-w0DLKRw)\n- [X] Persistent Storage\n  - [X] Repository Pattern [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/Z89UU4vSayY) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/04/04/golang-microservices-repository-pattern.html)\n  - [X] Database migrations [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/EavdaeUmn64) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/01/10/golang-tools-for-database-schema-migrations.html)\n  - [ ] MySQL\n  - [X] [PostgreSQL](docs/PERSISTENT\\_STORAGE.md) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/03/02/tips-building-microservices-in-go-golang-databases-postgresql-conclusion.html)\n      - [`jmoiron/sqlx`](https://github.com/jmoiron/sqlx), [`jackc/pgx`](https://github.com/jackc/pgx) and [`database/sql`](https://pkg.go.dev/database/sql) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/l8t6UKM1kro) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/02/05/tips-building-microservices-in-go-golang-databases-postgresql-part1.html)\n      - [`go-gorm/gorm`](https://github.com/go-gorm/gorm) and [`volatiletech/sqlboiler`](https://github.com/volatiletech/sqlboiler) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/CT2v0Xas8Sc) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/02/10/tips-building-microservices-in-go-golang-databases-postgresql-gorm-orm.html)\n      - [`Masterminds/squirrel`](https://github.com/Masterminds/squirrel) and [`kyleconroy/sqlc`](https://github.com/kyleconroy/sqlc) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/CT2v0Xas8Sc) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/02/23/tips-building-microservices-in-go-golang-databases-postgresql-sqlc-squirrel.html)\n- [ ] REST APIs\n  - [X] HTTP Handlers [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/CLdxwJCvTZE) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/04/18/golang-microservices-rest-api-http-handlers.html)\n  - [X] Custom JSON Types [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/UmVYkEYm4hw) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/04/28/golang-microservices-rest-api-custom-json-type.html)\n  - [ ] Versioning [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/4THy4iBQpFA)\n  - [X] Error Handling [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/uQOfXL6IFmQ)\n  - [X] [OpenAPI 3 and Swagger-UI](docs/OPENAPI3\\_SWAGGER.md) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/HwtOAc0M08o) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/05/02/golang-microservices-rest-api-openapi3-swagger-ui.html)\n  - [ ] Authorization\n- [ ] Events and Messaging\n  - [ ] [Apache Kafka](https://kafka.apache.org/) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/jr7OULxYm0A)\n  - [ ] [RabbitMQ](https://www.rabbitmq.com/) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/L0yJxCKrkIY)\n  - [ ] [Redis](https://redis.io/) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/uzuwZNiN4Y8)\n- [ ] Testing\n  - [X] Type-safe mocks with [`maxbrunsfeld/counterfeiter`](https://github.com/maxbrunsfeld/counterfeiter) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/ENqwq64TsDk) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2019/06/24/golang-tools-counterfeiter.html)\n  - [X] Equality with [`google/go-cmp`](https://github.com/google/go-cmp) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/ae15DzSwNnU) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/01/22/go-package-equality-google-go-cmp.html)\n  - [X] Integration tests for Datastores with [`ory/dockertest`](https://github.com/ory/dockertest) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/a-CCceqerhg) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/03/14/golang-package-testing-datastores-ory-dockertest.html)\n  - [X] REST APIs [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/lMrWO7OUMdY) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/link.svg\" width=\"20\" height=\"20\" alt=\"Blog post\"\u003e](https://mariocarrion.com/2021/04/25/golang-microservices-rest-api-testing.html)\n- [ ] Containerization using Docker [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/u_ayzie9pAQ)\n- [ ] Graceful Shutdown [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/VXxe7-b5euo)\n- [ ] Search Engine using [ElasticSearch](https://www.elastic.co/elasticsearch/) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/ZrdbQRYst5E)\n- [ ] Documentation\n  - [C4 Model](https://c4model.com/) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/pZ2z2tZkMsE)\n- [ ] Cloud Design Patterns\n  * Reliability\n    - [ ] [Circuit Breaker](https://en.wikipedia.org/wiki/Circuit_breaker_design_pattern) [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/UnL2iGcD7vE)\n- [ ] Tools as Dependencies [\u003cimg src=\"https://github.com/MarioCarrion/MarioCarrion/blob/main/youtube.svg\" width=\"20\" height=\"20\" alt=\"YouTube video\"\u003e](https://youtu.be/g_5n0W27XcY)\n- [ ] Whatever else I forgot to include\n\n## More ideas\n\n* [2016: Peter Bourgon's: Repository structure](https://peter.bourgon.org/go-best-practices-2016/#repository-structure)\n* [2016: Ben Johnson's: Standard Package Layout](https://medium.com/@benbjohnson/standard-package-layout-7cdbc8391fc1)\n* [2017: William Kennedy's: Design Philosophy On Packaging](https://www.ardanlabs.com/blog/2017/02/design-philosophy-on-packaging.html)\n* [2017: Jaana Dogan's: Style guideline for Go packages](https://rakyll.org/style-packages/)\n* [2018: Kat Zien - How Do You Structure Your Go Apps](https://www.youtube.com/watch?v=oL6JBUk6tj0)\n\n## Running project locally using Docker Compose\n\nOriginally added as part of [Building Microservices In Go: Containerization with Docker](https://youtu.be/u_ayzie9pAQ), `docker compose` has evolved and with it the way to run everything locally. Make sure you are running a recent version of Docker Compose. The configuration in this repository and the instructions below are known to work for at least the following versions:\n\n* Engine: **27.4.0**, and\n* Compose: **v2.31.0-desktop.2**\n\nThis project takes advantage of [Go's build constrains](https://pkg.go.dev/go/build) and [Docker's arguments](https://docs.docker.com/reference/dockerfile/#arg) to build the ElasticSearch indexers and to run the [rest-server](cmd/rest-server) using any of the following types of message broker:\n\n* Redis (**default one**)\n* RabbitMQ\n* Kafka\n\nThe `docker compose` instructions are executed in the form of:\n\n```\ndocker compose -f compose.yml -f compose.\u003ctype\u003e.yml \u003ccommand\u003e\n```\n\nWhere:\n\n* `\u003ctype\u003e`: Indicates what message broker to use, and effectively match the compose filename itself. The three supported values are:\n    1. `rabbitmq`,\n    1. `kafka`, and\n    1. `redis` (default value when building the `rest-server` binary).\n* `\u003ccommand\u003e`: Indicates the docker compose command to use.\n\nFor example to build images using RabbitMQ as the message broker you execute:\n\n```\ndocker compose -f compose.yml -f compose.rabbitmq.yml build\n```\n\nThen to start the containers you execute:\n\n```\ndocker compose -f compose.yml -f compose.rabbitmq.yml up\n```\n\nOnce you all the containers are `up` you can access the Swagger UI at http://127.0.0.1:9234/static/swagger-ui/ .\n\n## Diagrams\n\nTo start a local HTTP server that serves a graphical editor:\n\n```\nmdl serve github.com/MarioCarrion/todo-api/internal/doc -dir docs/diagrams/\n```\n\nTo generate JSON artifact for uploading to [structurizr](https://structurizr.com/):\n\n```\nstz gen github.com/MarioCarrion/todo-api/internal/doc\n```\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmariocarrion%2Ftodo-api-microservice-example","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmariocarrion%2Ftodo-api-microservice-example","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmariocarrion%2Ftodo-api-microservice-example/lists"}