19 changed files with 2894 additions and 354 deletions
			
			
		@ -0,0 +1,67 @@ | 
				
			|||
<?php | 
				
			|||
 | 
				
			|||
namespace Auxilium\DatabaseInteractions\Deegraph\Nodes; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
use App\Wrappers\DeegraphNode; | 
				
			|||
 | 
				
			|||
class User extends DeegraphNode | 
				
			|||
{ | 
				
			|||
    public function __construct(string $objectUuid) | 
				
			|||
    { | 
				
			|||
        parent::__construct($objectUuid); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Retrieves the system node user instance. | 
				
			|||
     * | 
				
			|||
     * @return User Returns a User instance representing the system node. | 
				
			|||
     */ | 
				
			|||
    public static function get_system_node(): User | 
				
			|||
    { | 
				
			|||
        return new User(INSTANCE_CREDENTIAL_DDS_LOGIN_NODE); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getDisplayName(): mixed | 
				
			|||
    { | 
				
			|||
        if($this->getProperty("display_name") != null) | 
				
			|||
        { | 
				
			|||
            return $this->getProperty("display_name"); | 
				
			|||
        } | 
				
			|||
        if($this->getProperty("name") != null) | 
				
			|||
        { | 
				
			|||
            return $this->getProperty("name"); | 
				
			|||
        } | 
				
			|||
        return null; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getFullName(): mixed | 
				
			|||
    { | 
				
			|||
        if($this->getProperty("name") != null) | 
				
			|||
        { | 
				
			|||
            return $this->getProperty("name"); | 
				
			|||
        } | 
				
			|||
        return null; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getContactEmail(): mixed | 
				
			|||
    { | 
				
			|||
        if($this->getProperty("contact_email") != null) | 
				
			|||
        { | 
				
			|||
            return $this->getProperty("contact_email"); | 
				
			|||
        } | 
				
			|||
        return null; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function __toString(): string | 
				
			|||
    { | 
				
			|||
        if($this->getProperty("name") == null) | 
				
			|||
        { | 
				
			|||
            return ""; | 
				
			|||
        } | 
				
			|||
        else | 
				
			|||
        { | 
				
			|||
            return strval($this->getProperty("name")); | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,15 @@ | 
				
			|||
<?php | 
				
			|||
 | 
				
			|||
namespace App\DeegraphSchemas; | 
				
			|||
 | 
				
			|||
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocument; | 
				
			|||
 | 
				
			|||
#[SchemaDocument( | 
				
			|||
    Name   : "collection", | 
				
			|||
    MaxSize: 0, | 
				
			|||
    Comment: "This is intended as an inheritable schema used to signify to software that it SHOULD display the numeric properties of this node as an inlined list", | 
				
			|||
)] | 
				
			|||
class CollectionSchema | 
				
			|||
{ | 
				
			|||
 | 
				
			|||
} | 
				
			|||
@ -0,0 +1,33 @@ | 
				
			|||
<?php | 
				
			|||
 | 
				
			|||
namespace App\DeegraphSchemas; | 
				
			|||
 | 
				
			|||
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocument; | 
				
			|||
use Darksparrow\AuxiliumSchemaBuilder\Attributes\SchemaDocumentField; | 
				
			|||
use Darksparrow\AuxiliumSchemaBuilder\Enumerators\SchemaFieldExistence; | 
				
			|||
 | 
				
			|||
#[SchemaDocument( | 
				
			|||
    Name   : "Tune", | 
				
			|||
    MaxSize: 0, | 
				
			|||
    Comment: "", | 
				
			|||
)] | 
				
			|||
class TuneSchema | 
				
			|||
{ | 
				
			|||
    #[SchemaDocumentField( | 
				
			|||
        Name     : "Title", | 
				
			|||
        Existence: SchemaFieldExistence::MUST, | 
				
			|||
        Comment  : "", | 
				
			|||
        MaxSize  : 2048, | 
				
			|||
        MimeType : "text/plain", | 
				
			|||
    )] | 
				
			|||
    public string $Title; | 
				
			|||
 | 
				
			|||
    #[SchemaDocumentField( | 
				
			|||
        Name     : "Copyright", | 
				
			|||
        Existence: SchemaFieldExistence::SHOULD, | 
				
			|||
        Comment  : "", | 
				
			|||
        MaxSize  : 2048, | 
				
			|||
        MimeType : "text/plain", | 
				
			|||
    )] | 
				
			|||
    public string $Copyright; | 
				
			|||
} | 
				
			|||
