Your IP : 216.73.216.79


Current Path : /var/www/html/reddsis/app/Http/Controllers/Backend/
Upload File :
Current File : /var/www/html/reddsis/app/Http/Controllers/Backend/ContentVideoController.php

<?php

namespace App\Http\Controllers\Backend;

use App\Http\Controllers\Controller;
use App\Http\Requests\Backend\ContentVideoRequest;
use App\Models\Backend\ContentVideo;
use App\Models\Backend\ContentVideoTranslation;
use App\Models\Backend\Ref;
use Illuminate\Http\Request;
use Illuminate\Support\Str;

class ContentVideoController extends Controller
{
    public function index(Request $request)
    {
        $search = $request->get('search');

        $videos = ContentVideo::with('translations')
            ->when($search, function ($q) use ($search) {
                $q->where(function ($sub) use ($search) {
                    $sub->where('video_code', 'like', "%{$search}%")
                        ->orWhere('video_status', 'like', "%{$search}%")
                        ->orWhere('video_date', 'like', "%{$search}%")
                        ->orWhereHas('translations', function ($translation) use ($search) {
                            $translation->where('video_translation_title', 'like', "%{$search}%");
                        });
                });
            })
            ->orderBy('video_sorting')
            ->orderBy('created_at', 'desc')
            ->paginate(10)
            ->onEachSide(1)
            ->withQueryString();

        $categories = Ref::where('cat', 'VIDEO_CAT')->orderBy('sort')->pluck('descr', 'code');
        $statuses = Ref::where('cat', 'VIDEO_STATUS')->orderBy('sort')->pluck('descr', 'code');

        return view('backend.module.contentVideo.index', [
            'videos' => $videos,
            'categories' => $categories,
            'statuses' => $statuses,
            'search' => $search,
        ]);
    }

    public function create()
    {
        $categories = Ref::where('cat', 'VIDEO_CAT')->orderBy('sort')->pluck('descr', 'code');
        $statuses = Ref::where('cat', 'VIDEO_STATUS')->orderBy('sort')->pluck('descr', 'code');
        $languages = Ref::where('cat', 'LANGUAGE')->orderBy('sort')->pluck('descr', 'code');

        return view('backend.module.contentVideo.create', [
            'categories' => $categories,
            'statuses' => $statuses,
            'languages' => $languages,
        ]);
    }

    public function store(ContentVideoRequest $request)
    {
        $imagePath = null;
        if ($request->hasFile('video_img')) {
            $file = $request->file('video_img');
            $name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
            $filename = $name . '_' . now()->format('Ymd') . '_' . substr(uniqid(), -5) . '.' . $file->getClientOriginalExtension();
            $imagePath = $file->storeAs('content-video', $filename, 'public');
        }

        $uploadPath = null;
        if ($request->hasFile('video_upload')) {
            $file = $request->file('video_upload');
            $name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
            $filename = $name . '_' . now()->format('Ymd') . '_' . substr(uniqid(), -5) . '.' . $file->getClientOriginalExtension();
            $uploadPath = $file->storeAs('content-video/uploads', $filename, 'public');
        }

        $video = ContentVideo::create([
            'video_code' => $request->video_code ?: $this->generateVideoCode($this->getMainTranslationTitle($request)),
            'video_page' => $request->video_page,
            'video_status' => $request->video_status,
            'video_date' => $request->video_date,
            'video_source' => $request->video_source,
            'video_url' => $request->video_url,
            'video_upload' => $uploadPath,
            'video_external' => $request->video_external,
            'video_img' => $imagePath,
            'video_category' => $request->video_category,
            'video_sorting' => $request->video_sorting ?? 0,
            'meta_title' => $request->meta_title,
            'meta_descr' => $request->meta_descr,
            'meta_keyword' => $request->meta_keyword,
            'meta_author' => $request->meta_author,
            'meta_img' => $request->meta_img,
            'publish_date_start' => $request->publish_date_start,
            'publish_time_start' => $request->publish_time_start,
            'publish_date_end' => $request->publish_date_end,
            'publish_time_end' => $request->publish_time_end,
            'created_by' => auth()->id(),
            'updated_by' => auth()->id(),
        ]);

        if ($request->has('translations')) {
            foreach ($request->translations as $lang => $translation) {
                if (!empty($translation['title'])) {
                    ContentVideoTranslation::create([
                        'video_translation_parent_id' => $video->video_id,
                        'video_translation_title' => $translation['title'],
                        'video_translation_content' => $translation['content'] ?? null,
                        'video_translation_location' => $translation['location'] ?? null,
                        'video_translation_url' => $translation['url'] ?? null,
                        'video_translation_main' => $translation['main'] ?? 0,
                        'video_translation_language' => $lang,
                        'created_by' => auth()->id(),
                        'updated_by' => auth()->id(),
                    ]);
                }
            }
        }

        flash()->success('Video created successfully!');

        return redirect()->route('content-video.index');
    }

