From 20028523b5a2969b70a1fde9468c434b78f916ea Mon Sep 17 00:00:00 2001
From: Valery Sizov <valery@gitlab.com>
Date: Sat, 17 Jan 2015 15:37:27 -0800
Subject: [PATCH] Application admin scaffold

---
 .../admin/applications_controller.rb          | 52 +++++++++++++++++++
 .../oauth/applications_controller.rb          |  6 +--
 .../admin/applications/_delete_form.html.haml |  4 ++
 app/views/admin/applications/_form.html.haml  | 24 +++++++++
 app/views/admin/applications/edit.html.haml   |  3 ++
 app/views/admin/applications/index.html.haml  | 16 ++++++
 app/views/admin/applications/new.html.haml    |  3 ++
 app/views/admin/applications/show.html.haml   | 26 ++++++++++
 app/views/layouts/nav/_admin.html.haml        |  6 +++
 config/initializers/doorkeeper.rb             |  2 +-
 config/routes.rb                              |  2 +
 11 files changed, 139 insertions(+), 5 deletions(-)
 create mode 100644 app/controllers/admin/applications_controller.rb
 create mode 100644 app/views/admin/applications/_delete_form.html.haml
 create mode 100644 app/views/admin/applications/_form.html.haml
 create mode 100644 app/views/admin/applications/edit.html.haml
 create mode 100644 app/views/admin/applications/index.html.haml
 create mode 100644 app/views/admin/applications/new.html.haml
 create mode 100644 app/views/admin/applications/show.html.haml

diff --git a/app/controllers/admin/applications_controller.rb b/app/controllers/admin/applications_controller.rb
new file mode 100644
index 00000000000..cba19184dba
--- /dev/null
+++ b/app/controllers/admin/applications_controller.rb
@@ -0,0 +1,52 @@
+class Admin::ApplicationsController < Admin::ApplicationController
+  before_action :set_application, only: [:show, :edit, :update, :destroy]
+
+  def index
+    @applications = Doorkeeper::Application.where("owner_id IS NULL")
+  end
+
+  def show
+  end
+
+  def new
+    @application = Doorkeeper::Application.new
+  end
+
+  def edit
+  end
+
+  def create
+    @application = Doorkeeper::Application.new(application_params)
+    
+    if @application.save
+      flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :create])
+      redirect_to admin_application_url(@application)
+    else
+      render :new
+    end
+  end
+
+  def update
+    if @application.update(application_params)
+      redirect_to admin_application_path(@application), notice: 'Application was successfully updated.'
+    else
+      render :edit
+    end
+  end
+
+  def destroy
+    @application.destroy
+    redirect_to admin_applications_url, notice: 'Application was successfully destroyed.'
+  end
+
+  private
+
+  def set_application
+    @application = Doorkeeper::Application.where("owner_id IS NULL").find(params[:id])
+  end
+
+  # Only allow a trusted parameter "white list" through.
+  def application_params
+    params[:doorkeeper_application].permit(:name, :redirect_uri)
+  end
+end
diff --git a/app/controllers/oauth/applications_controller.rb b/app/controllers/oauth/applications_controller.rb
index 3407490e498..efa291d9397 100644
--- a/app/controllers/oauth/applications_controller.rb
+++ b/app/controllers/oauth/applications_controller.rb
@@ -9,10 +9,8 @@ class Oauth::ApplicationsController < Doorkeeper::ApplicationsController
   def create
     @application = Doorkeeper::Application.new(application_params)
 
-    if Doorkeeper.configuration.confirm_application_owner?
-      @application.owner = current_user
-    end
-
+    @application.owner = current_user
+    
     if @application.save
       flash[:notice] = I18n.t(:notice, scope: [:doorkeeper, :flash, :applications, :create])
       redirect_to oauth_application_url(@application)
