Skip to content

Commit b1c401b

Browse files
add grant already exists for project user grant
1 parent 273fe1c commit b1c401b

File tree

2 files changed

+37
-0
lines changed

2 files changed

+37
-0
lines changed

pkg/client/client.go

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -386,6 +386,27 @@ func (client *Client) GetProjectRoles(ctx context.Context, projectId string) (ma
386386
return projectRolesAPIData, err
387387
}
388388

389+
func (client *Client) GetProjectRoleDetailsById(ctx context.Context, projectId string, roleId string) (*RolesAPIData, error) {
390+
var projectRoleDetailsAPIData RolesAPIData
391+
endpointUrl, err := url.JoinPath(allProjects, projectId, "role", roleId)
392+
if err != nil {
393+
return nil, err
394+
}
395+
396+
req, err := getRequest(ctx, client, endpointUrl, nil)
397+
if err != nil {
398+
return nil, err
399+
}
400+
401+
resp, err := client.httpClient.Do(req, uhttp.WithJSONResponse(&projectRoleDetailsAPIData))
402+
if err != nil {
403+
return nil, err
404+
}
405+
406+
defer resp.Body.Close()
407+
return &projectRoleDetailsAPIData, err
408+
}
409+
389410
// GetProjectRoleDetails
390411
// Returns all role details that are present in specific project.
391412
func (client *Client) GetProjectRoleDetails(ctx context.Context, urlApi string) (RolesAPIData, error) {

pkg/connector/project.go

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -213,6 +213,22 @@ func (p *projectBuilder) Grant(ctx context.Context, principal *v2.Resource, enti
213213
return nil, err
214214
}
215215

216+
// // Verify the user is not already a member of the project role
217+
roleDetails, err := p.client.GetProjectRoleDetailsById(ctx, projectId, roleId)
218+
if err != nil {
219+
return nil, fmt.Errorf("failed to fetch role details, %w", err)
220+
}
221+
for _, actor := range roleDetails.Actors {
222+
if actor.Name == userName {
223+
l.Debug("Project Membership already exists.",
224+
zap.String("userName", userName),
225+
zap.String("projectId", projectId),
226+
zap.String("roleId", roleId),
227+
)
228+
return annotations.New(&v2.GrantAlreadyExists{}), nil
229+
}
230+
}
231+
216232
body := client.BodyActors{
217233
User: []string{
218234
userName,

0 commit comments

Comments
 (0)