{"id":26398543,"url":"https://github.com/rafaelpadovezi/bookmark-manager","last_synced_at":"2025-08-25T14:11:27.143Z","repository":{"id":49883874,"uuid":"332292338","full_name":"rafaelpadovezi/bookmark-manager","owner":"rafaelpadovezi","description":"A simple bookmark manager written in C#","archived":false,"fork":false,"pushed_at":"2025-03-10T17:36:30.000Z","size":206,"stargazers_count":4,"open_issues_count":3,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-03T08:22:20.295Z","etag":null,"topics":["aspnet-core","csharp"],"latest_commit_sha":null,"homepage":"","language":"HTML","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/rafaelpadovezi.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}},"created_at":"2021-01-23T19:34:05.000Z","updated_at":"2025-01-26T01:21:19.000Z","dependencies_parsed_at":"2025-03-17T12:35:50.203Z","dependency_job_id":"d5d3ddb3-a0cf-4def-bd3a-8284f0dbce08","html_url":"https://github.com/rafaelpadovezi/bookmark-manager","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/rafaelpadovezi/bookmark-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelpadovezi%2Fbookmark-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelpadovezi%2Fbookmark-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelpadovezi%2Fbookmark-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelpadovezi%2Fbookmark-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/rafaelpadovezi","download_url":"https://codeload.github.com/rafaelpadovezi/bookmark-manager/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/rafaelpadovezi%2Fbookmark-manager/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259634382,"owners_count":22887700,"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":["aspnet-core","csharp"],"created_at":"2025-03-17T12:31:36.012Z","updated_at":"2025-06-13T11:09:17.045Z","avatar_url":"https://github.com/rafaelpadovezi.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Bookmark Manager\n\nA simple bookmark manager written in C#\n\n## Technologies\n\n- `aspnet core 5`\n- `sql server`\n- `ef core 5`\n- `rabbit mq`\n\n## Architecture\n\n![architecure](./docs/architecture.png)\n\nAdding a bookmark to Bookmark Manager is executed in two steps:\n1. Saves the provided URL on the DB and sends a message to RabbitMQ\n1. A consumer process the message fetching the url details from the site response\n\nTo make sure that bookmarks saved on te DB are always processed by the consumer it is used the [Outbox Pattern](https://microservices.io/patterns/data/transactional-outbox.html).\n\nIn this implementation of the outbox pattern messages to be sent to RabbitMQ are saved on the DB and processed by a background service periodically. `OutboxSendingService` gets the messages not sent and publish them to the queue updating their status. This way is guaranteed that each message is sent at least one time.\n\nFor this reason, to the outbox pattern work is important that the consumer is [idempotent](https://microservices.io/patterns/communication-style/idempotent-consumer.html). In this example, a separated table is used the store the processed messages. When commiting the transaction afer making changes to other entities the violation of the unique constraint error will occur and none of the change will be stored.\n\n## Running locally\n\n```sh\n# start dependencies\ndocker-compose up -d db queue\n\n# see help\ndotnet run -- -h\n\n# run api\ndotnet run -- api\n\n# run consumer\ndotnet run -- bookmark-inserted-consumer\n```\n\n## References\n\n- https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-5.0\u0026tabs=visual-studio\n- https://medium.com/@sergiobarriel/how-to-automatically-validate-a-model-with-mvc-filter-and-fluent-validation-package-ae51098bcf5b\n- https://www.rabbitmq.com/dotnet-api-guide.html#connection-and-channel-lifspan\n- https://github.com/Tyrrrz/CliFx\n- https://devblogs.microsoft.com/aspnet/improvements-in-net-core-3-0-for-troubleshooting-and-monitoring-distributed-apps/\n- https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/hosted-services?view=aspnetcore-5.0\u0026tabs=visual-studio#timed-background-tasks\n- https://github.com/davidfowl/AspNetCoreDiagnosticScenarios/blob/master/AsyncGuidance.md#timer-callbacks\n- https://altkomsoftware.pl/en/blog/microservices-outbox-rabbitmq/\n- https://chrisrichardson.net/post/microservices/patterns/2020/10/16/idempotent-consumer.html\n- https://cap.dotnetcore.xyz/user-guide/en/cap/idempotence/\n- https://www.thereformedprogrammer.net/entity-framework-core-validating-data-and-catching-sql-errors/\n- https://github.com/willianantunes/tutorials/tree/master/2021/XX/ef-core-how-to-handle-migrations-in-production","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafaelpadovezi%2Fbookmark-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frafaelpadovezi%2Fbookmark-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frafaelpadovezi%2Fbookmark-manager/lists"}