Skip to content

Commit

Permalink
Added api to send invoice email
Browse files Browse the repository at this point in the history
  • Loading branch information
shivamsinghchahar committed Apr 15, 2022
1 parent e274f55 commit 4bc140a
Show file tree
Hide file tree
Showing 4 changed files with 90 additions and 1 deletion.
12 changes: 12 additions & 0 deletions app/controllers/internal_api/v1/invoices_controller.rb
Original file line number Diff line number Diff line change
Expand Up @@ -42,6 +42,14 @@ def update
}
end

def send_invoice
authorize invoice

invoice.send_to_email(subject: invoice_email_params[:subject], recipients: invoice_email_params[:recipients])

render json: { message: "Invoice will be sent!" }, status: :accepted
end

private

def load_client
Expand All @@ -58,4 +66,8 @@ def invoice_params
policy(Invoice).permitted_attributes
)
end

def invoice_email_params
params.require(:invoice_email).permit(:subject, :body, recipients: [])
end
end
4 changes: 4 additions & 0 deletions app/policies/invoice_policy.rb
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,10 @@ def show?
user_owner_or_admin?
end

def send_invoice?
user_owner_or_admin?
end

def permitted_attributes
[
:issue_date, :due_date,
Expand Down
4 changes: 3 additions & 1 deletion config/routes/internal_api.rb
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,9 @@
resources :timesheet_entry, only: [:index, :create, :update, :destroy]
resources :reports, only: [:index]
resources :workspaces, only: [:update]
resources :invoices, only: [:index, :create, :update]
resources :invoices, only: [:index, :create, :update] do
post :send_invoice, on: :member
end
resources :generate_invoice, only: [:index, :show]
end
end
71 changes: 71 additions & 0 deletions spec/requests/internal_api/v1/invoices/send_invoice_spec.rb
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# frozen_string_literal: true

require "rails_helper"

RSpec.describe "InternalApi::V1::Invoices#send_invoice", type: :request do
let(:client) { create :client_with_invoices }
let(:company) { client.company }
let(:invoice) { client.invoices.first }
let(:user) { create :user, current_workspace_id: company.id }

context "when user is signed in" do
before do
create(:company_user, company:, user:)
end

let(:invoice_email) do
{ subject: "Some Subject", recipients: [client.email, "miru@example.com"], body: "You have an invoice!" }
end

context "when user is an admin" do
before do
user.add_role :admin, company
sign_in user
end

it "returns a 202 response" do
post send_invoice_internal_api_v1_invoice_path(id: invoice.id), params: { invoice_email: }

expect(response).to have_http_status :accepted
expect(json_response["message"]).to eq("Invoice will be sent!")
end

it "enqueues an email for delivery" do
expect do
post send_invoice_internal_api_v1_invoice_path(id: invoice.id), params: { invoice_email: }
end.to have_enqueued_mail(InvoiceMailer, :invoice)
end

context "when invoice doesn't exist" do
it "returns 404 response" do
post send_invoice_internal_api_v1_invoice_path(id: "random")

expect(response).to have_http_status :not_found
expect(json_response["errors"]).to eq "Couldn't find Invoice with 'id'=random"
end
end
end

context "when user is an employee" do
before do
user.add_role :employee, company
sign_in user
end

it "returns a 403 response" do
post send_invoice_internal_api_v1_invoice_path(id: invoice.id)

expect(response).to have_http_status(:forbidden)
end
end
end

context "when user is logged out" do
it "returns a 401 response" do
post send_invoice_internal_api_v1_invoice_path(id: invoice.id)

expect(response).to have_http_status(:unauthorized)
expect(json_response["error"]).to eq("You need to sign in or sign up before continuing.")
end
end
end

0 comments on commit 4bc140a

Please sign in to comment.