Consistency and SQL Query optimisations - focused around the UI
This commit is contained in:
@@ -395,16 +395,14 @@ class Address extends Model
|
||||
*
|
||||
* @param $query
|
||||
* @return mixed
|
||||
* @note zones and domains needs to be joined in the base call, or use FTN()
|
||||
*/
|
||||
public function scopeActiveFTN($query)
|
||||
{
|
||||
return $query->select($this->getTable().'.*')
|
||||
->join('zones',['zones.id'=>'addresses.zone_id'])
|
||||
->join('domains',['domains.id'=>'zones.domain_id'])
|
||||
return $query
|
||||
->where('zones.active',TRUE)
|
||||
->where('domains.active',TRUE)
|
||||
->active()
|
||||
->FTNorder();
|
||||
->active();
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -416,13 +414,21 @@ class Address extends Model
|
||||
public function scopeFTN($query)
|
||||
{
|
||||
return $query
|
||||
->select(['id','addresses.zone_id','host_id','node_id','point_id','system_id'])
|
||||
->select(['addresses.id','region_id','host_id','node_id','point_id','addresses.zone_id','addresses.active','role','security','addresses.system_id','addresses.active','validated'])
|
||||
->join('zones',['zones.id'=>'addresses.zone_id'])
|
||||
->join('domains',['domains.id'=>'zones.domain_id'])
|
||||
->orderBy('domains.name')
|
||||
->orderBy('region_id')
|
||||
->orderBy('host_id')
|
||||
->orderBy('node_id')
|
||||
->orderBy('point_id')
|
||||
->with([
|
||||
'zone:zones.id,domain_id,zone_id',
|
||||
'zone.domain:domains.id,name',
|
||||
'zone:zones.id,domain_id,zone_id,active',
|
||||
'zone.domain:domains.id,name,active,public',
|
||||
]);
|
||||
}
|
||||
|
||||
/** @deprecated use FTN() */
|
||||
public function scopeFTNOrder($query)
|
||||
{
|
||||
return $query
|
||||
|
@@ -48,35 +48,39 @@ class System extends Model
|
||||
$uo = Auth::user();
|
||||
|
||||
return $query
|
||||
->when($uo && ! $uo->isAdmin(),function($query) use ($uo) {
|
||||
return $query->whereIn('id',$uo->systems->pluck('id'))
|
||||
->orWhere($this->getTable().'.active',TRUE);
|
||||
},function($query) { $query->where($this->getTable().'.active',TRUE); })
|
||||
->when(
|
||||
$uo && ! $uo->isAdmin(),
|
||||
fn($query)=>
|
||||
$query
|
||||
->whereIn('id',$uo->systems->pluck('id'))
|
||||
->orWhere($this->getTable().'.active',TRUE),
|
||||
fn($query)=>$query->where($this->getTable().'.active',TRUE))
|
||||
->orderBy('name');
|
||||
}
|
||||
|
||||
/* RELATIONS */
|
||||
|
||||
/**
|
||||
* All addresses assigned to a system, including addresses pending deletion
|
||||
* @return mixed
|
||||
*/
|
||||
public function addresses()
|
||||
{
|
||||
return $this->hasMany(Address::class)
|
||||
->withTrashed()
|
||||
->FTNorder();
|
||||
->FTN()
|
||||
->withTrashed();
|
||||
}
|
||||
|
||||
/**
|
||||
* System addresses that are active
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function akas()
|
||||
{
|
||||
return $this->hasMany(Address::class)
|
||||
->select('addresses.*')
|
||||
->join('zones',['zones.id'=>'addresses.zone_id'])
|
||||
->join('domains',['domains.id'=>'zones.domain_id'])
|
||||
->where('addresses.active',TRUE)
|
||||
->where('zones.active',TRUE)
|
||||
->where('domains.active',TRUE)
|
||||
->orderBy('domains.name')
|
||||
->with(['zone.domain'])
|
||||
->FTNorder()
|
||||
->orderBy('role','ASC');
|
||||
->FTN()
|
||||
->ActiveFTN();
|
||||
}
|
||||
|
||||
public function mailers()
|
||||
@@ -136,7 +140,14 @@ class System extends Model
|
||||
*/
|
||||
public function zcs()
|
||||
{
|
||||
return $this->hasMany(Zone::class);
|
||||
return $this->hasMany(Zone::class)
|
||||
->select(['zones.id','zone_id','domain_id','system_id','zones.active'])
|
||||
->join('domains',['domains.id'=>'zones.domain_id'])
|
||||
->orderBy('domains.name')
|
||||
->orderBy('zone_id')
|
||||
->with([
|
||||
'domain:id,name,active',
|
||||
]);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -189,6 +200,58 @@ class System extends Model
|
||||
|
||||
/* METHODS */
|
||||
|
||||
/**
|
||||
* Return the ACTIVE addresses that are common with our addresses
|
||||
*
|
||||
* @return Collection
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function aka_common(): Collection
|
||||
{
|
||||
$our = our_address()->pluck('zone.domain_id')->unique();
|
||||
|
||||
// Return our akas, filter with our_addresses()
|
||||
return $this->akas->filter(fn($item)=>$our->contains($item->zone->domain_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the ACTIVE addresses that we auth with
|
||||
*
|
||||
* @return Collection
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function aka_known(): Collection
|
||||
{
|
||||
return $this->aka_common()
|
||||
->filter(fn($item)=>$this->sessions->contains($item->zone_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the ACTIVE addresses in the same networks as us, but dont auth here
|
||||
*
|
||||
* @return Collection
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function aka_unknown(): Collection
|
||||
{
|
||||
return $this->aka_common()
|
||||
->filter(fn($item)=>! $this->sessions->contains($item->zone_id));
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the AKAs that are in networks not common with us
|
||||
*
|
||||
* @return Collection
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function aka_uncommon(): Collection
|
||||
{
|
||||
$our = our_address()->pluck('zone.domain_id')->unique();
|
||||
|
||||
// Return our akas, filter with our_addresses()
|
||||
return $this->akas->filter(fn($item)=>! $our->contains($item->zone->domain_id));
|
||||
}
|
||||
|
||||
public function echoareas()
|
||||
{
|
||||
return Echoarea::select('echoareas.*')
|
||||
@@ -250,28 +313,13 @@ class System extends Model
|
||||
: $akas;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parse the addresses and return which ones are in my zones
|
||||
*
|
||||
* @param \Illuminate\Database\Eloquent\Collection $addresses
|
||||
* @param int $type
|
||||
* @return Collection
|
||||
*/
|
||||
public function inMyZones(Collection $addresses,int $type=(Address::NODE_HC|Address::NODE_NN|Address::NODE_POINT)): Collection
|
||||
{
|
||||
$myzones = $this->addresses->pluck('zone_id')->unique();
|
||||
|
||||
return $addresses->filter(function($item) use ($myzones,$type) {
|
||||
return ($item->role & $type) && ($myzones->search($item->zone_id) !== FALSE);
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the packet that this system uses
|
||||
*
|
||||
* @param Address $ao
|
||||
* @param string|null $password
|
||||
* @return Packet
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function packet(Address $ao,string $password=NULL): Packet
|
||||
{
|
||||
@@ -289,22 +337,7 @@ class System extends Model
|
||||
{
|
||||
return Job::where('queue',AddressPoll::QUEUE)
|
||||
->get()
|
||||
->where(function($item) {
|
||||
return $this->akas->pluck('id')->search($item->command->address->id) !== FALSE; })
|
||||
->where(fn($item)=>$this->akas->pluck('id')->contains($item->command->address->id))
|
||||
->last();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return other addresses that are not collected here, but are on the same network as us.
|
||||
*
|
||||
* @return \Illuminate\Database\Eloquent\Collection
|
||||
* @throws \Exception
|
||||
*/
|
||||
public function uncommon(): Collection
|
||||
{
|
||||
$our = our_address();
|
||||
|
||||
return $this->akas
|
||||
->filter(fn($item)=>(($x=$item->parent()) && (! $our->contains($x)) && ($our->pluck('zone.domain_id')->contains($item->zone->domain_id))));
|
||||
}
|
||||
}
|
@@ -75,19 +75,14 @@ class User extends Authenticatable implements MustVerifyEmail
|
||||
|
||||
/* GENERAL METHODS */
|
||||
|
||||
public function addresses(Domain $o=NULL): Collection
|
||||
public function addresses(): Collection
|
||||
{
|
||||
return Address::select('addresses.*')
|
||||
->join('systems',['systems.id'=>'addresses.system_id'])
|
||||
->join('system_user',['system_user.system_id'=>'systems.id'])
|
||||
->when(! is_null($o),function($query) use ($o) {
|
||||
return $query
|
||||
->join('zones',['zones.id'=>'addresses.zone_id'])
|
||||
->where('zones.domain_id',$o->id);
|
||||
})
|
||||
->where('system_user.user_id',$this->id)
|
||||
->activeFTN()
|
||||
->with(['zone.domain'])
|
||||
->ActiveFTN()
|
||||
->FTN()
|
||||
->get();
|
||||
}
|
||||
|
||||
|
Reference in New Issue
Block a user