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:
Chirag
2022-10-03 00:08:41 +05:30
committed by GitHub
parent 9f9da5aed8
commit 36bc081f8f
21 changed files with 669 additions and 9 deletions

View File

@@ -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));
}
});
}
}

View 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
]);
}
}

View 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
View 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);
}
}

View File

@@ -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'));
}
/**