{"id":22359286,"url":"https://github.com/martinpham/todo-ddd","last_synced_at":"2025-07-30T12:32:31.293Z","repository":{"id":122638126,"uuid":"80885364","full_name":"MartinPham/todo-ddd","owner":"MartinPham","description":"Todo app with DDD","archived":false,"fork":false,"pushed_at":"2017-02-10T12:29:21.000Z","size":485,"stargazers_count":18,"open_issues_count":0,"forks_count":6,"subscribers_count":3,"default_branch":"master","last_synced_at":"2025-07-19T11:04:24.761Z","etag":null,"topics":["behavior-driven-development","domain-driven-design","laravel","php","symfony","test-driven-development"],"latest_commit_sha":null,"homepage":null,"language":"PHP","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/MartinPham.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":"2017-02-04T01:56:08.000Z","updated_at":"2023-02-13T18:49:42.000Z","dependencies_parsed_at":null,"dependency_job_id":"350cb83e-a60d-432a-9ad2-001dabdd3c2b","html_url":"https://github.com/MartinPham/todo-ddd","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/MartinPham/todo-ddd","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MartinPham%2Ftodo-ddd","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MartinPham%2Ftodo-ddd/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MartinPham%2Ftodo-ddd/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MartinPham%2Ftodo-ddd/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/MartinPham","download_url":"https://codeload.github.com/MartinPham/todo-ddd/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/MartinPham%2Ftodo-ddd/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":267867803,"owners_count":24157357,"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","status":"online","status_checked_at":"2025-07-30T02:00:09.044Z","response_time":70,"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":["behavior-driven-development","domain-driven-design","laravel","php","symfony","test-driven-development"],"created_at":"2024-12-04T15:20:41.691Z","updated_at":"2025-07-30T12:32:31.285Z","avatar_url":"https://github.com/MartinPham.png","language":"PHP","funding_links":[],"categories":[],"sub_categories":[],"readme":"todo\n====\n\n[![Scrutinizer Code Quality](https://scrutinizer-ci.com/g/MartinPham/todo-ddd/badges/quality-score.png?bd=2017-02-04-12-46\u0026b=master)](https://scrutinizer-ci.com/g/MartinPham/todo-ddd/?branch=master)\n\n[![Build Status](https://scrutinizer-ci.com/g/MartinPham/todo-ddd/badges/build.png?bd=2017-02-04-12-46\u0026b=master)](https://scrutinizer-ci.com/g/MartinPham/todo-ddd/build-status/master)\n\n[![SensioLabsInsight](https://insight.sensiolabs.com/projects/0e23630d-1f08-495d-b8f5-d039e76b8bf8/big.png)](https://insight.sensiolabs.com/projects/0e23630d-1f08-495d-b8f5-d039e76b8bf8)\n\n###Description\ntodo is an application which allow people can add new task, see all the tasks added, modify existing tasks, mark tasks done/remaing, or remove tasks. Every task has name and status (completed/not-completed). Task should be unique.\n\n###Usecase\n- List/Read\n\t- See all remaning tasks\n\t- See all completed tasks\n- Create/Update/Delete\n\t- Add new task\n\t- Mark task as completed/remaning\n\t- Edit existing task (name and status)\n\t- Remove existing task\n\t- Clean all completed tasks\n\n###Story\n```\nFeature: Creating task\n  In order to create a new task\n  As an user\n  I can create new task with name\n\n  Scenario: Create new task\n    Given There is no task named \"Buying sugar\"\n    When I create a new task named \"Buying sugar\"\n    Then The task \"Buying sugar\" should be created\n    And The status of task \"Buying sugar\" should be \"remaining\"\n\n  Scenario: Create new task with existed name\n    Given There is a task named \"Buying salt\"\n    When I create a new task named \"Buying salt\"\n    Then The new task \"Buying salt\" should not be created\n```\n\n```\nFeature: Listing task\n  In order to see list of tasks\n  As an user\n  I can see tasks I created\n\n  Scenario: Listing remaining and completed task\n    Given There are tasks:\n      | name              | status    |\n      | Buying salt       | remaining |\n      | Buying milk       | remaining |\n      | Go to supermarket | completed |\n    When I list tasks\n    Then I should see remaining tasks:\n      | name        |\n      | Buying salt |\n      | Buying milk |\n    And I should see completed tasks:\n      | name              |\n      | Go to supermarket |\n```\n\n```\nFeature: Modifying task\n  In order to modify task detail\n  As an user\n  I can edit the task I created\n\n  Scenario: Editing task\n    Given There is a task named \"Buying salt\" with status \"remaining\"\n    When I modify task \"Buying salt\" with name \"Buying salt and pepper\" and status \"completed\"\n    Then The task \"Buying sugar\" should have name \"Buying salt and pepper\" and status \"completed\"\n\n  Scenario: Complete task status\n    Given There is a task named \"Buying salt\" with status \"remaining\"\n    When I modify task \"Buying salt\" with status \"completed\"\n    Then The task \"Buying salt\" should have status \"completed\"\n\n  Scenario: Redo task status\n    Given There is a task named \"Go to supermarket\" with status \"completed\"\n    When I modify task \"Go to supermarket\" with status \"remaining\"\n    Then The task \"Go to supermarket\" should have status \"remaining\"\n```\n\n```\nFeature: Removing task\n  In order to remove a task\n  As an user\n  I can remove the task I created\n\n  Scenario: Removing task\n    Given There is a task named \"Buying salt\" with status \"remaining\"\n    When I remove task \"Buying salt\"\n    Then The task \"Buying sugar\" should be deleted\n\n  Scenario: Cleanup completed task\n    Given There are tasks:\n      | name              | status    |\n      | Buying salt       | remaining |\n      | Buying milk       | remaining |\n      | Go to supermarket | completed |\n    When I cleanup completed tasks\n    Then The completed tasks should be removed:\n      | name              |\n      | Go to supermarket |\n```\n\n###Domain\n- Task\n\t- id\n\t- name\n\t- status (completed/remaning)\n\t- createdAt\n\t- updatedAt\n- Factory\n\t- TaskFactory\n\t\t- \u003e createFromName\n- Exception\n\t- TaskNameIsEmptyException\n\t- TaskNameIsAlreadyExistedException\n\t- TaskIsNotFoundException\n- Specification\n\t- TaskNameIsNotEmptySpecification\n\t\t- \u003e isSatisfiedBy \n\t- TaskNameIsUniqueSpecification\n\t\t- \u003e isSatisfiedBy \n- Repository\n\t- TaskRepositoryInterface\n \t\t- \u003e findAll\n \t\t- \u003e find\n \t\t- \u003e findAllByStatus\n \t\t- \u003e findByName\n\t\t- \u003e save\n\t\t- \u003e remove\n \t\t\n###Application\n- Task\n\t- Exception\n\t\t- TaskCannotBeSavedException  \n\t\t- TaskCannotBeRemovedException  \n\t- Query\n\t    - \u003e getTaskById\n\t\t- \u003e getAllRemainingTasks\n\t\t- \u003e getAllCompletedTasks\n\t- Command\n\t\t- \u003e addNewTask\n\t\t- \u003e completeTask\n\t\t- \u003e redoTask\n\t\t- \u003e editTask\n\t\t- \u003e removeTask\n\t\t- \u003e cleanAllCompletedTasks\n\n###Infrastructure\n- Persistence\n\t- DoctrineORM\n\t\t- Repository  \n\t\t\t- TaskRepository \n\t\t\t\t- \u003e findAll\n\t \t\t\t- \u003e find\n\t \t\t\t- \u003e findAllByStatus\n\t\t\t\t- \u003e save\n\t\t\t\t- \u003e remove\n\n\t- Eloquent\n\t\t- Repository\n\t\t\t- TaskRepository\n\t\t\t\t- \u003e findAll\n\t \t\t\t- \u003e find\n\t \t\t\t- \u003e findAllByStatus\n\t\t\t\t- \u003e save\n\t\t\t\t- \u003e remove\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmartinpham%2Ftodo-ddd","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmartinpham%2Ftodo-ddd","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmartinpham%2Ftodo-ddd/lists"}