From 424d6ef39dccfeed6320023769470689d6b7dbfb Mon Sep 17 00:00:00 2001 From: Deon George Date: Sat, 1 Jan 2022 16:59:35 +1100 Subject: [PATCH] Switchout DB to CockroachDB --- .env.example | 16 +- app/Classes/FTN/Message.php | 12 +- app/Classes/FTN/Process/Echomail/Test.php | 3 +- app/Classes/FTN/Process/Netmail/Ping.php | 2 +- app/Console/Commands/ConvertMongo.php | 160 +++ app/Http/Controllers/HomeController.php | 1 + app/Jobs/MessageProcess.php | 2 +- app/Models/Address.php | 70 +- app/Models/Domain.php | 42 +- app/Models/Echoarea.php | 36 +- app/Models/Echomail.php | 122 +- app/Models/Netmail.php | 12 +- app/Models/System.php | 8 +- app/Models/Zone.php | 4 +- app/Traits/MsgID.php | 4 +- app/Traits/QueryCacheableConfig.php | 17 + app/Traits/UseMongo.php | 104 -- app/Traits/UsePostgres.php | 21 - composer.json | 7 + composer.lock | 1265 +++++++++-------- config/database.php | 39 +- .../2021_06_18_112022_update_zones.php | 3 +- ...2021_06_21_121910_add_system_to_setups.php | 2 +- .../2022_01_01_235631_create_mail.php | 137 ++ resources/views/domain/view.blade.php | 8 +- resources/views/echoarea/addedit.blade.php | 41 + resources/views/system/addedit.blade.php | 57 +- resources/views/widgets/message.blade.php | 12 +- 28 files changed, 1342 insertions(+), 865 deletions(-) create mode 100644 app/Console/Commands/ConvertMongo.php create mode 100644 app/Traits/QueryCacheableConfig.php delete mode 100644 app/Traits/UseMongo.php delete mode 100644 app/Traits/UsePostgres.php create mode 100644 database/migrations/2022_01_01_235631_create_mail.php diff --git a/.env.example b/.env.example index 44a21e0..960a5be 100644 --- a/.env.example +++ b/.env.example @@ -7,12 +7,16 @@ APP_DEBUG=true LOG_CHANNEL=stack LOG_LEVEL=info -DB_CONNECTION=pgsql -DB_HOST=postgres -DB_PORT=5432 -DB_DATABASE=postgres -DB_USERNAME=postgres -DB_PASSWORD=password +DB_CONNECTION=cockroach +DB_HOST=cockroach +DB_PORT=26257 +DB_DATABASE=clrghouz +DB_USERNAME=dev +DB_PASSWORD= +DB_SSLMODE=prefer +DB_SSLROOTCERT=/var/www/html/config/ssl/ca.crt +DB_SSLCERT=/var/www/html/config/ssl/client.crt +DB_SSLKEY=/var/www/html/config/ssl/client.key DB_MONGO_HOST=mongo DB_MONGO_USERNAME=mongo diff --git a/app/Classes/FTN/Message.php b/app/Classes/FTN/Message.php index a7b0cfd..5d079dd 100644 --- a/app/Classes/FTN/Message.php +++ b/app/Classes/FTN/Message.php @@ -93,7 +93,7 @@ class Message extends FTNBase private string $subject; // Message subject private string $msgid; // MSG ID - private string $reply; // Reply ID + private string $replyid; // Reply ID private string $echoarea; // FTS-0004.001 private string $intl; // Netmail details @@ -182,7 +182,7 @@ class Message extends FTNBase $this->message = ''; $this->msgid = ''; - $this->reply = ''; + $this->replyid = ''; $this->echoarea = ''; $this->intl = ''; @@ -372,7 +372,7 @@ class Message extends FTNBase case 'echoarea': case 'msgid': - case 'reply': + case 'replyid': case 'message': case 'message_src': @@ -412,7 +412,7 @@ class Message extends FTNBase case 'subject': case 'msgid': - case 'reply': + case 'replyid': case 'echoarea': case 'intl': @@ -486,8 +486,8 @@ class Message extends FTNBase // Add some kludges $return .= sprintf("\01MSGID: %s\r",$this->msgid); - if ($this->reply) - $return .= sprintf("\01REPLY: %s\r",$this->reply); + if ($this->replyid) + $return .= sprintf("\01REPLY: %s\r",$this->replyid); foreach ($this->_kludge as $k=>$v) { if ($x=$this->kludge->get($k)) diff --git a/app/Classes/FTN/Process/Echomail/Test.php b/app/Classes/FTN/Process/Echomail/Test.php index 9338ba3..3976b65 100644 --- a/app/Classes/FTN/Process/Echomail/Test.php +++ b/app/Classes/FTN/Process/Echomail/Test.php @@ -26,6 +26,7 @@ final class Test extends Process private const testing = ['test','testing']; + // @todo add path and other kludges public static function handle(Message $msg): bool { if ((strtolower($msg->user_to) !== 'all') || ! in_array(strtolower($msg->subject),self::testing)) @@ -66,7 +67,7 @@ final class Test extends Process $o->datetime = Carbon::now(); $o->tzoffset = $o->datetime->utcOffset(); $o->echoarea_id = $eo?->id; - $o->reply = $msg->msgid; + $o->replyid = $msg->msgid; $o->fftn_id = $ftns->id; $o->flags = Message::FLAG_LOCAL; diff --git a/app/Classes/FTN/Process/Netmail/Ping.php b/app/Classes/FTN/Process/Netmail/Ping.php index 1e34e68..c355efc 100644 --- a/app/Classes/FTN/Process/Netmail/Ping.php +++ b/app/Classes/FTN/Process/Netmail/Ping.php @@ -50,7 +50,7 @@ final class Ping extends Process $o->datetime = Carbon::now(); $o->tzoffset = $o->datetime->utcOffset(); - $o->reply = $msg->msgid; + $o->replyid = $msg->msgid; $o->fftn_id = $ftns->id; $o->tftn_id = ($x=$msg->fftn_o) ? $x->id : NULL; $o->flags = Message::FLAG_LOCAL; diff --git a/app/Console/Commands/ConvertMongo.php b/app/Console/Commands/ConvertMongo.php new file mode 100644 index 0000000..254e7dc --- /dev/null +++ b/app/Console/Commands/ConvertMongo.php @@ -0,0 +1,160 @@ +collection('netmails')->cursor() as $o) { + $o['mid'] = (string)$o['_id']; + + foreach([ + 'reply'=>'replyid', + 'packet'=>'sent_pkt', + ] as $key => $newkey) { + if (array_key_exists($key,$o)) { + $o[$newkey] = $o[$key]; + unset($o[$key]); + } + } + + unset($o['_id'],$o['sent'],$o['reply']); + + foreach (['created_at','updated_at','sent_at','datetime','deleted_at'] as $key) { + if (Arr::get($o,$key)) + $o[$key] = Carbon::create($o[$key]->toDatetime()); + } + + if (! Arr::get($o,'datetime')) + $o['datetime'] = $o['created_at']; + + $oo = Netmail::withTrashed()->where('mid',$o['mid'])->firstOrNew(); + $oo->forceFill($o); + + try { + $oo->save(['timestamps' => false]); + } catch (\Exception $e) { + $this->warn(sprintf('Netmail didnt move over: %s (%s)',$o['mid'],$e->getMessage())); + } + } + */ + + /**/ + // Echomail + $c = 0; + foreach (DB::connection('mongodb')->collection('echomails')->cursor() as $o) { + if (++$c < $this->argument('start')) + continue; + + if (! ($c%100)) + Log::debug(sprintf('Processed : %d Echomails',$c)); + + $o['mid'] = (string)$o['_id']; + + foreach([ + 'reply'=>'replyid', + 'rogue_seen'=>'rogue_seenby', + ] as $key => $newkey) { + if (array_key_exists($key,$o)) { + $o[$newkey] = $o[$key]; + unset($o[$key]); + } + } + + $path = (array_key_exists('path',$o) && $o['path']) ? $o['path'] : NULL; + $seenby = (array_key_exists('seenby',$o) && $o['seenby']) ? $o['seenby'] : NULL; + $packet = (array_key_exists('packet',$o) && $o['packet']) ? $o['packet'] : NULL; + + unset($o['_id'],$o['reply'],$o['path'],$o['seenby'],$o['toexport'],$o['sent_at'],$o['packet'],$o['sent']); + + foreach (['created_at','updated_at','datetime','deleted_at'] as $key) { + if (Arr::get($o,$key)) + $o[$key] = Carbon::create($o[$key]->toDatetime()); + } + + if (! Arr::get($o,'datetime')) + $o['datetime'] = $o['created_at']; + + if (Arr::get($o,'echoarea') && ! Arr::get($o,'echoarea_id')) { + $ea = Echoarea::where('name',$o['echoarea'])->single(); + $o['echoarea_id'] = $ea->id; + unset($o['echoarea']); + } + + if (! $o['echoarea_id']) { + Log::error(sprintf('Echomail didnt move over: %s [%d] - has no echoarea_id',$o['mid'],$c)); + continue; + } + + if (Arr::get($o,'msg_src') && ! Arr::get($o,'msg_crc')) { + $o['msg_crc'] = 'x'.md5($o['msg_src']); + } + + $oo = Echomail::withTrashed()->where('mid',$o['mid'])->firstOrNew(); + $oo->forceFill($o); + $oo->set_path = $path ? array_filter($path) : []; + $oo->set_seenby = $seenby ? array_filter($seenby): []; + $oo->set_packet = $packet; + + try { + $oo->save(['timestamps'=>FALSE]); + + } catch (\Exception $e) { + Log::error(sprintf('Echomail didnt move over: %s [%d] (%s@%d|%s)',$o['mid'],$c,$e->getFile(),$e->getLine(),$e->getMessage())); + dd(['e'=>$e,'o'=>$o,'oo'=>$oo]); + } + + DB::connection('mongodb')->collection('echomails')->delete($o['mid']); + } + /**/ + + // Update old MID seenby with proper ID + foreach (DB::connection('cockroach')->table('echomail_seenby')->whereNotNull('mid')->whereNull('echomail_id')->cursor() as $o) + { + $eo = Echomail::where('mid',$o->mid)->get(); + + if ($eo->count() && $eo->count() == 1) { + DB::update('UPDATE echomail_seenby set echomail_id = ?, mid=NULL where echomail_id IS NULL AND mid = ? ',[ + $eo->first()->id, + $o->mid, + ]); + + } elseif ($eo->count() > 1) { + Log::error(sprintf('Echomail [%s] has more than 1 record [%d] - skipped',$o->mid,$eo->count())); + } + } + } +} diff --git a/app/Http/Controllers/HomeController.php b/app/Http/Controllers/HomeController.php index 3624743..296515e 100644 --- a/app/Http/Controllers/HomeController.php +++ b/app/Http/Controllers/HomeController.php @@ -121,6 +121,7 @@ class HomeController extends Controller # Look for Messages foreach (Echomail::select(['id','fftn_id','from']) ->where('msgid','like','%'.$request->query('term').'%') + ->orWhere('replyid','like','%'.$request->query('term').'%') ->get() as $o) { $result->push(['id'=>$o->id,'name'=>sprintf('%s (%s)',$o->from,$o->fftn->ftn3d),'value'=>url('echomail/view',[$o->id]),'category'=>'Echomail']); diff --git a/app/Jobs/MessageProcess.php b/app/Jobs/MessageProcess.php index 96e4a97..32f2b4f 100644 --- a/app/Jobs/MessageProcess.php +++ b/app/Jobs/MessageProcess.php @@ -112,7 +112,7 @@ class MessageProcess implements ShouldQueue $o->fftn_id = ($x=$this->msg->tftn_o) ? $x->id : NULL; $o->tftn_id = ($x=$this->msg->fftn_o) ? $x->id : NULL; - $o->reply = $this->msg->msgid; + $o->replyid = $this->msg->msgid; $o->msg = Process::format_msg($reply,$reject); $o->tagline = 'Do you think it was fate which brought us together? Nah, bad luck :('; diff --git a/app/Models/Address.php b/app/Models/Address.php index 4415322..1005edc 100644 --- a/app/Models/Address.php +++ b/app/Models/Address.php @@ -11,7 +11,7 @@ use Illuminate\Support\Facades\DB; use App\Classes\FTN\Packet; use App\Http\Controllers\DomainController; -use App\Traits\{ScopeActive,UsePostgres}; +use App\Traits\ScopeActive; /** * @todo Need to stop this from happening: @@ -24,7 +24,9 @@ use App\Traits\{ScopeActive,UsePostgres}; */ class Address extends Model { - use ScopeActive,SoftDeletes,UsePostgres; + use ScopeActive,SoftDeletes; + + protected $with = ['zone']; /* SCOPES */ @@ -337,6 +339,21 @@ class Address extends Model return ($o && $o->system->active) ? $o : NULL; } + /** + * Netmail waiting to be sent to this system + * + * @return Collection + */ + public function echomailWaiting(): Collection + { + return Echomail::select(['echomails.*']) + ->join('echomail_seenby',['echomail_seenby.echomail_id'=>'echomails.id']) + ->where('echomail_seenby.address_id',$this->id) + ->whereNull('echomail_seenby.sent_at') + ->whereNotNull('echomail_seenby.export_at') + ->get(); + } + /** * Get echomail for this node * @@ -346,23 +363,17 @@ class Address extends Model { $pkt = NULL; - $echomail = DB::table('address_echomail') - ->select('echomail_id') - ->where('address_id',$this->id) - ->whereNull('sent_date') - ->get(); - - if (($x=Echomail::select('*') - ->whereIn('_id',$echomail->pluck('echomail_id'))) + if (($x=$this->echomailWaiting()) ->count()) { - $pkt = $this->getPacket($x->get()); + $pkt = $this->getPacket($x); - DB::table('address_echomail') - ->whereIn('echomail_id',$echomail->pluck('echomail_id')) + DB::table('echomail_seenby') + ->whereIn('echomail_id',$x->pluck('id')) ->where('address_id',$this->id) - ->whereNull('sent_date') - ->update(['sent_date'=>Carbon::now()]); + ->whereNull('sent_at') + ->whereNotNull('echomail_seenby.export_at') + ->update(['sent_at'=>Carbon::now(),'packet'=>$pkt->name]); } return $pkt; @@ -375,18 +386,19 @@ class Address extends Model */ public function getNetmail(): ?Packet { - if (($x=Netmail::whereIn('tftn_id',(($x=$this->children) ? $x->pluck('id') : collect())->push($this->id)) - ->where(function($q) { - return $q->whereNull('sent') - ->orWhere('sent',FALSE); - })) - ->whereNull('local') + $pkt = NULL; + + if (($x=$this->netmailWaiting()) ->count()) { - return $this->getPacket($x->get()); + $pkt = $this->getPacket($x); + + DB::table('netmails') + ->whereIn('id',$x->pluck('id')) + ->update(['sent_at'=>Carbon::now(),'sent_pkt'=>$pkt->name]); } - return NULL; + return $pkt; } /** @@ -411,6 +423,18 @@ class Address extends Model return $o; } + /** + * Netmail waiting to be sent to this system + * + * @return Collection + */ + public function netmailWaiting(): Collection + { + return Netmail::whereIn('tftn_id',(($x=$this->children) ? $x->pluck('id') : collect())->push($this->id)) + ->whereNull('sent_at') + ->get(); + } + /** * Parse a string and split it out as an FTN array * diff --git a/app/Models/Domain.php b/app/Models/Domain.php index 30048f0..35eb4db 100644 --- a/app/Models/Domain.php +++ b/app/Models/Domain.php @@ -7,13 +7,15 @@ use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Database\Eloquent\Model; use Illuminate\Support\Facades\Cache; use Illuminate\Support\Collection; +use Illuminate\Support\Facades\DB; use MongoDB\BSON\UTCDateTime; -use App\Traits\ScopeActive; +use App\Traits\{QueryCacheableConfig,ScopeActive}; class Domain extends Model { - use HasFactory,ScopeActive; + use HasFactory,ScopeActive,QueryCacheableConfig; + private const CACHE_TIME = 3600; private const STATS_MONTHS = 6; @@ -65,17 +67,19 @@ class Domain extends Model $key = sprintf('%s_%d','daily_area_stats',$this->id); - return Cache::driver('redis')->remember($key,self::CACHE_TIME,function() { - $where = [ - 'echoarea_id'=>$this->echoareas->pluck('id')->toArray(), - 'datetime' => ['$gte',new UTCDateTime(Carbon::now()->subMonths(self::STATS_MONTHS)->startOfMonth())], - ]; +Cache::forget($key); + return Cache::remember($key,self::CACHE_TIME,function() { + $gb ="CONCAT(EXTRACT('year',datetime)::string,'-',LPAD(EXTRACT('month',datetime)::string,2,'0'),'-',LPAD(EXTRACT('day',datetime)::string,2,'0')) AS datetime"; - $echostats = Echomail::countGroupBy(['datetime',['datetime'=>'%Y-%m-%d']],$where); + $echostats = Echomail::select([DB::raw($gb),DB::raw('COUNT(*)')]) + ->whereIn('id',$this->echoareas->pluck('id')->toArray()) + ->where('datetime','>=',Carbon::now()->subMonths(self::STATS_MONTHS)->startOfMonth()) + ->groupBy('datetime') + ->orderBy('datetime') + ->get(); return $echostats - ->sortBy(function($item) { return $item->id->datetime; }) - ->map(function($item) { return ['x'=>Carbon::createFromFormat('Y-m-d',$item->id->datetime)->timestamp*1000,'y'=>$item->count]; }) + ->map(function($item) { return ['x'=>$item->datetime->timestamp*1000,'y'=>$item->count]; }) ->values(); }); } @@ -87,17 +91,19 @@ class Domain extends Model $key = sprintf('%s_%d-%d','daily_echoarea_stats',$this->id,$o->id); - return Cache::driver('redis')->remember($key,self::CACHE_TIME,function() use ($o) { - $where = [ - 'echoarea_id'=>[$o->id], - 'datetime' => ['$gte',new UTCDateTime(Carbon::now()->subMonths(self::STATS_MONTHS)->startOfMonth())], - ]; +Cache::forget($key); + return Cache::remember($key,self::CACHE_TIME,function() use ($o) { + $gb ="CONCAT(EXTRACT('year',datetime)::string,'-',LPAD(EXTRACT('month',datetime)::string,2,'0'),'-',LPAD(EXTRACT('day',datetime)::string,2,'0')) AS datetime"; - $echostats = Echomail::countGroupBy(['datetime',['datetime'=>'%Y-%m-%d']],$where); + $echostats = Echomail::select([DB::raw($gb),DB::raw('COUNT(*)')]) + ->whereIn('echoarea_id',[$o->id]) + ->where('datetime','>=',Carbon::now()->subMonths(self::STATS_MONTHS)->startOfMonth()) + ->groupBy('datetime') + ->orderBy('datetime') + ->get(); return $echostats - ->sortBy(function($item) { return $item->id->datetime; }) - ->map(function($item) { return ['x'=>Carbon::createFromFormat('Y-m-d',$item->id->datetime)->timestamp*1000,'y'=>$item->count]; }) + ->map(function($item) { return ['x'=>$item->datetime->timestamp*1000,'y'=>$item->count]; }) ->values(); }); } diff --git a/app/Models/Echoarea.php b/app/Models/Echoarea.php index a0fcfd4..39dd5b0 100644 --- a/app/Models/Echoarea.php +++ b/app/Models/Echoarea.php @@ -3,14 +3,16 @@ namespace App\Models; use Carbon\Carbon; +use Illuminate\Database\Eloquent\Collection; use Illuminate\Database\Eloquent\Model; use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Facades\Cache; -use App\Traits\{ScopeActive,UsePostgres}; + +use App\Traits\ScopeActive; class Echoarea extends Model { - use SoftDeletes,ScopeActive,UsePostgres; + use SoftDeletes,ScopeActive; private const CACHE_TIME = 3600; @@ -28,28 +30,24 @@ class Echoarea extends Model public function echomail() { - return Echomail::select('*') - ->where('echoarea_id',$this->id); + return $this->hasMany(Echomail::class) + ->orderBy('datetime','ASC'); } /* ATTRIBUTES */ public function getLastMessageAttribute(): ?Carbon { - $key = sprintf('%s_%d','echo_last_message',$this->id); - - return Cache::driver('redis')->remember($key,self::CACHE_TIME,function() { - return ($x=$this->echomail()->orderBy('datetime','DESC')->first()) ? $x->datetime : NULL; - }); + return $this->echomail?->last()->datetime; } /* METHODS */ public function messages_count(int $period): int { - $key = sprintf('%s_%d_%d','echo_mesages_count',$this->id,$period); + $key = sprintf('%s_%d_%d','echo_messages_count',$this->id,$period); - return Cache::driver('redis')->remember($key,self::CACHE_TIME,function() use ($period) { + return Cache::remember($key,self::CACHE_TIME,function() use ($period) { switch ($period) { case 1: // day return $this->echomail()->where('datetime','>=',Carbon::now()->startOfday()->subDay())->count(); @@ -62,4 +60,20 @@ class Echoarea extends Model } }); } + + /** + * 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(); + } } \ No newline at end of file diff --git a/app/Models/Echomail.php b/app/Models/Echomail.php index 457e971..ed959f6 100644 --- a/app/Models/Echomail.php +++ b/app/Models/Echomail.php @@ -3,25 +3,29 @@ namespace App\Models; use Carbon\Carbon; -use Illuminate\Support\Collection; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Facades\DB; use Illuminate\Support\Facades\Log; -use Jenssegers\Mongodb\Eloquent\Model; -use Jenssegers\Mongodb\Eloquent\SoftDeletes; use App\Classes\FTN\Message; use App\Interfaces\Packet; -use App\Traits\{EncodeUTF8,MsgID,UseMongo}; +use App\Traits\{EncodeUTF8,MsgID}; final class Echomail extends Model implements Packet { - use SoftDeletes,MsgID,UseMongo,EncodeUTF8; + use SoftDeletes,EncodeUTF8,MsgID; private const LOGKEY = 'ME-'; + private array $set_seenby = []; + private array $set_path = []; + private ?string $set_packet = NULL; - protected $collection = FALSE; - - protected $casts = [ 'kludges' => 'json' ]; + protected $casts = [ + 'kludges' => 'json', + 'rogue_seenby' => 'json', + 'rogue_path' => 'json', + ]; private const cast_utf8 = [ 'to', @@ -35,6 +39,20 @@ final class Echomail extends Model implements Packet protected $dates = ['datetime']; + public function __set($key, $value) + { + switch ($key) { + case 'set_path': + case 'set_packet': + case 'set_seenby': + $this->{$key} = $value; + break; + + default: + parent::__set($key,$value); + } + } + public static function boot() { parent::boot(); @@ -46,29 +64,43 @@ final class Echomail extends Model implements Packet return; } - // See if we need to export this message. - $exportto = $model->echoarea->addresses->pluck('system')->diff($model->seenby->pluck('system')); - - $export_ao = collect(); - foreach ($model->echoarea->domain->zones as $zo) { - foreach ($exportto as $so) { - $export_ao = $export_ao->merge($so->match($zo)); - } - } - - // Add to export - foreach ($export_ao as $ao) { - Log::info(sprintf('%s:- Exporting message [%s] to [%s]',self::LOGKEY,$model->id,$ao->ftn)); - - DB::table('address_echomail')->insert([ - 'address_id'=>$ao->id, - 'echomail_id'=>$model->id, - 'export_date'=>Carbon::now() + // Save the seenby + foreach ($model->set_seenby as $aoid) { + DB::insert('INSERT INTO echomail_seenby (echomail_id,address_id,packet) VALUES (?,?,?)',[ + $model->id, + $aoid, + $model->set_packet, ]); } - $model->seenby = $model->seenby->merge($export_ao)->pluck('id')->toArray(); - $model->save(); + // Save the Path + $ppoid = NULL; + foreach ($model->set_path as $aoid) { + $po = DB::select('INSERT INTO echomail_path (echomail_id,address_id,parent_id) VALUES (?,?,?) RETURNING id',[ + $model->id, + $aoid, + $ppoid, + ]); + + $ppoid = $po[0]->id; + } + + // See if we need to export this message. + $exportto = $model->echoarea->addresses->pluck('id')->diff($model->set_seenby); + + if ($exportto->count()) { + Log::debug(sprintf('%s:- Exporting message [%s] to [%s]',self::LOGKEY,$model->id,$exportto->join(','))); + + // Save the seenby for the exported systems + $export_at = Carbon::now(); + foreach ($exportto as $aoid) { + DB::insert('INSERT INTO echomail_seenby (echomail_id,address_id,export_at) VALUES (?,?,?)',[ + $model->id, + $aoid, + $export_at, + ]); + } + } }); } @@ -81,35 +113,19 @@ final class Echomail extends Model implements Packet public function fftn() { - return $this - ->setConnection('pgsql') - ->belongsTo(Address::class) + return $this->belongsTo(Address::class) ->withTrashed(); } - /* ATTRIBUTES */ - - public function getKludgesAttribute(?string $value): Collection + public function seenby() { - return collect($this->castAttribute('kludges',$value)); + return $this->belongsToMany(Address::class,'echomail_seenby') + ->ftnOrder(); } - public function getPathAttribute(?array $value): Collection + public function path() { - if (is_null($value)) - return collect(); - - return Address::whereIn('id',$value) - ->orderBy(DB::raw(sprintf("position (id::text in '(%s)')",join(',',$value)))) - ->get(); - } - - public function getSeenByAttribute(?array $value): Collection - { - if (is_null($value)) - return collect(); - - return Address::whereIn('id',$value)->get(); + return $this->belongsToMany(Address::class,'echomail_path'); } /* METHODS */ @@ -149,11 +165,11 @@ final class Echomail extends Model implements Packet if ($this->kludges) $o->kludge = $this->kludges; - $o->kludge->put('mid',$this->id); + $o->kludge->put('dbid',$this->id); $o->msgid = $this->msgid; - if ($this->reply) - $o->reply = $this->reply; + if ($this->replyid) + $o->replyid = $this->replyid; $o->message = $this->msg; diff --git a/app/Models/Netmail.php b/app/Models/Netmail.php index 9130623..71b9369 100644 --- a/app/Models/Netmail.php +++ b/app/Models/Netmail.php @@ -3,19 +3,19 @@ namespace App\Models; use Carbon\Carbon; +use Illuminate\Database\Eloquent\Model; +use Illuminate\Database\Eloquent\SoftDeletes; use Illuminate\Support\Facades\Log; -use Jenssegers\Mongodb\Eloquent\Model; -use Jenssegers\Mongodb\Eloquent\SoftDeletes; use App\Classes\FTN\Message; use App\Interfaces\Packet; -use App\Traits\{EncodeUTF8,UseMongo}; +use App\Traits\EncodeUTF8; final class Netmail extends Model implements Packet { private const LOGKEY = 'MN-'; - use SoftDeletes,UseMongo,EncodeUTF8; + use SoftDeletes,EncodeUTF8; private const cast_utf8 = [ 'to', @@ -80,8 +80,8 @@ final class Netmail extends Model implements Packet $o->flags = $this->flags; $o->msgid = sprintf('%s %08x',$this->fftn->ftn3d,crc32($this->id)); - if ($this->reply) - $o->reply = $this->reply; + if ($this->replyid) + $o->replyid = $this->replyid; $o->message = $this->msg; $o->tagline = $this->tagline; diff --git a/app/Models/System.php b/app/Models/System.php index 1bdcc36..81d60f4 100644 --- a/app/Models/System.php +++ b/app/Models/System.php @@ -8,10 +8,11 @@ use Illuminate\Support\Collection; use Illuminate\Support\Facades\Auth; use App\Http\Controllers\DomainController; +use App\Traits\QueryCacheableConfig; class System extends Model { - use HasFactory; + use HasFactory,QueryCacheableConfig; protected $dates = ['last_session']; @@ -37,10 +38,7 @@ class System extends Model public function addresses() { return $this->hasMany(Address::class) - ->orderBy('region_id') - ->orderBy('host_id') - ->orderBy('node_id') - ->orderBy('point_id'); + ->FTNorder(); } /** diff --git a/app/Models/Zone.php b/app/Models/Zone.php index 106c612..7809630 100644 --- a/app/Models/Zone.php +++ b/app/Models/Zone.php @@ -4,11 +4,11 @@ namespace App\Models; use Illuminate\Database\Eloquent\Model; -use App\Traits\ScopeActive; +use App\Traits\{QueryCacheableConfig,ScopeActive}; class Zone extends Model { - use ScopeActive; + use ScopeActive,QueryCacheableConfig; /* SCOPES */ diff --git a/app/Traits/MsgID.php b/app/Traits/MsgID.php index d224d5f..5eb2347 100644 --- a/app/Traits/MsgID.php +++ b/app/Traits/MsgID.php @@ -7,13 +7,15 @@ namespace App\Traits; use Illuminate\Support\Arr; +use App\Classes\FTN\Message; use App\Models\Setup; trait MsgID { public function save(array $options = []) { - if (! $this->exists) { + // Only create a MSGID for locally generated conetnt + if ((! $this->exists) && ($this->flags & Message::FLAG_LOCAL)) { $ftns = Setup::findOrFail(config('app.id'))->system->match($this->fftn->zone)->first(); if (is_null(Arr::get($this->attributes,'msgid'))) diff --git a/app/Traits/QueryCacheableConfig.php b/app/Traits/QueryCacheableConfig.php new file mode 100644 index 0000000..4c4dcae --- /dev/null +++ b/app/Traits/QueryCacheableConfig.php @@ -0,0 +1,17 @@ +connection('mongodb'); - } - - /* ATTRIBUTES */ - - public function getMsgAttribute($value): string - { - return utf8_decode($value); - } - - public function setMsgAttribute($value): void - { - $this->attributes['msg'] = utf8_encode($value); - } - - public function getSubjectAttribute($value): string - { - return utf8_decode($value); - } - - public function setSubjectAttribute($value): void - { - $this->attributes['subject'] = utf8_encode($value); - } - - /* METHODS */ - - public static function countGroupBy(array $fields,array $where=[]): Collection - { - $query = collect(); - - if (count($where)) { - $where_condition = []; - - foreach ($where as $key => $values) { - if (! is_array($values)) - throw new \Exception('Where values must be an array.'); - - switch ($x=Arr::get($values,0)) { - case '$gt': - case '$gte': - $where_condition[$key] = [ $x => Arr::get($values,1)]; - break; - - case '$in': - default: - $where_condition[$key] = ['$in' => $values]; - } - - } - - $query->push([ - '$match' => [ '$and'=> [$where_condition]] - ]); - } - - $gb = collect(); - foreach ($fields as $field) - if (is_array($field)) { - foreach ($field as $k=>$v) { - $gb->put('datetime',['$dateToString'=>['format'=>$v,'date'=>'$'.$k]]); - } - - } else { - $gb->put($field,'$'.$field); - } - - $query->push([ - '$group' => [ - '_id' => $gb->toArray(), - 'count' => ['$sum' => 1] - ] - ]); - - return (new self) - ->groupBy($field) - ->raw(function($collection) use ($query) { - return $collection->aggregate( - $query->toArray() - ); - }); - } -} \ No newline at end of file diff --git a/app/Traits/UsePostgres.php b/app/Traits/UsePostgres.php deleted file mode 100644 index b8f7c1e..0000000 --- a/app/Traits/UsePostgres.php +++ /dev/null @@ -1,21 +0,0 @@ -connection('pgsql'); - } -} \ No newline at end of file diff --git a/composer.json b/composer.json index fb87d09..920093d 100644 --- a/composer.json +++ b/composer.json @@ -17,6 +17,7 @@ "laravel/framework": "^8.0", "laravel/passport": "^10.1", "laravel/ui": "^3.2", + "leenooks/cockroachdb-laravel": "^0.1.0", "rennokki/laravel-eloquent-query-cache": "^3.1", "repat/laravel-job-models": "^0.5.1" }, @@ -54,6 +55,12 @@ "Tests\\": "tests/" } }, + "repositories": [ + { + "type": "vcs", + "url": "https://github.com/leenooks/cockroachdb-laravel" + } + ], "minimum-stability": "dev", "prefer-stable": true, "scripts": { diff --git a/composer.lock b/composer.lock index 83b8313..9431443 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "ce91f28a8503b610f0e0821fcc294062", + "content-hash": "d50e86483866e3133540660e44e8d69f", "packages": [ { "name": "asm89/stack-cors", @@ -122,79 +122,6 @@ ], "time": "2021-08-15T20:50:18+00:00" }, - { - "name": "composer/package-versions-deprecated", - "version": "1.11.99.4", - "source": { - "type": "git", - "url": "https://github.com/composer/package-versions-deprecated.git", - "reference": "b174585d1fe49ceed21928a945138948cb394600" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b174585d1fe49ceed21928a945138948cb394600", - "reference": "b174585d1fe49ceed21928a945138948cb394600", - "shasum": "" - }, - "require": { - "composer-plugin-api": "^1.1.0 || ^2.0", - "php": "^7 || ^8" - }, - "replace": { - "ocramius/package-versions": "1.11.99" - }, - "require-dev": { - "composer/composer": "^1.9.3 || ^2.0@dev", - "ext-zip": "^1.13", - "phpunit/phpunit": "^6.5 || ^7" - }, - "type": "composer-plugin", - "extra": { - "class": "PackageVersions\\Installer", - "branch-alias": { - "dev-master": "1.x-dev" - } - }, - "autoload": { - "psr-4": { - "PackageVersions\\": "src/PackageVersions" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Marco Pivetta", - "email": "ocramius@gmail.com" - }, - { - "name": "Jordi Boggiano", - "email": "j.boggiano@seld.be" - } - ], - "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", - "support": { - "issues": "https://github.com/composer/package-versions-deprecated/issues", - "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.4" - }, - "funding": [ - { - "url": "https://packagist.com", - "type": "custom" - }, - { - "url": "https://github.com/composer", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/composer/composer", - "type": "tidelift" - } - ], - "time": "2021-09-13T08:41:34+00:00" - }, { "name": "defuse/php-encryption", "version": "v2.3.1", @@ -951,24 +878,28 @@ }, { "name": "jean85/pretty-package-versions", - "version": "1.6.0", + "version": "2.0.5", "source": { "type": "git", "url": "https://github.com/Jean85/pretty-package-versions.git", - "reference": "1e0104b46f045868f11942aea058cd7186d6c303" + "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/1e0104b46f045868f11942aea058cd7186d6c303", - "reference": "1e0104b46f045868f11942aea058cd7186d6c303", + "url": "https://api.github.com/repos/Jean85/pretty-package-versions/zipball/ae547e455a3d8babd07b96966b17d7fd21d9c6af", + "reference": "ae547e455a3d8babd07b96966b17d7fd21d9c6af", "shasum": "" }, "require": { - "composer/package-versions-deprecated": "^1.8.0", - "php": "^7.0|^8.0" + "composer-runtime-api": "^2.0.0", + "php": "^7.1|^8.0" }, "require-dev": { - "phpunit/phpunit": "^6.0|^8.5|^9.2" + "friendsofphp/php-cs-fixer": "^2.17", + "jean85/composer-provided-replaced-stub-package": "^1.0", + "phpstan/phpstan": "^0.12.66", + "phpunit/phpunit": "^7.5|^8.5|^9.4", + "vimeo/psalm": "^4.3" }, "type": "library", "extra": { @@ -991,7 +922,7 @@ "email": "alessandro.lai85@gmail.com" } ], - "description": "A wrapper for ocramius/package-versions to get pretty versions strings", + "description": "A library to get pretty versions strings of installed dependencies", "keywords": [ "composer", "package", @@ -1000,9 +931,9 @@ ], "support": { "issues": "https://github.com/Jean85/pretty-package-versions/issues", - "source": "https://github.com/Jean85/pretty-package-versions/tree/1.6.0" + "source": "https://github.com/Jean85/pretty-package-versions/tree/2.0.5" }, - "time": "2021-02-04T16:20:16+00:00" + "time": "2021-10-08T21:21:46+00:00" }, { "name": "jenssegers/mongodb", @@ -1088,16 +1019,16 @@ }, { "name": "laravel/framework", - "version": "v8.73.2", + "version": "v8.77.1", "source": { "type": "git", "url": "https://github.com/laravel/framework.git", - "reference": "0e1c63315eeaee5920552ff042bd820bb4014533" + "reference": "994dbac5c6da856c77c81a411cff5b7d31519ca8" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/framework/zipball/0e1c63315eeaee5920552ff042bd820bb4014533", - "reference": "0e1c63315eeaee5920552ff042bd820bb4014533", + "url": "https://api.github.com/repos/laravel/framework/zipball/994dbac5c6da856c77c81a411cff5b7d31519ca8", + "reference": "994dbac5c6da856c77c81a411cff5b7d31519ca8", "shasum": "" }, "require": { @@ -1115,19 +1046,19 @@ "opis/closure": "^3.6", "php": "^7.3|^8.0", "psr/container": "^1.0", - "psr/log": "^1.0 || ^2.0", + "psr/log": "^1.0|^2.0", "psr/simple-cache": "^1.0", "ramsey/uuid": "^4.2.2", "swiftmailer/swiftmailer": "^6.3", - "symfony/console": "^5.1.4", - "symfony/error-handler": "^5.1.4", - "symfony/finder": "^5.1.4", - "symfony/http-foundation": "^5.1.4", - "symfony/http-kernel": "^5.1.4", - "symfony/mime": "^5.1.4", - "symfony/process": "^5.1.4", - "symfony/routing": "^5.1.4", - "symfony/var-dumper": "^5.1.4", + "symfony/console": "^5.4", + "symfony/error-handler": "^5.4", + "symfony/finder": "^5.4", + "symfony/http-foundation": "^5.4", + "symfony/http-kernel": "^5.4", + "symfony/mime": "^5.4", + "symfony/process": "^5.4", + "symfony/routing": "^5.4", + "symfony/var-dumper": "^5.4", "tijsverkoyen/css-to-inline-styles": "^2.2.2", "vlucas/phpdotenv": "^5.2", "voku/portable-ascii": "^1.4.8" @@ -1183,7 +1114,7 @@ "pda/pheanstalk": "^4.0", "phpunit/phpunit": "^8.5.19|^9.5.8", "predis/predis": "^1.1.9", - "symfony/cache": "^5.1.4" + "symfony/cache": "^5.4" }, "suggest": { "aws/aws-sdk-php": "Required to use the SQS queue driver, DynamoDb failed job storage and SES mail driver (^3.198.1).", @@ -1210,8 +1141,8 @@ "predis/predis": "Required to use the predis connector (^1.1.9).", "psr/http-message": "Required to allow Storage::put to accept a StreamInterface (^1.0).", "pusher/pusher-php-server": "Required to use the Pusher broadcast driver (^4.0|^5.0|^6.0|^7.0).", - "symfony/cache": "Required to PSR-6 cache bridge (^5.1.4).", - "symfony/filesystem": "Required to enable support for relative symbolic links (^5.1.4).", + "symfony/cache": "Required to PSR-6 cache bridge (^5.4).", + "symfony/filesystem": "Required to enable support for relative symbolic links (^5.4).", "symfony/psr-http-message-bridge": "Required to use PSR-7 bridging features (^2.0).", "wildbit/swiftmailer-postmark": "Required to use Postmark mail driver (^3.0)." }, @@ -1256,20 +1187,20 @@ "issues": "https://github.com/laravel/framework/issues", "source": "https://github.com/laravel/framework" }, - "time": "2021-11-23T14:27:43+00:00" + "time": "2021-12-21T20:22:29+00:00" }, { "name": "laravel/passport", - "version": "v10.2.0", + "version": "v10.2.2", "source": { "type": "git", "url": "https://github.com/laravel/passport.git", - "reference": "1c69a010930a3ce8db348967d8ad9585be4d7d4d" + "reference": "7981abed1a0979afd4a5a8bec81624b8127a287f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/passport/zipball/1c69a010930a3ce8db348967d8ad9585be4d7d4d", - "reference": "1c69a010930a3ce8db348967d8ad9585be4d7d4d", + "url": "https://api.github.com/repos/laravel/passport/zipball/7981abed1a0979afd4a5a8bec81624b8127a287f", + "reference": "7981abed1a0979afd4a5a8bec81624b8127a287f", "shasum": "" }, "require": { @@ -1333,20 +1264,20 @@ "issues": "https://github.com/laravel/passport/issues", "source": "https://github.com/laravel/passport" }, - "time": "2021-11-02T16:45:51+00:00" + "time": "2021-12-07T16:57:03+00:00" }, { "name": "laravel/serializable-closure", - "version": "v1.0.4", + "version": "v1.0.5", "source": { "type": "git", "url": "https://github.com/laravel/serializable-closure.git", - "reference": "8148e72e6c2c3af7f05640ada1b26c3bca970f8d" + "reference": "25de3be1bca1b17d52ff0dc02b646c667ac7266c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/8148e72e6c2c3af7f05640ada1b26c3bca970f8d", - "reference": "8148e72e6c2c3af7f05640ada1b26c3bca970f8d", + "url": "https://api.github.com/repos/laravel/serializable-closure/zipball/25de3be1bca1b17d52ff0dc02b646c667ac7266c", + "reference": "25de3be1bca1b17d52ff0dc02b646c667ac7266c", "shasum": "" }, "require": { @@ -1392,20 +1323,20 @@ "issues": "https://github.com/laravel/serializable-closure/issues", "source": "https://github.com/laravel/serializable-closure" }, - "time": "2021-11-16T17:01:57+00:00" + "time": "2021-11-30T15:53:04+00:00" }, { "name": "laravel/ui", - "version": "v3.3.3", + "version": "v3.4.1", "source": { "type": "git", "url": "https://github.com/laravel/ui.git", - "reference": "08ea313a35dfc89ff0cd9916ca0bcef9715d0ed6" + "reference": "9a1e52442dd238647905b98d773d59e438eb9f9d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/laravel/ui/zipball/08ea313a35dfc89ff0cd9916ca0bcef9715d0ed6", - "reference": "08ea313a35dfc89ff0cd9916ca0bcef9715d0ed6", + "url": "https://api.github.com/repos/laravel/ui/zipball/9a1e52442dd238647905b98d773d59e438eb9f9d", + "reference": "9a1e52442dd238647905b98d773d59e438eb9f9d", "shasum": "" }, "require": { @@ -1415,6 +1346,9 @@ "illuminate/validation": "^8.42|^9.0", "php": "^7.3|^8.0" }, + "require-dev": { + "orchestra/testbench": "^6.23|^7.0" + }, "type": "library", "extra": { "branch-alias": { @@ -1448,9 +1382,9 @@ "ui" ], "support": { - "source": "https://github.com/laravel/ui/tree/v3.3.3" + "source": "https://github.com/laravel/ui/tree/v3.4.1" }, - "time": "2021-11-21T22:20:05+00:00" + "time": "2021-12-22T10:40:50+00:00" }, { "name": "lcobucci/clock", @@ -1588,16 +1522,16 @@ }, { "name": "league/commonmark", - "version": "2.0.2", + "version": "2.1.0", "source": { "type": "git", "url": "https://github.com/thephpleague/commonmark.git", - "reference": "2df87709f44b0dd733df86aef0830dce9b1f0f13" + "reference": "819276bc54e83c160617d3ac0a436c239e479928" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/2df87709f44b0dd733df86aef0830dce9b1f0f13", - "reference": "2df87709f44b0dd733df86aef0830dce9b1f0f13", + "url": "https://api.github.com/repos/thephpleague/commonmark/zipball/819276bc54e83c160617d3ac0a436c239e479928", + "reference": "819276bc54e83c160617d3ac0a436c239e479928", "shasum": "" }, "require": { @@ -1616,11 +1550,11 @@ "ext-json": "*", "github/gfm": "0.29.0", "michelf/php-markdown": "^1.4", - "phpstan/phpstan": "^0.12.88", + "phpstan/phpstan": "^0.12.88 || ^1.0.0", "phpunit/phpunit": "^9.5.5", "scrutinizer/ocular": "^1.8.1", "symfony/finder": "^5.3", - "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0", + "symfony/yaml": "^2.3 | ^3.0 | ^4.0 | ^5.0 | ^6.0", "unleashedtech/php-coding-standard": "^3.1", "vimeo/psalm": "^4.7.3" }, @@ -1630,7 +1564,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.1-dev" + "dev-main": "2.2-dev" } }, "autoload": { @@ -1670,10 +1604,6 @@ "source": "https://github.com/thephpleague/commonmark" }, "funding": [ - { - "url": "https://enjoy.gitstore.app/repositories/thephpleague/commonmark", - "type": "custom" - }, { "url": "https://www.colinodell.com/sponsor", "type": "custom" @@ -1686,16 +1616,12 @@ "url": "https://github.com/colinodell", "type": "github" }, - { - "url": "https://www.patreon.com/colinodell", - "type": "patreon" - }, { "url": "https://tidelift.com/funding/github/packagist/league/commonmark", "type": "tidelift" } ], - "time": "2021-08-14T14:06:04+00:00" + "time": "2021-12-05T18:25:20+00:00" }, { "name": "league/config", @@ -1835,16 +1761,16 @@ }, { "name": "league/flysystem", - "version": "1.1.6", + "version": "1.1.9", "source": { "type": "git", "url": "https://github.com/thephpleague/flysystem.git", - "reference": "627be7fcde84c71aa0f15097fcf48fd5f2be5287" + "reference": "094defdb4a7001845300334e7c1ee2335925ef99" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/627be7fcde84c71aa0f15097fcf48fd5f2be5287", - "reference": "627be7fcde84c71aa0f15097fcf48fd5f2be5287", + "url": "https://api.github.com/repos/thephpleague/flysystem/zipball/094defdb4a7001845300334e7c1ee2335925ef99", + "reference": "094defdb4a7001845300334e7c1ee2335925ef99", "shasum": "" }, "require": { @@ -1917,7 +1843,7 @@ ], "support": { "issues": "https://github.com/thephpleague/flysystem/issues", - "source": "https://github.com/thephpleague/flysystem/tree/1.1.6" + "source": "https://github.com/thephpleague/flysystem/tree/1.1.9" }, "funding": [ { @@ -1925,7 +1851,7 @@ "type": "other" } ], - "time": "2021-11-21T11:04:36+00:00" + "time": "2021-12-09T09:40:50+00:00" }, { "name": "league/mime-type-detection", @@ -2071,35 +1997,91 @@ "time": "2021-10-11T20:41:49+00:00" }, { - "name": "mongodb/mongodb", - "version": "1.8.0", + "name": "leenooks/cockroachdb-laravel", + "version": "0.1.1", "source": { "type": "git", - "url": "https://github.com/mongodb/mongo-php-library.git", - "reference": "953dbc19443aa9314c44b7217a16873347e6840d" + "url": "https://github.com/leenooks/cockroachdb-laravel.git", + "reference": "16a0e063c37018124061adaf2a5a8166fff3c44e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/953dbc19443aa9314c44b7217a16873347e6840d", - "reference": "953dbc19443aa9314c44b7217a16873347e6840d", + "url": "https://api.github.com/repos/leenooks/cockroachdb-laravel/zipball/16a0e063c37018124061adaf2a5a8166fff3c44e", + "reference": "16a0e063c37018124061adaf2a5a8166fff3c44e", + "shasum": "" + }, + "require-dev": { + "illuminate/database": "^8.32", + "illuminate/support": "^8.32" + }, + "type": "package", + "extra": { + "laravel": { + "providers": [ + "Nbj\\Cockroach\\CockroachServiceProvider" + ] + } + }, + "autoload": { + "psr-4": { + "Nbj\\": "src/" + } + }, + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Nikolaj Boel Jensen", + "email": "nbj@cego.dk" + }, + { + "name": "Deon George", + "email": "deon@leenooks.net" + } + ], + "description": "CockroachDB driver for Laravel 8", + "keywords": [ + "cockroach", + "cockroachdb", + "laravel" + ], + "support": { + "source": "https://github.com/leenooks/cockroachdb-laravel/tree/0.1.1" + }, + "time": "2022-01-01T02:50:36+00:00" + }, + { + "name": "mongodb/mongodb", + "version": "1.10.1", + "source": { + "type": "git", + "url": "https://github.com/mongodb/mongo-php-library.git", + "reference": "9e0da590ec94e8af9a0ee065294627ffaee6244e" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/mongodb/mongo-php-library/zipball/9e0da590ec94e8af9a0ee065294627ffaee6244e", + "reference": "9e0da590ec94e8af9a0ee065294627ffaee6244e", "shasum": "" }, "require": { "ext-hash": "*", "ext-json": "*", - "ext-mongodb": "^1.8.1", - "jean85/pretty-package-versions": "^1.2", - "php": "^7.0 || ^8.0", + "ext-mongodb": "^1.11.0", + "jean85/pretty-package-versions": "^1.2 || ^2.0.1", + "php": "^7.1 || ^8.0", "symfony/polyfill-php80": "^1.19" }, "require-dev": { - "squizlabs/php_codesniffer": "^3.5, <3.5.5", - "symfony/phpunit-bridge": "5.x-dev" + "doctrine/coding-standard": "^9.0", + "squizlabs/php_codesniffer": "^3.6", + "symfony/phpunit-bridge": "^5.2" }, "type": "library", "extra": { "branch-alias": { - "dev-master": "1.8.x-dev" + "dev-master": "1.10.x-dev" } }, "autoload": { @@ -2134,9 +2116,9 @@ ], "support": { "issues": "https://github.com/mongodb/mongo-php-library/issues", - "source": "https://github.com/mongodb/mongo-php-library/tree/1.8.0" + "source": "https://github.com/mongodb/mongo-php-library/tree/1.10.1" }, - "time": "2020-11-25T12:26:02+00:00" + "time": "2021-12-06T21:42:33+00:00" }, { "name": "monolog/monolog", @@ -2239,16 +2221,16 @@ }, { "name": "nesbot/carbon", - "version": "2.54.0", + "version": "2.55.2", "source": { "type": "git", "url": "https://github.com/briannesbitt/Carbon.git", - "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5" + "reference": "8c2a18ce3e67c34efc1b29f64fe61304368259a2" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/eed83939f1aed3eee517d03a33f5ec587ac529b5", - "reference": "eed83939f1aed3eee517d03a33f5ec587ac529b5", + "url": "https://api.github.com/repos/briannesbitt/Carbon/zipball/8c2a18ce3e67c34efc1b29f64fe61304368259a2", + "reference": "8c2a18ce3e67c34efc1b29f64fe61304368259a2", "shasum": "" }, "require": { @@ -2256,7 +2238,7 @@ "php": "^7.1.8 || ^8.0", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16", - "symfony/translation": "^3.4 || ^4.0 || ^5.0" + "symfony/translation": "^3.4 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { "doctrine/dbal": "^2.0 || ^3.0", @@ -2317,6 +2299,7 @@ "time" ], "support": { + "docs": "https://carbon.nesbot.com/docs", "issues": "https://github.com/briannesbitt/Carbon/issues", "source": "https://github.com/briannesbitt/Carbon" }, @@ -2330,7 +2313,7 @@ "type": "tidelift" } ], - "time": "2021-11-01T21:22:20+00:00" + "time": "2021-12-03T14:59:52+00:00" }, { "name": "nette/schema", @@ -2794,16 +2777,16 @@ }, { "name": "phpoption/phpoption", - "version": "1.8.0", + "version": "1.8.1", "source": { "type": "git", "url": "https://github.com/schmittjoh/php-option.git", - "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28" + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/5455cb38aed4523f99977c4a12ef19da4bfe2a28", - "reference": "5455cb38aed4523f99977c4a12ef19da4bfe2a28", + "url": "https://api.github.com/repos/schmittjoh/php-option/zipball/eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", + "reference": "eab7a0df01fe2344d172bff4cd6dbd3f8b84ad15", "shasum": "" }, "require": { @@ -2811,7 +2794,7 @@ }, "require-dev": { "bamarni/composer-bin-plugin": "^1.4.1", - "phpunit/phpunit": "^6.5.14 || ^7.0.20 || ^8.5.19 || ^9.5.8" + "phpunit/phpunit": "^6.5.14 || ^7.5.20 || ^8.5.19 || ^9.5.8" }, "type": "library", "extra": { @@ -2831,11 +2814,13 @@ "authors": [ { "name": "Johannes M. Schmitt", - "email": "schmittjoh@gmail.com" + "email": "schmittjoh@gmail.com", + "homepage": "https://github.com/schmittjoh" }, { "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk" + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" } ], "description": "Option Type for PHP", @@ -2847,7 +2832,7 @@ ], "support": { "issues": "https://github.com/schmittjoh/php-option/issues", - "source": "https://github.com/schmittjoh/php-option/tree/1.8.0" + "source": "https://github.com/schmittjoh/php-option/tree/1.8.1" }, "funding": [ { @@ -2859,20 +2844,20 @@ "type": "tidelift" } ], - "time": "2021-08-28T21:27:29+00:00" + "time": "2021-12-04T23:24:31+00:00" }, { "name": "phpseclib/phpseclib", - "version": "3.0.11", + "version": "3.0.12", "source": { "type": "git", "url": "https://github.com/phpseclib/phpseclib.git", - "reference": "6e794226a35159eb06f355efe59a0075a16551dd" + "reference": "89bfb45bd8b1abc3b37e910d57f5dbd3174f40fb" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/6e794226a35159eb06f355efe59a0075a16551dd", - "reference": "6e794226a35159eb06f355efe59a0075a16551dd", + "url": "https://api.github.com/repos/phpseclib/phpseclib/zipball/89bfb45bd8b1abc3b37e910d57f5dbd3174f40fb", + "reference": "89bfb45bd8b1abc3b37e910d57f5dbd3174f40fb", "shasum": "" }, "require": { @@ -2954,7 +2939,7 @@ ], "support": { "issues": "https://github.com/phpseclib/phpseclib/issues", - "source": "https://github.com/phpseclib/phpseclib/tree/3.0.11" + "source": "https://github.com/phpseclib/phpseclib/tree/3.0.12" }, "funding": [ { @@ -2970,7 +2955,7 @@ "type": "tidelift" } ], - "time": "2021-10-27T03:01:46+00:00" + "time": "2021-11-28T23:46:03+00:00" }, { "name": "psr/container", @@ -3458,16 +3443,16 @@ }, { "name": "rennokki/laravel-eloquent-query-cache", - "version": "3.1.3", + "version": "3.1.4", "source": { "type": "git", "url": "https://github.com/renoki-co/laravel-eloquent-query-cache.git", - "reference": "ad4a9d935ddd355da9af0a086f33f2d64212da09" + "reference": "24d6aec2d2a097a64f8b44354462e3dd83c52e4d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/renoki-co/laravel-eloquent-query-cache/zipball/ad4a9d935ddd355da9af0a086f33f2d64212da09", - "reference": "ad4a9d935ddd355da9af0a086f33f2d64212da09", + "url": "https://api.github.com/repos/renoki-co/laravel-eloquent-query-cache/zipball/24d6aec2d2a097a64f8b44354462e3dd83c52e4d", + "reference": "24d6aec2d2a097a64f8b44354462e3dd83c52e4d", "shasum": "" }, "require": { @@ -3479,7 +3464,7 @@ "laravel/legacy-factories": "^1.1", "mockery/mockery": "^1.4", "orchestra/database": "^5.0|^6.0", - "orchestra/testbench": "^5.0|^6.0" + "orchestra/testbench": "^6.23.1" }, "type": "library", "autoload": { @@ -3511,15 +3496,15 @@ ], "support": { "issues": "https://github.com/renoki-co/laravel-eloquent-query-cache/issues", - "source": "https://github.com/renoki-co/laravel-eloquent-query-cache/tree/3.1.3" + "source": "https://github.com/renoki-co/laravel-eloquent-query-cache/tree/3.1.4" }, "funding": [ { - "url": "https://www.patreon.com/rennokki", - "type": "patreon" + "url": "https://github.com/rennokki", + "type": "github" } ], - "time": "2021-11-05T22:03:48+00:00" + "time": "2021-12-07T14:46:30+00:00" }, { "name": "repat/laravel-job-models", @@ -3651,28 +3636,29 @@ }, { "name": "symfony/console", - "version": "v5.3.11", + "version": "v5.4.2", "source": { "type": "git", "url": "https://github.com/symfony/console.git", - "reference": "3e7ab8f5905058984899b05a4648096f558bfeba" + "reference": "a2c6b7ced2eb7799a35375fb9022519282b5405e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/console/zipball/3e7ab8f5905058984899b05a4648096f558bfeba", - "reference": "3e7ab8f5905058984899b05a4648096f558bfeba", + "url": "https://api.github.com/repos/symfony/console/zipball/a2c6b7ced2eb7799a35375fb9022519282b5405e", + "reference": "a2c6b7ced2eb7799a35375fb9022519282b5405e", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php73": "^1.8", + "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16", - "symfony/service-contracts": "^1.1|^2", - "symfony/string": "^5.1" + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/string": "^5.1|^6.0" }, "conflict": { + "psr/log": ">=3", "symfony/dependency-injection": "<4.4", "symfony/dotenv": "<5.1", "symfony/event-dispatcher": "<4.4", @@ -3684,12 +3670,12 @@ }, "require-dev": { "psr/log": "^1|^2", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/event-dispatcher": "^4.4|^5.0", - "symfony/lock": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/var-dumper": "^4.4|^5.0" + "symfony/config": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^4.4|^5.0|^6.0", + "symfony/lock": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "suggest": { "psr/log": "For using the console logger", @@ -3729,7 +3715,7 @@ "terminal" ], "support": { - "source": "https://github.com/symfony/console/tree/v5.3.11" + "source": "https://github.com/symfony/console/tree/v5.4.2" }, "funding": [ { @@ -3745,25 +3731,24 @@ "type": "tidelift" } ], - "time": "2021-11-21T19:41:05+00:00" + "time": "2021-12-20T16:11:12+00:00" }, { "name": "symfony/css-selector", - "version": "v5.3.4", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/css-selector.git", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90" + "reference": "380f86c1a9830226f42a08b5926f18aed4195f25" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/css-selector/zipball/7fb120adc7f600a59027775b224c13a33530dd90", - "reference": "7fb120adc7f600a59027775b224c13a33530dd90", + "url": "https://api.github.com/repos/symfony/css-selector/zipball/380f86c1a9830226f42a08b5926f18aed4195f25", + "reference": "380f86c1a9830226f42a08b5926f18aed4195f25", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2" }, "type": "library", "autoload": { @@ -3795,7 +3780,7 @@ "description": "Converts CSS selectors to XPath expressions", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/css-selector/tree/v5.3.4" + "source": "https://github.com/symfony/css-selector/tree/v6.0.2" }, "funding": [ { @@ -3811,29 +3796,29 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:38:00+00:00" + "time": "2021-12-16T22:13:01+00:00" }, { "name": "symfony/deprecation-contracts", - "version": "v2.5.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/deprecation-contracts.git", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8" + "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/6f981ee24cf69ee7ce9736146d1c57c2780598a8", - "reference": "6f981ee24cf69ee7ce9736146d1c57c2780598a8", + "url": "https://api.github.com/repos/symfony/deprecation-contracts/zipball/c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", + "reference": "c726b64c1ccfe2896cb7df2e1331c357ad1c8ced", "shasum": "" }, "require": { - "php": ">=7.1" + "php": ">=8.0.2" }, "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.0-dev" }, "thanks": { "name": "symfony/contracts", @@ -3862,7 +3847,7 @@ "description": "A generic function and convention to trigger deprecation notices", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/deprecation-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/deprecation-contracts/tree/v3.0.0" }, "funding": [ { @@ -3878,32 +3863,35 @@ "type": "tidelift" } ], - "time": "2021-07-12T14:48:14+00:00" + "time": "2021-11-01T23:48:49+00:00" }, { "name": "symfony/error-handler", - "version": "v5.3.11", + "version": "v5.4.2", "source": { "type": "git", "url": "https://github.com/symfony/error-handler.git", - "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3" + "reference": "e0c0dd0f9d4120a20158fc9aec2367d07d38bc56" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/error-handler/zipball/eec73dd7218713f48a7996583a741b3bae58c8d3", - "reference": "eec73dd7218713f48a7996583a741b3bae58c8d3", + "url": "https://api.github.com/repos/symfony/error-handler/zipball/e0c0dd0f9d4120a20158fc9aec2367d07d38bc56", + "reference": "e0c0dd0f9d4120a20158fc9aec2367d07d38bc56", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/log": "^1|^2|^3", - "symfony/var-dumper": "^4.4|^5.0" + "symfony/var-dumper": "^4.4|^5.0|^6.0" }, "require-dev": { - "symfony/deprecation-contracts": "^2.1", - "symfony/http-kernel": "^4.4|^5.0", - "symfony/serializer": "^4.4|^5.0" + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/http-kernel": "^4.4|^5.0|^6.0", + "symfony/serializer": "^4.4|^5.0|^6.0" }, + "bin": [ + "Resources/bin/patch-type-declarations" + ], "type": "library", "autoload": { "psr-4": { @@ -3930,7 +3918,7 @@ "description": "Provides tools to manage errors and ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/error-handler/tree/v5.3.11" + "source": "https://github.com/symfony/error-handler/tree/v5.4.2" }, "funding": [ { @@ -3946,44 +3934,42 @@ "type": "tidelift" } ], - "time": "2021-11-13T13:42:37+00:00" + "time": "2021-12-19T20:02:00+00:00" }, { "name": "symfony/event-dispatcher", - "version": "v5.3.11", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher.git", - "reference": "661a7a6e085394f8513945669e31f7c1338a7e69" + "reference": "7093f25359e2750bfe86842c80c4e4a6a852d05c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/661a7a6e085394f8513945669e31f7c1338a7e69", - "reference": "661a7a6e085394f8513945669e31f7c1338a7e69", + "url": "https://api.github.com/repos/symfony/event-dispatcher/zipball/7093f25359e2750bfe86842c80c4e4a6a852d05c", + "reference": "7093f25359e2750bfe86842c80c4e4a6a852d05c", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", - "symfony/event-dispatcher-contracts": "^2", - "symfony/polyfill-php80": "^1.16" + "php": ">=8.0.2", + "symfony/event-dispatcher-contracts": "^2|^3" }, "conflict": { - "symfony/dependency-injection": "<4.4" + "symfony/dependency-injection": "<5.4" }, "provide": { "psr/event-dispatcher-implementation": "1.0", - "symfony/event-dispatcher-implementation": "2.0" + "symfony/event-dispatcher-implementation": "2.0|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/error-handler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/service-contracts": "^1.1|^2", - "symfony/stopwatch": "^4.4|^5.0" + "symfony/config": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/error-handler": "^5.4|^6.0", + "symfony/expression-language": "^5.4|^6.0", + "symfony/http-foundation": "^5.4|^6.0", + "symfony/service-contracts": "^1.1|^2|^3", + "symfony/stopwatch": "^5.4|^6.0" }, "suggest": { "symfony/dependency-injection": "", @@ -4015,7 +4001,7 @@ "description": "Provides tools that allow your application components to communicate with each other by dispatching events and listening to them", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/event-dispatcher/tree/v5.3.11" + "source": "https://github.com/symfony/event-dispatcher/tree/v6.0.2" }, "funding": [ { @@ -4031,24 +4017,24 @@ "type": "tidelift" } ], - "time": "2021-11-17T12:16:12+00:00" + "time": "2021-12-21T10:43:13+00:00" }, { "name": "symfony/event-dispatcher-contracts", - "version": "v2.5.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/event-dispatcher-contracts.git", - "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a" + "reference": "aa5422287b75594b90ee9cd807caf8f0df491385" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", - "reference": "66bea3b09be61613cd3b4043a65a8ec48cfa6d2a", + "url": "https://api.github.com/repos/symfony/event-dispatcher-contracts/zipball/aa5422287b75594b90ee9cd807caf8f0df491385", + "reference": "aa5422287b75594b90ee9cd807caf8f0df491385", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "psr/event-dispatcher": "^1" }, "suggest": { @@ -4057,7 +4043,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.0-dev" }, "thanks": { "name": "symfony/contracts", @@ -4094,7 +4080,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/event-dispatcher-contracts/tree/v3.0.0" }, "funding": [ { @@ -4110,24 +4096,25 @@ "type": "tidelift" } ], - "time": "2021-07-12T14:48:14+00:00" + "time": "2021-07-15T12:33:35+00:00" }, { "name": "symfony/finder", - "version": "v5.3.7", + "version": "v5.4.2", "source": { "type": "git", "url": "https://github.com/symfony/finder.git", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93" + "reference": "e77046c252be48c48a40816187ed527703c8f76c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/finder/zipball/a10000ada1e600d109a6c7632e9ac42e8bf2fb93", - "reference": "a10000ada1e600d109a6c7632e9ac42e8bf2fb93", + "url": "https://api.github.com/repos/symfony/finder/zipball/e77046c252be48c48a40816187ed527703c8f76c", + "reference": "e77046c252be48c48a40816187ed527703c8f76c", "shasum": "" }, "require": { "php": ">=7.2.5", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "type": "library", @@ -4156,7 +4143,7 @@ "description": "Finds files and directories via an intuitive fluent interface", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/finder/tree/v5.3.7" + "source": "https://github.com/symfony/finder/tree/v5.4.2" }, "funding": [ { @@ -4172,111 +4159,33 @@ "type": "tidelift" } ], - "time": "2021-08-04T21:20:46+00:00" - }, - { - "name": "symfony/http-client-contracts", - "version": "v2.5.0", - "source": { - "type": "git", - "url": "https://github.com/symfony/http-client-contracts.git", - "reference": "ec82e57b5b714dbb69300d348bd840b345e24166" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/symfony/http-client-contracts/zipball/ec82e57b5b714dbb69300d348bd840b345e24166", - "reference": "ec82e57b5b714dbb69300d348bd840b345e24166", - "shasum": "" - }, - "require": { - "php": ">=7.2.5" - }, - "suggest": { - "symfony/http-client-implementation": "" - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "2.5-dev" - }, - "thanks": { - "name": "symfony/contracts", - "url": "https://github.com/symfony/contracts" - } - }, - "autoload": { - "psr-4": { - "Symfony\\Contracts\\HttpClient\\": "" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Nicolas Grekas", - "email": "p@tchwork.com" - }, - { - "name": "Symfony Community", - "homepage": "https://symfony.com/contributors" - } - ], - "description": "Generic abstractions related to HTTP clients", - "homepage": "https://symfony.com", - "keywords": [ - "abstractions", - "contracts", - "decoupling", - "interfaces", - "interoperability", - "standards" - ], - "support": { - "source": "https://github.com/symfony/http-client-contracts/tree/v2.5.0" - }, - "funding": [ - { - "url": "https://symfony.com/sponsor", - "type": "custom" - }, - { - "url": "https://github.com/fabpot", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/symfony/symfony", - "type": "tidelift" - } - ], - "time": "2021-11-03T09:24:47+00:00" + "time": "2021-12-15T11:06:13+00:00" }, { "name": "symfony/http-foundation", - "version": "v5.3.11", + "version": "v5.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-foundation.git", - "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc" + "reference": "ce952af52877eaf3eab5d0c08cc0ea865ed37313" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-foundation/zipball/d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", - "reference": "d1e7059ebeb0b8f9fe5eb5b26eacd2e3c1f371cc", + "url": "https://api.github.com/repos/symfony/http-foundation/zipball/ce952af52877eaf3eab5d0c08cc0ea865ed37313", + "reference": "ce952af52877eaf3eab5d0c08cc0ea865ed37313", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-mbstring": "~1.1", "symfony/polyfill-php80": "^1.16" }, "require-dev": { "predis/predis": "~1.0", - "symfony/cache": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/mime": "^4.4|^5.0" + "symfony/cache": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/mime": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/mime": "To use the file extension guesser" @@ -4307,7 +4216,7 @@ "description": "Defines an object-oriented layer for the HTTP specification", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-foundation/tree/v5.3.11" + "source": "https://github.com/symfony/http-foundation/tree/v5.4.2" }, "funding": [ { @@ -4323,36 +4232,35 @@ "type": "tidelift" } ], - "time": "2021-11-04T16:37:19+00:00" + "time": "2021-12-28T17:15:56+00:00" }, { "name": "symfony/http-kernel", - "version": "v5.3.12", + "version": "v5.4.2", "source": { "type": "git", "url": "https://github.com/symfony/http-kernel.git", - "reference": "f53025cd1d91b1af85d6d9e17eefa98e31ee953b" + "reference": "35b7e9868953e0d1df84320bb063543369e43ef5" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/http-kernel/zipball/f53025cd1d91b1af85d6d9e17eefa98e31ee953b", - "reference": "f53025cd1d91b1af85d6d9e17eefa98e31ee953b", + "url": "https://api.github.com/repos/symfony/http-kernel/zipball/35b7e9868953e0d1df84320bb063543369e43ef5", + "reference": "35b7e9868953e0d1df84320bb063543369e43ef5", "shasum": "" }, "require": { "php": ">=7.2.5", "psr/log": "^1|^2", - "symfony/deprecation-contracts": "^2.1", - "symfony/error-handler": "^4.4|^5.0", - "symfony/event-dispatcher": "^5.0", - "symfony/http-client-contracts": "^1.1|^2", - "symfony/http-foundation": "^5.3.7", + "symfony/deprecation-contracts": "^2.1|^3", + "symfony/error-handler": "^4.4|^5.0|^6.0", + "symfony/event-dispatcher": "^5.0|^6.0", + "symfony/http-foundation": "^5.3.7|^6.0", "symfony/polyfill-ctype": "^1.8", "symfony/polyfill-php73": "^1.9", "symfony/polyfill-php80": "^1.16" }, "conflict": { - "symfony/browser-kit": "<4.4", + "symfony/browser-kit": "<5.4", "symfony/cache": "<5.0", "symfony/config": "<5.0", "symfony/console": "<4.4", @@ -4372,19 +4280,20 @@ }, "require-dev": { "psr/cache": "^1.0|^2.0|^3.0", - "symfony/browser-kit": "^4.4|^5.0", - "symfony/config": "^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/css-selector": "^4.4|^5.0", - "symfony/dependency-injection": "^5.3", - "symfony/dom-crawler": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", - "symfony/routing": "^4.4|^5.0", - "symfony/stopwatch": "^4.4|^5.0", - "symfony/translation": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", + "symfony/browser-kit": "^5.4|^6.0", + "symfony/config": "^5.0|^6.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/css-selector": "^4.4|^5.0|^6.0", + "symfony/dependency-injection": "^5.3|^6.0", + "symfony/dom-crawler": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/finder": "^4.4|^5.0|^6.0", + "symfony/http-client-contracts": "^1.1|^2|^3", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/routing": "^4.4|^5.0|^6.0", + "symfony/stopwatch": "^4.4|^5.0|^6.0", + "symfony/translation": "^4.4|^5.0|^6.0", + "symfony/translation-contracts": "^1.1|^2|^3", "twig/twig": "^2.13|^3.0.4" }, "suggest": { @@ -4419,7 +4328,7 @@ "description": "Provides a structured process for converting a Request into a Response", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/http-kernel/tree/v5.3.12" + "source": "https://github.com/symfony/http-kernel/tree/v5.4.2" }, "funding": [ { @@ -4435,25 +4344,25 @@ "type": "tidelift" } ], - "time": "2021-11-24T08:46:46+00:00" + "time": "2021-12-29T13:20:26+00:00" }, { "name": "symfony/mime", - "version": "v5.3.11", + "version": "v5.4.2", "source": { "type": "git", "url": "https://github.com/symfony/mime.git", - "reference": "dffc0684f10526db12c52fcd6238c64695426d61" + "reference": "1bfd938cf9562822c05c4d00e8f92134d3c8e42d" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/mime/zipball/dffc0684f10526db12c52fcd6238c64695426d61", - "reference": "dffc0684f10526db12c52fcd6238c64695426d61", + "url": "https://api.github.com/repos/symfony/mime/zipball/1bfd938cf9562822c05c4d00e8f92134d3c8e42d", + "reference": "1bfd938cf9562822c05c4d00e8f92134d3c8e42d", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-intl-idn": "^1.10", "symfony/polyfill-mbstring": "^1.0", "symfony/polyfill-php80": "^1.16" @@ -4467,10 +4376,10 @@ "require-dev": { "egulias/email-validator": "^2.1.10|^3.1", "phpdocumentor/reflection-docblock": "^3.0|^4.0|^5.0", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/property-access": "^4.4|^5.1", - "symfony/property-info": "^4.4|^5.1", - "symfony/serializer": "^5.2" + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/property-access": "^4.4|^5.1|^6.0", + "symfony/property-info": "^4.4|^5.1|^6.0", + "symfony/serializer": "^5.2|^6.0" }, "type": "library", "autoload": { @@ -4502,7 +4411,7 @@ "mime-type" ], "support": { - "source": "https://github.com/symfony/mime/tree/v5.3.11" + "source": "https://github.com/symfony/mime/tree/v5.4.2" }, "funding": [ { @@ -4518,7 +4427,7 @@ "type": "tidelift" } ], - "time": "2021-11-20T16:42:42+00:00" + "time": "2021-12-28T17:15:56+00:00" }, { "name": "symfony/polyfill-ctype", @@ -5330,16 +5239,16 @@ }, { "name": "symfony/process", - "version": "v5.3.12", + "version": "v5.4.2", "source": { "type": "git", "url": "https://github.com/symfony/process.git", - "reference": "e498803a6e95ede78e9d5646ad32a2255c033a6a" + "reference": "2b3ba8722c4aaf3e88011be5e7f48710088fb5e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/process/zipball/e498803a6e95ede78e9d5646ad32a2255c033a6a", - "reference": "e498803a6e95ede78e9d5646ad32a2255c033a6a", + "url": "https://api.github.com/repos/symfony/process/zipball/2b3ba8722c4aaf3e88011be5e7f48710088fb5e4", + "reference": "2b3ba8722c4aaf3e88011be5e7f48710088fb5e4", "shasum": "" }, "require": { @@ -5372,7 +5281,7 @@ "description": "Executes commands in sub-processes", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/process/tree/v5.3.12" + "source": "https://github.com/symfony/process/tree/v5.4.2" }, "funding": [ { @@ -5388,7 +5297,7 @@ "type": "tidelift" } ], - "time": "2021-11-22T22:39:13+00:00" + "time": "2021-12-27T21:01:00+00:00" }, { "name": "symfony/psr-http-message-bridge", @@ -5480,21 +5389,21 @@ }, { "name": "symfony/routing", - "version": "v5.3.11", + "version": "v5.4.0", "source": { "type": "git", "url": "https://github.com/symfony/routing.git", - "reference": "fcbc2b81d55984f04bb704c2269755fa5aaf5cca" + "reference": "9eeae93c32ca86746e5d38f3679e9569981038b1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/routing/zipball/fcbc2b81d55984f04bb704c2269755fa5aaf5cca", - "reference": "fcbc2b81d55984f04bb704c2269755fa5aaf5cca", + "url": "https://api.github.com/repos/symfony/routing/zipball/9eeae93c32ca86746e5d38f3679e9569981038b1", + "reference": "9eeae93c32ca86746e5d38f3679e9569981038b1", "shasum": "" }, "require": { "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "symfony/deprecation-contracts": "^2.1|^3", "symfony/polyfill-php80": "^1.16" }, "conflict": { @@ -5506,11 +5415,11 @@ "require-dev": { "doctrine/annotations": "^1.12", "psr/log": "^1|^2|^3", - "symfony/config": "^5.3", - "symfony/dependency-injection": "^4.4|^5.0", - "symfony/expression-language": "^4.4|^5.0", - "symfony/http-foundation": "^4.4|^5.0", - "symfony/yaml": "^4.4|^5.0" + "symfony/config": "^5.3|^6.0", + "symfony/dependency-injection": "^4.4|^5.0|^6.0", + "symfony/expression-language": "^4.4|^5.0|^6.0", + "symfony/http-foundation": "^4.4|^5.0|^6.0", + "symfony/yaml": "^4.4|^5.0|^6.0" }, "suggest": { "symfony/config": "For using the all-in-one router or any loader", @@ -5550,7 +5459,7 @@ "url" ], "support": { - "source": "https://github.com/symfony/routing/tree/v5.3.11" + "source": "https://github.com/symfony/routing/tree/v5.4.0" }, "funding": [ { @@ -5566,26 +5475,25 @@ "type": "tidelift" } ], - "time": "2021-11-04T16:37:19+00:00" + "time": "2021-11-23T10:19:22+00:00" }, { "name": "symfony/service-contracts", - "version": "v2.5.0", + "version": "v2.4.1", "source": { "type": "git", "url": "https://github.com/symfony/service-contracts.git", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc" + "reference": "d664541b99d6fb0247ec5ff32e87238582236204" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/service-contracts/zipball/1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", - "reference": "1ab11b933cd6bc5464b08e81e2c5b07dec58b0fc", + "url": "https://api.github.com/repos/symfony/service-contracts/zipball/d664541b99d6fb0247ec5ff32e87238582236204", + "reference": "d664541b99d6fb0247ec5ff32e87238582236204", "shasum": "" }, "require": { "php": ">=7.2.5", - "psr/container": "^1.1", - "symfony/deprecation-contracts": "^2.1" + "psr/container": "^1.1" }, "conflict": { "ext-psr": "<1.1|>=2" @@ -5596,7 +5504,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "2.4-dev" }, "thanks": { "name": "symfony/contracts", @@ -5633,7 +5541,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/service-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/service-contracts/tree/v2.4.1" }, "funding": [ { @@ -5649,35 +5557,37 @@ "type": "tidelift" } ], - "time": "2021-11-04T16:48:04+00:00" + "time": "2021-11-04T16:37:19+00:00" }, { "name": "symfony/string", - "version": "v5.3.10", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/string.git", - "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c" + "reference": "bae261d0c3ac38a1f802b4dfed42094296100631" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/string/zipball/d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", - "reference": "d70c35bb20bbca71fc4ab7921e3c6bda1a82a60c", + "url": "https://api.github.com/repos/symfony/string/zipball/bae261d0c3ac38a1f802b4dfed42094296100631", + "reference": "bae261d0c3ac38a1f802b4dfed42094296100631", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/polyfill-ctype": "~1.8", "symfony/polyfill-intl-grapheme": "~1.0", "symfony/polyfill-intl-normalizer": "~1.0", - "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "~1.15" + "symfony/polyfill-mbstring": "~1.0" + }, + "conflict": { + "symfony/translation-contracts": "<2.0" }, "require-dev": { - "symfony/error-handler": "^4.4|^5.0", - "symfony/http-client": "^4.4|^5.0", - "symfony/translation-contracts": "^1.1|^2", - "symfony/var-exporter": "^4.4|^5.0" + "symfony/error-handler": "^5.4|^6.0", + "symfony/http-client": "^5.4|^6.0", + "symfony/translation-contracts": "^2.0|^3.0", + "symfony/var-exporter": "^5.4|^6.0" }, "type": "library", "autoload": { @@ -5716,7 +5626,7 @@ "utf8" ], "support": { - "source": "https://github.com/symfony/string/tree/v5.3.10" + "source": "https://github.com/symfony/string/tree/v6.0.2" }, "funding": [ { @@ -5732,50 +5642,50 @@ "type": "tidelift" } ], - "time": "2021-10-27T18:21:46+00:00" + "time": "2021-12-16T22:13:01+00:00" }, { "name": "symfony/translation", - "version": "v5.3.11", + "version": "v6.0.2", "source": { "type": "git", "url": "https://github.com/symfony/translation.git", - "reference": "17a965c8f3b1b348cf15d903ac53942984561f8a" + "reference": "a16c33f93e2fd62d259222aebf792158e9a28a77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation/zipball/17a965c8f3b1b348cf15d903ac53942984561f8a", - "reference": "17a965c8f3b1b348cf15d903ac53942984561f8a", + "url": "https://api.github.com/repos/symfony/translation/zipball/a16c33f93e2fd62d259222aebf792158e9a28a77", + "reference": "a16c33f93e2fd62d259222aebf792158e9a28a77", "shasum": "" }, "require": { - "php": ">=7.2.5", - "symfony/deprecation-contracts": "^2.1", + "php": ">=8.0.2", "symfony/polyfill-mbstring": "~1.0", - "symfony/polyfill-php80": "^1.16", - "symfony/translation-contracts": "^2.3" + "symfony/translation-contracts": "^2.3|^3.0" }, "conflict": { - "symfony/config": "<4.4", - "symfony/dependency-injection": "<5.0", - "symfony/http-kernel": "<5.0", - "symfony/twig-bundle": "<5.0", - "symfony/yaml": "<4.4" + "symfony/config": "<5.4", + "symfony/console": "<5.4", + "symfony/dependency-injection": "<5.4", + "symfony/http-kernel": "<5.4", + "symfony/twig-bundle": "<5.4", + "symfony/yaml": "<5.4" }, "provide": { - "symfony/translation-implementation": "2.3" + "symfony/translation-implementation": "2.3|3.0" }, "require-dev": { "psr/log": "^1|^2|^3", - "symfony/config": "^4.4|^5.0", - "symfony/console": "^4.4|^5.0", - "symfony/dependency-injection": "^5.0", - "symfony/finder": "^4.4|^5.0", - "symfony/http-kernel": "^5.0", - "symfony/intl": "^4.4|^5.0", + "symfony/config": "^5.4|^6.0", + "symfony/console": "^5.4|^6.0", + "symfony/dependency-injection": "^5.4|^6.0", + "symfony/finder": "^5.4|^6.0", + "symfony/http-client-contracts": "^1.1|^2.0|^3.0", + "symfony/http-kernel": "^5.4|^6.0", + "symfony/intl": "^5.4|^6.0", "symfony/polyfill-intl-icu": "^1.21", - "symfony/service-contracts": "^1.1.2|^2", - "symfony/yaml": "^4.4|^5.0" + "symfony/service-contracts": "^1.1.2|^2|^3", + "symfony/yaml": "^5.4|^6.0" }, "suggest": { "psr/log-implementation": "To use logging capability in translator", @@ -5811,7 +5721,7 @@ "description": "Provides tools to internationalize your application", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/translation/tree/v5.3.11" + "source": "https://github.com/symfony/translation/tree/v6.0.2" }, "funding": [ { @@ -5827,24 +5737,24 @@ "type": "tidelift" } ], - "time": "2021-11-04T16:37:19+00:00" + "time": "2021-12-25T20:10:03+00:00" }, { "name": "symfony/translation-contracts", - "version": "v2.5.0", + "version": "v3.0.0", "source": { "type": "git", "url": "https://github.com/symfony/translation-contracts.git", - "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e" + "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/d28150f0f44ce854e942b671fc2620a98aae1b1e", - "reference": "d28150f0f44ce854e942b671fc2620a98aae1b1e", + "url": "https://api.github.com/repos/symfony/translation-contracts/zipball/1b6ea5a7442af5a12dba3dbd6d71034b5b234e77", + "reference": "1b6ea5a7442af5a12dba3dbd6d71034b5b234e77", "shasum": "" }, "require": { - "php": ">=7.2.5" + "php": ">=8.0.2" }, "suggest": { "symfony/translation-implementation": "" @@ -5852,7 +5762,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.5-dev" + "dev-main": "3.0-dev" }, "thanks": { "name": "symfony/contracts", @@ -5889,7 +5799,7 @@ "standards" ], "support": { - "source": "https://github.com/symfony/translation-contracts/tree/v2.5.0" + "source": "https://github.com/symfony/translation-contracts/tree/v3.0.0" }, "funding": [ { @@ -5905,20 +5815,20 @@ "type": "tidelift" } ], - "time": "2021-08-17T14:20:01+00:00" + "time": "2021-09-07T12:43:40+00:00" }, { "name": "symfony/var-dumper", - "version": "v5.3.11", + "version": "v5.4.2", "source": { "type": "git", "url": "https://github.com/symfony/var-dumper.git", - "reference": "a029b3a11b757f9cc8693040339153b4745a913f" + "reference": "1b56c32c3679002b3a42384a580e16e2600f41c1" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/var-dumper/zipball/a029b3a11b757f9cc8693040339153b4745a913f", - "reference": "a029b3a11b757f9cc8693040339153b4745a913f", + "url": "https://api.github.com/repos/symfony/var-dumper/zipball/1b56c32c3679002b3a42384a580e16e2600f41c1", + "reference": "1b56c32c3679002b3a42384a580e16e2600f41c1", "shasum": "" }, "require": { @@ -5932,8 +5842,9 @@ }, "require-dev": { "ext-iconv": "*", - "symfony/console": "^4.4|^5.0", - "symfony/process": "^4.4|^5.0", + "symfony/console": "^4.4|^5.0|^6.0", + "symfony/process": "^4.4|^5.0|^6.0", + "symfony/uid": "^5.1|^6.0", "twig/twig": "^2.13|^3.0.4" }, "suggest": { @@ -5977,7 +5888,7 @@ "dump" ], "support": { - "source": "https://github.com/symfony/var-dumper/tree/v5.3.11" + "source": "https://github.com/symfony/var-dumper/tree/v5.4.2" }, "funding": [ { @@ -5993,30 +5904,30 @@ "type": "tidelift" } ], - "time": "2021-11-12T11:38:27+00:00" + "time": "2021-12-29T10:10:35+00:00" }, { "name": "tijsverkoyen/css-to-inline-styles", - "version": "2.2.3", + "version": "2.2.4", "source": { "type": "git", "url": "https://github.com/tijsverkoyen/CssToInlineStyles.git", - "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5" + "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/b43b05cf43c1b6d849478965062b6ef73e223bb5", - "reference": "b43b05cf43c1b6d849478965062b6ef73e223bb5", + "url": "https://api.github.com/repos/tijsverkoyen/CssToInlineStyles/zipball/da444caae6aca7a19c0c140f68c6182e337d5b1c", + "reference": "da444caae6aca7a19c0c140f68c6182e337d5b1c", "shasum": "" }, "require": { "ext-dom": "*", "ext-libxml": "*", "php": "^5.5 || ^7.0 || ^8.0", - "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0" + "symfony/css-selector": "^2.7 || ^3.0 || ^4.0 || ^5.0 || ^6.0" }, "require-dev": { - "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5" + "phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.0 || ^7.5 || ^8.5.21 || ^9.5.10" }, "type": "library", "extra": { @@ -6044,22 +5955,22 @@ "homepage": "https://github.com/tijsverkoyen/CssToInlineStyles", "support": { "issues": "https://github.com/tijsverkoyen/CssToInlineStyles/issues", - "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.3" + "source": "https://github.com/tijsverkoyen/CssToInlineStyles/tree/2.2.4" }, - "time": "2020-07-13T06:12:54+00:00" + "time": "2021-12-08T09:12:39+00:00" }, { "name": "vlucas/phpdotenv", - "version": "v5.4.0", + "version": "v5.4.1", "source": { "type": "git", "url": "https://github.com/vlucas/phpdotenv.git", - "reference": "d4394d044ed69a8f244f3445bcedf8a0d7fe2403" + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/d4394d044ed69a8f244f3445bcedf8a0d7fe2403", - "reference": "d4394d044ed69a8f244f3445bcedf8a0d7fe2403", + "url": "https://api.github.com/repos/vlucas/phpdotenv/zipball/264dce589e7ce37a7ba99cb901eed8249fbec92f", + "reference": "264dce589e7ce37a7ba99cb901eed8249fbec92f", "shasum": "" }, "require": { @@ -6097,11 +6008,13 @@ "authors": [ { "name": "Graham Campbell", - "email": "hello@gjcampbell.co.uk" + "email": "hello@gjcampbell.co.uk", + "homepage": "https://github.com/GrahamCampbell" }, { "name": "Vance Lucas", - "email": "vance@vancelucas.com" + "email": "vance@vancelucas.com", + "homepage": "https://github.com/vlucas" } ], "description": "Loads environment variables from `.env` to `getenv()`, `$_ENV` and `$_SERVER` automagically.", @@ -6112,7 +6025,7 @@ ], "support": { "issues": "https://github.com/vlucas/phpdotenv/issues", - "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.0" + "source": "https://github.com/vlucas/phpdotenv/tree/v5.4.1" }, "funding": [ { @@ -6124,7 +6037,7 @@ "type": "tidelift" } ], - "time": "2021-11-10T01:08:39+00:00" + "time": "2021-12-12T23:22:04+00:00" }, { "name": "voku/portable-ascii", @@ -6262,16 +6175,16 @@ "packages-dev": [ { "name": "barryvdh/laravel-debugbar", - "version": "v3.6.4", + "version": "v3.6.5", "source": { "type": "git", "url": "https://github.com/barryvdh/laravel-debugbar.git", - "reference": "3c2d678269ba60e178bcd93e36f6a91c36b727f1" + "reference": "ccf109f8755dcc7e58779d1aeb1051b04e0b4bef" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/3c2d678269ba60e178bcd93e36f6a91c36b727f1", - "reference": "3c2d678269ba60e178bcd93e36f6a91c36b727f1", + "url": "https://api.github.com/repos/barryvdh/laravel-debugbar/zipball/ccf109f8755dcc7e58779d1aeb1051b04e0b4bef", + "reference": "ccf109f8755dcc7e58779d1aeb1051b04e0b4bef", "shasum": "" }, "require": { @@ -6299,7 +6212,7 @@ "Barryvdh\\Debugbar\\ServiceProvider" ], "aliases": { - "Debugbar": "Barryvdh\\Debugbar\\Facade" + "Debugbar": "Barryvdh\\Debugbar\\Facades\\Debugbar" } } }, @@ -6331,7 +6244,7 @@ ], "support": { "issues": "https://github.com/barryvdh/laravel-debugbar/issues", - "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.6.4" + "source": "https://github.com/barryvdh/laravel-debugbar/tree/v3.6.5" }, "funding": [ { @@ -6343,7 +6256,7 @@ "type": "github" } ], - "time": "2021-10-21T10:57:31+00:00" + "time": "2021-12-14T14:45:18+00:00" }, { "name": "barryvdh/laravel-ide-helper", @@ -6565,21 +6478,22 @@ }, { "name": "composer/composer", - "version": "2.1.12", + "version": "2.2.3", "source": { "type": "git", "url": "https://github.com/composer/composer.git", - "reference": "6e3c2b122e0ec41a7e885fcaf19fa15e2e0819a0" + "reference": "3c92ba5cdc7d48b7db2dcd197e6fa0e8fa6d9f4a" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/composer/zipball/6e3c2b122e0ec41a7e885fcaf19fa15e2e0819a0", - "reference": "6e3c2b122e0ec41a7e885fcaf19fa15e2e0819a0", + "url": "https://api.github.com/repos/composer/composer/zipball/3c92ba5cdc7d48b7db2dcd197e6fa0e8fa6d9f4a", + "reference": "3c92ba5cdc7d48b7db2dcd197e6fa0e8fa6d9f4a", "shasum": "" }, "require": { "composer/ca-bundle": "^1.0", "composer/metadata-minifier": "^1.0", + "composer/pcre": "^1.0", "composer/semver": "^3.0", "composer/spdx-licenses": "^1.2", "composer/xdebug-handler": "^2.0", @@ -6589,7 +6503,7 @@ "react/promise": "^1.2 || ^2.7", "seld/jsonlint": "^1.4", "seld/phar-utils": "^1.0", - "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", + "symfony/console": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0", "symfony/filesystem": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", "symfony/finder": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0", "symfony/process": "^2.8.52 || ^3.4.35 || ^4.4 || ^5.0 || ^6.0" @@ -6609,7 +6523,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "2.1-dev" + "dev-main": "2.2-dev" } }, "autoload": { @@ -6643,7 +6557,7 @@ "support": { "irc": "ircs://irc.libera.chat:6697/composer", "issues": "https://github.com/composer/composer/issues", - "source": "https://github.com/composer/composer/tree/2.1.12" + "source": "https://github.com/composer/composer/tree/2.2.3" }, "funding": [ { @@ -6659,7 +6573,7 @@ "type": "tidelift" } ], - "time": "2021-11-09T15:02:04+00:00" + "time": "2021-12-31T11:18:53+00:00" }, { "name": "composer/metadata-minifier", @@ -6730,6 +6644,150 @@ ], "time": "2021-04-07T13:37:33+00:00" }, + { + "name": "composer/package-versions-deprecated", + "version": "1.11.99.4", + "source": { + "type": "git", + "url": "https://github.com/composer/package-versions-deprecated.git", + "reference": "b174585d1fe49ceed21928a945138948cb394600" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/b174585d1fe49ceed21928a945138948cb394600", + "reference": "b174585d1fe49ceed21928a945138948cb394600", + "shasum": "" + }, + "require": { + "composer-plugin-api": "^1.1.0 || ^2.0", + "php": "^7 || ^8" + }, + "replace": { + "ocramius/package-versions": "1.11.99" + }, + "require-dev": { + "composer/composer": "^1.9.3 || ^2.0@dev", + "ext-zip": "^1.13", + "phpunit/phpunit": "^6.5 || ^7" + }, + "type": "composer-plugin", + "extra": { + "class": "PackageVersions\\Installer", + "branch-alias": { + "dev-master": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "PackageVersions\\": "src/PackageVersions" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Marco Pivetta", + "email": "ocramius@gmail.com" + }, + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be" + } + ], + "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)", + "support": { + "issues": "https://github.com/composer/package-versions-deprecated/issues", + "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.4" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-09-13T08:41:34+00:00" + }, + { + "name": "composer/pcre", + "version": "1.0.0", + "source": { + "type": "git", + "url": "https://github.com/composer/pcre.git", + "reference": "3d322d715c43a1ac36c7fe215fa59336265500f2" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/composer/pcre/zipball/3d322d715c43a1ac36c7fe215fa59336265500f2", + "reference": "3d322d715c43a1ac36c7fe215fa59336265500f2", + "shasum": "" + }, + "require": { + "php": "^5.3.2 || ^7.0 || ^8.0" + }, + "require-dev": { + "phpstan/phpstan": "^1", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^4.2 || ^5" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-main": "1.x-dev" + } + }, + "autoload": { + "psr-4": { + "Composer\\Pcre\\": "src" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "Jordi Boggiano", + "email": "j.boggiano@seld.be", + "homepage": "http://seld.be" + } + ], + "description": "PCRE wrapping library that offers type-safe preg_* replacements.", + "keywords": [ + "PCRE", + "preg", + "regex", + "regular expression" + ], + "support": { + "issues": "https://github.com/composer/pcre/issues", + "source": "https://github.com/composer/pcre/tree/1.0.0" + }, + "funding": [ + { + "url": "https://packagist.com", + "type": "custom" + }, + { + "url": "https://github.com/composer", + "type": "github" + }, + { + "url": "https://tidelift.com/funding/github/packagist/composer/composer", + "type": "tidelift" + } + ], + "time": "2021-12-06T15:17:27+00:00" + }, { "name": "composer/semver", "version": "3.2.6", @@ -6893,25 +6951,27 @@ }, { "name": "composer/xdebug-handler", - "version": "2.0.2", + "version": "2.0.3", "source": { "type": "git", "url": "https://github.com/composer/xdebug-handler.git", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339" + "reference": "6555461e76962fd0379c444c46fd558a0fcfb65e" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/84674dd3a7575ba617f5a76d7e9e29a7d3891339", - "reference": "84674dd3a7575ba617f5a76d7e9e29a7d3891339", + "url": "https://api.github.com/repos/composer/xdebug-handler/zipball/6555461e76962fd0379c444c46fd558a0fcfb65e", + "reference": "6555461e76962fd0379c444c46fd558a0fcfb65e", "shasum": "" }, "require": { + "composer/pcre": "^1", "php": "^5.3.2 || ^7.0 || ^8.0", "psr/log": "^1 || ^2 || ^3" }, "require-dev": { - "phpstan/phpstan": "^0.12.55", - "symfony/phpunit-bridge": "^4.2 || ^5" + "phpstan/phpstan": "^1.0", + "phpstan/phpstan-strict-rules": "^1.1", + "symfony/phpunit-bridge": "^4.2 || ^5.0 || ^6.0" }, "type": "library", "autoload": { @@ -6937,7 +6997,7 @@ "support": { "irc": "irc://irc.freenode.org/composer", "issues": "https://github.com/composer/xdebug-handler/issues", - "source": "https://github.com/composer/xdebug-handler/tree/2.0.2" + "source": "https://github.com/composer/xdebug-handler/tree/2.0.3" }, "funding": [ { @@ -6953,7 +7013,7 @@ "type": "tidelift" } ], - "time": "2021-07-31T17:03:58+00:00" + "time": "2021-12-08T13:07:32+00:00" }, { "name": "doctrine/cache", @@ -7056,36 +7116,38 @@ }, { "name": "doctrine/dbal", - "version": "3.1.4", + "version": "3.2.0", "source": { "type": "git", "url": "https://github.com/doctrine/dbal.git", - "reference": "821b4f01a36ce63ed36c090ea74767b72db367e9" + "reference": "5d54f63541d7bed1156cb5c9b79274ced61890e4" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/doctrine/dbal/zipball/821b4f01a36ce63ed36c090ea74767b72db367e9", - "reference": "821b4f01a36ce63ed36c090ea74767b72db367e9", + "url": "https://api.github.com/repos/doctrine/dbal/zipball/5d54f63541d7bed1156cb5c9b79274ced61890e4", + "reference": "5d54f63541d7bed1156cb5c9b79274ced61890e4", "shasum": "" }, "require": { "composer/package-versions-deprecated": "^1.11.99", - "doctrine/cache": "^1.0|^2.0", + "doctrine/cache": "^1.11|^2.0", "doctrine/deprecations": "^0.5.3", "doctrine/event-manager": "^1.0", - "php": "^7.3 || ^8.0" + "php": "^7.3 || ^8.0", + "psr/cache": "^1|^2|^3", + "psr/log": "^1|^2|^3" }, "require-dev": { "doctrine/coding-standard": "9.0.0", "jetbrains/phpstorm-stubs": "2021.1", - "phpstan/phpstan": "1.1.1", - "phpstan/phpstan-strict-rules": "^1", + "phpstan/phpstan": "1.2.0", + "phpstan/phpstan-strict-rules": "^1.1", "phpunit/phpunit": "9.5.10", "psalm/plugin-phpunit": "0.16.1", "squizlabs/php_codesniffer": "3.6.1", "symfony/cache": "^5.2|^6.0", "symfony/console": "^2.0.5|^3.0|^4.0|^5.0|^6.0", - "vimeo/psalm": "4.12.0" + "vimeo/psalm": "4.13.0" }, "suggest": { "symfony/console": "For helpful console commands such as SQL execution and import of files." @@ -7145,7 +7207,7 @@ ], "support": { "issues": "https://github.com/doctrine/dbal/issues", - "source": "https://github.com/doctrine/dbal/tree/3.1.4" + "source": "https://github.com/doctrine/dbal/tree/3.2.0" }, "funding": [ { @@ -7161,7 +7223,7 @@ "type": "tidelift" } ], - "time": "2021-11-15T16:44:33+00:00" + "time": "2021-11-26T21:00:12+00:00" }, { "name": "doctrine/deprecations", @@ -7436,16 +7498,16 @@ }, { "name": "facade/ignition", - "version": "2.17.1", + "version": "2.17.4", "source": { "type": "git", "url": "https://github.com/facade/ignition.git", - "reference": "317f6110c1977b50e06365bbb155fbe5079035ec" + "reference": "95c80bd35ee6858e9e1439b2f6a698295eeb2070" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/facade/ignition/zipball/317f6110c1977b50e06365bbb155fbe5079035ec", - "reference": "317f6110c1977b50e06365bbb155fbe5079035ec", + "url": "https://api.github.com/repos/facade/ignition/zipball/95c80bd35ee6858e9e1439b2f6a698295eeb2070", + "reference": "95c80bd35ee6858e9e1439b2f6a698295eeb2070", "shasum": "" }, "require": { @@ -7510,7 +7572,7 @@ "issues": "https://github.com/facade/ignition/issues", "source": "https://github.com/facade/ignition" }, - "time": "2021-11-25T10:26:30+00:00" + "time": "2021-12-27T15:11:24+00:00" }, { "name": "facade/ignition-contracts", @@ -7567,22 +7629,22 @@ }, { "name": "fakerphp/faker", - "version": "v1.16.0", + "version": "v1.17.0", "source": { "type": "git", "url": "https://github.com/FakerPHP/Faker.git", - "reference": "271d384d216e5e5c468a6b28feedf95d49f83b35" + "reference": "b85e9d44eae8c52cca7aa0939483611f7232b669" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/271d384d216e5e5c468a6b28feedf95d49f83b35", - "reference": "271d384d216e5e5c468a6b28feedf95d49f83b35", + "url": "https://api.github.com/repos/FakerPHP/Faker/zipball/b85e9d44eae8c52cca7aa0939483611f7232b669", + "reference": "b85e9d44eae8c52cca7aa0939483611f7232b669", "shasum": "" }, "require": { "php": "^7.1 || ^8.0", "psr/container": "^1.0 || ^2.0", - "symfony/deprecation-contracts": "^2.2" + "symfony/deprecation-contracts": "^2.2 || ^3.0" }, "conflict": { "fzaninotto/faker": "*" @@ -7601,7 +7663,7 @@ "type": "library", "extra": { "branch-alias": { - "dev-main": "v1.16-dev" + "dev-main": "v1.17-dev" } }, "autoload": { @@ -7626,9 +7688,9 @@ ], "support": { "issues": "https://github.com/FakerPHP/Faker/issues", - "source": "https://github.com/FakerPHP/Faker/tree/v1.16.0" + "source": "https://github.com/FakerPHP/Faker/tree/v1.17.0" }, - "time": "2021-09-06T14:53:37+00:00" + "time": "2021-12-05T17:14:47+00:00" }, { "name": "filp/whoops", @@ -8019,16 +8081,16 @@ }, { "name": "nikic/php-parser", - "version": "v4.13.1", + "version": "v4.13.2", "source": { "type": "git", "url": "https://github.com/nikic/PHP-Parser.git", - "reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd" + "reference": "210577fe3cf7badcc5814d99455df46564f3c077" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/63a79e8daa781cac14e5195e63ed8ae231dd10fd", - "reference": "63a79e8daa781cac14e5195e63ed8ae231dd10fd", + "url": "https://api.github.com/repos/nikic/PHP-Parser/zipball/210577fe3cf7badcc5814d99455df46564f3c077", + "reference": "210577fe3cf7badcc5814d99455df46564f3c077", "shasum": "" }, "require": { @@ -8069,9 +8131,9 @@ ], "support": { "issues": "https://github.com/nikic/PHP-Parser/issues", - "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.1" + "source": "https://github.com/nikic/PHP-Parser/tree/v4.13.2" }, - "time": "2021-11-03T20:52:16+00:00" + "time": "2021-11-30T19:35:32+00:00" }, { "name": "nunomaduro/collision", @@ -8433,16 +8495,16 @@ }, { "name": "phpspec/prophecy", - "version": "1.14.0", + "version": "v1.15.0", "source": { "type": "git", "url": "https://github.com/phpspec/prophecy.git", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e" + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/phpspec/prophecy/zipball/d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", - "reference": "d86dfc2e2a3cd366cee475e52c6bb3bbc371aa0e", + "url": "https://api.github.com/repos/phpspec/prophecy/zipball/bbcd7380b0ebf3961ee21409db7b38bc31d69a13", + "reference": "bbcd7380b0ebf3961ee21409db7b38bc31d69a13", "shasum": "" }, "require": { @@ -8494,22 +8556,22 @@ ], "support": { "issues": "https://github.com/phpspec/prophecy/issues", - "source": "https://github.com/phpspec/prophecy/tree/1.14.0" + "source": "https://github.com/phpspec/prophecy/tree/v1.15.0" }, - "time": "2021-09-10T09:02:12+00:00" + "time": "2021-12-08T12:19:24+00:00" }, { "name": "phpunit/php-code-coverage", - "version": "9.2.9", + "version": "9.2.10", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-code-coverage.git", - "reference": "f301eb1453c9e7a1bc912ee8b0ea9db22c60223b" + "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/f301eb1453c9e7a1bc912ee8b0ea9db22c60223b", - "reference": "f301eb1453c9e7a1bc912ee8b0ea9db22c60223b", + "url": "https://api.github.com/repos/sebastianbergmann/php-code-coverage/zipball/d5850aaf931743067f4bfc1ae4cbd06468400687", + "reference": "d5850aaf931743067f4bfc1ae4cbd06468400687", "shasum": "" }, "require": { @@ -8565,7 +8627,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-code-coverage/issues", - "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.9" + "source": "https://github.com/sebastianbergmann/php-code-coverage/tree/9.2.10" }, "funding": [ { @@ -8573,20 +8635,20 @@ "type": "github" } ], - "time": "2021-11-19T15:21:02+00:00" + "time": "2021-12-05T09:12:13+00:00" }, { "name": "phpunit/php-file-iterator", - "version": "3.0.5", + "version": "3.0.6", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/php-file-iterator.git", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8" + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/aa4be8575f26070b100fccb67faabb28f21f66f8", - "reference": "aa4be8575f26070b100fccb67faabb28f21f66f8", + "url": "https://api.github.com/repos/sebastianbergmann/php-file-iterator/zipball/cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", + "reference": "cf1c2e7c203ac650e352f4cc675a7021e7d1b3cf", "shasum": "" }, "require": { @@ -8625,7 +8687,7 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/php-file-iterator/issues", - "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.5" + "source": "https://github.com/sebastianbergmann/php-file-iterator/tree/3.0.6" }, "funding": [ { @@ -8633,7 +8695,7 @@ "type": "github" } ], - "time": "2020-09-28T05:57:25+00:00" + "time": "2021-12-02T12:48:52+00:00" }, { "name": "phpunit/php-invoker", @@ -8818,16 +8880,16 @@ }, { "name": "phpunit/phpunit", - "version": "9.5.10", + "version": "9.5.11", "source": { "type": "git", "url": "https://github.com/sebastianbergmann/phpunit.git", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a" + "reference": "2406855036db1102126125537adb1406f7242fdd" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/c814a05837f2edb0d1471d6e3f4ab3501ca3899a", - "reference": "c814a05837f2edb0d1471d6e3f4ab3501ca3899a", + "url": "https://api.github.com/repos/sebastianbergmann/phpunit/zipball/2406855036db1102126125537adb1406f7242fdd", + "reference": "2406855036db1102126125537adb1406f7242fdd", "shasum": "" }, "require": { @@ -8905,11 +8967,11 @@ ], "support": { "issues": "https://github.com/sebastianbergmann/phpunit/issues", - "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.10" + "source": "https://github.com/sebastianbergmann/phpunit/tree/9.5.11" }, "funding": [ { - "url": "https://phpunit.de/donate.html", + "url": "https://phpunit.de/sponsors.html", "type": "custom" }, { @@ -8917,7 +8979,56 @@ "type": "github" } ], - "time": "2021-09-25T07:38:51+00:00" + "time": "2021-12-25T07:07:57+00:00" + }, + { + "name": "psr/cache", + "version": "3.0.0", + "source": { + "type": "git", + "url": "https://github.com/php-fig/cache.git", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf" + }, + "dist": { + "type": "zip", + "url": "https://api.github.com/repos/php-fig/cache/zipball/aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "reference": "aa5030cfa5405eccfdcb1083ce040c2cb8d253bf", + "shasum": "" + }, + "require": { + "php": ">=8.0.0" + }, + "type": "library", + "extra": { + "branch-alias": { + "dev-master": "1.0.x-dev" + } + }, + "autoload": { + "psr-4": { + "Psr\\Cache\\": "src/" + } + }, + "notification-url": "https://packagist.org/downloads/", + "license": [ + "MIT" + ], + "authors": [ + { + "name": "PHP-FIG", + "homepage": "https://www.php-fig.org/" + } + ], + "description": "Common interface for caching libraries", + "keywords": [ + "cache", + "psr", + "psr-6" + ], + "support": { + "source": "https://github.com/php-fig/cache/tree/3.0.0" + }, + "time": "2021-02-03T23:26:27+00:00" }, { "name": "react/promise", @@ -9998,16 +10109,16 @@ }, { "name": "seld/phar-utils", - "version": "1.1.2", + "version": "1.2.0", "source": { "type": "git", "url": "https://github.com/Seldaek/phar-utils.git", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0" + "reference": "9f3452c93ff423469c0d56450431562ca423dcee" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/749042a2315705d2dfbbc59234dd9ceb22bf3ff0", - "reference": "749042a2315705d2dfbbc59234dd9ceb22bf3ff0", + "url": "https://api.github.com/repos/Seldaek/phar-utils/zipball/9f3452c93ff423469c0d56450431562ca423dcee", + "reference": "9f3452c93ff423469c0d56450431562ca423dcee", "shasum": "" }, "require": { @@ -10040,22 +10151,22 @@ ], "support": { "issues": "https://github.com/Seldaek/phar-utils/issues", - "source": "https://github.com/Seldaek/phar-utils/tree/1.1.2" + "source": "https://github.com/Seldaek/phar-utils/tree/1.2.0" }, - "time": "2021-08-19T21:01:38+00:00" + "time": "2021-12-10T11:20:11+00:00" }, { "name": "symfony/debug", - "version": "v4.4.31", + "version": "v4.4.36", "source": { "type": "git", "url": "https://github.com/symfony/debug.git", - "reference": "43ede438d4cb52cd589ae5dc070e9323866ba8e0" + "reference": "346e1507eeb3f566dcc7a116fefaa407ee84691b" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/debug/zipball/43ede438d4cb52cd589ae5dc070e9323866ba8e0", - "reference": "43ede438d4cb52cd589ae5dc070e9323866ba8e0", + "url": "https://api.github.com/repos/symfony/debug/zipball/346e1507eeb3f566dcc7a116fefaa407ee84691b", + "reference": "346e1507eeb3f566dcc7a116fefaa407ee84691b", "shasum": "" }, "require": { @@ -10094,7 +10205,7 @@ "description": "Provides tools to ease debugging PHP code", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/debug/tree/v4.4.31" + "source": "https://github.com/symfony/debug/tree/v4.4.36" }, "funding": [ { @@ -10110,26 +10221,26 @@ "type": "tidelift" } ], - "time": "2021-09-24T13:30:14+00:00" + "time": "2021-11-29T08:40:48+00:00" }, { "name": "symfony/filesystem", - "version": "v5.3.4", + "version": "v6.0.0", "source": { "type": "git", "url": "https://github.com/symfony/filesystem.git", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32" + "reference": "52b3c9cce673b014915445a432339f282e002ce6" }, "dist": { "type": "zip", - "url": "https://api.github.com/repos/symfony/filesystem/zipball/343f4fe324383ca46792cae728a3b6e2f708fb32", - "reference": "343f4fe324383ca46792cae728a3b6e2f708fb32", + "url": "https://api.github.com/repos/symfony/filesystem/zipball/52b3c9cce673b014915445a432339f282e002ce6", + "reference": "52b3c9cce673b014915445a432339f282e002ce6", "shasum": "" }, "require": { - "php": ">=7.2.5", + "php": ">=8.0.2", "symfony/polyfill-ctype": "~1.8", - "symfony/polyfill-php80": "^1.16" + "symfony/polyfill-mbstring": "~1.8" }, "type": "library", "autoload": { @@ -10157,7 +10268,7 @@ "description": "Provides basic utilities for the filesystem", "homepage": "https://symfony.com", "support": { - "source": "https://github.com/symfony/filesystem/tree/v5.3.4" + "source": "https://github.com/symfony/filesystem/tree/v6.0.0" }, "funding": [ { @@ -10173,7 +10284,7 @@ "type": "tidelift" } ], - "time": "2021-07-21T12:40:44+00:00" + "time": "2021-10-29T07:35:21+00:00" }, { "name": "theseer/tokenizer", diff --git a/config/database.php b/config/database.php index 713634d..235fca5 100644 --- a/config/database.php +++ b/config/database.php @@ -67,7 +67,10 @@ return [ 'prefix' => '', 'prefix_indexes' => true, 'schema' => 'public', - 'sslmode' => 'prefer', + 'sslmode' => 'disable', //depends on your security level https://www.postgresql.org/docs/current/libpq-ssl.html#LIBPQ-SSL-SSLMODE-STATEMENTS + 'sslrootcert' => env('DB_SSLROOTCERT', 'config/ssl/ca.crt'), + 'sslcert' => env('DB_SSLCERT', 'config/ssl/client.crt'), + 'sslkey' => env('DB_SSLKEY', 'config/ssl/client.key'), ], 'sqlsrv' => [ @@ -92,29 +95,29 @@ return [ 'charset' => 'utf8', 'prefix' => '', 'schema' => 'public', - 'sslmode' => 'prefer', + 'sslmode' => env('DB_SSLMODE', 'prefer'), // Only set these keys if you want to run en secure mode // otherwise you can them out of the configuration array - #'sslcert' => env('DB_SSLCERT', 'client.crt'), - #'sslkey' => env('DB_SSLKEY', 'client.key'), - #'sslrootcert' => env('DB_SSLROOTCERT', 'ca.crt'), + 'sslcert' => env('DB_SSLCERT', 'config/ssl/client.crt'), + 'sslkey' => env('DB_SSLKEY', 'config/ssl/client.key'), + 'sslrootcert' => env('DB_SSLROOTCERT', 'config/ssl/ca.crt'), ], - 'mongodb' => [ - 'driver' => 'mongodb', - 'host' => env('DB_MONGO_HOST', '127.0.0.1'), - 'port' => env('DB_MONGO_PORT', 27017), - 'database' => env('DB_MONGO_DATABASE', 'fido'), - 'username' => env('DB_MONGO_USERNAME', 'mongo'), - 'password' => env('DB_MONGO_PASSWORD', 'password'), - 'options' => [ - // here you can pass more settings to the Mongo Driver Manager - // see https://www.php.net/manual/en/mongodb-driver-manager.construct.php under "Uri Options" for a list of complete parameters that you can use + 'mongodb' => [ + 'driver' => 'mongodb', + 'host' => env('DB_MONGO_HOST', '127.0.0.1'), + 'port' => env('DB_MONGO_PORT', 27017), + 'database' => env('DB_MONGO_DATABASE', 'fido'), + 'username' => env('DB_MONGO_USERNAME', 'mongo'), + 'password' => env('DB_MONGO_PASSWORD', 'password'), + 'options' => [ + // here you can pass more settings to the Mongo Driver Manager + // see https://www.php.net/manual/en/mongodb-driver-manager.construct.php under "Uri Options" for a list of complete parameters that you can use - 'database' => env('DB_AUTHENTICATION_DATABASE', 'admin'), // required with Mongo 3+ - ], - ], + 'database' => env('DB_AUTHENTICATION_DATABASE', 'admin'), // required with Mongo 3+ + ], + ], ], /* diff --git a/database/migrations/2021_06_18_112022_update_zones.php b/database/migrations/2021_06_18_112022_update_zones.php index 044e253..a240c0b 100644 --- a/database/migrations/2021_06_18_112022_update_zones.php +++ b/database/migrations/2021_06_18_112022_update_zones.php @@ -16,11 +16,10 @@ class UpdateZones extends Migration DB::statement('ALTER TABLE zones ALTER COLUMN domain_id SET NOT NULL'); Schema::table('zones', function (Blueprint $table) { + $table->integer('system_id'); $table->dropColumn(['description','ipv4','ipv4_mask','ipv6','ipv6_mask','zt_id']); $table->string('ztid')->nullable(); $table->dropUnique(['domain_id']); - - $table->integer('system_id'); $table->foreign('system_id')->references('id')->on('systems'); }); } diff --git a/database/migrations/2021_06_21_121910_add_system_to_setups.php b/database/migrations/2021_06_21_121910_add_system_to_setups.php index 774bed2..5882422 100644 --- a/database/migrations/2021_06_21_121910_add_system_to_setups.php +++ b/database/migrations/2021_06_21_121910_add_system_to_setups.php @@ -14,8 +14,8 @@ class AddSystemToSetups extends Migration public function up() { Schema::table('setups', function (Blueprint $table) { - $table->integer('options'); $table->integer('system_id'); + $table->integer('options'); $table->foreign('system_id')->references('id')->on('systems'); }); } diff --git a/database/migrations/2022_01_01_235631_create_mail.php b/database/migrations/2022_01_01_235631_create_mail.php new file mode 100644 index 0000000..42151e1 --- /dev/null +++ b/database/migrations/2022_01_01_235631_create_mail.php @@ -0,0 +1,137 @@ +id(); + $table->timestamps(); + $table->softDeletes(); + $table->string('mid')->nullable(); + + $table->string('to',128); + $table->string('from',128); + $table->string('subject',256); + $table->dateTimeTz('datetime'); + $table->tinyInteger('tzoffset'); + + $table->string('msgid')->nullable(); + $table->string('replyid')->nullable(); + + $table->text('msg'); + $table->string('msg_src')->nullable(); + $table->string('msg_crc')->nullable(); + $table->string('tagline')->nullable(); + $table->string('tearline')->nullable(); + $table->string('origin')->nullable(); + + $table->tinyInteger('flags')->nullable(); + $table->jsonb('rogue_path')->nullable(); + $table->jsonb('rogue_seenby')->nullable(); + $table->jsonb('kludges')->nullable(); + + $table->integer('echoarea_id'); + $table->foreign('echoarea_id')->references('id')->on('echoareas'); + + $table->integer('fftn_id'); + $table->foreign('fftn_id')->references('id')->on('addresses'); + }); + + DB::statement("ALTER TABLE address_echomail RENAME COLUMN echomail_id TO mid"); + DB::statement("ALTER TABLE address_echomail ALTER COLUMN mid DROP NOT NULL"); + DB::statement("ALTER TABLE address_echomail RENAME COLUMN export_date TO export_at"); + DB::statement("ALTER TABLE address_echomail ALTER COLUMN export_at DROP NOT NULL"); + DB::statement("ALTER TABLE address_echomail RENAME COLUMN sent_date TO sent_at"); + DB::statement("ALTER TABLE address_echomail RENAME TO echomail_seenby"); + Schema::table('echomail_seenby', function (Blueprint $table) { + $table->integer('echomail_id')->nullable()->first(); + $table->string('packet')->nullable(); + + $table->foreign('echomail_id')->references('id')->on('echomails'); + }); + + Schema::create('echomail_path', function (Blueprint $table) { + $table->id(); + + $table->integer('address_id'); + $table->foreign('address_id')->references('id')->on('addresses'); + + $table->unique(['id','echomail_id']); + $table->unique(['echomail_id','address_id','parent_id']); + + $table->integer('parent_id')->nullable(); + $table->foreign(['parent_id','echomail_id'])->references(['id','echomail_id'])->on('echomail_path'); + + $table->integer('echomail_id'); + $table->foreign('echomail_id')->references('id')->on('echomails'); + }); + + Schema::create('netmails', function (Blueprint $table) { + $table->id(); + $table->timestamps(); + $table->softDeletes(); + $table->string('mid')->nullable(); + + $table->string('to',128); + $table->string('from',128); + $table->string('subject',256); + + $table->dateTimeTz('datetime'); + $table->tinyInteger('tzoffset')->nullable(); + + $table->tinyInteger('flags')->nullable(); + $table->tinyInteger('cost')->nullable(); + $table->string('msgid')->nullable(); + $table->string('replyid')->nullable(); + + $table->text('msg'); + $table->text('msg_src')->nullable(); + $table->integer('msg_crc')->nullable(); + + $table->string('tagline')->nullable(); + $table->string('tearline')->nullable(); + $table->boolean('local')->default(FALSE); + + $table->string('recv_pkt')->nullable(); + $table->string('sent_pkt')->nullable(); + $table->dateTimeTz('sent_at')->nullable(); + + $table->integer('fftn_id'); + $table->integer('tftn_id'); + $table->foreign('fftn_id')->references('id')->on('addresses'); + $table->foreign('tftn_id')->references('id')->on('addresses'); + }); + } + + /** + * Reverse the migrations. + * + * @return void + */ + public function down() + { + Schema::table('echomail_seenby', function (Blueprint $table) { + $table->dropForeign(['echomail_id']); + $table->dropColumn(['packet','echomail_id']); + }); + DB::commit(); + DB::statement("ALTER TABLE echomail_seenby RENAME TO address_echomail"); + DB::statement("ALTER TABLE address_echomail RENAME COLUMN mid TO echomail_id;"); + DB::statement("ALTER TABLE address_echomail RENAME COLUMN export_at TO export_date;"); + DB::statement("ALTER TABLE address_echomail RENAME COLUMN sent_at TO sent_date;"); + + Schema::dropIfExists('echomail_path'); + Schema::dropIfExists('echomails'); + Schema::dropIfExists('netmails'); + } +} diff --git a/resources/views/domain/view.blade.php b/resources/views/domain/view.blade.php index 9e43f77..b2894ec 100644 --- a/resources/views/domain/view.blade.php +++ b/resources/views/domain/view.blade.php @@ -261,7 +261,13 @@ }, }, legend: { - symbolWidth: 40 + align: 'right', + layout: 'vertical', + symbolWidth: 40, + floating: false, + navigation: { + arrowSize: 10 + }, }, plotOptions: { series: { diff --git a/resources/views/echoarea/addedit.blade.php b/resources/views/echoarea/addedit.blade.php index b3f0ab3..687e714 100644 --- a/resources/views/echoarea/addedit.blade.php +++ b/resources/views/echoarea/addedit.blade.php @@ -111,5 +111,46 @@ + +
+
+

