B8f7a improve templates pages for seo (#5)
* Templates * access templates without login also * Set required on UI * Improve templates pages for SEO * test case for Templates * Refactor SitemapController * Cosmetic changes to templates Co-authored-by: Julien Nahum <jhumanj@MacBook-Pro-de-Julien.local>
This commit is contained in:
@@ -5,6 +5,7 @@ namespace App\Http\Controllers;
|
||||
use Illuminate\Http\Request;
|
||||
use Spatie\Sitemap\Sitemap;
|
||||
use Spatie\Sitemap\Tags\Url;
|
||||
use App\Models\Template;
|
||||
|
||||
class SitemapController extends Controller
|
||||
{
|
||||
@@ -20,6 +21,7 @@ class SitemapController extends Controller
|
||||
['/login', 0.4],
|
||||
['/register', 0.4],
|
||||
['/password/reset', 0.3],
|
||||
['/templates', 0.9],
|
||||
];
|
||||
|
||||
public function getSitemap(Request $request)
|
||||
@@ -28,6 +30,7 @@ class SitemapController extends Controller
|
||||
foreach ($this->urls as $url) {
|
||||
$sitemap->add($this->createUrl($url[0], $url[1]));
|
||||
}
|
||||
$this->addTemplatesUrls($sitemap);
|
||||
|
||||
return $sitemap->toResponse($request);
|
||||
}
|
||||
@@ -36,4 +39,13 @@ class SitemapController extends Controller
|
||||
{
|
||||
return Url::create($url)->setPriority($priority)->setChangeFrequency($frequency);
|
||||
}
|
||||
|
||||
private function addTemplatesUrls(Sitemap $sitemap)
|
||||
{
|
||||
Template::chunk(100, function ($templates) use ($sitemap) {
|
||||
foreach ($templates as $template) {
|
||||
$sitemap->add($this->createUrl('/templates/' . $template->slug, 0.7));
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
32
app/Http/Controllers/TemplateController.php
Normal file
32
app/Http/Controllers/TemplateController.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Http\Requests\Templates\CreateTemplateRequest;
|
||||
use Illuminate\Http\Request;
|
||||
use App\Models\Template;
|
||||
|
||||
class TemplateController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
// TODO: create resource
|
||||
return Template::all();
|
||||
}
|
||||
|
||||
public function create(CreateTemplateRequest $request)
|
||||
{
|
||||
$this->middleware('admin');
|
||||
|
||||
// Create template
|
||||
$template = $request->getTemplate();
|
||||
$template->save();
|
||||
|
||||
return $this->success([
|
||||
'message' => 'Template created.',
|
||||
'template_id' => $template->id
|
||||
]);
|
||||
}
|
||||
|
||||
}
|
||||
45
app/Http/Requests/Templates/CreateTemplateRequest.php
Normal file
45
app/Http/Requests/Templates/CreateTemplateRequest.php
Normal file
@@ -0,0 +1,45 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Requests\Templates;
|
||||
|
||||
use App\Models\Template;
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
|
||||
class CreateTemplateRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Get the validation rules that apply to the request.
|
||||
*
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function rules()
|
||||
{
|
||||
return [
|
||||
'form' => 'required|array',
|
||||
'name' => 'required|string|max:60',
|
||||
'slug' => 'required|string|unique:templates',
|
||||
'description' => 'required|string|max:2000',
|
||||
'image_url' => 'required|string',
|
||||
'questions' => 'array',
|
||||
];
|
||||
}
|
||||
|
||||
public function getTemplate() : Template
|
||||
{
|
||||
$structure = $this->form;
|
||||
$ignoreKeys = ['id','creator','creator_id','created_at','updated_at','extra','workspace','submissions','submissions_count','views','views_count'];
|
||||
foreach($structure as $key=>$val){
|
||||
if(in_array($key, $ignoreKeys)){
|
||||
$structure[$key] = null;
|
||||
}
|
||||
}
|
||||
return new Template([
|
||||
'name' => $this->name,
|
||||
'slug' => $this->slug,
|
||||
'description' => $this->description,
|
||||
'image_url' => $this->image_url,
|
||||
'structure' => $structure,
|
||||
'questions' => $this->questions ?? []
|
||||
]);
|
||||
}
|
||||
}
|
||||
32
app/Models/Template.php
Normal file
32
app/Models/Template.php
Normal file
@@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace App\Models;
|
||||
|
||||
use Illuminate\Database\Eloquent\Factories\HasFactory;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Stevebauman\Purify\Facades\Purify;
|
||||
|
||||
class Template extends Model
|
||||
{
|
||||
use HasFactory;
|
||||
|
||||
protected $fillable = [
|
||||
'name',
|
||||
'slug',
|
||||
'description',
|
||||
'image_url',
|
||||
'structure',
|
||||
'questions',
|
||||
];
|
||||
|
||||
protected $casts = [
|
||||
'structure' => 'array',
|
||||
'questions' => 'array',
|
||||
];
|
||||
|
||||
public function setDescriptionAttribute($value)
|
||||
{
|
||||
// Strip out unwanted html
|
||||
$this->attributes['description'] = Purify::clean($value);
|
||||
}
|
||||
}
|
||||
@@ -18,8 +18,6 @@ class User extends Authenticatable implements JWTSubject //, MustVerifyEmail
|
||||
{
|
||||
use Notifiable, HasFactory, Billable;
|
||||
|
||||
const ADMINS = ['julien@notionforms.io'];
|
||||
|
||||
/**
|
||||
* The attributes that are mass assignable.
|
||||
*
|
||||
@@ -98,7 +96,7 @@ class User extends Authenticatable implements JWTSubject //, MustVerifyEmail
|
||||
|
||||
public function getAdminAttribute()
|
||||
{
|
||||
return in_array($this->email, self::ADMINS);
|
||||
return in_array($this->email, config('services.admin_emails'));
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
Reference in New Issue
Block a user