Changes
This commit is contained in:
@@ -28,82 +28,103 @@ class ClientPostController extends Controller
|
||||
{
|
||||
public function index(Request $request)
|
||||
{
|
||||
$tagIds = DB::table('taggables')
|
||||
->distinct()
|
||||
->select('tag_id')
|
||||
->where('taggable_type', Post::class)
|
||||
->get()
|
||||
->pluck('tag_id');
|
||||
// Кешируем список тегов
|
||||
$tagIds = Cache::remember('tag_ids', now()->addHours(1), function () {
|
||||
return DB::table('taggables')
|
||||
->distinct()
|
||||
->select('tag_id')
|
||||
->where('taggable_type', Post::class)
|
||||
->get()
|
||||
->pluck('tag_id');
|
||||
});
|
||||
|
||||
$tags = \Spatie\Tags\Tag::whereIn('id', $tagIds)->get();
|
||||
$posts = ClientPostListResource::collection(Post::query()
|
||||
->with('category')
|
||||
->select('title', 'slug', 'authors', 'category_id', 'preview', 'search_data', 'publish_at')
|
||||
->where('status', '=', 'published')
|
||||
->where('publish_at', '<', Carbon::now())
|
||||
->when(request()->input('search'), function ($query, $search) {
|
||||
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
|
||||
})
|
||||
->when(request()->input('category'), function ($query) {
|
||||
$slugs = request()->input('category');
|
||||
if (is_array($slugs)) {
|
||||
$query->whereHas('category', function ($query) use ($slugs) {
|
||||
$query->whereIn('slug', $slugs);
|
||||
});
|
||||
}
|
||||
})
|
||||
->when(request()->input('tag'), function ($query, $slugs) {
|
||||
if (is_array($slugs)) {
|
||||
return $query->withAnyTags($slugs);
|
||||
}
|
||||
// Кешируем теги
|
||||
$tags = Cache::remember('tags', now()->addHours(1), function () use ($tagIds) {
|
||||
return \Spatie\Tags\Tag::whereIn('id', $tagIds)->get();
|
||||
});
|
||||
|
||||
$slugsArray = explode(',', $slugs);
|
||||
return $query->withAnyTags($slugsArray);
|
||||
})
|
||||
->orderBy('publish_at', request()->input('sort', 'desc'))
|
||||
// Кешируем посты с учетом фильтров
|
||||
$cacheKey = 'posts_' . md5(serialize($request->all()));
|
||||
$posts = Cache::remember($cacheKey, now()->addHours(1), function () use ($request) {
|
||||
return ClientPostListResource::collection(Post::query()
|
||||
->with('category')
|
||||
->select('title', 'slug', 'authors', 'category_id', 'preview', 'search_data', 'publish_at')
|
||||
->where('status', '=', 'published')
|
||||
->where('publish_at', '<', Carbon::now())
|
||||
->when($request->input('search'), function ($query, $search) {
|
||||
$query->whereRaw('LOWER(title) like ?', ["%".strtolower($search)."%"]);
|
||||
})
|
||||
->when($request->input('category'), function ($query) use ($request) {
|
||||
$slugs = $request->input('category');
|
||||
if (is_array($slugs)) {
|
||||
$query->whereHas('category', function ($query) use ($slugs) {
|
||||
$query->whereIn('slug', $slugs);
|
||||
});
|
||||
}
|
||||
})
|
||||
->when($request->input('tag'), function ($query, $slugs) {
|
||||
if (is_array($slugs)) {
|
||||
return $query->withAnyTags($slugs);
|
||||
}
|
||||
|
||||
->paginate(6)
|
||||
->withQueryString());
|
||||
$slugsArray = explode(',', $slugs);
|
||||
return $query->withAnyTags($slugsArray);
|
||||
})
|
||||
->orderBy('publish_at', $request->input('sort', 'desc'))
|
||||
->paginate(6)
|
||||
->withQueryString());
|
||||
});
|
||||
|
||||
$categories = CategoryResource::collection(Category::has('posts')->get());
|
||||
// Кешируем категории
|
||||
$categories = Cache::remember('categories', now()->addHours(48), function () {
|
||||
return CategoryResource::collection(Category::has('posts')->get());
|
||||
});
|
||||
|
||||
// Кешируем контент категорий
|
||||
$categoriesContent = [];
|
||||
if (request()->input('category')) {
|
||||
foreach (request()->input('category') as $item) {
|
||||
$categoriesContent[$item] = new CategoryResource(Category::where('slug', $item)->first());
|
||||
if ($request->input('category')) {
|
||||
foreach ($request->input('category') as $item) {
|
||||
$cacheKey = 'category_content_' . $item;
|
||||
$categoriesContent[$item] = Cache::remember($cacheKey, now()->addHours(1), function () use ($item) {
|
||||
return new CategoryResource(Category::where('slug', $item)->first());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// Кешируем контент тегов
|
||||
$tagsContent = [];
|
||||
if (request()->input('tag')) {
|
||||
foreach (request()->input('tag') as $item) {
|
||||
$tagsContent[$item] = new ClientTagResource(DB::table('tags')
|
||||
->where(DB::raw("JSON_UNQUOTE(JSON_EXTRACT(slug, '$.ru'))"), $item)
|
||||
->first());
|
||||
if ($request->input('tag')) {
|
||||
foreach ($request->input('tag') as $item) {
|
||||
$cacheKey = 'tag_content_' . $item;
|
||||
$tagsContent[$item] = Cache::remember($cacheKey, now()->addHours(1), function () use ($item) {
|
||||
return new ClientTagResource(DB::table('tags')
|
||||
->where(DB::raw("JSON_UNQUOTE(JSON_EXTRACT(slug, '$.ru'))"), $item)
|
||||
->first());
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
$filters = [
|
||||
'search_filter' => [
|
||||
'type' => 'search',
|
||||
'value' => request()->input('search'),
|
||||
'value' => $request->input('search'),
|
||||
'param' => 'search'
|
||||
],
|
||||
'category_filter' => [
|
||||
'type' => 'category',
|
||||
'value' => request()->input('category'),
|
||||
'value' => $request->input('category'),
|
||||
'param' => 'category',
|
||||
'content' => $categoriesContent,
|
||||
],
|
||||
'tag_filter' => [
|
||||
'type' => 'tag',
|
||||
'value' => request()->input('tag'),
|
||||
'value' => $request->input('tag'),
|
||||
'param' => 'tag',
|
||||
'content' => $tagsContent
|
||||
],
|
||||
'sortingBy_filter' => [
|
||||
'type' => 'sort',
|
||||
'value' => request()->input('sort'),
|
||||
'value' => $request->input('sort'),
|
||||
'param' => 'sort',
|
||||
],
|
||||
];
|
||||
@@ -111,7 +132,10 @@ class ClientPostController extends Controller
|
||||
$routeUrl = route('client.post.index');
|
||||
$path = ltrim(parse_url($routeUrl, PHP_URL_PATH), '/');
|
||||
|
||||
$page = Page::where('path', '=', $path)->with('section.pages.section', 'section.mainSection')->first();
|
||||
// Кешируем страницу
|
||||
$page = Cache::remember('page_' . $path, now()->addHours(1), function () use ($path) {
|
||||
return Page::where('path', '=', $path)->with('section.pages.section', 'section.mainSection')->first();
|
||||
});
|
||||
|
||||
if (isset($page->section)) {
|
||||
$breadcrumbs = [
|
||||
@@ -123,7 +147,6 @@ class ClientPostController extends Controller
|
||||
$breadcrumbs = null;
|
||||
}
|
||||
|
||||
|
||||
return Inertia::render('Client/Posts/Index', compact('filters', 'posts', 'categories', 'tags', 'breadcrumbs'));
|
||||
}
|
||||
|
||||
|
||||
@@ -29,9 +29,6 @@ class ClientWidgetFormController extends Controller
|
||||
$messages = $this->generateValidationMessages($data['columns']);
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
$validateData = Validator::make($request->all(), $rules, $messages);
|
||||
|
||||
|
||||
|
||||
@@ -6,14 +6,21 @@ use App\Http\Resources\ClientPageNavigateResource;
|
||||
use App\Http\Resources\PageResource;
|
||||
use App\Models\Page;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
class ClientWidgetPageController extends Controller
|
||||
{
|
||||
public function single(int $id)
|
||||
{
|
||||
$page = Page::query()
|
||||
->with('section')
|
||||
->find($id);
|
||||
$cacheKey = 'page_' . md5($id);
|
||||
|
||||
// Пытаемся получить данные из кеша
|
||||
$page = Cache::remember($cacheKey, now()->addHours(1), function () use ($id) {
|
||||
return Page::where('id', '=', $id)
|
||||
->with('section.pages.section', 'section.mainSection')
|
||||
->first();
|
||||
});
|
||||
|
||||
if (isset($page->section)) {
|
||||
$breadcrumbs = [
|
||||
'mainSection' => $page->section->mainSection->title,
|
||||
|
||||
@@ -7,27 +7,40 @@ use App\Http\Resources\ClientPostListResource;
|
||||
use App\Http\Resources\PostThumbnailResource;
|
||||
use App\Models\Post;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Cache;
|
||||
|
||||
class ClientWidgetPostController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return PostThumbnailResource::collection(
|
||||
Post::query()
|
||||
->where('status', PostStatus::PUBLISHED)
|
||||
->when(request()->input('category'), function ($query, $category_id) {
|
||||
$query->where('category_id', $category_id);
|
||||
})
|
||||
->with('category')
|
||||
->orderBy('publish_at', 'desc')
|
||||
->take(request()->input('count', 5))
|
||||
->get());
|
||||
$category_id = request()->input('category');
|
||||
$count = request()->input('count', 5);
|
||||
|
||||
$cacheKey = 'posts_' . $category_id . '_' . $count;
|
||||
|
||||
return Cache::remember($cacheKey, now()->addMinutes(10), function () use ($category_id, $count) {
|
||||
return PostThumbnailResource::collection(
|
||||
Post::query()
|
||||
->where('status', PostStatus::PUBLISHED)
|
||||
->when($category_id, function ($query, $category_id) {
|
||||
$query->where('category_id', $category_id);
|
||||
})
|
||||
->with('category')
|
||||
->orderBy('publish_at', 'desc')
|
||||
->take($count)
|
||||
->get()
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
public function single(int $id)
|
||||
{
|
||||
return new PostThumbnailResource(
|
||||
Post::query()->with('category')->find($id)
|
||||
);
|
||||
$cacheKey = 'post_' . $id;
|
||||
|
||||
return Cache::remember($cacheKey, now()->addMinutes(10), function () use ($id) {
|
||||
return new PostThumbnailResource(
|
||||
Post::query()->with('category')->find($id)
|
||||
);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,57 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers;
|
||||
|
||||
use App\Models\User;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Http;
|
||||
use Illuminate\Support\Str;
|
||||
|
||||
class ImportUserController extends Controller
|
||||
{
|
||||
public function index()
|
||||
{
|
||||
return User::query()->whereHas('userDetail')->with('userDetail')->get();
|
||||
}
|
||||
|
||||
public function test()
|
||||
{
|
||||
$response = Http::get('http://crawdad-fresh-bream.ngrok-free.app/api/import/users/')->object();
|
||||
foreach ($response as $user) {
|
||||
$userDetail = $user->user_detail;
|
||||
unset($user->user_detail);
|
||||
$user = User::create([
|
||||
'name' => $user->name,
|
||||
'slug' => $user->slug,
|
||||
'email' => $user->email,
|
||||
'email_verified_at' => $user->email_verified_at,
|
||||
'password' => Md5(Str::random(15)),
|
||||
'remember_token' => null,
|
||||
'created_at' => $user->created_at,
|
||||
'updated_at' => $user->updated_at,
|
||||
]);
|
||||
$user->userDetail()->create([
|
||||
'user_id' => $user->id,
|
||||
'is_only_worker' => $userDetail->is_only_worker,
|
||||
'photo' => $userDetail->photo,
|
||||
'academicTitle' => $userDetail->academicTitle,
|
||||
'AcademicDegree' => $userDetail->AcademicDegree,
|
||||
'education' => $userDetail->education,
|
||||
'awards' => $userDetail->awards,
|
||||
'professDisciplines' => $userDetail->professDisciplines,
|
||||
'professionalRetraining' => $userDetail->professionalRetraining,
|
||||
'professionalDevelopment' => $userDetail->professionalDevelopment,
|
||||
'workExperience' => $userDetail->workExperience,
|
||||
'attendedConferences' => $userDetail->attendedConferences,
|
||||
'participationScienceProjects' => $userDetail->participationScienceProjects,
|
||||
'publications' => $userDetail->publications,
|
||||
'contactEmail' => $userDetail->contactEmail,
|
||||
'contactPhone' => $userDetail->contactPhone,
|
||||
'search_data' => $userDetail->search_data,
|
||||
'other' => $userDetail->other,
|
||||
'created_at' => $userDetail->created_at,
|
||||
'updated_at' => $userDetail->updated_at,
|
||||
]);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -22,13 +22,13 @@ use Inertia\Inertia;
|
||||
|
||||
class PageController extends Controller
|
||||
{
|
||||
public function render($path)
|
||||
public function render(Request $request, $path)
|
||||
{
|
||||
// Генерируем уникальный ключ для кеширования
|
||||
$cacheKey = 'page_' . md5($path);
|
||||
|
||||
// Пытаемся получить данные из кеша
|
||||
$page = Cache::remember($cacheKey, now()->addHours(1), function () use ($path) {
|
||||
$page = Cache::remember($cacheKey, now()->addHours(48), function () use ($path) {
|
||||
return Page::where('path', '=', $path)
|
||||
->with('section.pages.section', 'section.mainSection')
|
||||
->first();
|
||||
|
||||
@@ -3,6 +3,7 @@
|
||||
namespace App\Http;
|
||||
|
||||
use App\Http\Middleware\AccessCheck;
|
||||
use App\Http\Middleware\InternalRequestOnly;
|
||||
use App\Http\Middleware\RateLimitCheckMiddleware;
|
||||
use App\Http\Middleware\RateLimitCounterMiddleware;
|
||||
use Illuminate\Foundation\Http\Kernel as HttpKernel;
|
||||
@@ -81,5 +82,8 @@ class Kernel extends HttpKernel
|
||||
'access-check' => AccessCheck::class,
|
||||
'rate.limited.counter' => RateLimitCounterMiddleware::class,
|
||||
'rate.limited.check' => RateLimitCheckMiddleware::class,
|
||||
'ensure.browser' => InternalRequestOnly::class,
|
||||
'superadmin' => \App\Http\Middleware\EnsureUserIsSuperadmin::class,
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,26 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class EnsureUserIsSuperadmin
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next)
|
||||
{
|
||||
// Проверяем, что пользователь аутентифицирован и имеет роль superadmin
|
||||
if (!Auth::check() || !Auth::user()->hasRole('super_admin')) {
|
||||
return response('Access denied. You do not have permission to access this route.', 403);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,36 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use App\Http\Resources\ClientBreadcrumbPage;
|
||||
use App\Http\Resources\ClientBreadcrumbSection;
|
||||
use App\Http\Resources\ClientBreadcrumbSubSection;
|
||||
use App\Models\Page;
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class GenerateBreadcrumbs
|
||||
{
|
||||
public function handle(Request $request, Closure $next)
|
||||
{
|
||||
$path = $request->path();
|
||||
$page = Page::where('path', '=', $path)
|
||||
->with('section.pages.section', 'section.mainSection')
|
||||
->first();
|
||||
|
||||
if ($page && isset($page->section)) {
|
||||
$breadcrumbs = [
|
||||
'mainSection' => new ClientBreadcrumbSection($page->section->mainSection),
|
||||
'subSection' => new ClientBreadcrumbSubSection($page->section),
|
||||
'page' => new ClientBreadcrumbPage($page),
|
||||
];
|
||||
} else {
|
||||
$breadcrumbs = null;
|
||||
}
|
||||
|
||||
$request->merge(['breadcrumbs' => $breadcrumbs]);
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,27 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Middleware;
|
||||
|
||||
use Closure;
|
||||
use Illuminate\Http\Request;
|
||||
use Symfony\Component\HttpFoundation\Response;
|
||||
|
||||
class InternalRequestOnly
|
||||
{
|
||||
/**
|
||||
* Handle an incoming request.
|
||||
*
|
||||
* @param \Closure(\Illuminate\Http\Request): (\Symfony\Component\HttpFoundation\Response) $next
|
||||
*/
|
||||
public function handle(Request $request, Closure $next)
|
||||
{
|
||||
$userAgent = $request->header('User-Agent');
|
||||
|
||||
// Проверяем, что User-Agent содержит ключевые слова, характерные для браузеров
|
||||
if (!preg_match('/Mozilla|Chrome|Safari|Firefox|Edge/i', $userAgent)) {
|
||||
return response('Access denied. This route is available only from a web browser.', 403);
|
||||
}
|
||||
|
||||
return $next($request);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user