<?php namespace App\Models; use Carbon\Carbon; use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use App\Traits\{AreaSecurity,ScopeActive}; /** * Echomail echoareas * * Security thoughts: * + ZCs/RCs/NCs/HUBs carry all echos * + echos for HUBs only (not NODES/POINTs, thus Hub/NC/RC/ZC) * + echos for NCs only (NC/RC/ZC) * + echos for RCs only (RC/ZC) * YYRRRWWW * * Thus YY: * + 0 - not exported * + 1 - Sent to RCs (RW) * + 2 - Sent to NCs as well (RW) * + 3 - Sent to Hubs as well (RW) * * Thus RRR: (Read) * + 0-7 * = 0 no read access * = 1-7 minimum access required to perform * Thus WWW: (Write) * + 0-7 * = 0 no write access * = 1-7 minimum access required to perform * * - If a node has 0, or an echoarea has 0, then no access to the function * - So if node has 1, and echoarea has 2, no access to function * * @note change "public" to "bot posts"? */ class Echoarea extends Model { use SoftDeletes,ScopeActive,AreaSecurity; private const CACHE_TIME = 3600; protected $casts = [ 'first_message' => 'datetime:Y-m-d H:i:s', 'last_message' => 'datetime:Y-m-d H:i:s', ]; /* RELATIONS */ public function addresses() { return $this->belongsToMany(Address::class); } public function addresses_active() { return $this->belongsToMany(Address::class); } public function domain() { return $this->belongsTo(Domain::class); } public function echomail() { return $this->hasMany(Echomail::class) ->orderBy('datetime','ASC'); } /* METHODS */ public function messages_count(int $period=NULL): int { $eo = Echomail::where('echoarea_id',$this->id); $dt = Carbon::now()->startOfday(); switch ($period) { case 1: // day $eo->where('datetime','>=',$dt->subDay()); break; case 7: // week $eo->where('datetime','>=',$dt->subWeek()); break; case 30: // month $eo->where('datetime','>=',$dt->subMonth()); break; case NULL: // all break; default: return 0; } return $eo->count(); } /** * Number of messages waiting for address * * @param Address $ao * @return Collection */ public function waiting(Address $ao): Collection { return $this->echomail() ->join('echomail_seenby',['echomail_seenby.echomail_id'=>'echomails.id']) ->whereNull('sent_at') ->whereNotNull('export_at') ->where('address_id',$ao->id) ->get(); } }