From 6ccaf5dad902841d2a94b3009361e83b7e3184f4 Mon Sep 17 00:00:00 2001 From: = Date: Wed, 28 Apr 2021 20:25:21 +1000 Subject: [PATCH 1/4] Minor fixes for migration --- app/Repositories/Migration/InvoiceMigrationRepository.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/app/Repositories/Migration/InvoiceMigrationRepository.php b/app/Repositories/Migration/InvoiceMigrationRepository.php index 7d0a74b0c696..14d56965d29f 100644 --- a/app/Repositories/Migration/InvoiceMigrationRepository.php +++ b/app/Repositories/Migration/InvoiceMigrationRepository.php @@ -161,7 +161,7 @@ class InvoiceMigrationRepository extends BaseRepository } - if ($model->company->update_products !== false) { + if ($model->company->update_products) { UpdateOrCreateProduct::dispatchNow($model->line_items, $model, $model->company); } } From d12fcf7b35962743df1ae7dba9c9cb605fc64524 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 29 Apr 2021 08:07:50 +1000 Subject: [PATCH 2/4] remove wasm --- resources/views/index/index.blade.php | 2 -- 1 file changed, 2 deletions(-) diff --git a/resources/views/index/index.blade.php b/resources/views/index/index.blade.php index 84eb079a0141..07d0b1e710f5 100644 --- a/resources/views/index/index.blade.php +++ b/resources/views/index/index.blade.php @@ -148,8 +148,6 @@ @if(config('ninja.flutter_renderer') == 'hosted') - @elseif(config('ninja.flutter_renderer') == 'selfhosted-canvaskit') - @else @endif From 61828d412a6a6c278f6a0c9e3fb59a6f8b52c3dc Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 29 Apr 2021 08:44:40 +1000 Subject: [PATCH 3/4] Customize the login return request --- app/Http/Controllers/Auth/LoginController.php | 3 +- app/Http/Controllers/BaseController.php | 185 ++++++++++++++++++ 2 files changed, 187 insertions(+), 1 deletion(-) diff --git a/app/Http/Controllers/Auth/LoginController.php b/app/Http/Controllers/Auth/LoginController.php index 81dd5fffadd3..08747f9c2411 100644 --- a/app/Http/Controllers/Auth/LoginController.php +++ b/app/Http/Controllers/Auth/LoginController.php @@ -209,7 +209,8 @@ class LoginController extends BaseController }); - return $this->listResponse($cu); + return $this->timeConstrainedResponse($cu); + // return $this->listResponse($cu); } else { diff --git a/app/Http/Controllers/BaseController.php b/app/Http/Controllers/BaseController.php index ea5b8d97deb5..5ec9add2ec26 100644 --- a/app/Http/Controllers/BaseController.php +++ b/app/Http/Controllers/BaseController.php @@ -367,6 +367,191 @@ class BaseController extends Controller return $this->response($this->manager->createData($resource)->toArray()); } + protected function timeConstrainedResponse($query) + { + + $user = auth()->user(); + + if ($user->getCompany()->is_large) + $this->manager->parseIncludes($this->mini_load); + else + $this->manager->parseIncludes($this->first_load); + + $this->serializer = request()->input('serializer') ?: EntityTransformer::API_SERIALIZER_ARRAY; + + if ($this->serializer === EntityTransformer::API_SERIALIZER_JSON) { + $this->manager->setSerializer(new JsonApiSerializer()); + } else { + $this->manager->setSerializer(new ArraySerializer()); + } + + $transformer = new $this->entity_transformer($this->serializer); + $created_at = request()->has('created_at') ? request()->input('created_at') : 0; + + $created_at = date('Y-m-d H:i:s', $created_at); + + $query->with( + [ + 'company' => function ($query) use ($created_at, $user) { + $query->whereNotNull('created_at')->with('documents'); + }, + 'company.clients' => function ($query) use ($user) { + + if(!$user->hasPermission('view_client')) + $query->where('clients.user_id', $user->id)->orWhere('clients.assigned_user_id', $user->id); + + }, + 'company.company_gateways' => function ($query) use ($user) { + $query->whereNotNull('created_at'); + + if(!$user->isAdmin()) + $query->where('company_gateways.user_id', $user->id); + + }, + 'company.credits'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at)->with('invitations', 'documents'); + + if(!$user->hasPermission('view_credit')) + $query->where('credits.user_id', $user->id)->orWhere('credits.assigned_user_id', $user->id); + + }, + 'company.designs'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at)->with('company'); + + if(!$user->isAdmin()) + $query->where('designs.user_id', $user->id); + }, + 'company.documents'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at); + }, + 'company.expenses'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at)->with('documents'); + + if(!$user->hasPermission('view_expense')) + $query->where('expenses.user_id', $user->id)->orWhere('expenses.assigned_user_id', $user->id); + }, + 'company.groups' => function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at); + + if(!$user->isAdmin()) + $query->where('group_settings.user_id', $user->id); + }, + 'company.invoices'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at)->with('invitations', 'documents'); + + if(!$user->hasPermission('view_invoice')) + $query->where('invoices.user_id', $user->id)->orWhere('invoices.assigned_user_id', $user->id); + + }, + 'company.payments'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at)->with('paymentables', 'documents'); + + if(!$user->hasPermission('view_payment')) + $query->where('payments.user_id', $user->id)->orWhere('payments.assigned_user_id', $user->id); + + }, + 'company.payment_terms'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at); + + if(!$user->isAdmin()) + $query->where('payment_terms.user_id', $user->id); + + }, + 'company.products' => function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at)->with('documents'); + + if(!$user->hasPermission('view_product')) + $query->where('products.user_id', $user->id)->orWhere('products.assigned_user_id', $user->id); + + }, + 'company.projects'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at)->with('documents'); + + if(!$user->hasPermission('view_project')) + $query->where('projects.user_id', $user->id)->orWhere('projects.assigned_user_id', $user->id); + + }, + 'company.quotes'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at)->with('invitations', 'documents'); + + if(!$user->hasPermission('view_quote')) + $query->where('quotes.user_id', $user->id)->orWhere('quotes.assigned_user_id', $user->id); + + }, + 'company.recurring_invoices'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at)->with('invitations', 'documents'); + + if(!$user->hasPermission('view_recurring_invoice')) + $query->where('recurring_invoices.user_id', $user->id)->orWhere('recurring_invoices.assigned_user_id', $user->id); + + }, + 'company.tasks'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at)->with('documents'); + + if(!$user->hasPermission('view_task')) + $query->where('tasks.user_id', $user->id)->orWhere('tasks.assigned_user_id', $user->id); + + }, + 'company.tax_rates' => function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at); + + if(!$user->isAdmin()) + $query->where('tax_rates.user_id', $user->id); + + }, + 'company.vendors'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at)->with('contacts', 'documents'); + + if(!$user->hasPermission('view_vendor')) + $query->where('vendors.user_id', $user->id)->orWhere('vendors.assigned_user_id', $user->id); + + }, + 'company.expense_categories'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at); + + if(!$user->isAdmin()) + $query->where('expense_categories.user_id', $user->id); + + }, + 'company.task_statuses'=> function ($query) use ($created_at, $user) { + $query->where('created_at', '>=', $created_at); + + if(!$user->isAdmin()) + $query->where('task_statuses.user_id', $user->id); + + }, + 'company.activities'=> function ($query) use($user) { + + if(!$user->isAdmin()) + $query->where('activities.user_id', $user->id); + + }, + 'company.subscriptions'=> function ($query) use($created_at, $user) { + $query->where('created_at', '>=', $created_at); + + if(!$user->isAdmin()) + $query->where('subscriptions.user_id', $user->id); + + } + ] + ); + + if ($query instanceof Builder) { + $limit = request()->input('per_page', 20); + + $paginator = $query->paginate($limit); + $query = $paginator->getCollection(); + $resource = new Collection($query, $transformer, $this->entity_type); + $resource->setPaginator(new IlluminatePaginatorAdapter($paginator)); + } else { + $resource = new Collection($query, $transformer, $this->entity_type); + } + + return $this->response($this->manager->createData($resource)->toArray()); + + + } + protected function listResponse($query) { $this->buildManager(); From f26948b76f6abfb77588e77671d6dc5e40af8fe7 Mon Sep 17 00:00:00 2001 From: David Bomba Date: Thu, 29 Apr 2021 09:19:00 +1000 Subject: [PATCH 4/4] Log query analytics --- app/DataMapper/Analytics/DbQuery.php | 65 ++++++++++++++++++++++++++++ app/Http/Middleware/QueryLogging.php | 32 ++++++++------ app/Models/Invoice.php | 5 --- 3 files changed, 83 insertions(+), 19 deletions(-) create mode 100644 app/DataMapper/Analytics/DbQuery.php diff --git a/app/DataMapper/Analytics/DbQuery.php b/app/DataMapper/Analytics/DbQuery.php new file mode 100644 index 000000000000..74a7470fa0a7 --- /dev/null +++ b/app/DataMapper/Analytics/DbQuery.php @@ -0,0 +1,65 @@ +string_metric5 = $string_metric5; + $this->double_metric2 = $double_metric2; + } +} diff --git a/app/Http/Middleware/QueryLogging.php b/app/Http/Middleware/QueryLogging.php index b898814f6855..034c13b2376a 100644 --- a/app/Http/Middleware/QueryLogging.php +++ b/app/Http/Middleware/QueryLogging.php @@ -11,10 +11,13 @@ namespace App\Http\Middleware; +use App\DataMapper\Analytics\DbQuery; +use App\Utils\Ninja; use Closure; use DB; use Illuminate\Http\Request; use Log; +use Turbo124\Beacon\Facades\LightLogs; /** * Class QueryLogging. @@ -31,32 +34,33 @@ class QueryLogging */ public function handle(Request $request, Closure $next) { - $timeStart = microtime(true); // Enable query logging for development - if (config('ninja.app_env') == 'production') { + if (!Ninja::isHosted() || !config('beacon.enabled')) { return $next($request); } + $timeStart = microtime(true); DB::enableQueryLog(); - $response = $next($request); - if (config('ninja.app_env') != 'production') { + // hide requests made by debugbar + if (strstr($request->url(), '_debugbar') === false) { - // hide requests made by debugbar - if (strstr($request->url(), '_debugbar') === false) { - $queries = DB::getQueryLog(); - $count = count($queries); - $timeEnd = microtime(true); - $time = $timeEnd - $timeStart; + $queries = DB::getQueryLog(); + $count = count($queries); + $timeEnd = microtime(true); + $time = $timeEnd - $timeStart; - nlog($request->method().' - '.$request->url().": $count queries - ".$time); + nlog($request->method().' - '.$request->url().": $count queries - ".$time); - // if($count > 50) - //nlog($queries); - } + // if($count > 50) + //nlog($queries); + + LightLogs::create(new DbQuery($request->method(), $request->url(), $count, $time)) + ->batch(); } + return $response; } diff --git a/app/Models/Invoice.php b/app/Models/Invoice.php index ab11b83696b3..d210552e2033 100644 --- a/app/Models/Invoice.php +++ b/app/Models/Invoice.php @@ -249,19 +249,14 @@ class Invoice extends BaseModel $partial_due_date = $this->partial_due_Date ? Carbon::parse($this->partial_due_date) : false; if ($this->status_id == self::STATUS_SENT && $due_date && $due_date->gt(now())) { - nlog("1 unpaid"); return self::STATUS_UNPAID; } elseif ($this->status_id == self::STATUS_PARTIAL && $partial_due_date && $partial_due_date->gt(now())) { - nlog("2 partial"); return self::STATUS_PARTIAL; } elseif ($this->status_id == self::STATUS_SENT && $due_date && $due_date->lt(now())) { - nlog("3 overdue"); return self::STATUS_OVERDUE; } elseif ($this->status_id == self::STATUS_PARTIAL && $partial_due_date && $partial_due_date->lt(now())) { - nlog("4 overdue"); return self::STATUS_OVERDUE; } else { - nlog("status id "); return $this->status_id; } }