Improved DB performance & loading times (#1)
This commit is contained in:
parent
341ee04268
commit
8ac5f5b9d8
|
@ -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() {
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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);
|
||||||
|
}
|
||||||
|
}
|
|
@ -88,7 +88,6 @@ class Form extends Model
|
||||||
|
|
||||||
protected $appends = [
|
protected $appends = [
|
||||||
'share_url',
|
'share_url',
|
||||||
'is_pro'
|
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $hidden = [
|
protected $hidden = [
|
||||||
|
|
|
@ -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'];
|
||||||
|
|
Loading…
Reference in New Issue