From ba61c6435b668375a411716f3a35447aa38b03a4 Mon Sep 17 00:00:00 2001 From: winter Date: Sat, 18 Jan 2025 00:22:36 +0000 Subject: implement object storage --- Digitigrade/Model/StorageObject.php | 107 ++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 Digitigrade/Model/StorageObject.php (limited to 'Digitigrade/Model/StorageObject.php') diff --git a/Digitigrade/Model/StorageObject.php b/Digitigrade/Model/StorageObject.php new file mode 100644 index 0000000..333b5b1 --- /dev/null +++ b/Digitigrade/Model/StorageObject.php @@ -0,0 +1,107 @@ +storeFile($path, $checkIsUpload); + + $obj = new self(); + $obj->oid = random_printable_bytes(); + $obj->provider = $p::class; + $obj->token = $token; + $obj->filename = $filename; + $obj->mimetype = $mimetype; + $obj->created = new \DateTimeImmutable(); + + $obj->save(); + return $obj; + } + + public static function findByOid(string $oid): ?self { + return self::findWhere('oid = ?', [$oid]); + } + + public static function findByProviderTokenPair(string $provider, string $token): ?self { + return self::findWhere('provider = ? AND token = ?', [$provider, $token]); + } + + protected function getUpdateWhereClause(\PDO $db): ?string { + if (isset($this->oid) && self::findByOid($this->oid) != null) { + return 'oid = ' . $db->quote($this->oid); + } + if (self::findByProviderTokenPair($this->provider, $this->token) != null) { + return 'provider = ' . $db->quote($this->provider) . ' AND token = ' . $db->quote($this->token); + } + return null; + } + + private function getProvider(): StorageProvider { + return new $this->provider(); + } + + /** + * Deletes this object from the storage backend and removes it from the database. + * @return void + */ + public function delete() { + $this->getProvider()->delete($this->token); + $this->remove(); + } + + /** + * Gets the entire content of this object. + * @return string + */ + public function retrieve(): string { + return $this->getProvider()->retrieve($this->token); + } + + /** + * Streams the content of this object to the web client (stdout). + * @return void + */ + public function passthrough() { + $this->getProvider()->passthrough($this->token, $this->mimetype); + } + + /** + * Gets a direct public URL to this object, if one exists. + * @return ?string the URL or null if none is available + */ + public function getDirectUrl(): ?string { + return $this->getProvider()->directUrl($this->token); + } + + public function getUrl(bool $allowDirect = true): string { + if ($allowDirect) { + $url = $this->getDirectUrl(); + if ($url != null) { + return $url; + } + } + return path_to_uri("/storage/$this->oid"); + } +} \ No newline at end of file -- cgit v1.3