Refactor to use new REST resource

This commit is contained in:
Matt-Yorkley
2018-03-15 16:51:05 +00:00
parent f3f18d8338
commit 5f0075f8b7
9 changed files with 84 additions and 73 deletions

View File

@@ -56,7 +56,7 @@ angular.module("admin.enterprises")
$scope.invite_errors = $scope.invite_success = null
email = $scope.newUser
$http.post('/admin/enterprises/invite_manager', {email: email, enterprise: $scope.Enterprise.id}).success (data)->
$http.post("/admin/manager_invitations", {email: email, enterprise_id: $scope.Enterprise.id}).success (data)->
$scope.addManager({id: data.user, email: email})
$scope.invite_success = t('user_invited', email: email)
.error (data) ->

View File

@@ -114,36 +114,8 @@ module Admin
end
end
def invite_manager
existing_user = Spree::User.where("email = :email OR unconfirmed_email = :email", email: params[:email]).first
if existing_user
render json: { errors: t('admin.enterprises.invite_manager.user_already_exists') }, status: :unprocessable_entity
return
end
new_user = create_new_manager(params[:email], params[:enterprise])
if new_user
render json: { user: new_user.id }, status: :ok
else
render json: { errors: t('admin.enterprises.invite_manager.error') }, status: 500
end
end
protected
def create_new_manager(email, enterprise_id)
enterprise = Enterprise.find(enterprise_id)
password = Devise.friendly_token.first(8)
new_user = Spree::User.create(email: email, unconfirmed_email: email, password: password, password_confirmation: password)
enterprise.send_manager_invitation(new_user)
enterprise.users << new_user
new_user
end
def build_resource_with_address
enterprise = build_resource_without_address
enterprise.address ||= Spree::Address.new

View File

@@ -0,0 +1,37 @@
module Admin
class ManagerInvitationsController < Spree::Admin::BaseController
def create
@email = params[:email]
@enterprise = Enterprise.find(params[:enterprise_id])
authorize! :edit, @enterprise
existing_user = Spree::User.find_by_email(@email)
if existing_user
render json: { errors: t('admin.enterprises.invite_manager.user_already_exists') }, status: :unprocessable_entity
return
end
new_user = create_new_manager
if new_user
render json: { user: new_user.id }, status: :ok
else
render json: { errors: t('admin.enterprises.invite_manager.error') }, status: 500
end
end
private
def create_new_manager
password = Devise.friendly_token.first(8)
new_user = Spree::User.create(email: @email, unconfirmed_email: @email, password: password)
@enterprise.users << new_user
Delayed::Job.enqueue ManagerInvitationJob.new(@enterprise.id, new_user.id)
new_user
end
end
end

View File

@@ -348,10 +348,6 @@ class Enterprise < ActiveRecord::Base
abn.present?
end
def send_manager_invitation(user)
Delayed::Job.enqueue ManagerInvitationJob.new(self.id, user.id)
end
protected
def devise_mailer

View File

@@ -99,7 +99,6 @@ Openfoodnetwork::Application.routes.draw do
get :for_order_cycle
get :visible
post :bulk_update, as: :bulk_update
post :invite_manager
end
member do
@@ -114,6 +113,8 @@ Openfoodnetwork::Application.routes.draw do
resources :tag_rules, only: [:destroy]
end
resources :manager_invitations, only: [:create]
resources :enterprise_relationships
resources :enterprise_roles

View File

@@ -634,41 +634,5 @@ module Admin
end
end
end
describe "#invite_manager" do
context "when given email matches an existing user" do
let!(:existing_user) { create(:user) }
let!(:enterprise) { create(:enterprise) }
let(:admin) { create(:admin_user) }
before do
controller.stub spree_current_user: admin
end
it "returns an error" do
spree_post :invite_manager, {email: user.email, enterprise: enterprise.id}
expect(response.status).to eq 422
expect(json_response['errors']).to eq I18n.t('admin.enterprises.invite_manager.user_already_exists')
end
end
context "signing up a new user" do
let!(:enterprise) { create(:enterprise) }
let(:admin) { create(:admin_user) }
before do
controller.stub spree_current_user: admin
end
it "creates a new user, sends an invitation email, and returns the user id" do
spree_post :invite_manager, {email: 'un.registered@email.com', enterprise: enterprise.id}
expect(Delayed::Job.last.payload_object.class.to_s).to eq('ManagerInvitationJob')
expect(response.status).to eq 200
expect(json_response['user']).to eq Spree::User.find_by_email('un.registered@email.com').id
end
end
end
end
end

View File

@@ -0,0 +1,42 @@
require 'spec_helper'
module Admin
describe ManagerInvitationsController, type: :controller do
let!(:existing_user) { create(:user) }
let!(:enterprise) { create(:enterprise) }
let(:admin) { create(:admin_user) }
describe "#create" do
context "when given email matches an existing user" do
before do
controller.stub spree_current_user: admin
end
it "returns an error" do
spree_post :create, {email: existing_user.email, enterprise_id: enterprise.id}
expect(response.status).to eq 422
expect(json_response['errors']).to eq I18n.t('admin.enterprises.invite_manager.user_already_exists')
end
end
context "signing up a new user" do
before do
controller.stub spree_current_user: admin
end
it "creates a new user, sends an invitation email, and returns the user id" do
expect do
spree_post :create, {email: 'un.registered@email.com', enterprise_id: enterprise.id}
end.to enqueue_job Delayed::PerformableMethod
new_user = Spree::User.find_by_email('un.registered@email.com')
expect(new_user.reset_password_token).to_not be_nil
expect(response.status).to eq 200
expect(json_response['user']).to eq new_user.id
end
end
end
end
end

View File

@@ -83,6 +83,7 @@ feature %q{
let!(:user1) { create(:user, email: 'user1@example.com') }
let!(:user2) { create(:user, email: 'user2@example.com') }
let!(:user3) { create(:user, email: 'user3@example.com', confirmed_at: nil) }
let(:new_email) { 'new@manager.com' }
let!(:enterprise) { create(:enterprise, name: 'Test Enterprise', owner: user1) }
let!(:enterprise_role) { create(:enterprise_role, user_id: user2.id, enterprise_id: enterprise.id) }
@@ -137,8 +138,6 @@ feature %q{
end
it "can invite unregistered users to be managers" do
new_email = 'new@manager.com'
find('a.button.help-modal').click
expect(page).to have_css '#invite-manager-modal'

View File

@@ -11,7 +11,7 @@ describe EnterpriseMailer do
describe "#welcome" do
it "should send a welcome email when given an enterprise" do
EnterpriseMailer.welcome(enterprise).deliver
ActionMailer::Base.deliveries.count.should == 1
expect(ActionMailer::Base.deliveries.count).to eq 1
mail = ActionMailer::Base.deliveries.first
expect(mail.subject).to eq "#{enterprise.name} is now on #{Spree::Config[:site_name]}"
end