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([]);
}
}