@ -0,0 +1,8 @@ | 
				
			|||
<?php | 
				
			|||
 | 
				
			|||
namespace App\Wrappers; | 
				
			|||
 | 
				
			|||
class CeilidhKitLFSObject | 
				
			|||
{ | 
				
			|||
 | 
				
			|||
} | 
				
			|||
@ -0,0 +1,44 @@ | 
				
			|||
<?php | 
				
			|||
 | 
				
			|||
namespace App\Wrappers; | 
				
			|||
 | 
				
			|||
use App\Configuration; | 
				
			|||
use Darksparrow\DeegraphInteractions\Core\DeegraphServer; | 
				
			|||
use Darksparrow\DeegraphInteractions\DataStructures\NewNodeDetails; | 
				
			|||
use Darksparrow\DeegraphInteractions\DataStructures\UUID; | 
				
			|||
use Darksparrow\DeegraphInteractions\QueryBuilder\QueryBuilder; | 
				
			|||
 | 
				
			|||
class DeegraphInteractions | 
				
			|||
{ | 
				
			|||
    public static function GetConnection(): DeegraphServer | 
				
			|||
    { | 
				
			|||
        return new DeegraphServer( | 
				
			|||
            token               : Configuration::GetConfig("Deegraph", "Token"), | 
				
			|||
            server              : Configuration::GetConfig("Deegraph", "Host"), | 
				
			|||
            port                : Configuration::GetConfig("Deegraph", "Port"), | 
				
			|||
            allowSelfSignedCerts: Configuration::GetConfig("Deegraph", "AllowSelfSignedCerts"), | 
				
			|||
        ); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public static function NewNode( | 
				
			|||
        string $dataURL = null, | 
				
			|||
        string $schema = null, | 
				
			|||
    ): NewNodeDetails | 
				
			|||
    { | 
				
			|||
        return self::GetConnection()->CreateNewNode( | 
				
			|||
            actorID: new UUID(Configuration::GetConfig("Deegraph", "LoginNode")), | 
				
			|||
            dataURL: $dataURL, | 
				
			|||
            schema : $schema, | 
				
			|||
            creator: new UUID(Configuration::GetConfig("Deegraph", "LoginNode")), | 
				
			|||
        ); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public static function AddProperty() | 
				
			|||
    { | 
				
			|||
        $query = QueryBuilder::Link() | 
				
			|||
            ->linkOfRelativePath($node->NodeID, $this->NodeID) | 
				
			|||
            ->as($key); | 
				
			|||
        if($force) $query = $query->Force(); | 
				
			|||
        $query = $query->Build(); | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,472 @@ | 
				
			|||
<?php | 
				
			|||
 | 
				
			|||
namespace App\Wrappers; | 
				
			|||
 | 
				
			|||
use Auxilium\DatabaseInteractions\Deegraph\Nodes\User; | 
				
			|||
use Darksparrow\DeegraphInteractions\DataStructures\DataURL; | 
				
			|||
use Darksparrow\DeegraphInteractions\DataStructures\UUID; | 
				
			|||
use Darksparrow\DeegraphInteractions\Exceptions\InvalidUUIDFormatException; | 
				
			|||
use Darksparrow\DeegraphInteractions\QueryBuilder\QueryBuilder; | 
				
			|||
 | 
				
			|||
class DeegraphNode | 
				
			|||
{ | 
				
			|||
    /** | 
				
			|||
     * Static cache for storing already instantiated nodes. | 
				
			|||
     * @var array | 
				
			|||
     */ | 
				
			|||
    private static $cached_nodes = []; | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    private $RawContent = null; | 
				
			|||
    private $Metadata = null; | 
				
			|||
 | 
				
			|||
    private ?array $CachedProperties = null; | 
				
			|||
    private ?array $CachedReferences = null; | 
				
			|||
    private ?array $CachedPermissions = null; | 
				
			|||
 | 
				
			|||
    private bool $HasRawContentBeenFetchedYet = false; | 
				
			|||
    private bool $HasMetadataBeenFetchedYet = false; | 
				
			|||
 | 
				
			|||
    private UUID $NodeID; | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Constructor to initialise a DeegraphNode with a given ID. | 
				
			|||
     * @param string $id The unique identifier for the node. | 
				
			|||
     * @throws InvalidUUIDFormatException | 
				
			|||
     */ | 
				
			|||
    public function __construct(string $id) | 
				
			|||
    { | 
				
			|||
        $this->NodeID = new UUID($id); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Fetches a Node from the database by its path. | 
				
			|||
     * @param string $path The path to the Node. | 
				
			|||
     * @return DeegraphNode|null The Node if found, otherwise null. | 
				
			|||
     */ | 
				
			|||
    public static function from_path(string $path): ?DeegraphNode | 
				
			|||
    { | 
				
			|||
        return GraphDatabaseConnection::node_from_path($path); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Converts the Node to a string by fetching its data. | 
				
			|||
     * If the data is a string, it returns that string; otherwise, it returns an empty string. | 
				
			|||
     * @return string | 
				
			|||
     */ | 
				
			|||
    public function __toString() | 
				
			|||
    { | 
				
			|||
        if(is_string($this->getData())) | 
				
			|||
        { | 
				
			|||
            return $this->getData(); | 
				
			|||
        } | 
				
			|||
        else | 
				
			|||
        { | 
				
			|||
            return ""; | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Retrieves raw content data associated with the node. | 
				
			|||
     * @return mixed Raw content or null if not fetched. | 
				
			|||
     */ | 
				
			|||
    public function getData(User $actor = null) | 
				
			|||
    { | 
				
			|||
        $content = $this->getContent($actor); | 
				
			|||
        return ($content == null) ? null : $content->getData(); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getContent(User $actor = null): CeilidhKitLFSObject|DataURL|null | 
				
			|||
    { | 
				
			|||
        if($this->getRawContent($actor) != null) | 
				
			|||
        { | 
				
			|||
            if(str_starts_with($this->getRawContent($actor), "data:")) | 
				
			|||
            { | 
				
			|||
                return new DataURL($this->getRawContent($actor)); | 
				
			|||
            } | 
				
			|||
            elseif(str_starts_with($this->getRawContent($actor), "auxlfs:")) | 
				
			|||
            { | 
				
			|||
                return new CeilidhKitLFSObject($this->getRawContent($actor)); | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
        return null; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getRawContent(User $actor = null) | 
				
			|||
    { | 
				
			|||
        if($this->HasRawContentBeenFetchedYet) | 
				
			|||
        { | 
				
			|||
            return $this->RawContent; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        if($actor == null) | 
				
			|||
        { | 
				
			|||
            $actor = Session::get_current()->getUser(); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        $result = GraphDatabaseConnection::raw_request($actor, "/api/v1/" . $this->NodeID, "GET"); | 
				
			|||
 | 
				
			|||
        if(is_array($result)) | 
				
			|||
        { | 
				
			|||
            if(isset($result["@data"])) | 
				
			|||
            { | 
				
			|||
                $this->RawContent = $result["@data"]; | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        $this->HasRawContentBeenFetchedYet = true; | 
				
			|||
        return $this->RawContent; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getUuid(): string | 
				
			|||
    { | 
				
			|||
        return $this->NodeID->GetPlainUUID(); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Adds a property (link) between this Node and another Node. | 
				
			|||
     * @param string $key The key representing the property. | 
				
			|||
     * @param DeegraphNode $node The Node to link as a property. | 
				
			|||
     * @param User|null $actor The User performing the operation. | 
				
			|||
     * @param bool $force Whether to force the link creation. | 
				
			|||
     * @return mixed The result of the graph database query. | 
				
			|||
     * @throws InvalidUUIDFormatException | 
				
			|||
     */ | 
				
			|||
    public function addProperty(string $key, DeegraphNode $node, User $actor = null, bool $force = false) | 
				
			|||
    { | 
				
			|||
        if($actor == null) | 
				
			|||
        { | 
				
			|||
            $actor = Session::get_current()->getUser(); | 
				
			|||
        } | 
				
			|||
        if(preg_match('/^[a-z_][a-z0-9_]*$/', $key) || preg_match('/^[0-9]+$/', $key) || $key == "#") | 
				
			|||
        { // Let's not allow injections! (Even though DDS handles permissions and damage will be limited to this user anyway, there's not really a benefit to *not* preventing injections) | 
				
			|||
            // $query = "LINK {".$node->NodeID."} AS ".$key." OF {".$this->NodeID."}".($force ? " FORCE" : ""); | 
				
			|||
            $query = QueryBuilder::Link() | 
				
			|||
                ->linkOfRelativePath($node->NodeID, $this->NodeID) | 
				
			|||
                ->as($key); | 
				
			|||
            if($force) $query = $query->force(); | 
				
			|||
            $query = $query->build(); | 
				
			|||
            return GraphDatabaseConnection::query($actor, $query); | 
				
			|||
        } | 
				
			|||
        else | 
				
			|||
        { | 
				
			|||
            return false; | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Removes a property link from this Node. | 
				
			|||
     * @param string $key The key of the property to unlink. | 
				
			|||
     * @param User|null $actor The user performing the operation. | 
				
			|||
     * @return mixed The result of the graph database query. | 
				
			|||
     * @throws InvalidUUIDFormatException | 
				
			|||
     */ | 
				
			|||
    public function unlinkProperty(string $key, User $actor = null) | 
				
			|||
    { | 
				
			|||
        if($actor == null) | 
				
			|||
        { | 
				
			|||
            $actor = Session::get_current()->getUser(); | 
				
			|||
        } | 
				
			|||
        if(preg_match('/^[a-z_][a-z0-9_]*$/', $key) || preg_match('/^[0-9]+$/', $key)) | 
				
			|||
        { // Let's not allow injections! (Even though DDS handles permissions and damage will be limited to this user anyway, there's not really a benefit to *not* preventing injections) | 
				
			|||
            // $query = "UNLINK ".$key." FROM {".$this->GetNodeID()."}"; | 
				
			|||
            $query = QueryBuilder::Unlink() | 
				
			|||
                ->unlinkWhat($key) | 
				
			|||
                ->from($this->NodeID) | 
				
			|||
                ->build(); | 
				
			|||
            if($this->CachedProperties != null) | 
				
			|||
            { | 
				
			|||
                if(isset($this->CachedProperties[$key])) | 
				
			|||
                { | 
				
			|||
                    unset($this->CachedProperties[$key]); // Get rid of any dangling references to this | 
				
			|||
                } | 
				
			|||
            } | 
				
			|||
            return GraphDatabaseConnection::query($actor, $query); | 
				
			|||
        } | 
				
			|||
        else | 
				
			|||
        { | 
				
			|||
            return false; | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Deletes this Node from the graph database. | 
				
			|||
     * @param User|null $actor The user performing the operation. | 
				
			|||
     * @return mixed The result of the graph database query. | 
				
			|||
     * @throws InvalidUUIDFormatException | 
				
			|||
     */ | 
				
			|||
    public function delete(User $actor = null) | 
				
			|||
    { | 
				
			|||
        if($actor == null) | 
				
			|||
        { | 
				
			|||
            $actor = Session::get_current()->getUser(); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        // $query = "DELETE {".$this->GetNodeID()."}"; | 
				
			|||
        $query = QueryBuilder::Delete() | 
				
			|||
            ->relativePath($this->NodeID) | 
				
			|||
            ->build(); | 
				
			|||
        return GraphDatabaseConnection::query($actor, $query); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Checks if this Node is the same as another. | 
				
			|||
     * @param DeegraphNode $n Another Node to compare. | 
				
			|||
     * @return bool True if they are the same, false otherwise. | 
				
			|||
     */ | 
				
			|||
    public function is(DeegraphNode $n): bool | 
				
			|||
    { | 
				
			|||
        if($this->getId() == $n->getId()) | 
				
			|||
        { | 
				
			|||
            return true; | 
				
			|||
        } | 
				
			|||
        return false; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Returns the UUID of the Node as a string. | 
				
			|||
     * @return string Node UUID. | 
				
			|||
     */ | 
				
			|||
    public function getId(): string | 
				
			|||
    { | 
				
			|||
        return $this->NodeID->GetPlainUUID(); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Fetches the permissions of the Node from the database. | 
				
			|||
     * @param User|null $actor The user performing the operation. | 
				
			|||
     * @return array|null Permissions data or null if not fetched. | 
				
			|||
     * @throws InvalidUUIDFormatException | 
				
			|||
     */ | 
				
			|||
    public function getPermissions(User $actor = null): ?array | 
				
			|||
    { | 
				
			|||
        if($actor == null) | 
				
			|||
        { | 
				
			|||
            $actor = Session::get_current()->getUser(); | 
				
			|||
        } | 
				
			|||
        if($this->CachedPermissions != null) | 
				
			|||
        { | 
				
			|||
            return $this->CachedPermissions; | 
				
			|||
        } | 
				
			|||
        $outputMap = []; | 
				
			|||
        // $query = "PERMS ON {".$this->GetNodeID()."}"; | 
				
			|||
        $query = QueryBuilder::Permission() | 
				
			|||
            ->on($this->NodeID) | 
				
			|||
            ->build(); | 
				
			|||
        $response = GraphDatabaseConnection::query($actor, $query); | 
				
			|||
        if(isset($response["@permissions"])) | 
				
			|||
        { | 
				
			|||
            foreach($response["@permissions"] as $value) | 
				
			|||
            { | 
				
			|||
                $outputMap[] = $value; | 
				
			|||
            } | 
				
			|||
            $this->CachedPermissions = $outputMap; | 
				
			|||
            return $this->CachedPermissions; | 
				
			|||
        } | 
				
			|||
        else | 
				
			|||
        { | 
				
			|||
            return null; | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Fetches references to other Nodes. | 
				
			|||
     * @param User|null $actor The user performing the operation. | 
				
			|||
     * @return array|null References data or null if not fetched. | 
				
			|||
     * @throws InvalidUUIDFormatException | 
				
			|||
     */ | 
				
			|||
    public function getReferences(User $actor = null): ?array | 
				
			|||
    { | 
				
			|||
        if($actor == null) | 
				
			|||
        { | 
				
			|||
            $actor = Session::get_current()->getUser(); | 
				
			|||
        } | 
				
			|||
        if($this->CachedReferences != null) | 
				
			|||
        { | 
				
			|||
            return $this->CachedReferences; | 
				
			|||
        } | 
				
			|||
        $outputMap = []; | 
				
			|||
        // $query = "REFERENCES {".$this->GetNodeID()."}"; | 
				
			|||
        $query = QueryBuilder::References() | 
				
			|||
            ->relativePath($this->NodeID) | 
				
			|||
            ->build(); | 
				
			|||
        $response = GraphDatabaseConnection::query($actor, $query); | 
				
			|||
        if(isset($response["@map"])) | 
				
			|||
        { | 
				
			|||
            foreach($response["@map"] as $key => $value) | 
				
			|||
            { | 
				
			|||
                $arr = []; | 
				
			|||
                foreach($value as $refNodeId) | 
				
			|||
                { | 
				
			|||
                    $arr[] = DeegraphNode::from_id($refNodeId); | 
				
			|||
                } | 
				
			|||
                $outputMap[$key] = $arr; | 
				
			|||
            } | 
				
			|||
            $this->CachedReferences = $outputMap; | 
				
			|||
            return $outputMap; | 
				
			|||
        } | 
				
			|||
        else | 
				
			|||
        { | 
				
			|||
            return null; | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Fetches a Node by its ID, using a static cache for optimisation. | 
				
			|||
     * @param string|null $id The ID of the Node. | 
				
			|||
     * @return DeegraphNode|null The Node if found or created, null otherwise. | 
				
			|||
     * @throws InvalidUUIDFormatException | 
				
			|||
     */ | 
				
			|||
    public static function from_id(string $id = null): ?DeegraphNode | 
				
			|||
    { | 
				
			|||
        if($id == null) | 
				
			|||
        { | 
				
			|||
            return null; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        if(isset(self::$cached_nodes[$id])) | 
				
			|||
        { | 
				
			|||
            if(self::$cached_nodes[$id] instanceof DeegraphNode) | 
				
			|||
            { | 
				
			|||
                return self::$cached_nodes[$id]; // Skip creating the node representation - we've already loaded it! | 
				
			|||
            } | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        // Do stuff | 
				
			|||
 | 
				
			|||
        self::$cached_nodes[$id] = new DeegraphNode($id); | 
				
			|||
 | 
				
			|||
        if(isset(self::$cached_nodes[$id])) | 
				
			|||
        { | 
				
			|||
            return self::$cached_nodes[$id]; | 
				
			|||
        } | 
				
			|||
        else | 
				
			|||
        { | 
				
			|||
            return null; | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Retrieves a property of the Node by its key. | 
				
			|||
     * @param string $property Property name to fetch. | 
				
			|||
     * @param User|null $actor The user performing the operation. | 
				
			|||
     * @return mixed|null Property value or null if not found. | 
				
			|||
     */ | 
				
			|||
    public function getProperty(string $property, User $actor = null): mixed | 
				
			|||
    { | 
				
			|||
        if($actor == null) | 
				
			|||
        { | 
				
			|||
            $actor = Session::get_current()->getUser(); | 
				
			|||
        } | 
				
			|||
        $temp = $this->getProperties($actor); | 
				
			|||
        if(isset($temp[$property])) | 
				
			|||
            return $temp[$property]; | 
				
			|||
        return null; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getProperties(User $actor = null): ?array | 
				
			|||
    { | 
				
			|||
        if($actor == null) | 
				
			|||
        { | 
				
			|||
            $actor = Session::get_current()->getUser(); | 
				
			|||
        } | 
				
			|||
        if($this->CachedProperties != null) | 
				
			|||
        { | 
				
			|||
            return $this->CachedProperties; | 
				
			|||
        } | 
				
			|||
        $outputMap = []; | 
				
			|||
        // $query = "DIRECTORY {".$this->GetNodeID()."}"; | 
				
			|||
        $query = QueryBuilder::Directory() | 
				
			|||
            ->relativePath($this->NodeID) | 
				
			|||
            ->build(); | 
				
			|||
 | 
				
			|||
        $response = GraphDatabaseConnection::query($actor, $query); | 
				
			|||
        if(isset($response["@map"])) | 
				
			|||
        { | 
				
			|||
            foreach($response["@map"] as $key => $value) | 
				
			|||
            { | 
				
			|||
                $outputMap[$key] = DeegraphNode::from_id($value); | 
				
			|||
            } | 
				
			|||
            $this->CachedProperties = $outputMap; | 
				
			|||
            return $outputMap; | 
				
			|||
        } | 
				
			|||
        else | 
				
			|||
        { | 
				
			|||
            return null; | 
				
			|||
        } | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getObjectSize() | 
				
			|||
    { | 
				
			|||
        $content = $this->getContent($actor); | 
				
			|||
        return ($content == null) ? 0 : $content->getSize(); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getMimeType() | 
				
			|||
    { | 
				
			|||
        $content = $this->getContent($actor); | 
				
			|||
        return ($content == null) ? null : $content->getMimeType(); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getTimestamp(): string | 
				
			|||
    { | 
				
			|||
        return date("c", strtotime($this->getNodeMetadata()["@created"])); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    /** | 
				
			|||
     * Retrieves metadata associated with the node. | 
				
			|||
     * @return mixed Metadata or null if not fetched. | 
				
			|||
     */ | 
				
			|||
    public function getNodeMetadata(User $actor = null): ?array | 
				
			|||
    { | 
				
			|||
        if($this->HasMetadataBeenFetchedYet) | 
				
			|||
        { | 
				
			|||
            return $this->Metadata; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        if($actor == null) | 
				
			|||
        { | 
				
			|||
            $actor = Session::get_current()->getUser(); | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        $result = GraphDatabaseConnection::raw_request($actor, "/api/v1/{" . $this->getId() . "}", "GET"); | 
				
			|||
 | 
				
			|||
        if(is_array($result)) | 
				
			|||
        { | 
				
			|||
            $this->Metadata = $result; | 
				
			|||
        } | 
				
			|||
 | 
				
			|||
        $this->HasMetadataBeenFetchedYet = true; | 
				
			|||
        return $this->Metadata; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getTimestampInt(): false|int | 
				
			|||
    { | 
				
			|||
        return strtotime($this->getNodeMetadata()["@created"]); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getSchema() | 
				
			|||
    { | 
				
			|||
        return Schema::from_url($this->getSchemaUrl()); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getSchemaUrl() | 
				
			|||
    { | 
				
			|||
        return isset($this->getNodeMetadata()["@schema"]) ? $this->getNodeMetadata()["@schema"] : null; | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function getCreator(): ?DeegraphNode | 
				
			|||
    { | 
				
			|||
        return DeegraphNode::from_id($this->getNodeMetadata()["@creator"]); | 
				
			|||
    } | 
				
			|||
 | 
				
			|||
    public function extendsOrInstanceOf(string $schema): bool | 
				
			|||
    { | 
				
			|||
        if(!isset($this->getNodeMetadata()["@schema"])) | 
				
			|||
        { | 
				
			|||
            return false; | 
				
			|||
        } | 
				
			|||
        return $this->getNodeMetadata()["@schema"] == $schema; | 
				
			|||
    } | 
				
			|||
} | 
				
			|||
@ -0,0 +1,40 @@ | 
				
			|||
<?php | 
				
			|||
 | 
				
			|||
use App\Configuration; | 
				
			|||
use App\DeegraphSchemas\TuneSchema; | 
				
			|||
use App\Wrappers\DeegraphInteractions; | 
				
			|||
use App\Wrappers\TwigWrapper; | 
				
			|||
use Darksparrow\AuxiliumSchemaBuilder\Utilities\URLHandling; | 
				
			|||
use Darksparrow\DeegraphInteractions\DataStructures\UUID; | 
				
			|||
use Darksparrow\DeegraphInteractions\QueryBuilder\QueryBuilder; | 
				
			|||
 | 
				
			|||
require_once __DIR__ . "/../vendor/autoload.php"; | 
				
			|||
 | 
				
			|||
$db = DeegraphInteractions::GetConnection(); | 
				
			|||
 | 
				
			|||
 | 
				
			|||
$temp = DeegraphInteractions::NewNode( | 
				
			|||
    dataURL: 'https://google.com', | 
				
			|||
    schema: URLHandling::GetURLForSchema(TuneSchema::class), | 
				
			|||
); | 
				
			|||
 | 
				
			|||
 | 
				
			|||
 | 
				
			|||
$temp = QueryBuilder::Select() | 
				
			|||
    ->relativePaths([ | 
				
			|||
        '.' | 
				
			|||
    ]) | 
				
			|||
    // ->From('**') | 
				
			|||
    ->instanceOf(schema: URLHandling::GetURLForSchema(TuneSchema::class)) | 
				
			|||
    ->build() | 
				
			|||
    ->runQuery( | 
				
			|||
        actorID: new UUID(Configuration::GetConfig("Deegraph", "LoginNode")), | 
				
			|||
        server: $db, | 
				
			|||
    ) | 
				
			|||
; | 
				
			|||
 | 
				
			|||
foreach($temp->Rows as $row) | 
				
			|||
{ | 
				
			|||
    var_dump($row); | 
				
			|||
    echo "<br><br>"; | 
				
			|||
} | 
				
			|||
@ -0,0 +1,15 @@ | 
				
			|||
 | 
				
			|||
.ThreeDContainer { | 
				
			|||
    border-width: 0.5rem; | 
				
			|||
    border-style: ridge; | 
				
			|||
    border-color: #000000; | 
				
			|||
    width: auto; | 
				
			|||
    padding: .5em 2em; | 
				
			|||
} | 
				
			|||
 | 
				
			|||
.NotationContainer { | 
				
			|||
 | 
				
			|||
} | 
				
			|||
 | 
				
			|||
.RawABCReadoutContainer { | 
				
			|||
} | 
				
			|||
								
									
										File diff suppressed because it is too large
									
								
							
						
					
					Loading…
					
					
				
		Reference in new issue