Info

+

There are {{ number_format($o->echomail->count()) }} messages in this area, and the oldest message in this area is {{ $o->last_message ? $o->last_message->format('Y-m-d H:i:s') : 'None' }}.

+
+
+ + @can('admin',$o) + @if($o->addresses->count()) +
+
+

Exporting to the following adresses:

+ + + + + + + + + + + + + + @foreach ($o->addresses as $ao) + + + + + + + + @endforeach + +
SystemAddressLast SessionOldest MessageMessages Waiting
{{ $ao->system->full_name($ao) }} @auth@if($ao->session('sespass')){{ $ao->session('default') ? '**' : '*' }}@elseif($ao->system->setup)+@endif[{{ $ao->system_id }}]@endauth{{ $ao->ftn_3d }}{{ $ao->system->last_session ? $ao->system->last_session->format('Y-m-d H:i') : '-' }}{{ ($x=$o->waiting($ao))->count() ? $x->first()->datetime->format('Y-m-d H:i') : '-' }}{{ number_format($x->count()) }}
+
+
+ @endif + @endcan @endsection \ No newline at end of file diff --git a/resources/views/system/addedit.blade.php b/resources/views/system/addedit.blade.php index 64dbc32..6c12e13 100644 --- a/resources/views/system/addedit.blade.php +++ b/resources/views/system/addedit.blade.php @@ -217,7 +217,7 @@ use App\Http\Controllers\DomainController as DC;
-
+
@@ -288,6 +288,61 @@ use App\Http\Controllers\DomainController as DC;
+ + +
+ + +
+
+
+ +
+ Netmails are waiting for these addresses: + + + + + + + + + + @foreach ($o->addresses->sortBy('zone.zone_id') as $ao) + + + + + @endforeach + +
AddressNetmail
{{ $ao->ftn3d }}{{ $ao->netmailWaiting()->count() }}
+
+ + +
+ Echomail waiting for these addresses: + + + + + + + + + + @foreach ($o->addresses->sortBy('zone.zone_id') as $ao) + + + + + @endforeach + +
AddressEchomail
{{ $ao->ftn3d }}{{ $ao->echomailWaiting()->count() }}
+
+
+
+
+
@endif @else @include('system.form-system') diff --git a/resources/views/widgets/message.blade.php b/resources/views/widgets/message.blade.php index e7c0018..be3e063 100644 --- a/resources/views/widgets/message.blade.php +++ b/resources/views/widgets/message.blade.php @@ -1,22 +1,22 @@
+
+ TO: {!! \App\Classes\FTN\Message::tr($msg->to) !!} +
DATE: {{ $msg->datetime->format('Y-m-d H:i:s') }}
-
- MSGID: {{ $msg->msgid }}@if($x=\App\Models\Echomail::where('reply',$msg->msgid)->count()) ({{$x}} replies)@endif @if($msg->reply)
REPLY: {{ $msg->reply }}@endif -
-
+
FROM: {!! \App\Classes\FTN\Message::tr($msg->from) !!} ({{ $msg->fftn->ftn }})
- TO: {!! \App\Classes\FTN\Message::tr($msg->to) !!} + MSGID: {{ $msg->msgid }}@if($x=\App\Models\Echomail::where('replyid',$msg->msgid)->count()) ({{$x}} replies)@endif @if($msg->replyid)
REPLY: {{ $msg->replyid }}@endif
-
+
SUBJECT: {!! \App\Classes\FTN\Message::tr($msg->subject) !!}