diff --git a/app/views/admin/applications/_delete_form.html.haml b/app/views/admin/applications/_delete_form.html.haml
new file mode 100644
index 00000000000..371ac55209f
--- /dev/null
+++ b/app/views/admin/applications/_delete_form.html.haml
@@ -0,0 +1,4 @@
+- submit_btn_css ||= 'btn btn-link btn-remove btn-small'
+= form_tag admin_application_path(application) do
+  %input{:name => "_method", :type => "hidden", :value => "delete"}/
+  = submit_tag 'Destroy', onclick: "return confirm('Are you sure?')", class: submit_btn_css
\ No newline at end of file
diff --git a/app/views/admin/applications/_form.html.haml b/app/views/admin/applications/_form.html.haml
new file mode 100644
index 00000000000..b77d188a38d
--- /dev/null
+++ b/app/views/admin/applications/_form.html.haml
@@ -0,0 +1,24 @@
+= form_for [:admin, @application], url: @url, html: {class: 'form-horizontal', role: 'form'} do |f|
+  - if application.errors.any?
+    .alert.alert-danger{"data-alert" => ""}
+      %p Whoops! Check your form for possible errors
+  = content_tag :div, class: "form-group#{' has-error' if application.errors[:name].present?}" do
+    = f.label :name, class: 'col-sm-2 control-label'
+    .col-sm-10
+      = f.text_field :name, class: 'form-control'
+      = doorkeeper_errors_for application, :name
+  = content_tag :div, class: "form-group#{' has-error' if application.errors[:redirect_uri].present?}" do
+    = f.label :redirect_uri, class: 'col-sm-2 control-label'
+    .col-sm-10
+      = f.text_area :redirect_uri, class: 'form-control'
+      = doorkeeper_errors_for application, :redirect_uri
+      %span.help-block
+        Use one line per URI
+      - if Doorkeeper.configuration.native_redirect_uri
+        %span.help-block
+          Use
+          %code= Doorkeeper.configuration.native_redirect_uri
+          for local tests
+  .form-actions
+    = f.submit 'Submit', class: "btn btn-primary wide"
+    = link_to "Cancel", admin_applications_path, class: "btn btn-default"
diff --git a/app/views/admin/applications/edit.html.haml b/app/views/admin/applications/edit.html.haml
new file mode 100644
index 00000000000..e408ae2f29d
--- /dev/null
+++ b/app/views/admin/applications/edit.html.haml
@@ -0,0 +1,3 @@
+%h3.page-title Edit application
+- @url = admin_application_path(@application)
+= render 'form', application: @application
\ No newline at end of file
diff --git a/app/views/admin/applications/index.html.haml b/app/views/admin/applications/index.html.haml
new file mode 100644
index 00000000000..b0af75573b0
--- /dev/null
+++ b/app/views/admin/applications/index.html.haml
@@ -0,0 +1,16 @@
+%h3.page-title Your applications
+%p= link_to 'New Application', new_admin_application_path, class: 'btn btn-success'
+%table.table.table-striped
+  %thead
+    %tr
+      %th Name
+      %th Callback URL
+      %th
+      %th
+  %tbody
+    - @applications.each do |application|
+      %tr{:id => "application_#{application.id}"}
+        %td= link_to application.name, admin_application_path(application)
+        %td= application.redirect_uri
+        %td= link_to 'Edit', edit_admin_application_path(application), class: 'btn btn-link'
+        %td= render 'delete_form', application: application
\ No newline at end of file
diff --git a/app/views/admin/applications/new.html.haml b/app/views/admin/applications/new.html.haml
new file mode 100644
index 00000000000..7c62425f19c
--- /dev/null
+++ b/app/views/admin/applications/new.html.haml
@@ -0,0 +1,3 @@
+%h3.page-title New application
+- @url = admin_applications_path
+= render 'form', application: @application
\ No newline at end of file
diff --git a/app/views/admin/applications/show.html.haml b/app/views/admin/applications/show.html.haml
new file mode 100644
index 00000000000..2abe390ce13
--- /dev/null
+++ b/app/views/admin/applications/show.html.haml
@@ -0,0 +1,26 @@
+%h3.page-title
+  Application: #{@application.name}
+
+
+%table.table
+  %tr
+    %td
+      Application Id
+    %td
+      %code#application_id= @application.uid
+  %tr
+    %td
+      Secret:
+    %td
+      %code#secret= @application.secret
+
+  %tr
+    %td
+      Callback url
+    %td
+      - @application.redirect_uri.split.each do |uri|
+        %div
+          %span.monospace= uri
+.form-actions
+  = link_to 'Edit', edit_admin_application_path(@application), class: 'btn btn-primary wide pull-left'
+  = render 'delete_form', application: @application, submit_btn_css: 'btn btn-danger prepend-left-10'
diff --git a/app/views/layouts/nav/_admin.html.haml b/app/views/layouts/nav/_admin.html.haml
index fdc517617e3..d48dfcd4e94 100644
--- a/app/views/layouts/nav/_admin.html.haml
+++ b/app/views/layouts/nav/_admin.html.haml
@@ -45,3 +45,9 @@
       %i.fa.fa-cogs
       %span
         Settings
+
+  = nav_link(controller: :applications) do
+    = link_to admin_applications_path do
+      %i.fa.fa-unlock-alt
+      %span
+        Application
diff --git a/config/initializers/doorkeeper.rb b/config/initializers/doorkeeper.rb
index 536c849421e..23d9852725b 100644
--- a/config/initializers/doorkeeper.rb
+++ b/config/initializers/doorkeeper.rb
@@ -40,7 +40,7 @@ Doorkeeper.configure do
   # Optional parameter :confirmation => true (default false) if you want to enforce ownership of
   # a registered application
   # Note: you must also run the rails g doorkeeper:application_owner generator to provide the necessary support
-  enable_application_owner :confirmation => true
+  enable_application_owner :confirmation => false
 
   # Define access token scopes for your provider
   # For more information go to
diff --git a/config/routes.rb b/config/routes.rb
index 9deddf3eade..648ab53926d 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -97,6 +97,8 @@ Gitlab::Application.routes.draw do
       end
     end
 
+    resources :applications
+
     resources :groups, constraints: { id: /[^\/]+/ } do
       member do
         put :project_teams_update
-- 
GitLab