GOOD SHELL MAS BOY
Server: Apache/2.4.52 (Ubuntu)
System: Linux vmi1836763.contaboserver.net 5.15.0-130-generic #140-Ubuntu SMP Wed Dec 18 17:59:53 UTC 2024 x86_64
User: www-data (33)
PHP: 8.4.10
Disabled: NONE
Upload Files
File: /var/www/api.ayokah.co.uk/app/Http/Controllers/Seller/CouponController.php
<?php

namespace App\Http\Controllers\Seller;

use Carbon\Carbon;
use App\Models\Coupon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;
use Illuminate\Validation\ValidationException;

class CouponController extends Controller
{
    public function store(Request $request)
    {
        try {
            // Validate the request data
            $validatedData = $request->validate([
                'name' => 'required|string',
                'code' => 'required|string',
                'expiry_date' => 'required|date',
                'value' => 'nullable|string', // same as amount
                'discount_type' => 'required|in:fixed,percentage,free_shipping',
                'status' => 'required|in:active,inactive',
                'min_purchase_amount' => 'nullable|string|min:0',
                'seller_id' => 'nullable|exists:products,seller_id',
                'product_uuid' => 'nullable|exists:products,uuid',
                'user_id' => 'required|exists:users,id',
            ]);
            $coupon = Coupon::where('product_uuid', $validatedData['product_uuid'])->orWhere('code', $validatedData['code'])
                ->first();

            if ($coupon) {
                // Update the existing coupon
                $coupon->update($validatedData);
                $message = 'Coupon updated successfully';
            } else {
                // Create a new coupon
                $coupon = Coupon::create($validatedData);
                $message = 'Coupon created successfully';
            }

            return response()->json([
                'status' => 'success',
                'message' => $message,
                'data' => $coupon
            ], 200);
        } catch (\Throwable $th) {
            Log::error($th->getMessage());
            return response()->json(['message' => $th->getMessage()], 500);
        }
    }


    public function verify(Request $request)
    {
        try {
            $validatedData = $request->validate([
                'code' => 'required|exists:coupons,code',
                'seller_id' => 'required|array',
                'seller_id.*' => 'exists:sellers,id',
            ]);
        } catch (ValidationException $e) {
            return response()->json(
                ['error' => $e->getMessage()],
                422
            );
        }

        try {
            $coupon = Coupon::where('code', $validatedData['code'])->where('seller_id', $validatedData['seller_id'])
                ->where('status', 'active')
                ->where('expiry_date', '>', Carbon::now())
                ->select('code', 'status', 'expiry_date', 'discount_type', 'min_purchase_amount')
                ->first();
            if ($coupon) {
                return response()->json([
                    'message' => 'Success',
                    'coupon' => $coupon
                ]);
            } else {
                return response()->json([
                    'message' => 'Coupon not found or not active',
                ], 404);
            }
        } catch (\Throwable $e) {
            // Handle any exceptions
            return response()->json([
                'error' => 'Failed to retrieve coupon'
            ], 500);
        }
    }

    public function delete(Request $request)
    {
        try {
            $validatedData = $request->validate([
                'coupon_id' => 'required|exists:coupons,id'
            ]);
            $coupon = Coupon::findOrFail($validatedData['coupon_id']);
            $coupon->delete();
            return response()->json([
                'message' => 'Coupon deleted successfully',
                'status' => 'success'
            ], 200);
        } catch (\Throwable $th) {
            return response()->json([
                'message' => 'Coupon not deleted successfully',
                'status' => 'error',
                'data' => $th->getMessage(),
            ], 500);
        }
    }

    public function updateStatus(Request $request)
    {
        try {
            $validatedData = $request->validate([
                'coupon_id' => 'required|exists:coupons,id',
                'status' => 'nullable|in:active,inactive'
            ]);
            $coupon = Coupon::findOrFail($validatedData['coupon_id']);
            $coupon->status = ($coupon->status === 'active') ? 'inactive' : 'active';
            $coupon->save();
            return response()->json([
                'message' => 'Coupon status updated successfully',
                'status' => 'success',
                'data' => $coupon
            ], 200);
        } catch (\Throwable $th) {
            return response()->json([
                'message' => 'Coupon status not updated successfully',
                'status' => 'error',
                'data' => $th->getMessage()
            ], 500);
        }
    }

    public function query(Request $request)
    {
        try {
            $validatedData = $request->validate([
                'coupon_id' => 'required|exists:coupons,id'
            ]);
            $coupon = Coupon::findOrFail($validatedData['coupon_id']);
            return response()->json([
                'message' => 'Coupon queried successfully',
                'status' => 'success',
                'data' => $coupon
            ], 200);
        } catch (\Throwable $th) {
            return response()->json([
                'message' => 'Coupon not queried successfully',
                'status' => 'error',
                'data' => $th->getMessage()
            ], 500);
        }
    }

    public function list(Request $request)
    {
        try {
            $validatedData = $request->validate([
                'user_id' => 'required|exists:users,id'
            ]);
            $coupons = Coupon::with('order')->where('user_id', $validatedData['user_id'])->get();
            if ($coupons->isNotEmpty()) {
                return response()->json([
                    'message' => 'Coupon fetched successfully',
                    'data' => $coupons,
                    'status' => 'success'
                ], 200);
            }
            return response()->json([
                'status' => 'error',
                'message' => 'Nothing to show',
                'data' => [],
            ], 200);
        } catch (\Throwable $th) {
            Log::error($th->getMessage());
            return response()->json(['status' => 'error', 'data' => [], 'message' => $th->getMessage()], 500);
        }
    }
    public function listShopCoupon(Request $request)
    {
        $validatedData = $request->validate([
            'shop_id' => 'nullable|exists:sellers,id',
        ]);
        $coupon = Coupon::where('seller_id', $validatedData['shop_id'])->get();

        if ($coupon) {

            return response()->json([
                'status' => 'success',
                'data' => $coupon
            ], 200);
        }
    }

    public function index()
    {
        $coupons = Coupon::get();
        return response()->json(['status' => 'success', 'data' => $coupons], 200);
    }
}