Skip to content

Commit

Permalink
Trigger tokens through webui
Browse files Browse the repository at this point in the history
* Add controller and views to trigger tokens through the webui
* Adapt autocomplete javascript to support `:package` and `:project`
  param names
* Add corresponding policies
  • Loading branch information
krauselukas committed Sep 10, 2021
1 parent 8f5a76c commit 0eb73e5
Show file tree
Hide file tree
Showing 7 changed files with 106 additions and 2 deletions.
4 changes: 2 additions & 2 deletions src/api/app/assets/javascripts/webui/autocomplete.js
Original file line number Diff line number Diff line change
Expand Up @@ -57,9 +57,9 @@ $(document).ready(function() {
});
});

$('#linked_project, #review_project, #project_name').on('autocompletechange', function() {
$('#linked_project, #review_project, #project_name, #project').on('autocompletechange', function() {
var projectName = $(this).val(),
packageInput = $('#linked_package, #review_package, #package_name');
packageInput = $('#linked_package, #review_package, #package_name, #package');

if (!packageInput.is(':visible')) return;

Expand Down
52 changes: 52 additions & 0 deletions src/api/app/controllers/webui/users/token_triggers_controller.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,52 @@
class Webui::Users::TokenTriggersController < Webui::WebuiController
include Pundit
include Triggerable

before_action :set_token
before_action :set_project, except: [:show]
before_action :set_package, except: [:show]
before_action :set_object_to_authorize, except: [:show]
# set_multibuild_flavor needs to run after the set_object_to_authorize callback
append_before_action :set_multibuild_flavor, except: [:show]

rescue_from 'Project::Errors::UnknownObjectError' do |exception|
flash[:error] = "#{exception.message}"
redirect_to tokens_url
end

rescue_from 'Package::Errors::UnknownObjectError' do |exception|
flash[:error] = "#{exception.message}"
redirect_to tokens_url
end

def show
authorize @token, :show?
end

def update
authorize @token, :webui_trigger?

opts = { project: @project, package: @package, repository: params[:repository], arch: params[:arch] }
opts[:multibuild_flavor] = @multibuild_container if @multibuild_container.present?

begin
@token.call(opts)
flash[:success] = "Token with id #{@token.id} successfully triggered!"
rescue Token::Errors::NoReleaseTargetFound, Project::Errors::WritePermissionError => e
flash[:error] = "Failed to trigger token: #{e.message}"
rescue Backend::NotFoundError => e
flash[:error] = "Failed to trigger token: #{e.summary}"
end

redirect_to tokens_url
end

private

def set_token
@token = Token.find(params[:id])
rescue ActiveRecord::RecordNotFound => e
flash[:error] = e.message
redirect_to tokens_url
end
end
8 changes: 8 additions & 0 deletions src/api/app/policies/token_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -37,4 +37,12 @@ def create?
def destroy?
create?
end

def webui_trigger?
record.user == user && !record.type.in?(['Token::Workflow', 'Token::Rss'])
end

def show?
webui_trigger?
end
end
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
%li.breadcrumb-item
= link_to('Your Profile', user_path(User.session!))

- if action_name == 'show'
%li.breadcrumb-item.active{ 'aria-current' => 'page' }
Trigger Token
34 changes: 34 additions & 0 deletions src/api/app/views/webui/users/token_triggers/show.html.haml
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
- @pagetitle = 'Trigger Token'

.card
.card-body
%h3.mb-3= @pagetitle

-# "as: :token" to have a consistent name across all various token classes
= form_for(@token, as: :token, url: token_trigger_path, method: :put, local: false) do |f|
.form-row
.col-12.col-md-10.col-lg-9
.form-group
= f.label(:id, 'Id:')
= @token.id
.form-group
= f.label(:type, 'Operation:')
= @token.class.token_name.capitalize
- token_package = @token.package
- if token_package.present?
= fields_for(:package, token_package) do |token_fields|
.form-group
= token_fields.label(:project, 'Project:')
= token_package.project
.form-group
= token_fields.label(:package, 'Package:')
= token_package.name
- else
.form-group.row
.col-sm
= render partial: 'webui/shared/autocomplete', locals: { html_id: 'project', label: 'Project:', required: true,
data: { source: autocomplete_projects_path(local: true) } }
.col-sm
= render partial: 'webui/shared/autocomplete', locals: { html_id: 'package', label: 'Package:', required: true,
data: { source: autocomplete_packages_path }, disabled: true }
= f.submit('Trigger', class: 'btn btn-primary px-4 mt-3 mt-sm-0')
3 changes: 3 additions & 0 deletions src/api/app/views/webui/users/tokens/index.html.haml
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,9 @@
- if policy(token).edit?
= link_to(edit_token_path(token), title: 'Edit Token') do
%i.fas.fa-edit
- if policy(token).show?
= link_to(token_trigger_path(token), title: 'Trigger Token') do
%i.fas.fa-project-diagram
= link_to '#', title: 'Delete Token',
data: { toggle: 'modal', target: '#delete-token-modal', token_id: token.id, action: token_path(token) } do
%i.fas.fa-times-circle.text-danger
Expand Down
1 change: 1 addition & 0 deletions src/api/config/routes/webui_routes.rb
Original file line number Diff line number Diff line change
Expand Up @@ -333,6 +333,7 @@
post 'status_messages/:id' => :acknowledge, controller: 'webui/status_messages', as: :acknowledge_status_message

resources :tokens, controller: 'webui/users/tokens'
resources :token_triggers, only: [:show, :update], controller: 'webui/users/token_triggers'
end

get 'home', to: 'webui/webui#home', as: :home
Expand Down

0 comments on commit 0eb73e5

Please sign in to comment.