Update API to allow sharing a project to a group with a custom role
What does this MR do and why?
This MR updates the POST /projects/:id/share API endpoint to accept a member_role_id parameter. In EE (only), providing member_role_id param will assign the matching custom role to the group the target project is shared with.
References
This MR implements Update API to allow inviting a group to a proje... (#506675 - closed). A part of Assign custom role when sharing a project to a ... (#468329).
MR acceptance checklist
Please evaluate this MR against the MR acceptance checklist. It helps you analyze changes to reduce risks in quality, performance, reliability, security, and maintainability.
Screenshots or screen recordings
Screenshots are required for UI changes, and strongly recommended for all other merge requests.
| Before | After |
|---|---|
How to set up and validate locally
-
Start GDK with
GITLAB_SIMULATE_SAAS=1$ export GITLAB_SIMULATE_SAAS=1 $ gdk start -
Enable required feature flags
$ rails c > Feature.enable(:assign_custom_roles_to_group_links_saas) > Feature.enable(:assign_custom_roles_to_project_links_saas) -
Login with
rootuser and generate a PAT withapiscope -
Visit a group and create a custom role (e.g. http://localhost:9393/flightjs/)
-
With a project under the group (e.g. http://localhost:9393/flightjs/Flight/) with the new custom role, send an API request to share the project to another group (e.g. http://localhost:9393/gitlab-org) with the new custom role
$ curl --request POST --header "Content-Type: application/json" --data '{"group_access": 10, "group_id": <share_with_group_id>, "member_role_id": <custom_role_id>}' --header "PRIVATE-TOKEN: <root_user_access_token>" "localhost:9393/api/v4/projects/<project_id>/share"Note:
group_accessvalue should be the same as the baseaccess_levelof the custom role you created (e.g. if you selected Guest,group_accessshould be10) -
Verify that the returned
ProjectGroupLinkdata includes a non-nilmember_role_id(e.g.{"id":11,"project_id":7,"group_id":24,"group_access":30,"expires_at":null,"member_role_id":4})