From f8fee3e8cd517295fb29614a376f16de30c14917 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 15 Feb 2016 21:24:06 +1100 Subject: [PATCH 01/15] Error handling for API --- app/Http/Controllers/AccountApiController.php | 4 ++-- app/Http/Controllers/BaseAPIController.php | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/AccountApiController.php b/app/Http/Controllers/AccountApiController.php index fc90946135..193cf2d7c5 100644 --- a/app/Http/Controllers/AccountApiController.php +++ b/app/Http/Controllers/AccountApiController.php @@ -36,14 +36,14 @@ class AccountApiController extends BaseAPIController { if ( ! env(API_SECRET) || $request->api_secret !== env(API_SECRET)) { sleep(ERROR_DELAY); - return 'Invalid secret'; + return $this->errorResponse(['message'=>'Invalid secret'],401); } if (Auth::attempt(['email' => $request->email, 'password' => $request->password])) { return $this->processLogin($request); } else { sleep(ERROR_DELAY); - return 'Invalid credentials'; + return $this->errorResponse(['message'=>'Invalid credentials'],401); } } diff --git a/app/Http/Controllers/BaseAPIController.php b/app/Http/Controllers/BaseAPIController.php index f7ebf9b20d..af603a9c8f 100644 --- a/app/Http/Controllers/BaseAPIController.php +++ b/app/Http/Controllers/BaseAPIController.php @@ -107,13 +107,13 @@ class BaseAPIController extends Controller return Response::make($response, 200, $headers); } - protected function errorResponse($response) + protected function errorResponse($response, $httpErrorCode = 400) { $error['error'] = $response; $error = json_encode($error, JSON_PRETTY_PRINT); $headers = Utils::getApiHeaders(); - return Response::make($error, 400, $headers); + return Response::make($error, $httpErrorCode, $headers); } From a29512001525102cbbb7fea223d4c3a94c053fc1 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Mon, 15 Feb 2016 21:57:58 +1100 Subject: [PATCH 02/15] Client API Error handling --- app/Http/Controllers/ClientApiController.php | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/ClientApiController.php b/app/Http/Controllers/ClientApiController.php index 6cd91d1d09..fa4c9df266 100644 --- a/app/Http/Controllers/ClientApiController.php +++ b/app/Http/Controllers/ClientApiController.php @@ -1,5 +1,6 @@ action == ACTION_ARCHIVE) { - $client = Client::scope($publicId)->firstOrFail(); + + try { + $client = Client::scope($publicId)->firstOrFail(); + } catch (ModelNotFoundException $e) { + return $this->errorResponse(['message'=>'Record not found'], 400); + } + $this->clientRepo->archive($client); $transformer = new ClientTransformer(Auth::user()->account, Input::get('serializer')); From 4a033ce925d58f7d1d1ce2599959fe6a39de14c3 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Feb 2016 08:57:06 +1100 Subject: [PATCH 03/15] Improving error reporting API --- app/Http/Controllers/InvoiceApiController.php | 11 +++++++---- app/Ninja/Mailers/ContactMailer.php | 2 ++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/InvoiceApiController.php b/app/Http/Controllers/InvoiceApiController.php index f6a5b9b60b..f22be4b787 100644 --- a/app/Http/Controllers/InvoiceApiController.php +++ b/app/Http/Controllers/InvoiceApiController.php @@ -282,12 +282,15 @@ class InvoiceApiController extends BaseAPIController $data = Input::all(); $error = null; - $invoice = Invoice::scope($data['id'])->firstOrFail(); + $invoice = Invoice::scope($data['id'])->withTrashed()->first(); - $this->mailer->sendInvoice($invoice); + if(!$invoice) + return $this->errorResponse(['message'=>'Invoice does not exist.'], 400); - if($error) { - $response['error'] = "There was an error sending the invoice"; + $emailAction = $this->mailer->sendInvoice($invoice); + + if(($error) || ($emailAction === FALSE)) { + return $this->errorResponse(['message'=>'There was an error sending the invoice'], 400); } else { $response = json_encode(RESULT_SUCCESS, JSON_PRETTY_PRINT); diff --git a/app/Ninja/Mailers/ContactMailer.php b/app/Ninja/Mailers/ContactMailer.php index 8959602ce6..a5861ab94a 100644 --- a/app/Ninja/Mailers/ContactMailer.php +++ b/app/Ninja/Mailers/ContactMailer.php @@ -41,6 +41,8 @@ class ContactMailer extends Mailer $client = $invoice->client; $account = $invoice->account; + $response = false; + if ($client->trashed()) { return trans('texts.email_errors.inactive_client'); } elseif ($invoice->trashed()) { From 746b6ef362ed0f8d76bd72397392703645d7d4cd Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Feb 2016 09:09:32 +1100 Subject: [PATCH 04/15] Improving error reporting API --- app/Http/Controllers/InvoiceApiController.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Http/Controllers/InvoiceApiController.php b/app/Http/Controllers/InvoiceApiController.php index f22be4b787..6bac870557 100644 --- a/app/Http/Controllers/InvoiceApiController.php +++ b/app/Http/Controllers/InvoiceApiController.php @@ -1,6 +1,7 @@ withTrashed()->first(); if(!$invoice) From 31720b59fde1a26a7135befe2fa7da7661dd3434 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Feb 2016 09:12:34 +1100 Subject: [PATCH 05/15] Improving error reporting API --- app/Http/Controllers/InvoiceApiController.php | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/InvoiceApiController.php b/app/Http/Controllers/InvoiceApiController.php index 6bac870557..17259da12a 100644 --- a/app/Http/Controllers/InvoiceApiController.php +++ b/app/Http/Controllers/InvoiceApiController.php @@ -284,15 +284,21 @@ class InvoiceApiController extends BaseAPIController $error = null; Log::info($data); - + $invoice = Invoice::scope($data['id'])->withTrashed()->first(); if(!$invoice) return $this->errorResponse(['message'=>'Invoice does not exist.'], 400); - $emailAction = $this->mailer->sendInvoice($invoice); + try { + $this->mailer->sendInvoice($invoice); + } + catch(\Exception $e) + { + $this->errorResponse(['message'=>'There was an error sending the invoice'], 400); + } - if(($error) || ($emailAction === FALSE)) { + if($error) { return $this->errorResponse(['message'=>'There was an error sending the invoice'], 400); } else { From 170ee5a40b789d603eab5790047df4cab4f77710 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Feb 2016 09:28:00 +1100 Subject: [PATCH 06/15] Improving error reporting API --- app/Http/Controllers/InvoiceApiController.php | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/app/Http/Controllers/InvoiceApiController.php b/app/Http/Controllers/InvoiceApiController.php index 17259da12a..350869fec8 100644 --- a/app/Http/Controllers/InvoiceApiController.php +++ b/app/Http/Controllers/InvoiceApiController.php @@ -283,22 +283,16 @@ class InvoiceApiController extends BaseAPIController $data = Input::all(); $error = null; - Log::info($data); - $invoice = Invoice::scope($data['id'])->withTrashed()->first(); if(!$invoice) return $this->errorResponse(['message'=>'Invoice does not exist.'], 400); - try { - $this->mailer->sendInvoice($invoice); - } - catch(\Exception $e) - { - $this->errorResponse(['message'=>'There was an error sending the invoice'], 400); - } - if($error) { + $emailResponse = $this->mailer->sendInvoice($invoice, false, false); + + + if($emailResponse === FALSE) { return $this->errorResponse(['message'=>'There was an error sending the invoice'], 400); } else { From 1fde9261e66023d17c794f106b3609dad7adfec0 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Feb 2016 09:38:23 +1100 Subject: [PATCH 07/15] Improving error reporting API --- app/Http/Controllers/InvoiceApiController.php | 4 ++-- app/Ninja/Mailers/ContactMailer.php | 2 -- 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/InvoiceApiController.php b/app/Http/Controllers/InvoiceApiController.php index 350869fec8..b293ccef40 100644 --- a/app/Http/Controllers/InvoiceApiController.php +++ b/app/Http/Controllers/InvoiceApiController.php @@ -289,10 +289,10 @@ class InvoiceApiController extends BaseAPIController return $this->errorResponse(['message'=>'Invoice does not exist.'], 400); - $emailResponse = $this->mailer->sendInvoice($invoice, false, false); + $this->mailer->sendInvoice($invoice, false, $invoice->getPDFString()); - if($emailResponse === FALSE) { + if($error) { return $this->errorResponse(['message'=>'There was an error sending the invoice'], 400); } else { diff --git a/app/Ninja/Mailers/ContactMailer.php b/app/Ninja/Mailers/ContactMailer.php index a5861ab94a..8959602ce6 100644 --- a/app/Ninja/Mailers/ContactMailer.php +++ b/app/Ninja/Mailers/ContactMailer.php @@ -41,8 +41,6 @@ class ContactMailer extends Mailer $client = $invoice->client; $account = $invoice->account; - $response = false; - if ($client->trashed()) { return trans('texts.email_errors.inactive_client'); } elseif ($invoice->trashed()) { From a1be1f3529f918c327f87b8b5c51d1473048fb07 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Feb 2016 09:45:28 +1100 Subject: [PATCH 08/15] Improving error reporting API --- app/Http/Controllers/InvoiceApiController.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Http/Controllers/InvoiceApiController.php b/app/Http/Controllers/InvoiceApiController.php index b293ccef40..54e527385d 100644 --- a/app/Http/Controllers/InvoiceApiController.php +++ b/app/Http/Controllers/InvoiceApiController.php @@ -289,7 +289,7 @@ class InvoiceApiController extends BaseAPIController return $this->errorResponse(['message'=>'Invoice does not exist.'], 400); - $this->mailer->sendInvoice($invoice, false, $invoice->getPDFString()); + $this->mailer->sendInvoice($invoice, false, false); if($error) { From 09650123d7bd3e347629110a9cd4bcca092c66f1 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Feb 2016 10:05:08 +1100 Subject: [PATCH 09/15] Improving error reporting API --- app/Models/Invoice.php | 3 +++ 1 file changed, 3 insertions(+) diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index e93c8d3b07..f87dc20aa7 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -1,5 +1,6 @@ Date: Wed, 17 Feb 2016 10:29:18 +1100 Subject: [PATCH 10/15] Improving error reporting API --- app/Models/Invoice.php | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index f87dc20aa7..72c255ae09 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -753,15 +753,17 @@ class Invoice extends EntityModel implements BalanceAffecting ], ]; - Log::info($opts); - curl_setopt_array($curl, $opts); $response = curl_exec($curl); curl_close($curl); + Log::info($response); + $encodedString = strip_tags($response); $pdfString = Utils::decodePDF($encodedString); + Log::info($pdfString); + if ( ! $pdfString || strlen($pdfString) < 200) { Utils::logError("PhantomJSCloud - failed to create pdf: {$encodedString}"); } From 1a953c5bcbae82d2c02559d71a28e7e0ea727f20 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Feb 2016 10:34:23 +1100 Subject: [PATCH 11/15] Improving error reporting API --- app/Models/Invoice.php | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 72c255ae09..7198eff647 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -744,7 +744,7 @@ class Invoice extends EntityModel implements BalanceAffecting $opts = [ CURLOPT_URL => PHANTOMJS_CLOUD . env('PHANTOMJS_CLOUD_KEY') . '/', CURLOPT_RETURNTRANSFER => true, - CURLOPT_CUSTOMREQUEST => 'POST', + CURLOPT_CUSTOMREQUEST => 'GET', CURLOPT_POST => 1, CURLOPT_POSTFIELDS => $jsonEncodedData, CURLOPT_HTTPHEADER => [ @@ -757,13 +757,9 @@ class Invoice extends EntityModel implements BalanceAffecting $response = curl_exec($curl); curl_close($curl); - Log::info($response); - $encodedString = strip_tags($response); $pdfString = Utils::decodePDF($encodedString); - Log::info($pdfString); - if ( ! $pdfString || strlen($pdfString) < 200) { Utils::logError("PhantomJSCloud - failed to create pdf: {$encodedString}"); } From 7cd3bac29c450db1d88e4e0b4ff4c8e2a38e915a Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Feb 2016 10:35:54 +1100 Subject: [PATCH 12/15] Improving error reporting API --- app/Models/Invoice.php | 2 ++ 1 file changed, 2 insertions(+) diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 7198eff647..b82e8ea9cf 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -757,6 +757,8 @@ class Invoice extends EntityModel implements BalanceAffecting $response = curl_exec($curl); curl_close($curl); + Log::info($response); + $encodedString = strip_tags($response); $pdfString = Utils::decodePDF($encodedString); From 7da522599c8c651909b00fafab2c3bd3365311a2 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Feb 2016 10:36:45 +1100 Subject: [PATCH 13/15] Improving error reporting API --- app/Models/Invoice.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index b82e8ea9cf..1da325ff01 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -744,7 +744,7 @@ class Invoice extends EntityModel implements BalanceAffecting $opts = [ CURLOPT_URL => PHANTOMJS_CLOUD . env('PHANTOMJS_CLOUD_KEY') . '/', CURLOPT_RETURNTRANSFER => true, - CURLOPT_CUSTOMREQUEST => 'GET', + CURLOPT_CUSTOMREQUEST => 'POST', CURLOPT_POST => 1, CURLOPT_POSTFIELDS => $jsonEncodedData, CURLOPT_HTTPHEADER => [ @@ -758,7 +758,7 @@ class Invoice extends EntityModel implements BalanceAffecting curl_close($curl); Log::info($response); - + $encodedString = strip_tags($response); $pdfString = Utils::decodePDF($encodedString); From e3ee79f369a5d5ea8018da141630414d40749146 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Wed, 17 Feb 2016 10:44:01 +1100 Subject: [PATCH 14/15] Improving error reporting API --- app/Models/Invoice.php | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index 1da325ff01..e93c8d3b07 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -1,6 +1,5 @@ Date: Wed, 17 Feb 2016 14:32:20 +1100 Subject: [PATCH 15/15] Expense and Vendor Transformers for API --- app/Http/Controllers/ExpenseApiController.php | 64 +++++++++++++++++++ app/Http/Controllers/VendorApiController.php | 1 + app/Http/routes.php | 1 + app/Models/Vendor.php | 5 ++ app/Ninja/Mailers/ContactMailer.php | 2 + app/Ninja/Transformers/ExpenseTransformer.php | 29 +++++++++ app/Ninja/Transformers/VendorTransformer.php | 15 +++-- 7 files changed, 113 insertions(+), 4 deletions(-) create mode 100644 app/Http/Controllers/ExpenseApiController.php create mode 100644 app/Ninja/Transformers/ExpenseTransformer.php diff --git a/app/Http/Controllers/ExpenseApiController.php b/app/Http/Controllers/ExpenseApiController.php new file mode 100644 index 0000000000..88ff5497ce --- /dev/null +++ b/app/Http/Controllers/ExpenseApiController.php @@ -0,0 +1,64 @@ +expenseRepo = $expenseRepo; + $this->expenseService = $expenseService; + } + + public function index() + { + + $expenses = Expense::scope() + ->withTrashed() + ->orderBy('created_at','desc'); + + $expenses = $expenses->paginate(); + + $transformer = new ExpenseTransformer(Auth::user()->account, Input::get('serializer')); + $paginator = Expense::scope()->withTrashed()->paginate(); + + $data = $this->createCollection($expenses, $transformer, ENTITY_EXPENSE, $paginator); + + return $this->response($data); + + } + + public function update() + { + //stub + + } + + public function store() + { + //stub + + } + + public function destroy() + { + //stub + + } + + +} \ No newline at end of file diff --git a/app/Http/Controllers/VendorApiController.php b/app/Http/Controllers/VendorApiController.php index 80236226dd..e2cec175ba 100644 --- a/app/Http/Controllers/VendorApiController.php +++ b/app/Http/Controllers/VendorApiController.php @@ -48,6 +48,7 @@ class VendorApiController extends BaseAPIController { $vendors = Vendor::scope() ->with($this->getIncluded()) + ->withTrashed() ->orderBy('created_at', 'desc') ->paginate(); diff --git a/app/Http/routes.php b/app/Http/routes.php index 9001c18e62..97002c05b1 100644 --- a/app/Http/routes.php +++ b/app/Http/routes.php @@ -236,6 +236,7 @@ Route::group(['middleware' => 'api', 'prefix' => 'api/v1'], function() Route::resource('products', 'ProductApiController'); Route::resource('tax_rates', 'TaxRateApiController'); Route::resource('users', 'UserApiController'); + Route::resource('expenses','ExpenseApiController'); // Vendor Route::resource('vendors', 'VendorApiController'); diff --git a/app/Models/Vendor.php b/app/Models/Vendor.php index a93fc6e5d7..ce21a64463 100644 --- a/app/Models/Vendor.php +++ b/app/Models/Vendor.php @@ -124,6 +124,11 @@ class Vendor extends EntityModel return $this->belongsTo('App\Models\Industry'); } + public function expenses() + { + return $this->hasMany('App\Models\Expense','vendor_id','id'); + } + public function addVendorContact($data, $isPrimary = false) { $publicId = isset($data['public_id']) ? $data['public_id'] : false; diff --git a/app/Ninja/Mailers/ContactMailer.php b/app/Ninja/Mailers/ContactMailer.php index 8959602ce6..dc513c3e88 100644 --- a/app/Ninja/Mailers/ContactMailer.php +++ b/app/Ninja/Mailers/ContactMailer.php @@ -41,6 +41,8 @@ class ContactMailer extends Mailer $client = $invoice->client; $account = $invoice->account; + $response = null; + if ($client->trashed()) { return trans('texts.email_errors.inactive_client'); } elseif ($invoice->trashed()) { diff --git a/app/Ninja/Transformers/ExpenseTransformer.php b/app/Ninja/Transformers/ExpenseTransformer.php new file mode 100644 index 0000000000..26729f4ddb --- /dev/null +++ b/app/Ninja/Transformers/ExpenseTransformer.php @@ -0,0 +1,29 @@ + (int) $expense->public_id, + 'private_notes' => $expense->private_notes, + 'public_notes' => $expense->public_notes, + 'should_be_invoiced' => (bool) $expense->should_be_invoiced, + 'updated_at' => $this->getTimestamp($expense->updated_at), + 'archived_at' => $this->getTimestamp($expense->deleted_at), + 'transaction_id' => $expense->transaction_id, + 'bank_id' => $expense->bank_id, + 'expense_currency_id' => (int) $expense->expense_currency_id, + 'account_key' => $this->account->account_key, + 'amount' => (float) $expense->amount, + 'expense_date' => $expense->expense_date, + 'exchange_rate' => (float) $expense->exchange_rate, + 'invoice_currency_id' => (int) $expense->invoice_currency_id, + 'is_deleted' => (bool) $expense->is_deleted, + ]; + } +} \ No newline at end of file diff --git a/app/Ninja/Transformers/VendorTransformer.php b/app/Ninja/Transformers/VendorTransformer.php index c1714b27a1..f0b8fd0415 100644 --- a/app/Ninja/Transformers/VendorTransformer.php +++ b/app/Ninja/Transformers/VendorTransformer.php @@ -36,14 +36,15 @@ class VendorTransformer extends EntityTransformer */ protected $availableIncludes = [ - 'contacts', + 'vendorContacts', 'invoices', + 'expenses', ]; - public function includeContacts(Vendor $vendor) + public function includeVendorContacts(Vendor $vendor) { - $transformer = new ContactTransformer($this->account, $this->serializer); - return $this->includeCollection($vendor->contacts, $transformer, ENTITY_CONTACT); + $transformer = new VendorContactTransformer($this->account, $this->serializer); + return $this->includeCollection($vendor->vendorContacts, $transformer, ENTITY_CONTACT); } public function includeInvoices(Vendor $vendor) @@ -52,6 +53,12 @@ class VendorTransformer extends EntityTransformer return $this->includeCollection($vendor->invoices, $transformer, ENTITY_INVOICE); } + public function includeExpenses(Vendor $vendor) + { + $transformer = new ExpenseTransformer($this->account, $this->serializer); + return $this->includeCollection($vendor->expenses, $transformer, ENTITY_EXPENSE); + } + public function transform(Vendor $vendor) { return [