'array', 'last_used_at' => 'datetime', 'expires_at' => 'datetime']; } public function user(): BelongsTo { return $this->belongsTo(User::class); } public static function issue(User $u, string $name, array $abilities = ['*'], ?\DateTimeInterface $expires = null): array { $plain = config('api.token_prefix', 'cms_').Str::random(64); $record = self::query()->create(['user_id' => $u->id, 'name' => $name, 'token' => hash('sha256', $plain), 'abilities' => $abilities, 'expires_at' => $expires]); return [$record, $plain]; } public function allows(string $ability): bool { $a = $this->abilities ?: []; return in_array('*', $a, true) || in_array($ability, $a, true); } }