Define how to treat Project model in the modular monolith
## Problem
As we explore more the modular monolith architecture we need to decide how to treat common concepts like `Project`. A `Project` may be comprised of different facets depending on the bounded context.
Should there be a `Projects::` bounded context to deal with all "project related stuff"? If so, where do we draw the line between what goes into `Projects::` and what goes into another bounded context?
## Context and background
This issue is created from a conversation sparked in this thread: https://gitlab.com/gitlab-org/gitlab/-/merge_requests/124411#note_1441183122:
@fabiopitino:
>>>
I agree with you here! :thumbsup: however with `Projects::` bounded context I refer to both data and behavior related to projects. The fact that `Project` model is a [god class is a different problem](https://docs.gitlab.com/ee/development/software_design.html#taming-omniscient-classes). Definitely a lot of the model's data could be represented as specific implementation in various bounded context: `Ci::ProjectSettings`, `MergeRequests::ProjectSettings`, etc.
Within a `Projects::` bounded context, assuming that `Project` class is stripped to its intrinsic attributes (name, path, description, namespace_id, etc.), there can be various classes:
* `Projects::UpdateService`
* `Projects::CreateService`
* `Projects::TransferService`
* `Projects::Project`
* `Projects::Alias` (current `ProjectAlias` model)
* `Projects::Topic` (existing today)
* `Projects::ProjectPolicy`
>>>
@mkaeppler:
>>>
`Project` is not a bounded context IMO. It is the super-set of what a GitLab project conceptually represents across all bounded contexts. A bounded context would be:
* CI/CD
* Issue management
* Sales
* Import/export
* ...
A `Project` *can* exist within a bounded context, e.g.:
* `Ci::Project` -- only contains those attributes relevant for CI/CD
* `Issues::Project` -- only contains those attributes relevant for issue management
>>>
issue