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);
}
}