Files
monica/app/Models/AddressBookSubscription.php
T

187 lines
4.4 KiB
PHP

<?php
namespace App\Models;
use App\Domains\Contact\DavClient\Services\Utils\Dav\DavClient;
use App\Logging\Loggable;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Database\Eloquent\Casts\Attribute;
use Illuminate\Database\Eloquent\Concerns\HasUuids;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\BelongsTo;
use Illuminate\Database\Eloquent\Relations\MorphMany;
class AddressBookSubscription extends Model implements Loggable
{
use HasFactory, HasUuids;
/** Allow push changes to the distant server */
public const WAY_PUSH = 0x1;
/** Allow get changes from the distant server */
public const WAY_GET = 0x2;
/** Allow both push and get changes from the distant server */
public const WAY_BOTH = self::WAY_GET | self::WAY_PUSH;
protected $table = 'addressbook_subscriptions';
/**
* The attributes that are mass assignable.
*
* @var array<string>
*/
protected $fillable = [
'user_id',
'vault_id',
'uri',
'capabilities',
'username',
'password',
'sync_way',
'distant_sync_token',
'current_logid',
'frequency',
'last_synchronized_at',
'active',
];
/**
* The attributes that aren't mass assignable.
*
* @var array<string>|bool
*/
protected $guarded = ['id'];
/**
* The attributes that should be cast to native types.
*
* @var array<string, string>
*/
protected $casts = [
'user_id' => 'string',
'vault_id' => 'string',
'last_synchronized_at' => 'datetime',
'active' => 'boolean',
'capabilities' => 'array',
'current_logid' => 'integer',
];
/**
* Eager load account with every contact.
*
* @var array<string>
*/
protected $with = [
'user',
];
/**
* Get the account record associated with the subscription.
*/
public function account(): BelongsTo
{
return $this->belongsTo(Account::class);
}
/**
* Get the user record associated with the subscription.
*/
public function user(): BelongsTo
{
return $this->belongsTo(User::class);
}
/**
* Get the vault record associated with the subscription.
*/
public function vault(): BelongsTo
{
return $this->belongsTo(Vault::class);
}
/**
* Get the local synctoken.
*/
public function localSyncToken(): BelongsTo
{
return $this->belongsTo(SyncToken::class);
}
/**
* Get the subscription's logs.
*/
public function logs(): MorphMany
{
return $this->morphMany(Log::class, 'loggable');
}
/**
* Get password.
*
* @return Attribute<string,string>
*/
public function password(): Attribute
{
return Attribute::make(
get: fn (?string $value) => decrypt($value, true),
set: fn (string $value) => encrypt($value)
);
}
/**
* Get synchronization way.
*
* @return Attribute<bool,never>
*/
public function isWayPush(): Attribute
{
return Attribute::make(
get: fn (?bool $value, array $attributes) => ($attributes['sync_way'] & self::WAY_PUSH) === self::WAY_PUSH,
);
}
/**
* Get synchronization way.
*
* @return Attribute<bool,never>
*/
public function isWayGet(): Attribute
{
return Attribute::make(
get: fn (?bool $value, array $attributes) => ($attributes['sync_way'] & self::WAY_GET) === self::WAY_GET,
);
}
/**
* Get synchronization way.
*
* @return Attribute<bool,never>
*/
public function isWayBoth(): Attribute
{
return Attribute::make(
get: fn (?bool $value, array $attributes) => ($attributes['syncWay'] & self::WAY_BOTH) === self::WAY_BOTH,
);
}
/**
* Scope a query to only include active subscriptions.
*/
public function scopeActive(Builder $query): Builder
{
return $query->where('active', 1);
}
/**
* Get a new client.
*/
public function getClient(): DavClient
{
return app(DavClient::class)
->setBaseUri($this->uri)
->setCredentials($this->username, $this->password);
}
}