From 841960f847f04da9c427bcdb19037e2112a90890 Mon Sep 17 00:00:00 2001
From: Kamil Trzcinski <ayufan@ayufan.eu>
Date: Tue, 20 Dec 2016 00:22:10 +0100
Subject: [PATCH] Fix flow

---
 .../projects/mattermosts_controller.rb        |  1 +
 .../mattermost_slash_commands_service.rb      | 11 ++----
 lib/mattermost/client.rb                      | 39 +++++++++++++++++++
 lib/mattermost/command.rb                     | 14 ++-----
 lib/mattermost/team.rb                        | 14 ++-----
 5 files changed, 51 insertions(+), 28 deletions(-)
 create mode 100644 lib/mattermost/client.rb

diff --git a/app/controllers/projects/mattermosts_controller.rb b/app/controllers/projects/mattermosts_controller.rb
index c6b39add7ad..0f939838306 100644
--- a/app/controllers/projects/mattermosts_controller.rb
+++ b/app/controllers/projects/mattermosts_controller.rb
@@ -32,6 +32,7 @@ class Projects::MattermostsController < Projects::ApplicationController
   def teams
     @teams ||= @service.list_teams(current_user)
   rescue => e
+    @teams = []
     flash[:alert] = e.message
   end
 
diff --git a/app/models/project_services/mattermost_slash_commands_service.rb b/app/models/project_services/mattermost_slash_commands_service.rb
index 51de80f38de..accf59bea18 100644
--- a/app/models/project_services/mattermost_slash_commands_service.rb
+++ b/app/models/project_services/mattermost_slash_commands_service.rb
@@ -25,18 +25,15 @@ class MattermostSlashCommandsService < ChatService
     ]
   end
 
-  def configure!(current_user, params)
-    token = Mattermost::Session.new(current_user).with_session do |session|
-      Mattermost::Command.create(session, command(params))
-    end
+  def configure!(user, params)
+    token = Mattermost::Command.new(user).
+      create(command(params))
 
     update!(active: true, token: token)
   end
 
   def list_teams(user)
-    Mattermost::Session.new(user).with_session do |session|
-      Mattermost::Team.all(session)
-    end
+    Mattermost::Team.new(user).all
   end
 
   def trigger(params)
diff --git a/lib/mattermost/client.rb b/lib/mattermost/client.rb
new file mode 100644
index 00000000000..2a0e4b400d3
--- /dev/null
+++ b/lib/mattermost/client.rb
@@ -0,0 +1,39 @@
+module Mattermost
+  class Client
+    attr_reader :user
+
+    def initialize(user)
+      @user = user
+    end
+
+    private
+
+    def with_session(&blk)
+      Session.new(user).with_session(&blk)
+    end
+
+    def json_get(path, options = {})
+      with_session do |session|
+        json_response session.get(path, options)
+      end
+    end
+
+    def json_post(path, options = {})
+      with_session do |session|
+        json_response session.post(path, options)
+      end
+    end
+
+    def json_response(response)
+      json_response = JSON.parse(response.body)
+
+      if response.success?
+        json_response
+      elsif json_response['message']
+        raise json_response['message']
+      else
+        raise 'Undefined error'
+      end
+    end
+  end
+end
diff --git a/lib/mattermost/command.rb b/lib/mattermost/command.rb
index 5c6f5861a7f..d1e4bb0eccf 100644
--- a/lib/mattermost/command.rb
+++ b/lib/mattermost/command.rb
@@ -1,16 +1,10 @@
 module Mattermost
-  class Command
-    def self.create(session, params)
-      response = session.post("/api/v3/teams/#{params[:team_id]}/commands/create",
+  class Command < Client
+    def create(params)
+      response = json_post("/api/v3/teams/#{params[:team_id]}/commands/create",
         body: params.to_json)
 
-      if response.success?
-        response.parsed_response['token']
-      elsif response.parsed_response.try(:has_key?, 'message')
-        raise response.parsed_response['message']
-      else
-        raise 'Failed to create a new command'
-      end
+      response['token']
     end
   end
 end
diff --git a/lib/mattermost/team.rb b/lib/mattermost/team.rb
index 2de01eced0b..784eca6ab5a 100644
--- a/lib/mattermost/team.rb
+++ b/lib/mattermost/team.rb
@@ -1,15 +1,7 @@
 module Mattermost
-  class Team
-    def self.all(session)
-      response = session.get('/api/v3/teams/all')
-
-      if response.success?
-        response.parsed_response
-      elsif response.parsed_response.try(:has_key?, 'message')
-        raise response.parsed_response['message']
-      else
-        raise 'Failed to list teams'
-      end
+  class Team < Client
+    def all
+      json_get('/api/v3/teams/all')
     end
   end
 end
-- 
GitLab