From 135988ef5e960115ee4cc33fffbd8d7a2c447ffd Mon Sep 17 00:00:00 2001 From: Eduardo Navarro Date: Tue, 1 Mar 2022 16:25:18 +0100 Subject: [PATCH] Add events for creating and deleting relationships Co-authored-by: Rubhan Azeem --- src/api/app/mixins/has_relationships.rb | 1 + src/api/app/models/event/relationship.rb | 7 +++++ .../app/models/event/relationship_create.rb | 6 ++++ .../app/models/event/relationship_delete.rb | 6 ++++ src/api/app/models/relationship.rb | 29 +++++++++++++++++++ src/api/spec/models/relationship_spec.rb | 2 ++ 6 files changed, 51 insertions(+) create mode 100644 src/api/app/models/event/relationship.rb create mode 100644 src/api/app/models/event/relationship_create.rb create mode 100644 src/api/app/models/event/relationship_delete.rb diff --git a/src/api/app/mixins/has_relationships.rb b/src/api/app/mixins/has_relationships.rb index 8e0e94b3daf..1d4275fcbf1 100644 --- a/src/api/app/mixins/has_relationships.rb +++ b/src/api/app/mixins/has_relationships.rb @@ -55,6 +55,7 @@ def remove_role(what, role) end rel = rel.where(role_id: role.id) if role transaction do + rel.map(&:create_event_before_delete) rel.delete_all write_to_backend end diff --git a/src/api/app/models/event/relationship.rb b/src/api/app/models/event/relationship.rb new file mode 100644 index 00000000000..98a70202782 --- /dev/null +++ b/src/api/app/models/event/relationship.rb @@ -0,0 +1,7 @@ +module Event + class Relationship < Base + self.abstract_class = true + payload_keys :description, :who, :user, :group, :project, :package, :role + shortenable_key :description + end +end diff --git a/src/api/app/models/event/relationship_create.rb b/src/api/app/models/event/relationship_create.rb new file mode 100644 index 00000000000..8008edeabcc --- /dev/null +++ b/src/api/app/models/event/relationship_create.rb @@ -0,0 +1,6 @@ +module Event + class RelationshipCreate < Relationship + self.message_bus_routing_key = 'relationship.create' + self.description = 'Relationship was created' + end +end diff --git a/src/api/app/models/event/relationship_delete.rb b/src/api/app/models/event/relationship_delete.rb new file mode 100644 index 00000000000..8cdc6d30235 --- /dev/null +++ b/src/api/app/models/event/relationship_delete.rb @@ -0,0 +1,6 @@ +module Event + class RelationshipDelete < Relationship + self.message_bus_routing_key = 'relationship.delete' + self.description = 'Relationship was deleted' + end +end diff --git a/src/api/app/models/relationship.rb b/src/api/app/models/relationship.rb index 754974be3e1..46408ec3c3d 100644 --- a/src/api/app/models/relationship.rb +++ b/src/api/app/models/relationship.rb @@ -60,6 +60,8 @@ class Relationship < ApplicationRecord bugowners.joins(:user).merge(User.with_email) } + after_create :create_event_after_create + # we only care for project<->user relationships, but the cache is not *that* expensive # to recalculate after_create :discard_cache @@ -125,6 +127,12 @@ def self.with_groups_and_roles with_groups_and_roles_query.pluck('groups.title', 'roles.title') end + def create_event_before_delete + return unless User.session + + Event::RelationshipDelete.create(event_parameters) + end + private class << self @@ -158,6 +166,27 @@ def check_global_role def allowed_user raise NotFoundError, "Couldn't find user #{user.login}" if user && user.is_nobody? end + + def create_event_after_create + return unless User.session + + Event::RelationshipCreate.create(event_parameters) + end + + def event_parameters + parameters = { who: User.session.login, + user: user&.login, + group: group&.title, + role: role.title } + if package + parameters[:project] = package.project.name + parameters[:package] = package.name + else + parameters[:project] = project.name + end + + parameters + end end # == Schema Information diff --git a/src/api/spec/models/relationship_spec.rb b/src/api/spec/models/relationship_spec.rb index 69df814b391..9ba70593f0c 100644 --- a/src/api/spec/models/relationship_spec.rb +++ b/src/api/spec/models/relationship_spec.rb @@ -57,6 +57,7 @@ end it { expect { project.store }.to change(Relationship, :count).by(1) } + it { expect { project.store }.to change(Event::RelationshipCreate, :count).by(1) } end end @@ -96,6 +97,7 @@ end it { expect { project.store }.to change(Relationship, :count).by(1) } + it { expect { project.store }.to change(Event::RelationshipCreate, :count).by(1) } end end