{"id":31527165,"url":"https://github.com/mkopylec/project-manager","last_synced_at":"2025-10-03T21:58:41.485Z","repository":{"id":64984131,"uuid":"89321960","full_name":"mkopylec/project-manager","owner":"mkopylec","description":"Ready to go Domain-Driven Design workshop.","archived":false,"fork":false,"pushed_at":"2023-02-02T12:17:31.000Z","size":1047,"stargazers_count":61,"open_issues_count":0,"forks_count":23,"subscribers_count":5,"default_branch":"master","last_synced_at":"2024-05-07T02:32:15.308Z","etag":null,"topics":["ddd","domain-driven-design","hexagonal","rest","sample","spring-boot","workshop"],"latest_commit_sha":null,"homepage":"","language":"Java","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mkopylec.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":"2017-04-25T05:45:50.000Z","updated_at":"2024-04-17T13:41:19.000Z","dependencies_parsed_at":"2023-02-17T19:45:22.922Z","dependency_job_id":null,"html_url":"https://github.com/mkopylec/project-manager","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/mkopylec/project-manager","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkopylec%2Fproject-manager","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkopylec%2Fproject-manager/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkopylec%2Fproject-manager/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkopylec%2Fproject-manager/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mkopylec","download_url":"https://codeload.github.com/mkopylec/project-manager/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mkopylec%2Fproject-manager/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278234034,"owners_count":25953075,"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-10-03T02:00:06.070Z","response_time":53,"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":["ddd","domain-driven-design","hexagonal","rest","sample","spring-boot","workshop"],"created_at":"2025-10-03T21:58:38.979Z","updated_at":"2025-10-03T21:58:41.477Z","avatar_url":"https://github.com/mkopylec.png","language":"Java","funding_links":[],"categories":["Sample Projects"],"sub_categories":["JVM languages"],"readme":"# Project Manager - Domain-Driven Design workshop application\nProject Manager is a sample REST service implemented using Domain-Driven Design technique.\nIts primary goal is to help me to conduct a Domain-Driven Design workshops.\nDuring the workshop developers implement the application on their own, following the steps in right order.\n\n\u003e :bulb:  \n\u003e Currently I organize the source code someway different. See the [hexagonal_architecture](https://github.com/mkopylec/project-manager/tree/hexagonal_architecture) and/or [hexagonal_architecture_unit_of_work](https://github.com/mkopylec/project-manager/tree/hexagonal_architecture_unit_of_work) and/or [denormalized_model](https://github.com/mkopylec/project-manager/tree/denormalized_model) and/or [api_implementation_achitecture](https://github.com/mkopylec/project-manager/tree/api_implementation_achitecture) branch and also [my blog post](https://allegro.tech/2019/12/grouping-and-organizing-classes.html) for more details. Neverless the following workshop is still a valueable way to get familiar with DDD.\n\n## Application summary\nThe Project Manager is a simple application for managing business projects at IT company.\nThe application is directed to project managers.\nUsing the application they can add projects, monitor their progress and assign teams to work on the projects.\n\n## Working with application\nTo run the application execute:\n```bash\n./gradlew bootRun\n```\nTo run tests execute:\n```bash\n./gradlew test\n```\n\n## Steps to implement\nEach branch of the repository represents a subsequent step of the overall task.\nThe task is to implement each step using Domain-Driven Design rules, so the unit tests can successfully pass.\nCheckout the _master_ branch.\nGet known with the starting code, it contains the parts that are not focused on Domain-Driven Design modelling but are necessary for application to work properly.\n\nThe following describes steps to implement using an ubiquitous language.\nThe description contains hints on how to design a model from the business requirements.\nA hint is a bold part of the text with a suggestion on what domain building block or block part should be used:\n - _(E)_ - entity\n - _(EP)_ - entity property\n - _(VO)_ - value object\n - _(VOP)_ - value object property\n - _(DS)_ - domain service\n - _(?)_ - try to guess :-)\n \nThe [layers](src/main/java/layers) package contains examples on how to properly implement and organize Domain-Driven Design building blocks and other component types. \n\n### Step 1 - Create a team\nThe user can create a new **team**\u003csub\u003e_(E)_\u003c/sub\u003e.\nEvery team must be **named**\u003csub\u003e_(EP)_\u003c/sub\u003e.\nTo manage teams more efficient the user will need an information on how busy a team currently is.\nTo fulfil this requirement the application must display **how many projects a team is currently implementing**\u003csub\u003e_(EP)_\u003c/sub\u003e.\nA team cannot be created if it already exists.\n\n##### To do\nCheckout the _step-1-start_ branch.\nImplement the `TeamController.createTeam(...)` method, so the unit tests can successfully pass.\nCompare your solution with the _step-1-finish_ branch.\n\n### Step 2 - Add a member to a team\nThe user can add a member to a team.\nEvery team consists of **members**\u003csub\u003e_(EP)_\u003c/sub\u003e that are company's **employees**\u003csub\u003e_(VO)_\u003c/sub\u003e.\nIt is important for an employee that, besides of having a **first**\u003csub\u003e_(VOP)_\u003c/sub\u003e and **last name**\u003csub\u003e_(VOP)_\u003c/sub\u003e, he has a known **job position**\u003csub\u003e_(VOP)_\u003c/sub\u003e.\nJob position can be one of: developer, scrum master or product owner.\n\n##### To do\nCheckout the _step-2-start_ branch.\nImplement the `TeamController.addMemberToTeam(...)` method, so the unit tests can successfully pass.\nCompare your solution with the _step-2-finish_ branch.\n\n### Step 3 - Show teams\nThe user can browse teams.\nHe can see their members and on how many projects teams are working right now.\nIf a team is working on more than 3 projects the user sees it as a busy team.\n\n##### To do\nCheckout the _step-3-start_ branch.\nImplement the `TeamController.getTeams(...)` method, so the unit tests can successfully pass.\nCompare your solution with the _step-3-finish_ branch.\n\n### Step 4 - Create a project draft\nThe user can create **project**\u003csub\u003e_(E)_\u003c/sub\u003e drafts.\nA project draft includes minimum information about the project.\nIt requires a project **name**\u003csub\u003e_(EP)_\u003c/sub\u003e and an automatically **generated unique project identifier**\u003csub\u003e_(DS)_\u003c/sub\u003e.\nA newly created project has a \"to do\" **status**\u003csub\u003e_(EP)_\u003c/sub\u003e.\nNo **team**\u003csub\u003e_(EP)_\u003c/sub\u003e is assigned to work on a newly created project.\n\n##### To do\nCheckout the _step-4-start_ branch.\nImplement the `ProjectController.createProject(...)` method, so the unit tests can successfully pass.\nCompare your solution with the _step-4-finish_ branch.\n\n### Step 5 - Create a full project\nThe user can also create a full project.\nA full project is a project draft with extra information.\nIt must contain a list of **features**\u003csub\u003e_(EP)_\u003c/sub\u003e that are required to implement within the project.\nEvery **feature**\u003csub\u003e_(VO)_\u003c/sub\u003e has to be **named**\u003csub\u003e_(VOP)_\u003c/sub\u003e and it must have **status**\u003csub\u003e_(VOP)_\u003c/sub\u003e and **requirement**\u003csub\u003e_(VOP)_\u003c/sub\u003e defined.\nFor the newly created feature a \"to do\" status has to be set.\nRequirement can be one of: optional, recommended or necessary.\n\n##### To do\nCheckout the _step-5-start_ branch.\nImplement the `ProjectController.createProject(...)` method, so the unit tests can successfully pass.\nCompare your solution with the _step-5-finish_ branch.\n\n### Step 6 - Show projects\nThe user can browse projects.\nHe can see their list.\nEvery item on the list contains a project identifier and name.\n\n##### To do\nCheckout the _step-6-start_ branch.\nImplement the `ProjectController.getProjects(...)` method, so the unit tests can successfully pass.\nCompare your solution with the _step-6-finish_ branch.\n\n### Step 7 - Show a specific project\nThe user can also browse a specific project when he clicks on it in the projects list.\nHe can see all information about the clicked project.\n\n##### To do\nCheckout the _step-7-start_ branch.\nImplement the `ProjectController.getProject(...)` method, so the unit tests can successfully pass.\nCompare your solution with the _step-7-finish_ branch.\n\n### Step 8 - Edit a project\nThe user can edit created projects.\nHe can update its name, features and he can **assign a team**\u003csub\u003e_(DS)_\u003c/sub\u003e to work on a project.\nFeature status can be change to one of: to do, in progress or done.\nIf a team is assigned to a project then the project counts as a project implemented by the team.\n\n##### To do\nCheckout the _step-8-start_ branch.\nImplement the `ProjectController.updateProject(...)` method, so the unit tests can successfully pass.\nCompare your solution with the _step-8-finish_ branch.\n\n### Step 9 - Start a project\nThe user can start a project only if the project is assigned to a team.\nWhen the project starts its status is changed to \"in progress\".\n\n##### To do\nCheckout the _step-9-start_ branch.\nImplement the `ProjectController.startProject(...)` method, so the unit tests can successfully pass.\nCompare your solution with the _step-9-finish_ branch.\n\n### Step 10 - End a project\nThe user can end a started project when **all of the features in the project are done**\u003csub\u003e_(?)_\u003c/sub\u003e.\nSometimes the users supervisor can give him a permission to end a project when **only the necessary features are done**\u003csub\u003e_(?)_\u003c/sub\u003e.\nEnded projects don't count as projects implemented by a team.\nEnded projects needs to be reported in the company's end year review.\nTo do that the application needs to inform a Reporting Service about the **ended project**\u003csub\u003e_(?)_\u003c/sub\u003e by sending its **identifier**\u003csub\u003e_(?)_\u003c/sub\u003e.\n\n##### To do\nCheckout the _step-10-start_ branch.\nImplement the `ProjectController.endProject(...)` method, so the unit tests can successfully pass.\nCompare your solution with the _step-10-finish_ branch.\n\n## Hexagonal architecture\nFollowing the workshop's steps creates an application designed in classic layered architecture.\nThe [hexagonal_architecture](https://github.com/mkopylec/project-manager/tree/hexagonal_architecture) branch shows the fully implemented application in hexagonal architecture.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkopylec%2Fproject-manager","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmkopylec%2Fproject-manager","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmkopylec%2Fproject-manager/lists"}