From a144b67a4eff39a64f4e7bc88df2c74dc1e20f45 Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Tue, 12 Nov 2019 18:26:29 +0530 Subject: [PATCH 01/12] validation and status changes --- app/Http/Controllers/InvoicesController.php | 1 + app/Http/Controllers/PaymentController.php | 23 +++---------------- app/Http/Requests/CustomerRequest.php | 4 ++++ app/Http/Requests/EstimatesRequest.php | 15 +++++++++--- app/Http/Requests/ExpenseRequest.php | 2 +- app/Http/Requests/InvoicesRequest.php | 15 +++++++++--- app/Http/Requests/ItemsRequest.php | 2 +- app/Http/Requests/PaymentRequest.php | 2 +- app/Http/Requests/ProfileRequest.php | 4 ++++ .../2017_04_11_081227_create_items_table.php | 2 +- ...017_04_12_090759_create_invoices_table.php | 12 +++++----- ...4_12_091015_create_invoice_items_table.php | 12 +++++----- ...17_05_05_055609_create_estimates_table.php | 10 ++++---- ..._02_123501_create_estimate_items_table.php | 12 +++++----- ...018_11_02_133956_create_expenses_table.php | 2 +- ...019_09_03_135234_create_payments_table.php | 2 +- .../2019_09_21_052548_create_taxes_table.php | 2 +- database/seeds/EstimateTemplateSeeder.php | 6 ++--- database/seeds/InvoiceTemplateSeeder.php | 6 ++--- 19 files changed, 72 insertions(+), 62 deletions(-) diff --git a/app/Http/Controllers/InvoicesController.php b/app/Http/Controllers/InvoicesController.php index ce434e24..7eaebb7b 100644 --- a/app/Http/Controllers/InvoicesController.php +++ b/app/Http/Controllers/InvoicesController.php @@ -260,6 +260,7 @@ class InvoicesController extends Controller 'error' => 'invalid_due_amount' ]); } elseif ($invoice->due_amount != 0 && $invoice->paid_status == Invoice::STATUS_PAID) { + $invoice->status = $invoice->getPreviousStatus(); $invoice->paid_status = Invoice::STATUS_PARTIALLY_PAID; } diff --git a/app/Http/Controllers/PaymentController.php b/app/Http/Controllers/PaymentController.php index e141fd7c..9ebc8203 100644 --- a/app/Http/Controllers/PaymentController.php +++ b/app/Http/Controllers/PaymentController.php @@ -170,6 +170,7 @@ class PaymentController extends Controller $invoice->status = Invoice::STATUS_COMPLETED; $invoice->paid_status = Invoice::STATUS_PAID; } else { + $invoice->status = $invoice->getPreviousStatus(); $invoice->paid_status = Invoice::STATUS_PARTIALLY_PAID; } @@ -211,16 +212,7 @@ class PaymentController extends Controller $invoice->paid_status = Invoice::STATUS_PARTIALLY_PAID; } - if ($invoice->due_date < Carbon::now()) { - $invoice->status = Invoice::STATUS_OVERDUE; - } elseif ($invoice->viewed) { - $invoice->status = Invoice::STATUS_VIEWED; - } elseif ($invoice->sent) { - $invoice->status = Invoice::STATUS_SENT; - } else { - $invoice->status = Invoice::STATUS_DRAFT; - } - + $invoice->status = $invoice->getPreviousStatus(); $invoice->save(); } @@ -246,16 +238,7 @@ class PaymentController extends Controller $invoice->paid_status = Invoice::STATUS_PARTIALLY_PAID; } - if ($invoice->due_date < Carbon::now()) { - $invoice->status = Invoice::STATUS_OVERDUE; - } elseif ($invoice->sent) { - $invoice->status = Invoice::STATUS_SENT; - } elseif ($invoice->viewed) { - $invoice->status = Invoice::STATUS_VIEWED; - } else { - $invoice->status = Invoice::STATUS_DRAFT; - } - + $invoice->status = $invoice->getPreviousStatus(); $invoice->save(); } diff --git a/app/Http/Requests/CustomerRequest.php b/app/Http/Requests/CustomerRequest.php index 9a55be44..0973264c 100644 --- a/app/Http/Requests/CustomerRequest.php +++ b/app/Http/Requests/CustomerRequest.php @@ -26,12 +26,16 @@ class CustomerRequest extends FormRequest case 'POST': return [ 'name' => 'required', + 'addresses.*.address_street_1' => 'max:255', + 'addresses.*.address_street_2' => 'max:255', 'email' => 'email|nullable|unique:users,email', ]; break; case 'PUT': return [ 'name' => 'required', + 'addresses.*.address_street_1' => 'max:255', + 'addresses.*.address_street_2' => 'max:255', ]; break; default: diff --git a/app/Http/Requests/EstimatesRequest.php b/app/Http/Requests/EstimatesRequest.php index 61b96d65..5a9c760e 100644 --- a/app/Http/Requests/EstimatesRequest.php +++ b/app/Http/Requests/EstimatesRequest.php @@ -27,13 +27,22 @@ class EstimatesRequest extends FormRequest 'expiry_date' => 'required', 'estimate_number' => 'required|unique:estimates,estimate_number', 'user_id' => 'required', - 'discount' => 'required', + 'discount' => 'required|digits_between:1,20', + 'discount_val' => 'required|digits_between:1,20', + 'sub_total' => 'required|digits_between:1,20', + 'total' => 'required|digits_between:1,20', + 'tax' => 'required|digits_between:1,20', 'estimate_template_id' => 'required', 'items' => 'required|array', + 'items.*.description' => 'max:255', 'items.*' => 'required|max:255', 'items.*.name' => 'required', - 'items.*.quantity' => 'required|numeric', - 'items.*.price' => 'required|numeric', + 'items.*.quantity' => 'required|digits_between:1,20', + 'items.*.price' => 'required|digits_between:1,20', + 'items.*.discount' => 'digits_between:1,20', + 'items.*.discount_val' => 'digits_between:1,20', + 'items.*.tax' => 'digits_between:1,20', + 'items.*.total' => 'digits_between:1,20', ]; if ($this->getMethod() == 'PUT') { diff --git a/app/Http/Requests/ExpenseRequest.php b/app/Http/Requests/ExpenseRequest.php index 576d69f5..3c03bd67 100644 --- a/app/Http/Requests/ExpenseRequest.php +++ b/app/Http/Requests/ExpenseRequest.php @@ -25,7 +25,7 @@ class ExpenseRequest extends FormRequest return [ 'expense_date' => 'required', 'expense_category_id' => 'required', - 'amount' => 'required' + 'amount' => 'required|digits_between:1,20' ]; } } diff --git a/app/Http/Requests/InvoicesRequest.php b/app/Http/Requests/InvoicesRequest.php index 2724e323..3b9306ce 100644 --- a/app/Http/Requests/InvoicesRequest.php +++ b/app/Http/Requests/InvoicesRequest.php @@ -27,13 +27,22 @@ class InvoicesRequest extends FormRequest 'due_date' => 'required', 'invoice_number' => 'required|unique:invoices,invoice_number', 'user_id' => 'required', - 'discount' => 'required', + 'discount' => 'required|digits_between:1,20', + 'discount_val' => 'required|digits_between:1,20', + 'sub_total' => 'required|digits_between:1,20', + 'total' => 'required|digits_between:1,20', + 'tax' => 'required|digits_between:1,20', 'invoice_template_id' => 'required', 'items' => 'required|array', 'items.*' => 'required|max:255', + 'items.*.description' => 'max:255', 'items.*.name' => 'required', - 'items.*.quantity' => 'required|numeric', - 'items.*.price' => 'required|numeric', + 'items.*.quantity' => 'required|digits_between:1,20', + 'items.*.price' => 'required|digits_between:1,20', + 'items.*.discount' => 'digits_between:1,20', + 'items.*.discount_val' => 'digits_between:1,20', + 'items.*.tax' => 'digits_between:1,20', + 'items.*.total' => 'digits_between:1,20', ]; if ($this->getMethod() == 'PUT') { diff --git a/app/Http/Requests/ItemsRequest.php b/app/Http/Requests/ItemsRequest.php index 1aa535f3..d24e29ef 100644 --- a/app/Http/Requests/ItemsRequest.php +++ b/app/Http/Requests/ItemsRequest.php @@ -24,7 +24,7 @@ class ItemsRequest extends FormRequest { return [ 'name' => 'required', - 'price' => 'required', + 'price' => 'required|digits_between:1,20', ]; } } diff --git a/app/Http/Requests/PaymentRequest.php b/app/Http/Requests/PaymentRequest.php index 9f326d1d..cc8a9718 100644 --- a/app/Http/Requests/PaymentRequest.php +++ b/app/Http/Requests/PaymentRequest.php @@ -26,7 +26,7 @@ class PaymentRequest extends FormRequest 'payment_date' => 'required', 'payment_number' => 'required|unique:payments,payment_number', 'user_id' => 'required', - 'amount' => 'required', + 'amount' => 'required|digits_between:1,20', ]; if ($this->getMethod() == 'PUT') { diff --git a/app/Http/Requests/ProfileRequest.php b/app/Http/Requests/ProfileRequest.php index 0a9b2e6c..6d96742d 100644 --- a/app/Http/Requests/ProfileRequest.php +++ b/app/Http/Requests/ProfileRequest.php @@ -31,6 +31,8 @@ class ProfileRequest extends FormRequest return [ 'name' => 'required', 'password' => 'required', + 'address_street_1' => 'max:255', + 'address_street_2' => 'max:255', 'email' => [ 'required', 'email', @@ -41,6 +43,8 @@ class ProfileRequest extends FormRequest case 'PUT': return [ 'name' => 'required', + 'address_street_1' => 'max:255', + 'address_street_2' => 'max:255', 'email' => 'required|email' ]; break; diff --git a/database/migrations/2017_04_11_081227_create_items_table.php b/database/migrations/2017_04_11_081227_create_items_table.php index e1041517..f383ff1f 100644 --- a/database/migrations/2017_04_11_081227_create_items_table.php +++ b/database/migrations/2017_04_11_081227_create_items_table.php @@ -18,7 +18,7 @@ class CreateItemsTable extends Migration $table->string('name'); $table->string('description')->nullable(); $table->string('unit')->nullable(); - $table->integer('price'); + $table->unsignedBigInteger('price'); $table->integer('company_id')->unsigned()->nullable(); $table->foreign('company_id')->references('id')->on('companies')->onDelete('cascade'); $table->timestamps(); diff --git a/database/migrations/2017_04_12_090759_create_invoices_table.php b/database/migrations/2017_04_12_090759_create_invoices_table.php index 3f30011c..7089c847 100644 --- a/database/migrations/2017_04_12_090759_create_invoices_table.php +++ b/database/migrations/2017_04_12_090759_create_invoices_table.php @@ -24,13 +24,13 @@ class CreateInvoicesTable extends Migration $table->string('tax_per_item'); $table->string('discount_per_item'); $table->text('notes')->nullable(); - $table->decimal('discount', 15, 0)->nullable(); $table->string('discount_type')->nullable(); - $table->integer('discount_val')->nullable(); - $table->integer('sub_total'); - $table->integer('total'); - $table->integer('tax'); - $table->integer('due_amount'); + $table->unsignedBigInteger('discount')->nullable(); + $table->unsignedBigInteger('discount_val')->nullable(); + $table->unsignedBigInteger('sub_total'); + $table->unsignedBigInteger('total'); + $table->unsignedBigInteger('tax'); + $table->unsignedBigInteger('due_amount'); $table->boolean('sent')->default(false); $table->boolean('viewed')->default(false); $table->string('unique_hash')->nullable(); diff --git a/database/migrations/2017_04_12_091015_create_invoice_items_table.php b/database/migrations/2017_04_12_091015_create_invoice_items_table.php index 343b6a77..26af22bf 100644 --- a/database/migrations/2017_04_12_091015_create_invoice_items_table.php +++ b/database/migrations/2017_04_12_091015_create_invoice_items_table.php @@ -17,13 +17,13 @@ class CreateInvoiceItemsTable extends Migration $table->increments('id'); $table->string('name'); $table->string('description')->nullable(); - $table->integer('quantity'); - $table->integer('price'); $table->string('discount_type'); - $table->integer('discount_val'); - $table->decimal('discount', 15, 0); - $table->integer('tax'); - $table->integer('total'); + $table->unsignedBigInteger('quantity'); + $table->unsignedBigInteger('price'); + $table->unsignedBigInteger('discount_val'); + $table->unsignedBigInteger('discount'); + $table->unsignedBigInteger('tax'); + $table->unsignedBigInteger('total'); $table->integer('invoice_id')->unsigned(); $table->foreign('invoice_id')->references('id')->on('invoices')->onDelete('cascade'); $table->integer('item_id')->unsigned()->nullable(); diff --git a/database/migrations/2017_05_05_055609_create_estimates_table.php b/database/migrations/2017_05_05_055609_create_estimates_table.php index 77c43e68..cfd5b536 100644 --- a/database/migrations/2017_05_05_055609_create_estimates_table.php +++ b/database/migrations/2017_05_05_055609_create_estimates_table.php @@ -23,12 +23,12 @@ class CreateEstimatesTable extends Migration $table->string('tax_per_item'); $table->string('discount_per_item'); $table->string('notes')->nullable(); - $table->decimal('discount', 15, 0)->nullable(); $table->string('discount_type')->nullable(); - $table->integer('discount_val')->nullable(); - $table->integer('sub_total'); - $table->integer('total'); - $table->integer('tax'); + $table->unsignedBigInteger('discount')->nullable(); + $table->unsignedBigInteger('discount_val')->nullable(); + $table->unsignedBigInteger('sub_total'); + $table->unsignedBigInteger('total'); + $table->unsignedBigInteger('tax'); $table->string('unique_hash')->nullable(); $table->integer('user_id')->unsigned()->nullable(); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); diff --git a/database/migrations/2017_10_02_123501_create_estimate_items_table.php b/database/migrations/2017_10_02_123501_create_estimate_items_table.php index 400086c6..a2222dcb 100644 --- a/database/migrations/2017_10_02_123501_create_estimate_items_table.php +++ b/database/migrations/2017_10_02_123501_create_estimate_items_table.php @@ -17,13 +17,13 @@ class CreateEstimateItemsTable extends Migration $table->increments('id'); $table->string('name'); $table->string('description')->nullable(); - $table->integer('quantity'); $table->string('discount_type'); - $table->decimal('discount', 15, 0); - $table->integer('discount_val'); - $table->integer('price'); - $table->integer('tax'); - $table->integer('total'); + $table->unsignedBigInteger('quantity'); + $table->unsignedBigInteger('discount'); + $table->unsignedBigInteger('discount_val'); + $table->unsignedBigInteger('price'); + $table->unsignedBigInteger('tax'); + $table->unsignedBigInteger('total'); $table->integer('item_id')->unsigned()->nullable(); $table->foreign('item_id')->references('id')->on('items')->onDelete('cascade'); $table->integer('estimate_id')->unsigned(); diff --git a/database/migrations/2018_11_02_133956_create_expenses_table.php b/database/migrations/2018_11_02_133956_create_expenses_table.php index ae3e1f2c..25912644 100644 --- a/database/migrations/2018_11_02_133956_create_expenses_table.php +++ b/database/migrations/2018_11_02_133956_create_expenses_table.php @@ -17,7 +17,7 @@ class CreateExpensesTable extends Migration $table->increments('id'); $table->date('expense_date'); $table->string('attachment_receipt')->nullable(); - $table->integer('amount'); + $table->unsignedBigInteger('amount'); $table->string('notes')->nullable(); $table->integer('expense_category_id')->unsigned(); $table->foreign('expense_category_id')->references('id')->on('expense_categories')->onDelete('cascade'); diff --git a/database/migrations/2019_09_03_135234_create_payments_table.php b/database/migrations/2019_09_03_135234_create_payments_table.php index 7797905c..d34af4f2 100644 --- a/database/migrations/2019_09_03_135234_create_payments_table.php +++ b/database/migrations/2019_09_03_135234_create_payments_table.php @@ -19,7 +19,7 @@ class CreatePaymentsTable extends Migration $table->string('payment_mode')->nullable(); $table->date('payment_date'); $table->text('notes')->nullable(); - $table->decimal('amount', 15, 0); + $table->unsignedBigInteger('amount'); $table->integer('user_id')->unsigned(); $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade'); $table->integer('invoice_id')->unsigned()->nullable(); diff --git a/database/migrations/2019_09_21_052548_create_taxes_table.php b/database/migrations/2019_09_21_052548_create_taxes_table.php index 56622267..f5ae90f9 100644 --- a/database/migrations/2019_09_21_052548_create_taxes_table.php +++ b/database/migrations/2019_09_21_052548_create_taxes_table.php @@ -30,7 +30,7 @@ class CreateTaxesTable extends Migration $table->integer('company_id')->unsigned()->nullable(); $table->foreign('company_id')->references('id')->on('companies'); $table->string('name'); - $table->decimal('amount', 15, 0); + $table->unsignedBigInteger('amount'); $table->decimal('percent', 5, 2); $table->tinyInteger('compound_tax')->default(0); $table->timestamps(); diff --git a/database/seeds/EstimateTemplateSeeder.php b/database/seeds/EstimateTemplateSeeder.php index 63263e17..13219dc9 100644 --- a/database/seeds/EstimateTemplateSeeder.php +++ b/database/seeds/EstimateTemplateSeeder.php @@ -13,19 +13,19 @@ class EstimateTemplateSeeder extends Seeder public function run() { EstimateTemplate::create([ - 'name' => 'Estimate Template1', + 'name' => 'Template 1', 'view' => 'estimate1', 'path' => '/assets/img/PDF/Template1.png' ]); EstimateTemplate::create([ - 'name' => 'Estimate Template2', + 'name' => 'Template 2', 'view' => 'estimate2', 'path' => '/assets/img/PDF/Template2.png' ]); EstimateTemplate::create([ - 'name' => 'Estimate Template3', + 'name' => 'Template 3', 'view' => 'estimate3', 'path' => '/assets/img/PDF/Template3.png' ]); diff --git a/database/seeds/InvoiceTemplateSeeder.php b/database/seeds/InvoiceTemplateSeeder.php index aade6397..b0fcb647 100644 --- a/database/seeds/InvoiceTemplateSeeder.php +++ b/database/seeds/InvoiceTemplateSeeder.php @@ -13,19 +13,19 @@ class InvoiceTemplateSeeder extends Seeder public function run() { InvoiceTemplate::create([ - 'name' => 'Invoice Template1', + 'name' => 'Template 1', 'view' => 'invoice1', 'path' => '/assets/img/PDF/Template1.png' ]); InvoiceTemplate::create([ - 'name' => 'Invoice Template2', + 'name' => ' Template 2', 'view' => 'invoice2', 'path' => '/assets/img/PDF/Template2.png' ]); InvoiceTemplate::create([ - 'name' => 'Invoice Template3', + 'name' => 'Template 3', 'view' => 'invoice3', 'path' => '/assets/img/PDF/Template3.png' ]); From 81f34b8912e6e9d33ba038f46951bc9fc172f2b3 Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Tue, 12 Nov 2019 18:30:17 +0530 Subject: [PATCH 02/12] add previous status method in invoice model --- app/Invoice.php | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/app/Invoice.php b/app/Invoice.php index 0bbd845a..31a1425e 100644 --- a/app/Invoice.php +++ b/app/Invoice.php @@ -113,6 +113,19 @@ class Invoice extends Model return $this->belongsTo(InvoiceTemplate::class); } + public function getPreviousStatus() + { + if ($this->due_date < Carbon::now()) { + return self::STATUS_OVERDUE; + } elseif ($this->viewed) { + return self::STATUS_VIEWED; + } elseif ($this->sent) { + return self::STATUS_SENT; + } else { + return self::STATUS_DRAFT; + } + } + private function strposX($haystack, $needle, $number) { if ($number == '1') { From 1b28b082d2212f5b02829ee691b5c013004e6f96 Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Tue, 12 Nov 2019 18:44:49 +0530 Subject: [PATCH 03/12] add auto update feature --- app/Events/UpdateFinished.php | 34 ++++++++ app/Http/Controllers/UpdateController.php | 18 +++++ app/Listeners/Updates/Listener.php | 31 ++++++++ app/Listeners/Updates/V10/Version101.php | 28 +++++++ app/Providers/EventServiceProvider.php | 4 +- app/Space/SiteApi.php | 35 ++++++++ app/Space/Updater.php | 97 +++++++++++++++++++++++ routes/api.php | 9 +++ 8 files changed, 254 insertions(+), 2 deletions(-) create mode 100644 app/Events/UpdateFinished.php create mode 100644 app/Http/Controllers/UpdateController.php create mode 100644 app/Listeners/Updates/Listener.php create mode 100644 app/Listeners/Updates/V10/Version101.php create mode 100644 app/Space/SiteApi.php create mode 100644 app/Space/Updater.php diff --git a/app/Events/UpdateFinished.php b/app/Events/UpdateFinished.php new file mode 100644 index 00000000..d9700d93 --- /dev/null +++ b/app/Events/UpdateFinished.php @@ -0,0 +1,34 @@ +alias = $alias; + $this->old = $old; + $this->new = $new; + } +} diff --git a/app/Http/Controllers/UpdateController.php b/app/Http/Controllers/UpdateController.php new file mode 100644 index 00000000..db8a3a55 --- /dev/null +++ b/app/Http/Controllers/UpdateController.php @@ -0,0 +1,18 @@ +alias, $request->installed, $request->version); + + return response()->json($json); + } +} diff --git a/app/Listeners/Updates/Listener.php b/app/Listeners/Updates/Listener.php new file mode 100644 index 00000000..cc63c94b --- /dev/null +++ b/app/Listeners/Updates/Listener.php @@ -0,0 +1,31 @@ +alias != static::ALIAS) { + return false; + } + + // Do not apply to the same or newer versions + if (version_compare($event->old, static::VERSION, '>=')) { + return false; + } + + return true; + } +} diff --git a/app/Listeners/Updates/V10/Version101.php b/app/Listeners/Updates/V10/Version101.php new file mode 100644 index 00000000..6bd9c226 --- /dev/null +++ b/app/Listeners/Updates/V10/Version101.php @@ -0,0 +1,28 @@ +check($event)) { + return; + } + } +} diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index 94b27038..ea9d4fea 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -13,8 +13,8 @@ class EventServiceProvider extends ServiceProvider * @var array */ protected $listen = [ - 'Laraspace\Events\SomeEvent' => [ - 'Laraspace\Listeners\EventListener', + 'Laraspace\Events\UpdateFinished' => [ + 'Laraspace\Listeners\Updates\V10\Version101', ], Registered::class => [ SendEmailVerificationNotification::class, diff --git a/app/Space/SiteApi.php b/app/Space/SiteApi.php new file mode 100644 index 00000000..6952208b --- /dev/null +++ b/app/Space/SiteApi.php @@ -0,0 +1,35 @@ + false, 'base_uri' => $base]); + + $headers['headers'] = array( + 'Accept' => 'application/json', + 'Referer' => url('/'), + 'crater' => getFullVersion() + ); + + $data['http_errors'] = false; + + $data = array_merge($data, $headers); + + try { + $result = $client->get($url, $data); + } catch (RequestException $e) { + $result = $e; + } + + return $result; + } +} diff --git a/app/Space/Updater.php b/app/Space/Updater.php new file mode 100644 index 00000000..21997506 --- /dev/null +++ b/app/Space/Updater.php @@ -0,0 +1,97 @@ + 50, 'track_redirects' => true]); + + // Exception + if ($response instanceof RequestException) { + return [ + 'success' => false, + 'errors' => 'Download Exception', + 'data' => [ + 'path' => $path + ] + ]; + } + + if ($response && ($response->getStatusCode() == 200)) { + $data = $response->getBody()->getContents(); + } + + // Create temp directory + $path = 'temp-' . md5(mt_rand()); + $path2 = 'temp2-' . md5(mt_rand()); + $temp_path = storage_path('app/temp') . '/' . $path; + $temp_path2 = storage_path('app/temp') . '/' . $path2; + + if (!File::isDirectory($temp_path)) { + File::makeDirectory($temp_path); + File::makeDirectory($temp_path2); + } + + $file = $temp_path . '/upload.zip'; + + // Add content to the Zip file + $uploaded = is_int(file_put_contents($file, $data)) ? true : false; + + if (!$uploaded) { + return false; + } + + // Unzip the file + $zip = new ZipArchive(); + + if ($zip->open($file)) { + $zip->extractTo($temp_path2); + } + + $zip->close(); + + // Delete zip file + File::delete($file); + + if (!File::copyDirectory($temp_path2, base_path())) { + return false; + } + + // Delete temp directory + File::deleteDirectory($temp_path); + File::deleteDirectory($temp_path2); + + Artisan::call('cache:clear'); + + try { + event(new UpdateFinished($alias, $installed, $version)); + + return [ + 'success' => true, + 'errors' => false, + 'data' => [] + ]; + } catch (\Exception $e) { + return [ + 'success' => false, + 'errors' => 'Update error', + 'data' => [] + ]; + } + } +} diff --git a/routes/api.php b/routes/api.php index 4fa230ff..2d1cc49b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -106,6 +106,8 @@ Route::group(['middleware' => 'redirect-if-installed'], function () { 'uses' => 'OnboardingController@companySettings' ]); }); + + // App version // ---------------------------------- @@ -120,6 +122,13 @@ Route::group(['middleware' => 'api'], function () { 'middleware' => 'admin' ], function () { + // Auto update routes + //---------------------------------- + Route::post('/update', [ + 'as' => 'auto.update', + 'uses' => 'UpdateController@update' + ]); + Route::get('/bootstrap', [ 'as' => 'bootstrap', 'uses' => 'UsersController@getBootstrap' From 19f8d3c042399e09f449bc2fc7dd4d5cb19c2677 Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Tue, 12 Nov 2019 18:56:24 +0530 Subject: [PATCH 04/12] refactor update finished event --- app/Events/UpdateFinished.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Events/UpdateFinished.php b/app/Events/UpdateFinished.php index d9700d93..65949f76 100644 --- a/app/Events/UpdateFinished.php +++ b/app/Events/UpdateFinished.php @@ -12,7 +12,7 @@ use Illuminate\Queue\SerializesModels; class UpdateFinished { - use Dispatchable, InteractsWithSockets, SerializesModels; + use Dispatchable; public $alias; From 4923392db180d371f9f3003693027a0b378d5f0d Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Tue, 12 Nov 2019 19:37:04 +0530 Subject: [PATCH 05/12] refactor environment controller and login validation --- app/Http/Controllers/Auth/AccessTokensController.php | 2 +- app/Http/Controllers/EnvironmentController.php | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Http/Controllers/Auth/AccessTokensController.php b/app/Http/Controllers/Auth/AccessTokensController.php index 0441aa57..73396b11 100644 --- a/app/Http/Controllers/Auth/AccessTokensController.php +++ b/app/Http/Controllers/Auth/AccessTokensController.php @@ -54,7 +54,7 @@ class AccessTokensController extends Controller { $request->validate([ 'username' => 'required|email', - 'password' => 'required|string', + 'password' => 'required|string|min:8', ]); if ($this->hasTooManyLoginAttempts($request)) { diff --git a/app/Http/Controllers/EnvironmentController.php b/app/Http/Controllers/EnvironmentController.php index 2ce919e9..bc9a02bc 100755 --- a/app/Http/Controllers/EnvironmentController.php +++ b/app/Http/Controllers/EnvironmentController.php @@ -39,8 +39,8 @@ class EnvironmentController extends Controller if(array_key_exists("success", $results)) { Artisan::call('config:clear'); - Artisan::call('migrate --seed'); - Artisan::call('migrate', ['--path' => 'vendor/laravel/passport/database/migrations']); + Artisan::call('migrate --seed --force'); + Artisan::call('migrate', ['--path' => 'vendor/laravel/passport/database/migrations', '--force' => true]); \Storage::disk('local')->put('database_created', 'database_created'); From 3efc3357c181325fe6c51eac3accd7bd80918e05 Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Tue, 12 Nov 2019 20:25:00 +0530 Subject: [PATCH 06/12] add key generate command --- app/Http/Controllers/EnvironmentController.php | 1 + 1 file changed, 1 insertion(+) diff --git a/app/Http/Controllers/EnvironmentController.php b/app/Http/Controllers/EnvironmentController.php index 2ce919e9..9760514e 100755 --- a/app/Http/Controllers/EnvironmentController.php +++ b/app/Http/Controllers/EnvironmentController.php @@ -39,6 +39,7 @@ class EnvironmentController extends Controller if(array_key_exists("success", $results)) { Artisan::call('config:clear'); + Artisan::call('key:generate --force'); Artisan::call('migrate --seed'); Artisan::call('migrate', ['--path' => 'vendor/laravel/passport/database/migrations']); From fa1ddae78ccef38eb1a678bfd986e9a9cd2d32d1 Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Wed, 13 Nov 2019 20:14:46 +0530 Subject: [PATCH 07/12] refactor updater --- app/Space/SiteApi.php | 5 +++-- app/Space/Updater.php | 4 ++-- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/app/Space/SiteApi.php b/app/Space/SiteApi.php index 6952208b..35f5f6ab 100644 --- a/app/Space/SiteApi.php +++ b/app/Space/SiteApi.php @@ -4,20 +4,21 @@ namespace Laraspace\Space; use GuzzleHttp\Client; use GuzzleHttp\Exception\RequestException; +use Laraspace\Setting; trait SiteApi { protected static function getRemote($url, $data = array()) { - $base = 'https://codeload.github.com/'; + $base = 'http://download-test.test/'; $client = new Client(['verify' => false, 'base_uri' => $base]); $headers['headers'] = array( 'Accept' => 'application/json', 'Referer' => url('/'), - 'crater' => getFullVersion() + 'crater' => Setting::getSetting('version') ); $data['http_errors'] = false; diff --git a/app/Space/Updater.php b/app/Space/Updater.php index 21997506..967ea492 100644 --- a/app/Space/Updater.php +++ b/app/Space/Updater.php @@ -17,9 +17,9 @@ class Updater $data = null; $path = null; - $url = 'laraspace/laraspace/zip/master'; + $url = '/api/download'; - $response = static::getRemote($url, ['timeout' => 50, 'track_redirects' => true]); + $response = static::getRemote($url, ['timeout' => 100, 'track_redirects' => true]); // Exception if ($response instanceof RequestException) { From 3b789dc49e306a42787670c4620735f9cd482f93 Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Thu, 14 Nov 2019 18:08:50 +0530 Subject: [PATCH 08/12] refactor updater --- app/Space/Updater.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/app/Space/Updater.php b/app/Space/Updater.php index 967ea492..bd0dad3f 100644 --- a/app/Space/Updater.php +++ b/app/Space/Updater.php @@ -76,8 +76,6 @@ class Updater File::deleteDirectory($temp_path); File::deleteDirectory($temp_path2); - Artisan::call('cache:clear'); - try { event(new UpdateFinished($alias, $installed, $version)); From 78fc41c9d258a4b9bd9164289bf192766db21e96 Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Thu, 14 Nov 2019 18:23:07 +0530 Subject: [PATCH 09/12] refactor updater --- app/Listeners/Updates/Listener.php | 12 ++++++------ app/Listeners/Updates/V10/Version101.php | 12 +++++++++--- app/Providers/EventServiceProvider.php | 6 ++++-- app/Space/Updater.php | 6 +++--- 4 files changed, 22 insertions(+), 14 deletions(-) diff --git a/app/Listeners/Updates/Listener.php b/app/Listeners/Updates/Listener.php index cc63c94b..703ebce6 100644 --- a/app/Listeners/Updates/Listener.php +++ b/app/Listeners/Updates/Listener.php @@ -17,14 +17,14 @@ class Listener protected function check($event) { // Apply only to the specified alias - if ($event->alias != static::ALIAS) { - return false; - } + // if ($event->alias != static::ALIAS) { + // return false; + // } // Do not apply to the same or newer versions - if (version_compare($event->old, static::VERSION, '>=')) { - return false; - } + // if (version_compare($event->old, static::VERSION, '>=')) { + // return false; + // } return true; } diff --git a/app/Listeners/Updates/V10/Version101.php b/app/Listeners/Updates/V10/Version101.php index 6bd9c226..6ba1b9b1 100644 --- a/app/Listeners/Updates/V10/Version101.php +++ b/app/Listeners/Updates/V10/Version101.php @@ -6,6 +6,8 @@ use Illuminate\Contracts\Queue\ShouldQueue; use Illuminate\Queue\InteractsWithQueue; use Laraspace\Listeners\Updates\Listener; use Laraspace\Events\UpdateFinished; +use Illuminate\Support\Facades\Artisan; +use Laraspace\Setting; class Version101 extends Listener { @@ -21,8 +23,12 @@ class Version101 extends Listener */ public function handle(UpdateFinished $event) { - if (!$this->check($event)) { - return; - } + // if (!$this->check($event)) { + // return; + // } + + Artisan::call('db:seed', ['--class' => 'DemoSeeder', '--force' => true]); + + Setting::getSetting('version', self::VERSION); } } diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index ea9d4fea..85c073ef 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -4,6 +4,8 @@ namespace Laraspace\Providers; use Illuminate\Foundation\Support\Providers\EventServiceProvider as ServiceProvider; use Illuminate\Auth\Events\Registered; use Illuminate\Auth\Listeners\SendEmailVerificationNotification; +use Laraspace\Events\UpdateFinished; +use Laraspace\Listeners\Updates\V10\Version101; class EventServiceProvider extends ServiceProvider { @@ -13,8 +15,8 @@ class EventServiceProvider extends ServiceProvider * @var array */ protected $listen = [ - 'Laraspace\Events\UpdateFinished' => [ - 'Laraspace\Listeners\Updates\V10\Version101', + UpdateFinished::class=> [ + Version101::class, ], Registered::class => [ SendEmailVerificationNotification::class, diff --git a/app/Space/Updater.php b/app/Space/Updater.php index bd0dad3f..566a3f26 100644 --- a/app/Space/Updater.php +++ b/app/Space/Updater.php @@ -68,16 +68,16 @@ class Updater // Delete zip file File::delete($file); - if (!File::copyDirectory($temp_path2, base_path())) { + if (!File::copyDirectory($temp_path2.'/test', base_path())) { return false; } // Delete temp directory File::deleteDirectory($temp_path); File::deleteDirectory($temp_path2); - + event(new UpdateFinished($alias, $installed, $version)); try { - event(new UpdateFinished($alias, $installed, $version)); + // event(new UpdateFinished($alias, $installed, $version)); return [ 'success' => true, From eee69a5d42017555c72643c3c676b77ef92e631f Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Thu, 14 Nov 2019 18:27:27 +0530 Subject: [PATCH 10/12] refactor updater event calling --- app/Space/Updater.php | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/app/Space/Updater.php b/app/Space/Updater.php index 566a3f26..bd0dad3f 100644 --- a/app/Space/Updater.php +++ b/app/Space/Updater.php @@ -68,16 +68,16 @@ class Updater // Delete zip file File::delete($file); - if (!File::copyDirectory($temp_path2.'/test', base_path())) { + if (!File::copyDirectory($temp_path2, base_path())) { return false; } // Delete temp directory File::deleteDirectory($temp_path); File::deleteDirectory($temp_path2); - event(new UpdateFinished($alias, $installed, $version)); + try { - // event(new UpdateFinished($alias, $installed, $version)); + event(new UpdateFinished($alias, $installed, $version)); return [ 'success' => true, From 0d9ca2a0fdddce48fedc8932ad4e44dfb5e3bfe0 Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Thu, 14 Nov 2019 18:59:31 +0530 Subject: [PATCH 11/12] refactor sales reports --- app/Http/Controllers/ReportController.php | 3 +-- app/InvoiceItem.php | 2 +- app/User.php | 2 +- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/ReportController.php b/app/Http/Controllers/ReportController.php index 99887eba..1e49aba9 100644 --- a/app/Http/Controllers/ReportController.php +++ b/app/Http/Controllers/ReportController.php @@ -26,8 +26,7 @@ class ReportController extends Controller $query->whereBetween( 'invoice_date', [$start->format('Y-m-d'), $end->format('Y-m-d')] - ) - ->where('paid_status', Invoice::STATUS_PAID); + ); }]) ->customer() ->whereCompany($company->id) diff --git a/app/InvoiceItem.php b/app/InvoiceItem.php index 6d4c3bd8..9b75a507 100644 --- a/app/InvoiceItem.php +++ b/app/InvoiceItem.php @@ -60,7 +60,7 @@ class InvoiceItem extends Model $query->whereBetween( 'invoice_date', [$start->format('Y-m-d'), $end->format('Y-m-d')] - )->where('paid_status', Invoice::STATUS_PAID); + ); }); } diff --git a/app/User.php b/app/User.php index 4951a842..780332f6 100644 --- a/app/User.php +++ b/app/User.php @@ -216,7 +216,7 @@ class User extends Authenticatable implements HasMedia $query->whereBetween( 'invoice_date', [$start->format('Y-m-d'), $end->format('Y-m-d')] - )->where('paid_status', Invoice::STATUS_PAID); + ); }); } From 917b618ac770da0ca8026afd677d1a9656c9275a Mon Sep 17 00:00:00 2001 From: jayvirsinh_gohil Date: Thu, 14 Nov 2019 21:00:17 +0530 Subject: [PATCH 12/12] add check version and refactpr auto update --- app/Events/UpdateFinished.php | 5 +---- app/Http/Controllers/UpdateController.php | 12 +++++++++++- app/Listeners/Updates/Listener.php | 7 ------- app/Listeners/Updates/V10/Version101.php | 2 -- app/Space/SiteApi.php | 2 +- app/Space/Updater.php | 23 +++++++++++++++++++---- routes/api.php | 5 +++++ 7 files changed, 37 insertions(+), 19 deletions(-) diff --git a/app/Events/UpdateFinished.php b/app/Events/UpdateFinished.php index 65949f76..ec7451a3 100644 --- a/app/Events/UpdateFinished.php +++ b/app/Events/UpdateFinished.php @@ -14,8 +14,6 @@ class UpdateFinished { use Dispatchable; - public $alias; - public $new; public $old; @@ -25,9 +23,8 @@ class UpdateFinished * * @return void */ - public function __construct($alias, $old, $new) + public function __construct($old, $new) { - $this->alias = $alias; $this->old = $old; $this->new = $new; } diff --git a/app/Http/Controllers/UpdateController.php b/app/Http/Controllers/UpdateController.php index db8a3a55..2b1049d9 100644 --- a/app/Http/Controllers/UpdateController.php +++ b/app/Http/Controllers/UpdateController.php @@ -4,6 +4,7 @@ namespace Laraspace\Http\Controllers; use Illuminate\Http\Request; use Laraspace\Space\Updater; +use Laraspace\Space\SiteApi; class UpdateController extends Controller { @@ -11,7 +12,16 @@ class UpdateController extends Controller { set_time_limit(600); // 10 minutes - $json = Updater::update($request->alias, $request->installed, $request->version); + $json = Updater::update($request->installed, $request->version); + + return response()->json($json); + } + + public function checkLatestVersion(Request $request) + { + set_time_limit(600); // 10 minutes + + $json = Updater::checkForUpdate(); return response()->json($json); } diff --git a/app/Listeners/Updates/Listener.php b/app/Listeners/Updates/Listener.php index 703ebce6..6dab62a8 100644 --- a/app/Listeners/Updates/Listener.php +++ b/app/Listeners/Updates/Listener.php @@ -4,8 +4,6 @@ namespace Laraspace\Listeners\Updates; class Listener { - const ALIAS = ''; - const VERSION = ''; /** @@ -16,11 +14,6 @@ class Listener */ protected function check($event) { - // Apply only to the specified alias - // if ($event->alias != static::ALIAS) { - // return false; - // } - // Do not apply to the same or newer versions // if (version_compare($event->old, static::VERSION, '>=')) { // return false; diff --git a/app/Listeners/Updates/V10/Version101.php b/app/Listeners/Updates/V10/Version101.php index 6ba1b9b1..03de4a34 100644 --- a/app/Listeners/Updates/V10/Version101.php +++ b/app/Listeners/Updates/V10/Version101.php @@ -11,8 +11,6 @@ use Laraspace\Setting; class Version101 extends Listener { - const ALIAS = 'core'; - const VERSION = '1.0.1'; /** diff --git a/app/Space/SiteApi.php b/app/Space/SiteApi.php index 35f5f6ab..2b04f178 100644 --- a/app/Space/SiteApi.php +++ b/app/Space/SiteApi.php @@ -11,7 +11,7 @@ trait SiteApi protected static function getRemote($url, $data = array()) { - $base = 'http://download-test.test/'; + $base = 'http://crater-main.test/'; $client = new Client(['verify' => false, 'base_uri' => $base]); diff --git a/app/Space/Updater.php b/app/Space/Updater.php index bd0dad3f..b5d8b369 100644 --- a/app/Space/Updater.php +++ b/app/Space/Updater.php @@ -7,17 +7,18 @@ use Artisan; use GuzzleHttp\Exception\RequestException; use Laraspace\Space\SiteApi; use Laraspace\Events\UpdateFinished; +use Laraspace\Setting; class Updater { use SiteApi; - public static function update($alias, $installed, $version) + public static function update($installed, $version) { $data = null; $path = null; - $url = '/api/download'; + $url = '/download/'.$version; $response = static::getRemote($url, ['timeout' => 100, 'track_redirects' => true]); @@ -68,7 +69,7 @@ class Updater // Delete zip file File::delete($file); - if (!File::copyDirectory($temp_path2, base_path())) { + if (!File::copyDirectory($temp_path2.'/crater', base_path())) { return false; } @@ -77,7 +78,7 @@ class Updater File::deleteDirectory($temp_path2); try { - event(new UpdateFinished($alias, $installed, $version)); + event(new UpdateFinished($installed, $version)); return [ 'success' => true, @@ -92,4 +93,18 @@ class Updater ]; } } + + public static function checkForUpdate() + { + $data = null; + $url = '/check/latest/download/'.Setting::getSetting('version'); + + $response = static::getRemote($url, ['timeout' => 100, 'track_redirects' => true]); + + if ($response && ($response->getStatusCode() == 200)) { + $data = $response->getBody()->getContents(); + } + + return json_decode($data); + } } diff --git a/routes/api.php b/routes/api.php index 2d1cc49b..2a7b8c0b 100644 --- a/routes/api.php +++ b/routes/api.php @@ -129,6 +129,11 @@ Route::group(['middleware' => 'api'], function () { 'uses' => 'UpdateController@update' ]); + Route::get('/check/update', [ + 'as' => 'check.update', + 'uses' => 'UpdateController@checkLatestVersion' + ]); + Route::get('/bootstrap', [ 'as' => 'bootstrap', 'uses' => 'UsersController@getBootstrap'