{"id":19051017,"url":"https://github.com/tomasbasham/blunderlist-comment","last_synced_at":"2026-06-17T06:32:42.814Z","repository":{"id":69147686,"uuid":"174954658","full_name":"tomasbasham/blunderlist-comment","owner":"tomasbasham","description":"Contrived todo app example comment service","archived":false,"fork":false,"pushed_at":"2019-10-11T16:22:10.000Z","size":33,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2025-11-12T06:03:20.246Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/tomasbasham.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2019-03-11T08:15:14.000Z","updated_at":"2019-10-11T16:22:13.000Z","dependencies_parsed_at":null,"dependency_job_id":"0d1cae8a-a1ea-4ee2-a3bd-bd079df82120","html_url":"https://github.com/tomasbasham/blunderlist-comment","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/tomasbasham/blunderlist-comment","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomasbasham%2Fblunderlist-comment","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomasbasham%2Fblunderlist-comment/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomasbasham%2Fblunderlist-comment/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomasbasham%2Fblunderlist-comment/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/tomasbasham","download_url":"https://codeload.github.com/tomasbasham/blunderlist-comment/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/tomasbasham%2Fblunderlist-comment/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34437449,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-17T02:00:05.408Z","response_time":127,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","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":[],"created_at":"2024-11-08T23:16:55.756Z","updated_at":"2026-06-17T06:32:42.786Z","avatar_url":"https://github.com/tomasbasham.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# blunderlist-comment [![Build Status](https://travis-ci.com/tomasbasham/blunderlist-comment.svg?branch=master)](https://travis-ci.com/tomasbasham/blunderlist-comment) [![Maintainability](https://api.codeclimate.com/v1/badges/428e6cae5d8321a778ed/maintainability)](https://codeclimate.com/github/tomasbasham/blunderlist-comment/maintainability)\n\nA fictitious todo application through which to teach how to implement a\nmicroservice architecture. For the full list of services required to run this\napplication visit\n[Blunderlist](https://github.com/tomasbasham?utf8=✓\u0026tab=repositories\u0026q=blunderlist)\non GitHub.\n\nThis repository implements an API that manages comments and their creation,\nproviding an isolated data abstraction from other components of the overall\nsystem. Data from this service may be further decorated with data obtained from\nother services in some downstream closer to the client.\n\nThe intent of this repository is to provide the most optimal API surface for\nthe domain with which it is concerned, issuing unique resource handles that may\nbe referred to in other services.\n\nThe code here attempts to follow the principles of [Domain Driven\nDesign](https://www.google.com/search?q=domain-driven+design); where my take on\nthe subject can be seen on [my\nblog](https://tomasbasham.dev/development/2019/10/26/domain-driven-design-in-practice).\n\n## Prerequisites\n\nYou will need the following things properly installed on your computer.\n\n* [Git](https://git-scm.com/)\n* [Go](https://golang.org/)\n* [Docker](https://www.docker.com/)\n\n## Installation\n\n* `git clone \u003crepository-url\u003e` this repository\n* `cd blunderlist-comment`\n* `docker build -t comment .`\n\n## Running / Development\n\n* `docker run --rm -it -p 8080:8080 --env-file .env comment`\n* Visit your app at [http://localhost:8080](http://localhost:8080).\n\n### Rebuilding Protobuf Definitions\n\nWhen changes to the API surface are made it is necessary to update the\ngenerated protobuf definitions and any code that uses them. A docker image with\nthe `protoc` compiler has been made to make this far simpler.\n\n* `docker run --rm -v $(pwd):/usr/src/app tomasbasham/protoc:3.6.1-go -I ./proto --go_out=plugins=grpc:. comment.proto`\n\n## Creating a Client\n\nThis repository includes generated protobuf files that may be used in consuming\napplications to establish a connection to this service. For convenience a\nclient package is provided to perform any per-request setup in addition to\ninitialising any gRPC dial options.\n\n```go\nimport (\n    \"context\"\n    \"fmt\"\n\n    commentpb \"github.com/tomasbasham/blunderlist-comment/blunderlist_comment_v1\"\n    \"github.com/tomasbasham/blunderlist-comment/grpc\"\n)\n\nfunc main() {\n    client, err := grpc.NewClientWithTarget(context.Background(), \"1.2.3.4:50051\")\n    if err != nil {\n        panic(\"unable to create client. terminating.\")\n    }\n\n    query := \u0026commentpb.CommentQuery{\n        Id: 1,\n    }\n\n    comment, err := client.GetComment(context.Background(), query)\n    if err != nil {\n        panic(\"unable to get comment. terminating.\")\n    }\n\n    fmt.Println(comment)\n}\n```\n\n## Further Reading / Useful Links\n\n* [Go](https://golang.org/)\n* [gRPC](https://grpc.io/)\n* [protobuf](https://developers.google.com/protocol-buffers/)\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomasbasham%2Fblunderlist-comment","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftomasbasham%2Fblunderlist-comment","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftomasbasham%2Fblunderlist-comment/lists"}