relation deletion must be done through the api as events delete all relationships

This commit is contained in:
Mike Mason
2023-07-17 16:32:21 +00:00
parent 70f17de14b
commit cb0651b7bf
3 changed files with 54 additions and 21 deletions

View File

@@ -3,8 +3,9 @@ package permissions
import "errors"
var (
ErrRoleNotFound = errors.New("role not found")
ErrAssignmentFailed = errors.New("assignment failed")
ErrUnassignmentFailed = errors.New("unassignment failed")
ErrUnexpectedRoleDeleteFailed = errors.New("unknown role delete error")
ErrRoleNotFound = errors.New("role not found")
ErrAssignmentFailed = errors.New("assignment failed")
ErrUnassignmentFailed = errors.New("unassignment failed")
ErrUnexpectedRoleDeleteFailed = errors.New("unknown role delete error")
ErrUnexpectedRelationshipDeleteFailed = errors.New("unknown relationship delete error")
)

View File

@@ -21,6 +21,39 @@ type ResourceRelationship struct {
SubjectID gidx.PrefixedID
}
type ResourceRelationshipRequest struct {
Relation string `json:"relation"`
SubjectID string `json:"subject_id"`
}
type ResourceRelationshipDeleteResponse struct {
Success bool `json:"success"`
}
func (c *Client) DeleteResourceRelationship(ctx context.Context, resourceID gidx.PrefixedID, relation string, relatedResourceID gidx.PrefixedID) error {
path := fmt.Sprintf("/api/v1/resources/%s/relationships", resourceID.String())
body, err := encodeJSON(ResourceRelationshipRequest{
Relation: relation,
SubjectID: relatedResourceID.String(),
})
if err != nil {
return err
}
var response ResourceRelationshipDeleteResponse
if _, err := c.DoRequest(ctx, http.MethodDelete, path, body, &response); err != nil {
return err
}
if !response.Success {
return ErrUnexpectedRelationshipDeleteFailed
}
return nil
}
func (c *Client) ListResourceRelationships(ctx context.Context, resourceID gidx.PrefixedID, relatedResourceType string) ([]ResourceRelationship, error) {
query := url.Values{
"resourceType": []string{relatedResourceType},