Consolidate memberships
The goal is to have one way of querying for members, for projects and groups.
In terms of the codebase, it means getting rid of polymorphic associations between membership and groups and projects and using only association through namespace_id.
Consolidating memberships between groups and projects will allow us:
- [ ] to [query the memberships table more effectively](https://gitlab.com/groups/gitlab-org/-/epics/9308)
- [ ] to [delete code duplication](https://gitlab.com/groups/gitlab-org/-/epics/9309)
- [ ] to [unify parts of code that are now duplicated or have multiple if-clauses](https://gitlab.com/groups/gitlab-org/-/epics/9310)
- [ ] [make it easier to add members-related features](https://gitlab.com/groups/gitlab-org/-/epics/9311) (such as invitations).
# Actions to review
| Controller | Action | Feature | Status |
|--------------------------------|----------------------------------------|---------------|-------|
| Groups::GroupMembersController | approve_access_request | Group members | |
| Groups::GroupMembersController | destroy | Group members | |
| Groups::GroupMembersController | export_csv | Group members | |
| Groups::GroupMembersController | index | Group members | |
| Groups::GroupMembersController | leave | Group members | |
| Groups::GroupMembersController | override | Group members | |
| Groups::GroupMembersController | request_access | Group members | |
| Groups::GroupMembersController | resend_invite | Group members | |
| Groups::GroupMembersController | unban | Group members | |
| Groups::GroupMembersController | update | Group members | |
| API::Members | /groups/:id/members | Group members | plan for API v5 release |
| API::Members | /groups/:id/members/:member_id/approve | Group members | plan for API v5 release |
| API::Members | /groups/:id/members/:user_id | Group members | plan for API v5 release |
| API::Members | /groups/:id/members/all | Group members | plan for API v5 release |
| API::Members | /groups/:id/members/all/:user_id | Group members | plan for API v5 release |
| API::Members | /groups/:id/members/approve_all | Group members | plan for API v5 release |
| API::Members | /groups/:id/pending_members | Group members | plan for API v5 release |
| API::Invitations | /groups/:id/invitations | Group members | plan for API v5 release |
| API::Invitations | /groups/:id/invitations/:email | Group members | plan for API v5 release |
| API::Projects | /projects/:id/import_project_members/:project_id | Project members | |
| Projects::ProjectMembersController | approve_access_request | Project members | :white_check_mark: |
| Projects::ProjectMembersController | destroy | Project members | :white_check_mark: |
| Projects::ProjectMembersController | index | Project members | :white_check_mark: |
| Projects::ProjectMembersController | leave | Project members | :white_check_mark: |
| Projects::ProjectMembersController | request_access | Project members | :white_check_mark: |
| Projects::ProjectMembersController | resend_invite | Project members | :white_check_mark: |
| Projects::ProjectMembersController | update | Project members | :white_check_mark: |
| API::Invitations | /projects/:id/invitations | Project members | :white_check_mark: |
| API::Invitations | /projects/:id/invitations/:email | Project members | :white_check_mark: |
| API::Members | /projects/:id/members | Project members | :white_check_mark: |
| API::Members | /projects/:id/members/:user_id | Project members | :white_check_mark: |
| API::Members | /projects/:id/members/all | Project members | :white_check_mark: |
| API::Members | /projects/:id/members/all/:user_id | Project members | :white_check_mark: |
# Impact on other teams
When we start to update membership queries, it may impact other teams. If they have their own way of querying the membership table, they will need to update it. For instance, in the Rails app it is possible to reuse parts of code. When we change this code and someone reuses it as part of their own code, it may suddenly become slower.
epic