    public function edit($id)
    {
        $video = ContentVideo::with('translations')->findOrFail($id);
        $categories = Ref::where('cat', 'VIDEO_CAT')->orderBy('sort')->pluck('descr', 'code');
        $statuses = Ref::where('cat', 'VIDEO_STATUS')->orderBy('sort')->pluck('descr', 'code');
        $languages = Ref::where('cat', 'LANGUAGE')->orderBy('sort')->pluck('descr', 'code');

        return view('backend.module.contentVideo.edit', [
            'video' => $video,
            'categories' => $categories,
            'statuses' => $statuses,
            'languages' => $languages,
        ]);
    }

    public function update(ContentVideoRequest $request, $id)
    {
        $video = ContentVideo::findOrFail($id);

        $imagePath = $video->video_img;
        if ($request->hasFile('video_img')) {
            if ($imagePath && \Storage::disk('public')->exists($imagePath)) {
                \Storage::disk('public')->delete($imagePath);
            }

            $file = $request->file('video_img');
            $name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
            $filename = $name . '_' . now()->format('Ymd') . '_' . substr(uniqid(), -5) . '.' . $file->getClientOriginalExtension();
            $imagePath = $file->storeAs('content-video', $filename, 'public');
        }

        $uploadPath = $video->video_upload;
        if ($request->hasFile('video_upload')) {
            if ($uploadPath && \Storage::disk('public')->exists($uploadPath)) {
                \Storage::disk('public')->delete($uploadPath);
            }

            $file = $request->file('video_upload');
            $name = pathinfo($file->getClientOriginalName(), PATHINFO_FILENAME);
            $filename = $name . '_' . now()->format('Ymd') . '_' . substr(uniqid(), -5) . '.' . $file->getClientOriginalExtension();
            $uploadPath = $file->storeAs('content-video/uploads', $filename, 'public');
        }

        $video->update([
            'video_code' => $request->video_code ?: $this->generateVideoCode($this->getMainTranslationTitle($request), $video->video_id),
            'video_page' => $request->video_page,
            'video_status' => $request->video_status,
            'video_date' => $request->video_date,
            'video_source' => $request->video_source,
            'video_url' => $request->video_url,
            'video_upload' => $uploadPath,
            'video_external' => $request->video_external,
            'video_img' => $imagePath,
            'video_category' => $request->video_category,
            'video_sorting' => $request->video_sorting ?? 0,
            'meta_title' => $request->meta_title,
            'meta_descr' => $request->meta_descr,
            'meta_keyword' => $request->meta_keyword,
            'meta_author' => $request->meta_author,
            'meta_img' => $request->meta_img,
            'publish_date_start' => $request->publish_date_start,
            'publish_time_start' => $request->publish_time_start,
            'publish_date_end' => $request->publish_date_end,
            'publish_time_end' => $request->publish_time_end,
            'updated_by' => auth()->id(),
        ]);

        $video->translations()->delete();

        if ($request->filled('translations')) {
            foreach ($request->translations as $lang => $translation) {
                if (!empty($translation['title'])) {
                    ContentVideoTranslation::create([
                        'video_translation_parent_id' => $video->video_id,
                        'video_translation_title' => $translation['title'],
                        'video_translation_content' => $translation['content'] ?? null,
                        'video_translation_location' => $translation['location'] ?? null,
                        'video_translation_url' => $translation['url'] ?? null,
                        'video_translation_main' => $translation['main'] ?? 0,
                        'video_translation_language' => $lang,
                        'created_by' => auth()->id(),
                        'updated_by' => auth()->id(),
                    ]);
                }
            }
        }

        flash()->success('Video updated successfully!');

        return redirect()->route('content-video.index');
    }

    public function destroy($id)
    {
        $video = ContentVideo::findOrFail($id);

        if ($video->video_img && \Storage::disk('public')->exists($video->video_img)) {
            \Storage::disk('public')->delete($video->video_img);
        }

        if ($video->video_upload && \Storage::disk('public')->exists($video->video_upload)) {
            \Storage::disk('public')->delete($video->video_upload);
        }

        $video->translations()->delete();
        $video->delete();

        flash()->success('Video deleted successfully.');

        return redirect()->route('content-video.index');
    }

    private function getMainTranslationTitle(Request $request): string
    {
        $translations = $request->input('translations', []);

        foreach ($translations as $translation) {
            if (!empty($translation['main']) && !empty($translation['title'])) {
                return $translation['title'];
            }
        }

        foreach ($translations as $translation) {
            if (!empty($translation['title'])) {
                return $translation['title'];
            }
        }

        return 'video';
    }

    private function generateVideoCode(string $title, ?int $ignoreId = null): string
    {
        $baseCode = Str::slug($title) ?: 'video';
        $code = $baseCode;
        $counter = 2;

        while (ContentVideo::where('video_code', $code)
            ->when($ignoreId, fn ($query) => $query->where('video_id', '!=', $ignoreId))
            ->exists()) {
            $code = $baseCode . '-' . $counter;
            $counter++;
        }

        return $code;
    }
}