PHP 8.2.30
Preview: ProductRepository.php Size: 7.79 KB
/home/byroehnu/easetack.com/app/Repositories/Admin/ProductRepository.php

<?php

namespace App\Repositories\Admin;

use App\Models\Product;
use App\Models\ProductCategoryContent;
use App\Models\ProductContent;
use App\Models\Setting;
use App\Repositories\Traits\ModelRepositoryTraits;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Pagination\LengthAwarePaginator;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Str;

class ProductRepository
{
    use ModelRepositoryTraits;

    /**
     * Object model will be used to modify product table
     */
    protected Product $model;

    /**
     * Constructor for product repository
     */
    public function __construct(Product $product)
    {
        $this->model = $product;
    }

    /**
     * Get search result with pagination
     */
    public function paginateSearchResult($search, array $sort = []): LengthAwarePaginator
    {
        $query = $this->model->with([
            'content',
            'category.content',
        ])->newQuery();

        // Apply search filters if necessary
        if ($search) {
            $query->whereHas('contents', function ($q) use ($search) {
                $q->where('title', 'like', "%{$search}%");
            })->orWhereHas('category.contents', function ($q) use ($search) {
                $q->where('title', 'like', "%{$search}%");
            });
        }

        if (isset($sort['column']) && isset($sort['order'])) {
            $column = $sort['column'];
            $order = $sort['order'];

            if ($column === 'title') {
                $query->orderBy(ProductContent::select($sort['column'])
                    ->whereColumn('products.id', 'product_contents.product_id')
                    ->where('language_code', app()->getLocale()), $sort['order']);
            } elseif ($column === 'category' || $column === 'category_title') {
                $query->orderBy(
                    ProductCategoryContent::select('title')
                        ->whereColumn('product_category_contents.product_category_id', 'products.category_id')
                        ->where('language_code', app()->getLocale()),
                    $order
                );
            } else {
                $query->orderBy($column, $order);
            }
        }

        // Paginate the results
        return $query->paginate(30)
            ->appends(array_filter([
                'search' => $search,
                'sort' => $sort,
                'lang' => app()->getLocale(),
            ]));
    }

    /**
     * Create a new product
     */
    public function create(Request $request): void
    {
        // Get languages from settings
        $languages = json_decode(Setting::pull('languages'), true);
        $defaultLang = Setting::pull('default_lang');
        $defaultTitle = '';
        $generatedSlug = Str::slug($request->input($defaultLang.'_name'));

        if (Product::where('slug', $generatedSlug)->exists()) {
            $generatedSlug = $generatedSlug.'-'.Carbon::now()->timestamp;
        }

        // Create a new product instance
        $product = $this->model->create([
            'slug' => $generatedSlug,
            'sku' => $request->input('sku'),
            'quantity' => $request->input('quantity'),
            'category_id' => $request->input('category'),
            'thumbnail_image' => $request->input('thumbnail_image'),
            'slider_images' => json_encode($request->input('slider_images')),
            'price' => $request->input('price'),
            'discount_price' => $request->input('discount_price'),
            'status' => $request->input('status'),
            'seo_title' => $request->input('seo_title'),
            'seo_description' => $request->input('seo_description'),
        ]);

        // tags
        if ($request->tags) {
            $product->attachTags($request->tags);
        }

        // Prepare content data
        $content = array_map(function ($language) use ($request, $defaultLang, &$defaultTitle) {
            $langCode = $language['code'];
            $title = $request[$langCode.'_name'];

            // Store the default language title for slug generation
            if ($langCode === $defaultLang) {
                $defaultTitle = $title;
            }

            return [
                'language_code' => $langCode,
                'title' => $title,
                'description' => $request[$langCode.'_description'],
                'short_description' => $request[$langCode.'_short_description'],
            ];
        }, $languages);

        // Create product contents
        $product->contents()->createMany($content);

        Cache::forget('max_product_price');
    }

    /**
     * Get featured room
     */
    public function getEditedData(Product $product): array
    {
        $productData = $product->load('contents');
        $languages = json_decode(Setting::pull('languages'), true);

        $data = [
            'id' => $product->id,
            'sku' => $product->sku,
            'quantity' => $product->quantity,
            'thumbnail_image' => $product->thumbnail_image,
            'slider_images' => is_string($product->slider_images) ? json_decode($product->slider_images) : $product->slider_images,
            'price' => $product->price,
            'discount_price' => $product->discount_price,
            'status' => $product->status,
            'category' => $product->category_id,
            'seo_title' => $product->seo_title,
            'seo_description' => $product->seo_description,
            'slug' => $product->slug,
            'tags' => $product->tags?->pluck('name'),
        ];

        foreach ($languages as $language) {
            $langCode = $language['code'];
            $data[$langCode.'_name'] = '';
            $data[$langCode.'_description'] = '';
            $data[$langCode.'_short_description'] = '';
        }

        foreach ($product->contents as $content) {
            $langCode = $content->language_code;
            $data[$langCode.'_name'] = $content->title;
            $data[$langCode.'_description'] = $content->description;
            $data[$langCode.'_short_description'] = $content->short_description;
        }

        return $data;
    }

