Improved DB performance & loading times (#1)
This commit is contained in:
parent
341ee04268
commit
8ac5f5b9d8
|
@ -3,6 +3,7 @@
|
|||
namespace App\Http\Controllers\Auth;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Resources\UserResource;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
|
@ -11,12 +12,10 @@ class UserController extends Controller
|
|||
/**
|
||||
* Get authenticated user.
|
||||
*
|
||||
* @param \Illuminate\Http\Request $request
|
||||
* @return \Illuminate\Http\JsonResponse
|
||||
*/
|
||||
public function current(Request $request)
|
||||
{
|
||||
return response()->json($request->user());
|
||||
return new UserResource($request->user());
|
||||
}
|
||||
|
||||
public function deleteAccount() {
|
||||
|
|
|
@ -33,7 +33,17 @@ class FormController extends Controller
|
|||
$this->authorize('view', $workspace);
|
||||
$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('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);
|
||||
}
|
||||
|
|
|
@ -3,13 +3,14 @@
|
|||
namespace App\Http\Resources;
|
||||
|
||||
use App\Http\Middleware\Form\PasswordProtectedForm;
|
||||
use App\Http\Resources\UserResource;
|
||||
use Illuminate\Http\Resources\Json\JsonResource;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Http\Request;
|
||||
|
||||
class FormResource extends JsonResource
|
||||
{
|
||||
private Array $cleanings = [];
|
||||
private array $cleanings = [];
|
||||
|
||||
/**
|
||||
* Transform the resource into an array.
|
||||
|
@ -19,15 +20,14 @@ class FormResource extends JsonResource
|
|||
*/
|
||||
public function toArray($request)
|
||||
{
|
||||
$userIsFormOwner = Auth::check() && Auth::user()->workspaces()->find($this->workspace_id) !== null;
|
||||
if(!$userIsFormOwner && $this->doesMissPassword($request)){
|
||||
if(!$this->userIsFormOwner() && $this->doesMissPassword($request)){
|
||||
return $this->getPasswordProtectedForm();
|
||||
}
|
||||
|
||||
$ownerData = $userIsFormOwner ? [
|
||||
'creator' => $this->creator,
|
||||
'views_count' => $this->when($this->workspace->is_pro, $this->views_count),
|
||||
'submissions_count' => $this->when($this->workspace->is_pro, $this->submissions_count),
|
||||
$ownerData = $this->userIsFormOwner() ? [
|
||||
'creator' => new UserResource($this->creator),
|
||||
'views_count' => $this->when($this->workspaceIsPro(), $this->views_count),
|
||||
'submissions_count' => $this->when($this->workspaceIsPro(), $this->submissions_count),
|
||||
'notifies' => $this->notifies,
|
||||
'send_submission_confirmation' => $this->send_submission_confirmation,
|
||||
'webhook_url' => $this->webhook_url,
|
||||
|
@ -44,11 +44,12 @@ class FormResource extends JsonResource
|
|||
'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, [
|
||||
'is_pro' => $this->workspaceIsPro(),
|
||||
'workspace_id' => $this->workspace_id,
|
||||
'workspace' => new WorkspaceResource($this->workspace),
|
||||
'workspace' => new WorkspaceResource($this->getWorkspace()),
|
||||
'is_closed' => $this->is_closed,
|
||||
'is_password_protected' => false,
|
||||
'has_password' => $this->has_password,
|
||||
|
@ -86,7 +87,7 @@ class FormResource extends JsonResource
|
|||
|
||||
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);
|
||||
}
|
||||
|
@ -107,4 +108,20 @@ class FormResource extends JsonResource
|
|||
'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 = [
|
||||
'share_url',
|
||||
'is_pro'
|
||||
];
|
||||
|
||||
protected $hidden = [
|
||||
|
|
|
@ -61,11 +61,6 @@ class User extends Authenticatable implements JWTSubject //, MustVerifyEmail
|
|||
*/
|
||||
protected $appends = [
|
||||
'photo_url',
|
||||
'is_subscribed',
|
||||
'has_enterprise_subscription',
|
||||
'admin',
|
||||
'has_customer_id',
|
||||
'has_forms'
|
||||
];
|
||||
|
||||
protected $withCount = ['workspaces'];
|
||||
|
|
Loading…
Reference in New Issue