<?php 
 
namespace App\Http\Controllers; 
 
use App\Models\Payment; 
use App\Transformers\PaymentTransformer; 
use Illuminate\Http\Request; 
use Illuminate\Support\Facades\Storage; 
use Illuminate\Support\Facades\Validator; 
use Illuminate\Support\Str; 
 
class PaymentController extends Controller 
{ 
    public function __construct() 
    { 
        // all transaction need admin permissions except (index) 
        $this->middleware(['admin'])->except(['index']); 
    } 
    /** 
     * Get all payment methods 
     * @return \Illuminate\Http\JsonResponse 
     */ 
    public function index() 
    { 
        return response()->json(fractal() 
            ->collection(Payment::all()) 
            ->transformWith(new PaymentTransformer()) 
            ->toArray()['data']); 
    } 
 
    /** 
     * create new payment 
     * @param  Request  $request 
     * @return \Illuminate\Http\JsonResponse 
     */ 
    public function create(Request $request) 
    { 
        // validate request 
        $validator = $this->validateRequest($request); 
 
        if($validator->fails()){ 
            return $this->sendError($validator->errors(), 422); 
        } 
 
        // create new payment method 
        $values = $request->all(); 
        $values['currencies'] = json_encode(explode(',', $values['currencies'])); 
        unset($values['errors']); // remove errors from requested data 
        /* 
         * add slug columns 
         *  we can generate uuid for slug from client side 
         * but I want to generate it from server side its just my preferred 
         */ 
        $values['slug'] = Str::uuid(); 
        // create payment method (insert into database) 
        $data = Payment::create($values); 
 
        // send created payment method to client-app 
        return response()->json(fractal() 
            ->item($data) 
            ->transformWith(new PaymentTransformer()) 
            ->toArray()['data']); 
    } 
 
    /** 
     * upload image for the payment method 
     * @param  Request  $request 
     * @param  Payment  $payment 
     * @return \Illuminate\Http\JsonResponse 
     */ 
    public function update(Request $request, Payment $payment) 
    { 
        // validate request 
        $validator = $this->validateRequest($request); 
 
        if($validator->fails()){ 
            return $this->sendError( $validator->errors(), 422); 
        } 
 
        $values = $request->all(); 
 
        if (!is_array($values['currencies'])) 
            $values['currencies'] = json_encode(explode(',', $values['currencies'])); 
        // update payment method 
        $payment->update($values); 
 
        return response()->json(fractal() 
            ->item($payment) 
            ->transformWith(new PaymentTransformer()) 
            ->toArray()['data']); 
    } 
 
    /** 
     * delete payment 
     * @param  Payment  $payment 
     * @return \Illuminate\Http\JsonResponse 
     */ 
    public function delete(Payment $payment) 
    { 
        $payment->delete(); 
 
        return $this->sendResponse([]); 
    } 
 
    /** 
     * upload payment method image 
     * @param  Request  $request 
     */ 
    public function upload(Request $request) 
    { 
        $uploadedFile = $request->file('File'); 
        $filename = time().$uploadedFile->getClientOriginalName(); 
 
        Storage::disk('local')->putFileAs( 
            'public/images/'. $filename, 
            $uploadedFile, 
            $filename 
        ); 
 
        return response()->json($filename); 
    } 
 
    /** 
     * validation input 
     * @param  Request  $request 
     * @return \Illuminate\Contracts\Validation\Validator 
     */ 
    private function validateRequest(Request $request): \Illuminate\Contracts\Validation\Validator 
    { 
        return Validator::make($request->all(), [ 
            'name' => 'required', 
            'currencies' => 'required', 
            'min_deposit' => 'required|numeric|min:0', 
            'max_deposit' => 'required|numeric', 
            'max_withdrawal' => 'required|numeric', 
            'min_withdrawal' => 'required|numeric|min:0', 
            'img' => 'required', 
        ]); 
    } 
} 
 
 |