    /**
     * Update product
     */
    public function update(Request $request, Product $product)
    {
        // Update the product
        $product->update([
            'sku' => $request->sku,
            'quantity' => $request->quantity,
            'thumbnail_image' => $request->thumbnail_image,
            'slider_images' => json_encode($request->input('slider_images')),
            'price' => $request->price,
            'discount_price' => $request->discount_price,
            'status' => $request->status,
            'category_id' => $request->category,
            'seo_title' => $request->seo_title,
            'seo_description' => $request->seo_description,
        ]);

        // First update the content
        $languages = json_decode(Setting::pull('languages'), true);
        foreach ($languages as $language) {
            $langCode = $language['code'];
            $product->contents()->updateOrCreate(
                ['language_code' => $langCode],
                [
                    'title' => $request[$langCode.'_name'],
                    'description' => $request[$langCode.'_description'],
                    'short_description' => $request[$langCode.'_short_description'],
                ],
            );
        }

        // Detach all existing tags
        $product->detachTags($product->tags);

        // attach tags
        $product->attachTags($request->tags);
        Cache::forget('max_product_price');
    }

    /**
     * delete product
     */
    public function destroy(Product $product)
    {
        $product->delete();
    }

    /**
     * bulk delete product
     */
    public function bulkDelete(string $ids)
    {
        $ids = explode(',', $ids);
        $this->model->whereIn('id', $ids)->delete();
    }
}

Directory Contents

Dirs: 0 × Files: 37

Name Size Perms Modified Actions
713 B lrw-rw-rw- 2025-04-08 04:12:56
Edit Download
4.90 KB lrw-rw-rw- 2025-04-19 04:22:16
Edit Download
8.52 KB lrw-rw-rw- 2025-04-19 04:22:17
Edit Download
4.28 KB lrw-rw-rw- 2025-05-15 11:40:33
Edit Download
1.27 KB lrw-rw-rw- 2025-04-19 04:22:16
Edit Download
3.81 KB lrw-rw-rw- 2025-04-08 04:12:56
Edit Download
2.42 KB lrw-rw-rw- 2025-04-08 04:12:56
Edit Download
1.11 KB lrw-rw-rw- 2025-04-08 04:12:56
Edit Download
1.58 KB lrw-rw-rw- 2025-04-22 07:44:34
Edit Download
1.18 KB lrw-rw-rw- 2025-05-05 10:37:43
Edit Download
11.35 KB lrw-rw-rw- 2025-04-19 04:42:55
Edit Download
5.59 KB lrw-rw-rw- 2025-05-15 11:24:11
Edit Download
982 B lrw-rw-rw- 2025-04-19 04:22:17
Edit Download
5.26 KB lrw-rw-rw- 2025-04-19 04:22:16
Edit Download
7.94 KB lrw-rw-rw- 2025-05-08 11:48:26
Edit Download
1.40 KB lrw-rw-rw- 2025-04-19 04:22:16
Edit Download
4.73 KB lrw-rw-rw- 2025-04-19 04:22:16
Edit Download
8.77 KB lrw-rw-rw- 2025-04-19 04:22:17
Edit Download
7.70 KB lrw-rw-rw- 2025-04-19 04:22:16
Edit Download
5.04 KB lrw-rw-rw- 2025-05-15 11:24:11
Edit Download
3.88 KB lrw-rw-rw- 2025-04-19 04:22:17
Edit Download
7.79 KB lrw-rw-rw- 2025-04-22 07:42:55
Edit Download
1.32 KB lrw-rw-rw- 2025-04-22 07:42:55
Edit Download
653 B lrw-rw-rw- 2025-04-19 04:22:17
Edit Download
3.79 KB lrw-rw-rw- 2025-05-04 10:44:46
Edit Download
2.27 KB lrw-rw-rw- 2025-04-26 10:16:33
Edit Download
4.97 KB lrw-rw-rw- 2025-05-15 11:24:11
Edit Download
8.42 KB lrw-rw-rw- 2025-04-19 04:22:17
Edit Download
723 B lrw-rw-rw- 2025-04-19 04:22:16
Edit Download
2.42 KB lrw-rw-rw- 2025-04-08 04:12:56
Edit Download
1.19 KB lrw-rw-rw- 2025-04-08 04:12:56
Edit Download
7.19 KB lrw-rw-rw- 2025-04-19 04:22:16
Edit Download
4.42 KB lrw-rw-rw- 2025-05-01 06:16:57
Edit Download
1017 B lrw-rw-rw- 2025-04-08 04:12:56
Edit Download
2.63 KB lrw-rw-rw- 2025-04-13 07:02:31
Edit Download
3.51 KB lrw-rw-rw- 2025-04-19 04:22:16
Edit Download
2.51 KB lrw-rw-rw- 2025-04-08 04:12:56
Edit Download

If ZipArchive is unavailable, a .tar will be created (no compression).