Remove services controller
This commit is contained in:
parent
9246148db4
commit
c327eee38e
|
@ -1,69 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class ServicesController < ApplicationController
|
|
||||||
before_action :authenticate_user!
|
|
||||||
before_action :mark_notifications_as_read, only: %i[index]
|
|
||||||
|
|
||||||
def index
|
|
||||||
@services = current_user.services
|
|
||||||
end
|
|
||||||
|
|
||||||
def create
|
|
||||||
service = Service.initialize_from_omniauth(omniauth_hash)
|
|
||||||
service.user = current_user
|
|
||||||
service_name = service.type.split("::").last.titleize
|
|
||||||
|
|
||||||
if service.save
|
|
||||||
flash[:success] = t(".success", service: service_name)
|
|
||||||
else
|
|
||||||
flash[:error] = if service.errors.details[:uid]&.any? { |err| err[:error] == :taken }
|
|
||||||
t(".duplicate", service: service_name, app: APP_CONFIG["site_name"])
|
|
||||||
else
|
|
||||||
t(".error", service: service_name)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
redirect_to origin || services_path
|
|
||||||
end
|
|
||||||
|
|
||||||
def update
|
|
||||||
service = current_user.services.find(params[:id])
|
|
||||||
service.post_tag = params[:service][:post_tag].tr("@", "")
|
|
||||||
if service.save
|
|
||||||
flash[:success] = t(".success")
|
|
||||||
else
|
|
||||||
flash[:error] = t(".error")
|
|
||||||
end
|
|
||||||
redirect_to services_path
|
|
||||||
end
|
|
||||||
|
|
||||||
def failure
|
|
||||||
Rails.logger.info "oauth error: #{params.inspect}"
|
|
||||||
flash[:error] = t(".error")
|
|
||||||
redirect_to services_path
|
|
||||||
end
|
|
||||||
|
|
||||||
def destroy
|
|
||||||
@service = current_user.services.find(params[:id])
|
|
||||||
service_name = @service.type.split("::").last.titleize
|
|
||||||
@service.destroy
|
|
||||||
flash[:success] = t(".success", service: service_name)
|
|
||||||
redirect_to services_path
|
|
||||||
end
|
|
||||||
|
|
||||||
private
|
|
||||||
|
|
||||||
def origin
|
|
||||||
request.env["omniauth.origin"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def omniauth_hash
|
|
||||||
request.env["omniauth.auth"]
|
|
||||||
end
|
|
||||||
|
|
||||||
def mark_notifications_as_read
|
|
||||||
Notification::ServiceTokenExpired
|
|
||||||
.where(recipient: current_user, new: true)
|
|
||||||
.update_all(new: false) # rubocop:disable Rails/SkipsModelValidations
|
|
||||||
end
|
|
||||||
end
|
|
|
@ -148,18 +148,6 @@ en:
|
||||||
author:
|
author:
|
||||||
info: "No questions from @%{author} found, showing entries from all users instead!"
|
info: "No questions from @%{author} found, showing entries from all users instead!"
|
||||||
error: "No user with the name @%{author} found, showing entries from all users instead!"
|
error: "No user with the name @%{author} found, showing entries from all users instead!"
|
||||||
services:
|
|
||||||
create:
|
|
||||||
success: "%{service} connected successfully."
|
|
||||||
duplicate: "The %{service} account you are trying to connect is already connected to another %{app} account. If you are unable to disconnect the account yourself, please send us a Direct Message on Twitter: @retrospring."
|
|
||||||
error: "Unable to connect to %{service}."
|
|
||||||
update:
|
|
||||||
success: "Service updated successfully."
|
|
||||||
error: "Unable to update service."
|
|
||||||
failure:
|
|
||||||
error: :errors.base
|
|
||||||
destroy:
|
|
||||||
success: "%{service} disconnected successfully."
|
|
||||||
settings:
|
settings:
|
||||||
export:
|
export:
|
||||||
index:
|
index:
|
||||||
|
|
|
@ -101,17 +101,6 @@ Rails.application.routes.draw do
|
||||||
resolve("Theme") { [:settings_theme] } # to make link_to/form_for work nicely when passing a `Theme` object to it, see also: https://api.rubyonrails.org/v6.1.5.1/classes/ActionDispatch/Routing/Mapper/CustomUrls.html#method-i-resolve
|
resolve("Theme") { [:settings_theme] } # to make link_to/form_for work nicely when passing a `Theme` object to it, see also: https://api.rubyonrails.org/v6.1.5.1/classes/ActionDispatch/Routing/Mapper/CustomUrls.html#method-i-resolve
|
||||||
resolve("Profile") { [:settings_profile] }
|
resolve("Profile") { [:settings_profile] }
|
||||||
|
|
||||||
# resources :services, only: [:index, :destroy]
|
|
||||||
get "/settings/services", to: "services#index", as: :services
|
|
||||||
patch "/settings/services/:id", to: "services#update", as: :update_service
|
|
||||||
delete "/settings/services/:id", to: "services#destroy", as: :service
|
|
||||||
controller :services do
|
|
||||||
scope "/auth", as: "auth" do
|
|
||||||
get ":provider/callback" => :create
|
|
||||||
get :failure
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
namespace :ajax do
|
namespace :ajax do
|
||||||
post "/ask", to: "question#create", as: :ask
|
post "/ask", to: "question#create", as: :ask
|
||||||
post "/destroy_question", to: "question#destroy", as: :destroy_question
|
post "/destroy_question", to: "question#destroy", as: :destroy_question
|
||||||
|
|
|
@ -1,129 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
require "rails_helper"
|
|
||||||
|
|
||||||
describe ServicesController, type: :controller do
|
|
||||||
describe "#index" do
|
|
||||||
subject { get :index }
|
|
||||||
|
|
||||||
context "user signed in" do
|
|
||||||
let(:user) { FactoryBot.create(:user) }
|
|
||||||
|
|
||||||
before { sign_in user }
|
|
||||||
|
|
||||||
it "renders the services settings page with no services" do
|
|
||||||
subject
|
|
||||||
expect(response).to render_template("index")
|
|
||||||
expect(controller.instance_variable_get(:@services)).to be_empty
|
|
||||||
end
|
|
||||||
|
|
||||||
context "user has a service token expired notification" do
|
|
||||||
let(:notification) do
|
|
||||||
Notification::ServiceTokenExpired.create(
|
|
||||||
target_id: user.id,
|
|
||||||
target_type: "User::ExpiredTwitterServiceConnection",
|
|
||||||
recipient_id: user.id,
|
|
||||||
new: true
|
|
||||||
)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "marks the notification as read" do
|
|
||||||
expect { subject }.to change { notification.reload.new }.from(true).to(false)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "user has Twitter connected" do
|
|
||||||
before do
|
|
||||||
Services::Twitter.create(user:, uid: 12)
|
|
||||||
end
|
|
||||||
|
|
||||||
it "renders the services settings page" do
|
|
||||||
subject
|
|
||||||
expect(response).to render_template("index")
|
|
||||||
expect(controller.instance_variable_get(:@services)).not_to be_empty
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "#create" do
|
|
||||||
subject { get :create, params: { provider: "twitter" } }
|
|
||||||
|
|
||||||
context "successful Twitter sign in" do
|
|
||||||
let(:user) { FactoryBot.create(:user) }
|
|
||||||
|
|
||||||
before do
|
|
||||||
sign_in user
|
|
||||||
OmniAuth.config.test_mode = true
|
|
||||||
OmniAuth.config.mock_auth[:twitter] = OmniAuth::AuthHash.new({
|
|
||||||
"provider" => "twitter",
|
|
||||||
"uid" => "12",
|
|
||||||
"info" => { "nickname" => "jack" },
|
|
||||||
"credentials" => { "token" => "AAAA", "secret" => "BBBB" }
|
|
||||||
})
|
|
||||||
request.env["omniauth.auth"] = OmniAuth.config.mock_auth[:twitter]
|
|
||||||
end
|
|
||||||
|
|
||||||
after do
|
|
||||||
OmniAuth.config.mock_auth[:twitter] = nil
|
|
||||||
end
|
|
||||||
|
|
||||||
context "no services connected" do
|
|
||||||
it "creates a service integration" do
|
|
||||||
expect { subject }.to change { Service.count }.by(1)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "a user has a service connected" do
|
|
||||||
let(:other_user) { FactoryBot.create(:user) }
|
|
||||||
let!(:service) { Services::Twitter.create(user: other_user, uid: 12) }
|
|
||||||
|
|
||||||
it "shows an error when trying to attach a service account which is already connected" do
|
|
||||||
subject
|
|
||||||
expect(flash[:error]).to eq("The Twitter account you are trying to connect is already connected to another #{APP_CONFIG['site_name']} account. If you are unable to disconnect the account yourself, please send us a Direct Message on Twitter: @retrospring.")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
describe "#update" do
|
|
||||||
subject { patch :update, params: }
|
|
||||||
|
|
||||||
context "not signed in" do
|
|
||||||
let(:params) { { id: 1 } }
|
|
||||||
|
|
||||||
it "redirects to sign in page" do
|
|
||||||
subject
|
|
||||||
expect(response).to redirect_to(new_user_session_path)
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "user with Twitter connection" do
|
|
||||||
before { sign_in user }
|
|
||||||
|
|
||||||
let(:user) { FactoryBot.create(:user) }
|
|
||||||
let(:service) { Services::Twitter.create(user:, uid: 12) }
|
|
||||||
let(:params) { { id: service.id, service: { post_tag: } } }
|
|
||||||
|
|
||||||
context "tag is valid" do
|
|
||||||
let(:post_tag) { "#askaraccoon" }
|
|
||||||
|
|
||||||
it "updates a service connection" do
|
|
||||||
expect { subject }.to change { service.reload.post_tag }.to("#askaraccoon")
|
|
||||||
expect(response).to redirect_to(services_path)
|
|
||||||
expect(flash[:success]).to eq("Service updated successfully.")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
|
|
||||||
context "tag is too long" do
|
|
||||||
let(:post_tag) { "a" * 21 } # 1 character over the limit
|
|
||||||
|
|
||||||
it "shows an error" do
|
|
||||||
subject
|
|
||||||
expect(response).to redirect_to(services_path)
|
|
||||||
expect(flash[:error]).to eq("Unable to update service.")
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
||||||
end
|
|
Loading…
Reference in New Issue