clrghouz/app/Classes/File/Send/Dynamic.php

124 lines
2.3 KiB
PHP

<?php
namespace App\Classes\File\Send;
use Carbon\Carbon;
use App\Classes\File\Send;
use App\Classes\Node;
use App\Models\Address;
use App\Models\Dynamic as Model;
use App\Classes\Dynamic as Item;
/**
* Dynamic files that are sent to systems during a mailer session
*/
final class Dynamic extends Send
{
private const LOGKEY = 'FSD';
/** @var int Our internal position counter */
private int $readpos = 0;
private string $buffer;
private Item $item;
private Carbon $sent;
/**
* @throws \Exception
*/
public function __construct(private Model $do,Address $ao,int $type)
{
parent::__construct();
$this->ftype = ((($type&0xff)<<8)|self::IS_FILE);
$this->item = new $this->do->model($ao,$this->do->arguments);
$this->sent = Carbon::now();
}
public function __get($key) {
switch ($key) {
case 'dbids':
return collect([$this->do->id]);
case 'nameas':
return $this->item->getName();
case 'mtime':
return $this->sent->timestamp;
case 'size':
return strlen($this->buffer);
default:
return NULL;
}
}
public function close(bool $successful,Node $node): void
{
if ($successful) {
$this->complete = TRUE;
$next_at = $this->do->next_at
->startOfDay()
->addHours($this->do->start_time->hour)
->addMinutes($this->do->start_time->minute);
switch ($this->do->frequency) {
case 'ONCE':
$this->do->active = FALSE;
break;
case 'DAILY':
$this->do->next_at = $next_at
->addDay();
break;
case 'WEEKLY':
$this->do->next_at = $next_at
->addWeek();
break;
case 'MONTHLY':
$this->do->next_at = $next_at
->addMonth();
break;
default:
throw new \Exception(sprintf('%s:! Unknown frequency [%s] for [%d]',self::LOGKEY,$this->do->frequency,$this->do->id));
}
$this->do->save();
}
}
public function feof(): bool
{
return ($this->readpos === $this->size);
}
public function open(string $compress=''): bool
{
$this->buffer = (string)$this->item;
return TRUE;
}
public function read(int $length): string
{
$result = substr($this->buffer,$this->readpos,$length);
$this->readpos += strlen($result);
return $result;
}
public function seek(int $pos): bool
{
$this->readpos = ($pos < $this->size) ? $pos : $this->size;
return TRUE;
}
}