Improved DB performance & loading times (#1)

This commit is contained in:
Chirag 2022-09-21 18:29:32 +05:30 committed by GitHub
parent 341ee04268
commit 8ac5f5b9d8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 79 additions and 21 deletions

View File

@ -3,6 +3,7 @@
namespace App\Http\Controllers\Auth; namespace App\Http\Controllers\Auth;
use App\Http\Controllers\Controller; use App\Http\Controllers\Controller;
use App\Http\Resources\UserResource;
use Illuminate\Http\Request; use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
@ -11,12 +12,10 @@ class UserController extends Controller
/** /**
* Get authenticated user. * Get authenticated user.
* *
* @param \Illuminate\Http\Request $request
* @return \Illuminate\Http\JsonResponse
*/ */
public function current(Request $request) public function current(Request $request)
{ {
return response()->json($request->user()); return new UserResource($request->user());
} }
public function deleteAccount() { public function deleteAccount() {

View File

@ -33,7 +33,17 @@ class FormController extends Controller
$this->authorize('view', $workspace); $this->authorize('view', $workspace);
$this->authorize('viewAny', Form::class); $this->authorize('viewAny', Form::class);
return FormResource::collection($workspace->forms); $workspaceIsPro = $workspace->is_pro;
$forms = $workspace->forms()->with(['creator','views','submissions'])->get()->map(function (Form $form) use ($workspace, $workspaceIsPro){
// Add attributes for faster loading
$form->extra = (object) [
'loadedWorkspace' => $workspace,
'workspaceIsPro' => $workspaceIsPro,
'userIsOwner' => true,
];
return $form;
});
return FormResource::collection($forms);
} }
/** /**
@ -47,7 +57,18 @@ class FormController extends Controller
$this->authorize('view', $workspace); $this->authorize('view', $workspace);
$this->authorize('viewAny', Form::class); $this->authorize('viewAny', Form::class);
$forms = $forms->merge($workspace->forms); $workspaceIsPro = $workspace->is_pro;
$newForms = $workspace->forms()->with(['creator','views','submissions'])->get()->map(function (Form $form) use ($workspace, $workspaceIsPro){
// Add attributes for faster loading
$form->extra = (object) [
'loadedWorkspace' => $workspace,
'workspaceIsPro' => $workspaceIsPro,
'userIsOwner' => true,
];
return $form;
});
$forms = $forms->merge($newForms);
} }
return FormResource::collection($forms); return FormResource::collection($forms);
} }

View File

@ -3,13 +3,14 @@
namespace App\Http\Resources; namespace App\Http\Resources;
use App\Http\Middleware\Form\PasswordProtectedForm; use App\Http\Middleware\Form\PasswordProtectedForm;
use App\Http\Resources\UserResource;
use Illuminate\Http\Resources\Json\JsonResource; use Illuminate\Http\Resources\Json\JsonResource;
use Illuminate\Support\Facades\Auth; use Illuminate\Support\Facades\Auth;
use Illuminate\Http\Request; use Illuminate\Http\Request;
class FormResource extends JsonResource class FormResource extends JsonResource
{ {
private Array $cleanings = []; private array $cleanings = [];
/** /**
* Transform the resource into an array. * Transform the resource into an array.
@ -19,15 +20,14 @@ class FormResource extends JsonResource
*/ */
public function toArray($request) public function toArray($request)
{ {
$userIsFormOwner = Auth::check() && Auth::user()->workspaces()->find($this->workspace_id) !== null; if(!$this->userIsFormOwner() && $this->doesMissPassword($request)){
if(!$userIsFormOwner && $this->doesMissPassword($request)){
return $this->getPasswordProtectedForm(); return $this->getPasswordProtectedForm();
} }
$ownerData = $userIsFormOwner ? [ $ownerData = $this->userIsFormOwner() ? [
'creator' => $this->creator, 'creator' => new UserResource($this->creator),
'views_count' => $this->when($this->workspace->is_pro, $this->views_count), 'views_count' => $this->when($this->workspaceIsPro(), $this->views_count),
'submissions_count' => $this->when($this->workspace->is_pro, $this->submissions_count), 'submissions_count' => $this->when($this->workspaceIsPro(), $this->submissions_count),
'notifies' => $this->notifies, 'notifies' => $this->notifies,
'send_submission_confirmation' => $this->send_submission_confirmation, 'send_submission_confirmation' => $this->send_submission_confirmation,
'webhook_url' => $this->webhook_url, 'webhook_url' => $this->webhook_url,
@ -44,11 +44,12 @@ class FormResource extends JsonResource
'notification_emails' => $this->notification_emails, 'notification_emails' => $this->notification_emails,
] : []; ] : [];
$baseData = $this->getFilteredFormData(parent::toArray($request), $userIsFormOwner); $baseData = $this->getFilteredFormData(parent::toArray($request), $this->userIsFormOwner());
return array_merge($baseData, $ownerData, [ return array_merge($baseData, $ownerData, [
'is_pro' => $this->workspaceIsPro(),
'workspace_id' => $this->workspace_id, 'workspace_id' => $this->workspace_id,
'workspace' => new WorkspaceResource($this->workspace), 'workspace' => new WorkspaceResource($this->getWorkspace()),
'is_closed' => $this->is_closed, 'is_closed' => $this->is_closed,
'is_password_protected' => false, 'is_password_protected' => false,
'has_password' => $this->has_password, 'has_password' => $this->has_password,
@ -86,7 +87,7 @@ class FormResource extends JsonResource
private function doesMissPassword(Request $request) private function doesMissPassword(Request $request)
{ {
if (!$this->is_pro || !$this->has_password) return false; if (!$this->workspaceIsPro() || !$this->has_password) return false;
return !PasswordProtectedForm::hasCorrectPassword($request, $this->resource); return !PasswordProtectedForm::hasCorrectPassword($request, $this->resource);
} }
@ -107,4 +108,20 @@ class FormResource extends JsonResource
'properties' => [] 'properties' => []
]; ];
} }
private function getWorkspace() {
return $this->extra?->loadedWorkspace ?? $this->workspace;
}
private function workspaceIsPro() {
return $this->extra?->workspaceIsPro ?? $this->getWorkspace()->is_pro ?? $this->is_pro;
}
private function userIsFormOwner() {
return $this->extra?->userIsOwner ??
(
Auth::check()
&& Auth::user()->workspaces()->find($this->workspace_id) !== null
);
}
} }

View File

@ -0,0 +1,27 @@
<?php
namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource;
class UserResource extends JsonResource
{
/**
* Transform the resource into an array.
*
* @param \Illuminate\Http\Request $request
* @return array|\Illuminate\Contracts\Support\Arrayable|\JsonSerializable
*/
public function toArray($request)
{
$personalData = \Auth::id() === $this->id ? [
'is_subscribed' => $this->is_subscribed,
'has_enterprise_subscription' => $this->has_enterprise_subscription,
'admin' => $this->admin,
'has_customer_id' => $this->has_customer_id,
'has_forms' => $this->has_forms,
] : [];
return array_merge(parent::toArray($request), $personalData);
}
}

View File

@ -88,7 +88,6 @@ class Form extends Model
protected $appends = [ protected $appends = [
'share_url', 'share_url',
'is_pro'
]; ];
protected $hidden = [ protected $hidden = [

View File

@ -61,11 +61,6 @@ class User extends Authenticatable implements JWTSubject //, MustVerifyEmail
*/ */
protected $appends = [ protected $appends = [
'photo_url', 'photo_url',
'is_subscribed',
'has_enterprise_subscription',
'admin',
'has_customer_id',
'has_forms'
]; ];
protected $withCount = ['workspaces']; protected $withCount = ['workspaces'];