summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--app/controllers/callouts_controller.rb27
-rw-r--r--app/models/callout.rb3
-rw-r--r--app/models/user.rb1
-rw-r--r--config/routes.rb5
-rw-r--r--db/migrate/20180125214301_create_callouts.rb19
-rw-r--r--db/schema.rb14
-rw-r--r--spec/controllers/callouts_controller_spec.rb39
-rw-r--r--spec/factories/callouts.rb8
-rw-r--r--spec/models/callout_spec.rb9
9 files changed, 124 insertions, 1 deletions
diff --git a/app/controllers/callouts_controller.rb b/app/controllers/callouts_controller.rb
new file mode 100644
index 00000000000..a7bccfcce78
--- /dev/null
+++ b/app/controllers/callouts_controller.rb
@@ -0,0 +1,27 @@
+class CalloutsController < ApplicationController
+ before_action :callout, only: [:dismiss]
+
+ def dismiss
+ respond_to do |format|
+ format.json do
+ if @callout
+ @callout.update(dismissed_state: true)
+ else
+ Callout.create(feature_name: callout_param, dismissed_state: true, user: current_user)
+ end
+
+ head :ok
+ end
+ end
+ end
+
+ private
+
+ def callout
+ @callout = Callout.find_by(user: current_user, feature_name: callout_param)
+ end
+
+ def callout_param
+ params.require(:feature_name)
+ end
+end
diff --git a/app/models/callout.rb b/app/models/callout.rb
new file mode 100644
index 00000000000..b8131beb518
--- /dev/null
+++ b/app/models/callout.rb
@@ -0,0 +1,3 @@
+class Callout < ActiveRecord::Base
+ belongs_to :user
+end
diff --git a/app/models/user.rb b/app/models/user.rb
index 9403da98268..b54d44fe80a 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -137,6 +137,7 @@ class User < ActiveRecord::Base
has_many :assigned_merge_requests, dependent: :nullify, foreign_key: :assignee_id, class_name: "MergeRequest" # rubocop:disable Cop/ActiveRecordDependent
has_many :custom_attributes, class_name: 'UserCustomAttribute'
+ has_many :callouts
#
# Validations
diff --git a/config/routes.rb b/config/routes.rb
index f162043dd5e..f768bcebc7e 100644
--- a/config/routes.rb
+++ b/config/routes.rb
@@ -90,6 +90,11 @@ Rails.application.routes.draw do
# Notification settings
resources :notification_settings, only: [:create, :update]
+ # Callouts
+ namespace :callouts do
+ post :dismiss
+ end
+
draw :google_api
draw :import
draw :uploads
diff --git a/db/migrate/20180125214301_create_callouts.rb b/db/migrate/20180125214301_create_callouts.rb
new file mode 100644
index 00000000000..5dc9638a845
--- /dev/null
+++ b/db/migrate/20180125214301_create_callouts.rb
@@ -0,0 +1,19 @@
+# See http://doc.gitlab.com/ce/development/migration_style_guide.html
+# for more information on how to write migrations for GitLab.
+
+class CreateCallouts < ActiveRecord::Migration
+ # Set this constant to true if this migration requires downtime.
+ DOWNTIME = false
+
+ def change
+ create_table :callouts do |t|
+ t.string :feature_name, null: false
+ t.boolean :dismissed_state, null: false
+ t.references :user, index: true, foreign_key: { on_delete: :cascade }, null: false
+
+ t.timestamps_with_timezone null: false
+ end
+
+ add_index :callouts, :feature_name, unique: true
+ end
+end
diff --git a/db/schema.rb b/db/schema.rb
index 4e82a688725..fc12e5752b3 100644
--- a/db/schema.rb
+++ b/db/schema.rb
@@ -11,7 +11,7 @@
#
# It's strongly recommended that you check this file into your version control system.
-ActiveRecord::Schema.define(version: 20180115201419) do
+ActiveRecord::Schema.define(version: 20180125214301) do
# These are extensions that must be enabled in order to support this database
enable_extension "plpgsql"
@@ -203,6 +203,17 @@ ActiveRecord::Schema.define(version: 20180115201419) do
add_index "broadcast_messages", ["starts_at", "ends_at", "id"], name: "index_broadcast_messages_on_starts_at_and_ends_at_and_id", using: :btree
+ create_table "callouts", force: :cascade do |t|
+ t.string "feature_name", null: false
+ t.boolean "dismissed_state", null: false
+ t.integer "user_id", null: false
+ t.datetime_with_timezone "created_at", null: false
+ t.datetime_with_timezone "updated_at", null: false
+ end
+
+ add_index "callouts", ["feature_name"], name: "index_callouts_on_feature_name", unique: true, using: :btree
+ add_index "callouts", ["user_id"], name: "index_callouts_on_user_id", using: :btree
+
create_table "chat_names", force: :cascade do |t|
t.integer "user_id", null: false
t.integer "service_id", null: false
@@ -1924,6 +1935,7 @@ ActiveRecord::Schema.define(version: 20180115201419) do
add_index "web_hooks", ["type"], name: "index_web_hooks_on_type", using: :btree
add_foreign_key "boards", "projects", name: "fk_f15266b5f9", on_delete: :cascade
+ add_foreign_key "callouts", "users", on_delete: :cascade
add_foreign_key "chat_teams", "namespaces", on_delete: :cascade
add_foreign_key "ci_build_trace_section_names", "projects", on_delete: :cascade
add_foreign_key "ci_build_trace_sections", "ci_build_trace_section_names", column: "section_name_id", name: "fk_264e112c66", on_delete: :cascade
diff --git a/spec/controllers/callouts_controller_spec.rb b/spec/controllers/callouts_controller_spec.rb
new file mode 100644
index 00000000000..bf2aae190f2
--- /dev/null
+++ b/spec/controllers/callouts_controller_spec.rb
@@ -0,0 +1,39 @@
+require 'spec_helper'
+
+describe CalloutsController do
+ let(:user) { create(:user) }
+
+ before do
+ sign_in(user)
+ end
+
+ describe "POST #dismiss" do
+ subject { post :dismiss, feature_name: 'feature_name', format: :json }
+
+ context 'when callout entry does not exist' do
+ it 'should create a callout entry with dismissed state' do
+ expect { subject }.to change { Callout.count }.by(1)
+ end
+
+ it 'should return success' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+
+ context 'when callout entry already exists' do
+ let!(:callout) { create(:callout, feature_name: 'feature_name', user: user) }
+
+ it 'should update it with a dismissed state' do
+ expect { subject }.to change { callout.reload.dismissed_state }.from(false).to(true)
+ end
+
+ it 'should return success' do
+ subject
+
+ expect(response).to have_gitlab_http_status(:ok)
+ end
+ end
+ end
+end
diff --git a/spec/factories/callouts.rb b/spec/factories/callouts.rb
new file mode 100644
index 00000000000..b8ea879933e
--- /dev/null
+++ b/spec/factories/callouts.rb
@@ -0,0 +1,8 @@
+FactoryBot.define do
+ factory :callout do
+ feature_name 'test_callout'
+ dismissed_state false
+
+ user
+ end
+end
diff --git a/spec/models/callout_spec.rb b/spec/models/callout_spec.rb
new file mode 100644
index 00000000000..8328ce06139
--- /dev/null
+++ b/spec/models/callout_spec.rb
@@ -0,0 +1,9 @@
+require 'rails_helper'
+
+describe Callout do
+ let(:callout) { create(:callout) }
+
+ describe 'relationships' do
+ it { is_expected.to belong_to(:user) }
+ end
+end