{"id":13496513,"url":"https://github.com/Arvinje/meetinger","last_synced_at":"2025-03-28T18:32:12.524Z","repository":{"id":45959335,"uuid":"306738279","full_name":"Arvinje/meetinger","owner":"Arvinje","description":"A Serverless Meetup management app, built with TypeScript to showcase Domain-Driven Design (DDD), Clean Architecture \u0026 SOLID best practices","archived":false,"fork":false,"pushed_at":"2021-11-24T12:20:57.000Z","size":2353,"stargazers_count":5,"open_issues_count":5,"forks_count":0,"subscribers_count":0,"default_branch":"master","last_synced_at":"2024-10-31T11:37:11.907Z","etag":null,"topics":["architecture","clean-architecture","cognito","ddd","domain-driven-design","dynamodb","serverless","ses","sns","solid","terraform","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/Arvinje.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}},"created_at":"2020-10-23T20:16:33.000Z","updated_at":"2022-11-30T01:42:36.000Z","dependencies_parsed_at":"2022-08-23T21:20:59.623Z","dependency_job_id":null,"html_url":"https://github.com/Arvinje/meetinger","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arvinje%2Fmeetinger","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arvinje%2Fmeetinger/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arvinje%2Fmeetinger/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Arvinje%2Fmeetinger/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Arvinje","download_url":"https://codeload.github.com/Arvinje/meetinger/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":246080811,"owners_count":20720597,"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":["architecture","clean-architecture","cognito","ddd","domain-driven-design","dynamodb","serverless","ses","sns","solid","terraform","typescript"],"created_at":"2024-07-31T19:01:49.540Z","updated_at":"2025-03-28T18:32:07.498Z","avatar_url":"https://github.com/Arvinje.png","language":"TypeScript","funding_links":[],"categories":["TypeScript"],"sub_categories":[],"readme":"# Meetinger\n\n[![CI](https://github.com/Arvinje/meetinger/actions/workflows/CI.yml/badge.svg)](https://github.com/Arvinje/meetinger/actions/workflows/CI.yml)\n\n\u003e A Serverless Meetup management app, built with TypeScript to showcase Domain-Driven Design (DDD), Clean Architecture \u0026 SOLID best practices.\n\nThis started as an exercise for me to practice the principles of Domain-Driven Design in a TypeScript-written app. Additionally, I tried to up my game in DynamoDB single table design.\n\n## The Stack\n- A Serverless app, designed to be deployed on AWS infrastructure\n- TypeScript on NodeJS\n- DynamoDB as the primary database, with a single table design from the start\n- Infrastructure configured via Terraform (IaC)\n- Amazon Cognito for authentication\n- Amazon Simple Notification Service (SNS) as the message broker service\n- Amazon Simple Queue Service (SQS) for message queues\n- Amazon Simple Email Service (SES) for transactional emails\n\n## How to deploy\nFirst start by deploying the infrastructure using Terraform. In `infrastructure` directory, under the desired environment sub directory, simply run:\n\n`terraform init \u0026\u0026 terraform apply`\n\nThe Serverless stack can be deployed similarly by running `sls deploy` in `backend` directory.\n\n## Testing\nSimply run `yarn test` in the `backend` directory to run all automated tests. This code base utilizes auto-generated fake data for testing using Faker.js. Faker.js supports configurable seed number which can be used to achieve consistent result. You can use `FAKER_SEED` environment variable to set your own seed. e.g. `FAKER_SEED=123 yarn test`\n\n## DynamoDB Data Model\nFor more information on the data model, including examples, refer to the [DynamoDB Table Design document.](dynamodb)\n\n## Roadmap\nThe work on this project is not done yet. Here are some things that I consider to implement in the future:\n\n- [ ] Better error messages\n- [ ] Expand the API to include more usecases\n- [ ] Add a frontend\n\n## Credits\nThis app is highly influenced by the articles and the SOLID book by [Khalil Stemmler](https://khalilstemmler.com). On this journey, I've also enjoyed many articles on practical DDD by [Vaughn Vernon](https://vaughnvernon.co).\n\n## License\n\u003e Copyright (c) 2020 Arvin Jenabi (arvinjenabi.com)\n\nMeetinger is released under [the MIT license](LICENSE).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FArvinje%2Fmeetinger","html_url":"https://awesome.ecosyste.ms/projects/github.com%2FArvinje%2Fmeetinger","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2FArvinje%2Fmeetinger/lists"}