MOON
Server: Apache
System: Linux e2e-78-16.ssdcloudindia.net 3.10.0-1160.45.1.el7.x86_64 #1 SMP Wed Oct 13 17:20:51 UTC 2021 x86_64
User: imensosw (1005)
PHP: 8.0.30
Disabled: exec,passthru,shell_exec,system
Upload Files
File: /home/imensosw/public_html/mpl.imenso.co/app/Library/UserConnectionsProvider.php
<?php

namespace App\Library;

use App\Models\User;

class UserConnectionsProvider
{
    // TODO: write tests for this class
    public static $user;
    public static $type;
    public static $subtype;
    public static $approved;

    public static function getConnections(User $user, $type, $subtype = 'SeeLive', $approved = null)
    {
        self::$user = $user;
        self::$type = $type;
        self::$subtype = $subtype;
        self::$approved = $approved;

        switch ($user->type_id) {
            case 1:
                return self::getVenueConnections($user, $type, $subtype = 'SeeLive', $approved = null);
            case 2:
                return self::getArtistConnections($user, $type, $subtype = 'SeeLive', $approved = null);
            case 3:
                return self::getFanConnections($user, $type, $subtype = 'SeeLive', $approved = null);
            case 4:
                return self::getPromoterConnections($user, $type, $subtype = 'SeeLive', $approved = null);

            default:
                throw new \Exception("Type ID isn't supported for getting connections.", 1);
        }
    }

    private static function getVenueConnections()
    {
        if (self::$type == 'artist') {
            $query = self::$user->belongsToMany(User::class, 'artist_venue_connections', 'venue_id', 'artist_id')->distinct('artist_id');
        }

        if (self::$type == 'fan') {
            $query = self::$user->belongsToMany(User::class, 'fan_venue_connections', 'venue_id', 'fan_id')->distinct('fan_id');
        }

        if (self::$type == 'promoter') {
            $query = self::$user->belongsToMany(User::class, 'promoter_venue_connections', 'venue_id', 'promoter_id')->distinct('promoter_id');
        }

        if (isset(self::$approved)) {
            $query = $query->where('users.approved', self::$approved);
        }

        return isset($query)
            ? $query->get()
            : collect([]);
    }

    private static function getArtistConnections()
    {
        if (self::$type == 'venue') {
            $query = self::$user->belongsToMany(User::class, 'artist_venue_connections', 'artist_id', 'venue_id')->distinct('venue_id');
        }

        if (self::$type == 'artist') {
            $query = self::$user->belongsToMany(User::class, 'artist_artist_connections', 'artist1_id', 'artist2_id')->distinct('artist1_id');
        }

        if (self::$type == 'fan' && self::$subtype == 'SeeLive') {
            $query = self::$user->belongsToMany(User::class, 'fan_artist_follows', 'artist_id', 'fan_id')->distinct('fan_id');
        }

        if (self::$type == 'fan' && self::$subtype == 'SeenLive') {
            $query = self::$user->belongsToMany(User::class, 'fan_artist_seen', 'artist_id', 'fan_id')->distinct('fan_id');
        }

        if (self::$type == 'promoter') {
            $query = self::$user->belongsToMany(User::class, 'artist_promoter_connections', 'artist_id', 'promoter_id')->distinct('promoter_id');
        }

        if (isset(self::$approved)) {
            $query = $query->where('users.approved', self::$approved);
        }

        return isset($query)
            ? $query->get()
            : collect([]);
    }

    private static function getFanConnections()
    {
        if (self::$type == 'venue') {
            $query = self::$user->belongsToMany(User::class, 'fan_venue_connections', 'fan_id', 'venue_id')->distinct('venue_id');
        }

        if (self::$type == 'artist' && self::$subtype == 'SeeLive') {
            $query = self::$user->belongsToMany(User::class, 'fan_artist_follows', 'fan_id', 'artist_id')->distinct('artist_id');
        }

        if (self::$type == 'artist' && self::$subtype == 'SeenLive') {
            $query = self::$user->belongsToMany(User::class, 'fan_artist_seen', 'fan_id', 'artist_id')->distinct('artist_id');
        }

        if (self::$type == 'fan') {
            $query = User::whereIn('id', function ($query) {
                $query
                    ->select('fan_id2')
                    ->from('fan_fan_connections')
                    ->where('fan_id1', self::$user->id);

                return $query->union(function ($unionQuery) {
                    $unionQuery
                    ->select('fan_id1')
                    ->from('fan_fan_connections')
                    ->where('fan_id2', self::$user->id);
                });
            });
        }

        if (self::$type == 'promoter') {
            $query = self::$user->belongsToMany(User::class, 'fan_promoter_connections', 'fan_id', 'promoter_id')->distinct('promoter_id');
        }

        if (isset(self::$approved)) {
            $query = $query->where('users.approved', self::$approved);
        }

        return isset($query)
            ? $query->get()
            : collect([]);
    }

    private static function getPromoterConnections()
    {
        if (self::$type == 'venue') {
            $query = self::$user->belongsToMany(User::class, 'promoter_venue_connections', 'promoter_id', 'venue_id')->distinct('venue_id');
        }

        if (self::$type == 'artist') {
            $query = self::$user->belongsToMany(User::class, 'promoter_artist_connections', 'promoter_id', 'artist_id')->distinct('artist_id');
        }

        if (self::$type == 'promoter' || self::$type == 'fan') {
            return collect([]);
        }

        if (isset(self::$approved)) {
            $query = $query->where('users.approved', self::$approved);
        }

        return isset($query)
            ? $query->get()
            : collect([]);

    }
}