HEX
Server: Apache/2.4.41 (Ubuntu)
System: Linux ip-172-31-42-149 5.15.0-1084-aws #91~20.04.1-Ubuntu SMP Fri May 2 07:00:04 UTC 2025 aarch64
User: ubuntu (1000)
PHP: 7.4.33
Disabled: pcntl_alarm,pcntl_fork,pcntl_waitpid,pcntl_wait,pcntl_wifexited,pcntl_wifstopped,pcntl_wifsignaled,pcntl_wifcontinued,pcntl_wexitstatus,pcntl_wtermsig,pcntl_wstopsig,pcntl_signal,pcntl_signal_get_handler,pcntl_signal_dispatch,pcntl_get_last_error,pcntl_strerror,pcntl_sigprocmask,pcntl_sigwaitinfo,pcntl_sigtimedwait,pcntl_exec,pcntl_getpriority,pcntl_setpriority,pcntl_async_signals,pcntl_unshare,
Upload Files
File: /var/www/vhost/disk-apps/demo.sports-crowd.com/app/Http/Controllers/MembershipController.php
<?php

namespace App\Http\Controllers;

use App\Core\Membership\Application\MembershipService;
use App\Core\Payment\Application\PaymentTransactionService;
use App\Http\Requests\Memberships\MembershipStoreRequest;
use App\Http\Requests\Memberships\MembershipUpdateRequest;
use App\Models\Membership\Membership;
use App\PaymentTransaction;
use Carbon\Carbon;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Storage;

class MembershipController extends Controller
{
    private $membershipService;
    private $paymentTransactionService;

    public function __construct()
    {
        $this->membershipService = new MembershipService();
        $this->paymentTransactionService = new PaymentTransactionService();
    }
    /**
     * Display a listing of the resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function index()
    {
        return view('memberships.list');
    }

    public function listMemberships(Request $request)
    {
        $page = ($request->start / $request->length) + 1;
        $request->merge(['page' => $page]);

        $orderBy = $request->columns[$request->order[0]['column']]['name'];
        $orderDirection = $request->order[0]['dir'];

        $response = Membership::orderBy($orderBy, $orderDirection)
            ->when($request->search['value'], function ($query) use ($request) {
                foreach ($request->columns as $column) {
                    if (filter_var($column['searchable'], FILTER_VALIDATE_BOOLEAN)) {
                        $query->orWhere($column['name'], 'like', '%' . $request->search['value'] . '%');
                    }
                }
            })
            ->paginate();
        return response()->json($response);
    }

    /**
     * Show the form for creating a new resource.
     *
     * @return \Illuminate\Http\Response
     */
    public function create()
    {
        return view('memberships.create');
    }

    /**
     * Store a newly created resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @return \Illuminate\Http\Response
     */

    public function store(MembershipStoreRequest $request)
    {
        $membership = Membership::create($request->validated());

        if ($request->hasFile('image')) {
            $imageUrl = $this->saveImageToS3($request->file('image'), $membership->id, 'memberships');
            if ($imageUrl) {
                $membership->image = $imageUrl;
                $membership->save();
            }
        }

        if (!empty($request->tags)) {
            $membership->tags()->sync($request->tags);
        }

        if (!empty($request->list_tags)) {
            $membership->list_tags()->sync($request->list_tags);
        }

        $this->registerLog(Auth::user()->id, 'Crear membresia', json_encode($membership), "Create", $this->getModule($request));

        return $membership;
    }

    /**
     * Show the form for editing the specified resource.
     *
     * @param  \App\Membership  $membership
     * @return \Illuminate\Http\Response
     */
    public function edit(Membership $membership)
    {
        return view('memberships.edit', compact('membership'));
    }

    /**
     * Update the specified resource in storage.
     *
     * @param  \Illuminate\Http\Request  $request
     * @param  \App\Membership  $membership
     * @return \Illuminate\Http\Response
     */
    public function update(MembershipUpdateRequest $request, Membership $membership)
    {
        $membership->update($request->validated());

        if ($request->hasFile('image')) {
            $imageUrl = $this->saveImageToS3($request->file('image'), $membership->id, 'memberships');
            if ($imageUrl) {
                $membership->image = $imageUrl;
                $membership->save();
            }
        }

        if (!empty($request->tags)) {
            $membership->tags()->sync($request->tags);
        } else {
            $membership->tags()->detach();
        }

        if (!empty($request->list_tags)) {
            $membership->list_tags()->sync($request->list_tags);
        } else {
            $membership->list_tags()->detach();
        }

        $membership->load('tags');

        $this->registerLog(Auth::user()->id, 'Editar membresia', json_encode($membership), "Update", $this->getModule($request));

        return $membership;
    }

    public function dashboard()
    {
        return view('memberships.dashboard');
    }

    public function listMembershipDashboard(Request $request)
    {
        return $this->membershipService->queryDashboard($request);
    }

    public function validatePayment(Request $request, PaymentTransaction $paymentTransaction)
    {
        $this->paymentTransactionService->validatePayment($paymentTransaction);
        $this->registerLog(Auth::user()->id, 'Validar pago de membresia en pasarela', json_encode($paymentTransaction), "Update", $this->getModule($request));
        return response()->json($paymentTransaction);
    }

    public function activeToogle(Request $request, Membership $membership)
    {
        $membership->active = !$membership->active;
        $membership->save();
        $this->registerLog(Auth::user()->id, 'Activar/Desactivar membresia', json_encode($membership), "Update", $this->getModule($request));
        return $membership;
    }

    public function downloadReport(Request $request)
    {
        $reportData = $this->membershipService->queryDownloadReport($request);
        $data = array_map(function ($row) {
            $row['is_renewal'] = $row['is_renewal'] ? 'Renovación' : 'Nueva';
            $row['auto_renew'] = $row['auto_renew'] ? 'Si' : 'No';
            $row['start_date'] = $row['start_date'] ? Carbon::parse($row['start_date'])->format('Y-m-d') : '';
            $row['end_date'] = $row['end_date'] ? Carbon::parse($row['end_date'])->format('Y-m-d') : '';
            $row['created_at'] = $row['created_at'] ? Carbon::parse($row['created_at'])->format('Y-m-d H:i:s') : '';
            return $row;
        }, $reportData->toArray());
        return response()->json(['data' => $data]);
    }

    public function getBySegmentation($segmentationIds)
    {
        return Membership::where('active', true)
            ->join('membership_tags', 'membership_tags.membership_id', '=', 'memberships.id')
            ->whereIn('membership_tags.tag_id', $segmentationIds)
            ->get();
    }

    private function saveImageToS3($file, $id, $folder)
    {
        try {
            $extension = $file->getClientOriginalExtension();
            $filenameToStore = $id . '_' . uniqid() . '.' . $extension;

            Storage::disk('s3')->put(
                config("s3.$folder") . $filenameToStore,
                fopen($file, 'r+'),
                'public'
            );

            return config('filesystems.disks.s3.url') . "/$folder/" . $filenameToStore;
        } catch (\Throwable $th) {
            return response(array("r" => false, "type" => "error", "title" => "Oops...", "m" => __('messages.error_updating'), "data" => $th->getMessage()));
        }
    }
}