2021-05-13 12:40:21 +00:00
< ? php
namespace App\Models ;
2023-07-30 10:14:38 +00:00
use AgliPanci\LaravelCase\Facades\CaseBuilder ;
2021-11-20 06:58:46 +00:00
use Carbon\Carbon ;
2021-06-15 12:19:14 +00:00
use Illuminate\Database\Eloquent\Factories\HasFactory ;
2021-05-13 12:40:21 +00:00
use Illuminate\Database\Eloquent\Model ;
2021-10-26 12:19:55 +00:00
use Illuminate\Support\Collection ;
2023-11-24 13:10:21 +00:00
use Illuminate\Support\Facades\Auth ;
2024-04-20 12:03:47 +00:00
use Illuminate\Support\Facades\Cache ;
2022-01-01 05:59:35 +00:00
use Illuminate\Support\Facades\DB ;
2021-05-13 12:40:21 +00:00
2024-06-01 00:46:02 +00:00
use App\Casts\CompressedStringOrNull ;
2024-05-10 23:10:00 +00:00
use App\Traits\ { QueryCacheableConfig , ScopeActive };
2021-05-13 12:40:21 +00:00
class Domain extends Model
{
2024-05-10 23:10:00 +00:00
use HasFactory , QueryCacheableConfig , ScopeActive ;
2022-01-01 05:59:35 +00:00
2021-11-26 05:58:50 +00:00
private const CACHE_TIME = 3600 ;
2021-12-03 00:24:23 +00:00
private const STATS_MONTHS = 6 ;
2021-06-14 05:46:18 +00:00
2022-10-30 12:42:30 +00:00
protected $casts = [
2024-06-01 00:46:02 +00:00
'homepage' => CompressedStringOrNull :: class ,
2022-10-30 12:42:30 +00:00
];
2021-06-14 11:33:18 +00:00
/* SCOPES */
/**
* Only query active records
*/
public function scopePublic ( $query )
{
2023-11-24 13:10:21 +00:00
$user = Auth :: user ();
return $query
-> when ((( ! $user ) || ( ! $user -> isAdmin ())), function ( $query ) { return $query -> where ( 'public' , TRUE ) -> active (); });
2021-06-14 11:33:18 +00:00
}
2021-06-14 05:46:18 +00:00
/* RELATIONS */
2021-08-11 13:45:30 +00:00
public function echoareas ()
{
return $this -> hasMany ( Echoarea :: class );
}
public function fileareas ()
{
return $this -> hasMany ( Filearea :: class );
}
2022-11-04 06:20:22 +00:00
public function nodelist_filearea ()
{
return $this -> belongsTo ( Filearea :: class );
}
2024-05-25 12:25:57 +00:00
public function nodestatusarea ()
{
return $this -> belongsTo ( Echoarea :: class , 'nodestatus_id' );
}
2021-06-14 05:46:18 +00:00
public function zones ()
{
2024-06-17 09:03:48 +00:00
return $this -> hasMany ( Zone :: class )
-> select ([ 'id' , 'zone_id' , 'domain_id' ]);
2021-06-14 05:46:18 +00:00
}
2021-06-14 11:33:18 +00:00
2022-01-05 13:19:57 +00:00
/* ATTRIBUTES */
2021-06-14 11:33:18 +00:00
2024-04-26 06:18:40 +00:00
public function getCanAcceptAppAttribute () : bool
{
2024-05-29 08:59:44 +00:00
return ( $x = our_address ( $this ))
&& $x -> count ()
2024-04-26 06:18:40 +00:00
&& $this -> active
&& $this -> accept_app
&& Auth :: id ()
&& $this -> userHasSystemsNotInNet ( Auth :: user ()) -> count ();
}
2022-12-01 12:51:43 +00:00
public function getHomePageAttribute ( ? string $value ) : string
2021-06-14 11:33:18 +00:00
{
2022-10-23 09:11:03 +00:00
//0xFD2FB528
2022-10-30 12:42:30 +00:00
return $this -> castAttribute ( 'homepage' , $value ) ? : 'No available information at the moment.' ;
2021-06-14 11:33:18 +00:00
}
2021-10-26 12:19:55 +00:00
/* METHODS */
2023-07-30 10:14:38 +00:00
public function echoarea_stats () : Collection
2021-10-26 12:19:55 +00:00
{
2023-07-30 10:14:38 +00:00
$dt = Carbon :: now () -> startOfday ();
$case = CaseBuilder :: whenRaw ( " datetime >= '?' " , $dt -> subDay () -> format ( 'Y-m-d' )) -> thenRaw ( " 'day' " )
-> whenRaw ( " datetime >= '?' " , $dt -> subDays ( 7 ) -> format ( 'Y-m-d' )) -> thenRaw ( " 'week' " )
-> whenRaw ( " datetime >= '?' " , $dt -> subMonth () -> format ( 'Y-m-d' )) -> thenRaw ( " 'month' " )
-> elseRaw ( " 'all' " );
2024-04-26 06:18:40 +00:00
return Echoarea :: select ([ 'echoareas.id' , 'name' , 'description' , 'active' , DB :: raw ( 'count(echomails.id) AS count' ), DB :: raw ( 'max(datetime) as last_message' )])
2023-07-30 10:14:38 +00:00
-> selectRaw ( $case -> toRaw () . ' AS stats' )
2023-08-03 23:53:40 +00:00
-> join ( 'echomails' ,[ 'echomails.echoarea_id' => 'echoareas.id' ], NULL , NULL , 'left outer' )
2022-01-05 13:19:57 +00:00
-> where ( 'domain_id' , $this -> id )
-> groupBy ( 'echoareas.id' )
2023-07-30 10:14:38 +00:00
-> groupBy ( 'echoareas.name' )
-> groupBy ( 'stats' )
2022-01-05 13:19:57 +00:00
-> orderBy ( 'echoareas.name' )
2023-08-03 23:53:40 +00:00
-> orderBy ( 'last_message' , 'DESC' )
2022-01-05 13:19:57 +00:00
-> get ();
2021-10-26 12:19:55 +00:00
}
2022-11-25 10:44:03 +00:00
2024-04-20 12:03:47 +00:00
public function echoarea_total_daily ( Collection $systems = NULL ) : Collection
{
return Cache :: remember ( md5 ( sprintf ( '%d-%s' , $this -> id , $systems ? -> pluck ( 'id' ) -> join ( ',' ))), self :: CACHE_TIME , function () use ( $systems ) {
return DB :: query ()
-> select ([ 'echoareas.name' , 'echoareas.show' , DB :: raw ( 'COUNT(*) AS count' ), DB :: raw ( 'datetime::date AS date' )])
-> from ( $this -> getTable ())
-> join ( 'echoareas' ,[ 'echoareas.domain_id' => 'domains.id' ])
-> join ( 'echomails' ,[ 'echomails.echoarea_id' => 'echoareas.id' ])
-> where ( 'domains.id' , $this -> id )
-> where ( 'echomails.datetime' , '>=' , Carbon :: now () -> subMonths ( self :: STATS_MONTHS ) -> startOfMonth ())
-> when ( $systems ? -> count (), function ( $query ) use ( $systems ) { return $query -> whereIn ( 'echomails.fftn_id' , $systems -> pluck ( 'addresses' ) -> flatten () -> pluck ( 'id' )); })
-> groupBy ([ 'echoareas.name' , 'echoareas.show' , 'date' ])
-> orderBy ( 'echoareas.name' )
-> orderBy ( 'date' )
-> get ();
});
}
2022-11-25 10:44:03 +00:00
/**
* Determine if this zone is managed by this host
*
* @ return bool
2024-05-29 09:13:28 +00:00
* @ throws \Exception
2022-11-25 10:44:03 +00:00
*/
2024-05-29 09:13:28 +00:00
public function isManaged () : bool
2022-11-25 10:44:03 +00:00
{
2024-05-29 09:13:28 +00:00
return ( $x = our_address ())
&& $x -> pluck ( 'zone.domain' )
-> pluck ( 'id' )
-> contains ( $this -> id );
2022-11-25 10:44:03 +00:00
}
2024-04-26 06:18:40 +00:00
/**
* Work out which of the users systems are not in this domain
*
* @ param User $o
* @ return Collection
*/
public function userHasSystemsNotInNet ( User $o ) : Collection
{
$o -> load ( 'systems.akas.zone' );
$result = collect ();
foreach ( $o -> systems -> filter ( function ( $item ) { return $item -> active ; }) as $so ) {
if ( ! $so -> akas -> pluck ( 'zone' ) -> unique ( 'domain_id' ) -> pluck ( 'domain_id' ) -> contains ( $this -> id ))
$result -> push ( $so );
}
return $result ;
}
2021-05-13 12:40:21 +00:00
}