Files
productalert/app/Http/Controllers/Admin/PostController.php
Charles T 500714d7bf Update (config): enable canonical
Update (migration): Add category type
Add (admin): Add post cliffhanger
2023-08-03 19:46:32 +08:00

178 lines
6.5 KiB
PHP

<?php
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Models\Post;
use App\Models\PostCategory;
use Illuminate\Http\Request;
use LaravelFreelancerNL\LaravelIndexNow\Facades\IndexNow;
use LaravelGoogleIndexing;
class PostController extends Controller
{
public function index(Request $request)
{
$posts = Post::with('post_categories.category.country_locale')->orderBy('created_at', 'desc')->paginate();
return view('admin.posts.manage', compact('posts'));
}
public function new(Request $request)
{
$post = null;
return view('admin.posts.upsert', compact('post'));
}
public function edit(Request $request, $post_id)
{
$post = Post::find($post_id);
if (! is_null($post)) {
return view('admin.posts.upsert', compact('post'));
}
return redirect()->back()->with('error', 'Post does not exist.');
}
public function delete(Request $request, $post_id)
{
$post = Post::find($post_id);
if (! is_null($post)) {
$post_categories = PostCategory::where('post_id', $post->id)->delete();
$post->delete();
return redirect()->back()->with('success', 'Post deleted.');
}
return redirect()->back()->with('error', 'Post does not exist.');
}
public function indexing(Request $request, $post_id)
{
$post = Post::find($post_id);
if (! is_null($post)) {
$post_url = route('home.country.post', ['country' => $post->post_category?->category?->country_locale_slug, 'post_slug' => $post->slug]);
//LaravelGoogleIndexing::create()->update($post_url);
IndexNow::submit($post_url);
return redirect()->back()->with('success', 'Signalled, Bing, Yahoo and Yandex for Indexing.');
}
return redirect()->back()->with('error', 'Something went wrong.');
}
public function postUpsert(Request $request)
{
$post_data = [
'id' => $request->input('id', null),
'publish_date' => $request->input('publish_date', null),
'title' => $request->input('title'),
'slug' => $request->input('slug'),
'excerpt' => $request->input('excerpt'),
'cliffhanger' => $request->input('cliffhanger'),
'author_id' => intval($request->input('author_id', 1)),
'featured' => filter_var($request->input('featured'), FILTER_VALIDATE_BOOLEAN, FILTER_NULL_ON_FAILURE),
'featured_image' => $request->input('featured_image'),
'editor' => 'editorjs',
'body' => json_decode($request->input('body')),
'post_format' => 'standard',
'comment_count' => 0,
'likes_count' => 0,
'status' => $request->input('status'),
];
$post_categories = $this->normalizeCategories($request->input('categories'));
if (! empty($post_data['id'])) {
// It's an update - find the existing post by its ID
$existingPost = Post::find($post_data['id']);
// Check if the post with the given ID exists
if ($existingPost) {
// Update the existing post with the new data
$existingPost->update($post_data);
// Handle PostCategory records for the existing post
$existingPostCategoryIds = $existingPost?->post_categories->pluck('id')->toArray();
// Find the IDs of PostCategory records that should be removed
$postCategoriesToRemove = array_diff($existingPostCategoryIds, $post_categories);
// Remove the unwanted PostCategory records
if (! empty($postCategoriesToRemove)) {
PostCategory::whereIn('id', $postCategoriesToRemove)->delete();
}
// Find the new PostCategory records that should be added
$postCategoriesToAdd = array_diff($post_categories, $existingPostCategoryIds);
// Create the new PostCategory records
foreach ($postCategoriesToAdd as $categoryId) {
PostCategory::create([
'post_id' => $existingPost->id,
'category_id' => $categoryId,
]);
}
// Return a response indicating a successful update
return response()->json(['message' => 'Post updated successfully', 'action' => 'redirect_back']);
} else {
// If the post with the given ID doesn't exist, you can handle the error as per your requirement
return response()->json(['error' => 'Post not found'], 404);
}
} else {
// It's a new post - create a new record using Post::create
$newPost = Post::create($post_data);
// Create the new PostCategory records for the new post
foreach ($post_categories as $categoryId) {
PostCategory::create([
'post_id' => $newPost->id,
'category_id' => $categoryId,
]);
}
// Return a response indicating a successful creation
return response()->json(['message' => 'Post created successfully', 'action' => 'redirect_back']);
}
}
private function normalizeCategories($categories)
{
if (empty($categories) || is_null($categories)) {
// If the input is empty or null, return an empty array
return [];
} elseif (is_numeric($categories)) {
// If the input is a numeric value (integer or string), return an array with the integer value
return [(int) $categories];
} else {
// If the input is a string with separated commas or a JSON string that becomes an array of integers, return an array of integers
if (is_string($categories)) {
// Attempt to convert the string to an array of integers
$categoryIds = json_decode($categories, true);
// Check if the decoding was successful and the result is an array of integers
if (is_array($categoryIds) && ! empty($categoryIds)) {
$categoryIds = array_map('intval', $categoryIds);
return $categoryIds;
}
}
// If the input format doesn't match any of the above cases, return an empty array
return [];
}
}
}