From 00c275791f0640b3801d89009958541a7ac6204b Mon Sep 17 00:00:00 2001
From: Maximilian Giller <m.giller@tu-bs.de>
Date: Wed, 26 Jan 2022 20:50:04 +0100
Subject: [PATCH] Implemented get space with full graph

---
 README.md                         |   9 +-
 datasets/datasets.php             | 161 +++++++++++++++++++++++-------
 datasets/ks-datasets-database.php |  36 +++++--
 editor/js/interactions.js         |   2 +-
 4 files changed, 161 insertions(+), 47 deletions(-)

diff --git a/README.md b/README.md
index 7ccbef3..3867c4b 100644
--- a/README.md
+++ b/README.md
@@ -62,14 +62,15 @@ To run the project run `npm run watch`. This starts a parcel instance which auto
                         "nodetype_id": "3",
                         "name": "Vorlesung",
                         "color": "85D0AB"
-                    }
-                    "references": [
-                        {
+                    },
+                    "references": {
+                        "35": {
+                            "node_id": "1",
                             "reference_id": "35",
                             "url": "https://tu-bs.de/reference.html"
                         },
                         ... more references
-                    ]
+                    }
                 },
                 ... more nodes
             },
diff --git a/datasets/datasets.php b/datasets/datasets.php
index 7041473..7c0e386 100644
--- a/datasets/datasets.php
+++ b/datasets/datasets.php
@@ -1,29 +1,139 @@
 <?php
-require_once(__DIR__."/ks-datasets-database.php");
+//! TODO: REMOVE!
+ini_set('display_errors', 1);
+ini_set('display_startup_errors', 1);
+error_reporting(E_ALL);
+require_once(__DIR__ . "/../knowledge-space-database.php");
+
+require_once(__DIR__ . "/ks-datasets-database.php");
 
 $EMPTY_SPACE = '{"links":[],"nodes":[]}';
-$SPACES_DIR = __DIR__."/spaces/";
+$SPACES_DIR = __DIR__ . "/spaces/";
 
 add_action("wp_ajax_get_space", "kg_get_space"); // Fires only for logged-in-users
-add_action("wp_ajax_nopriv_get_space", 'kg_get_space' ); // Fires for everyone
-function kg_get_space() {
-    $space_id = kg_get_space_file_path($_POST["space_id"]);
+add_action("wp_ajax_nopriv_get_space", 'kg_get_space'); // Fires for everyone
+function kg_get_space()
+{
+    $space_id = $_POST["space_id"];
 
-    $space = ks_select_all_spaces($space_id);
+    $space = ks_select_space($space_id);
     if ($space == null) {
         // No valid space found
         wp_die();
     }
-    
+
     $space_id = $space->space_id;
 
-    // Collect nodes
+    // Collect data
     $nodes = ks_select_space_nodes($space_id);
+    $links = ks_select_space_links($space_id);
+
+    // Construct data
+    $nodes = ks_construct_nodes($nodes);
+    $links = ks_construct_links($links);
+
+    // Construct payload and insert graph data
+    $spaces = ks_spaces_to_array(array($space));
+    $spaces[$space_id]["nodes"] = $nodes;
+    $spaces[$space_id]["links"] = $links;
+
+    $payload = array("spaces" => $spaces);
+    echo json_encode($payload);
+
+    wp_die();
+}
+
+function ks_construct_links($raw_links) {
+    $array_links = array();
+    foreach ($raw_links as $link) {
+        // Construct link
+        $array_link = array(
+            "link_id" => $link->link_id,
+            "source_node_id" => $link->source_node_id,
+            "target_node_id" => $link->target_node_id
+        );
+
+        $array_links[$array_link["link_id"]] = $array_link;
+    }
+
+    return $array_links;
+}
+
+function ks_construct_nodes($raw_nodes) {
+    $array_nodes = array();
+    foreach ($raw_nodes as $node) {
+        // Get type
+        $array_type = ks_get_nodetype_to_node($node->nodetype_id);
+
+        // Get references
+        $array_references = ks_get_references_to_node($node->node_id);
+
+        // Construct node
+        $array_node = array(
+            "node_id" => $node->node_id,
+            "space_id" => $node->space_id,
+            "title" => $node->title,
+            "description" => $node->description,
+            "icon_url" => $node->icon_url,
+            "header_url" => $node->header_url,
+            "video_url" => $node->video_url,
+            "type" => $array_type,
+            "references" => $array_references,
+        );
+
+        $array_nodes[$array_node["node_id"]] = $array_node;
+    }
+
+    return $array_nodes;
+}
+
+function ks_get_references_to_node($node_id)
+{
+    if ($node_id == null) {
+        return array();
+    }
+
+    $raw_references = ks_select_node_references($node_id);
+    if ($raw_references == null) {
+        return array();
+    }
+
+    $array_references = array();
+    foreach($raw_references as $raw_reference) {
+        $array_reference = array(
+            "node_id" => $raw_reference->node_id,
+            "reference_id" => $raw_reference->reference_id,
+            "url" => $raw_reference->url
+        );
+
+        $array_references[$array_reference["reference_id"]] = $array_reference;
+    }
+
+    return $array_references;
+}
+
+function ks_get_nodetype_to_node($nodetype_id)
+{
+    if ($nodetype_id == null) {
+        return null;
+    }
+
+    $type = ks_select_nodetype($nodetype_id);
+    if ($type == null) {
+        return null;
+    }
+
+    return array(
+        "nodetype_id" => $type->nodetype_id,
+        "name" => $type->name,
+        "color" => str_pad(dechex($type->color), 6, "0", STR_PAD_LEFT)
+    );
 }
 
 add_action("wp_ajax_list_spaces", "kg_list_spaces"); // Fires only for logged-in-users
-function kg_list_spaces() {
-    $spaces = ks_select_spaces();
+function kg_list_spaces()
+{
+    $spaces = ks_select_all_spaces();
     $spaces = ks_spaces_to_array($spaces);
     $payload = array("spaces" => $spaces);
 
@@ -34,7 +144,8 @@ function kg_list_spaces() {
 
 add_action("wp_ajax_update_space", "kg_update_space"); // Fires only for logged-in-users
 //add_action("wp_ajax_nopriv_update_space", 'update_space' ); // Fires for everyone
-function kg_update_space() {
+function kg_update_space()
+{
     // Check user capabilities
     if (current_user_can("edit_posts")) {
         // Use json encoding.
@@ -48,7 +159,8 @@ function kg_update_space() {
     }
 }
 
-function kg_store_new_graph($graph, $space_id) {
+function kg_store_new_graph($graph, $space_id)
+{
     $file_path = kg_get_space_file_path($space_id);
     $result = file_put_contents($file_path, $graph);
 
@@ -59,34 +171,15 @@ function kg_store_new_graph($graph, $space_id) {
     echo $result;
 }
 
-function kg_get_space_file_path($space_id) {
+function kg_get_space_file_path($space_id)
+{
     // Cleaning up the space id
     $space_id = str_replace("/", "-", $space_id);
     $space_id = str_replace("\\", "-", $space_id);
     $space_id = str_replace(".", "-", $space_id);
 
     global $SPACES_DIR;
-    return $SPACES_DIR.$space_id.".json";
-}
-
-function kg_create_empty_space($file_path) {
-    // Don't do anything, if it exists
-    if (file_exists($file_path)) {
-        return;
-    }
-
-    // Write empty space to file
-    global $EMPTY_SPACE;
-    file_put_contents($file_path, $EMPTY_SPACE);
-}
-
-function endsWith( $haystack, $needle ) {
-    # Source: https://stackoverflow.com/a/834355/7376120
-    $length = strlen( $needle );
-    if( !$length ) {
-        return true;
-    }
-    return substr( $haystack, -$length ) === $needle;
+    return $SPACES_DIR . $space_id . ".json";
 }
 
 function ks_spaces_to_array($spaces)
diff --git a/datasets/ks-datasets-database.php b/datasets/ks-datasets-database.php
index e83dd77..8606b1e 100644
--- a/datasets/ks-datasets-database.php
+++ b/datasets/ks-datasets-database.php
@@ -20,7 +20,7 @@ function ks_select_all_spaces()
 function ks_select_space($space_id)
 {
     global $SPACES_TABLE;
-    return ks_select("SELECT * FROM $SPACES_TABLE WHERE space_id = %i", $space_id);
+    return ks_select_single("SELECT * FROM $SPACES_TABLE WHERE space_id = %d", $space_id);
 }
 
 function ks_insert_space($name = null, $description = "")
@@ -48,35 +48,55 @@ function ks_insert_space($name = null, $description = "")
 function ks_select_space_nodes($space_id)
 {
     global $NODES_TABLE;
-    return ks_select("SELECT * FROM $NODES_TABLE WHERE space_id = %i", $space_id);
+    return ks_select("SELECT * FROM $NODES_TABLE WHERE space_id = %d", $space_id);
 }
 
 function ks_select_space_links($space_id)
 {
     global $LINKS_TABLE;
     global $NODES_TABLE;
-    return ks_select("SELECT link_id, source_node_id, target_node_id FROM $LINKS_TABLE JOIN $NODES_TABLE ON $NODES_TABLE.node_id = $LINKS_TABLE.source_node_id WHERE $NODES_TABLE.space_id = %i", $space_id);
+    return ks_select("SELECT link_id, source_node_id, target_node_id FROM $LINKS_TABLE JOIN $NODES_TABLE ON $NODES_TABLE.node_id = $LINKS_TABLE.source_node_id WHERE $NODES_TABLE.space_id = %d", $space_id);
 }
 
 function ks_select_space_nodetypes($space_id)
 {
     global $NODETYPES_TABLE;
-    return ks_select("SELECT * FROM $NODETYPES_TABLE WHERE space_id = %i", $space_id);
+    return ks_select("SELECT * FROM $NODETYPES_TABLE WHERE space_id = %d", $space_id);
+}
+
+function ks_select_nodetype($nodetype_id)
+{
+    global $NODETYPES_TABLE;
+    return ks_select_single("SELECT * FROM $NODETYPES_TABLE WHERE nodetype_id = %d", $nodetype_id);
 }
 
 function ks_select_space_references($space_id)
 {
     global $REFERENCES_TABLE;
     global $NODES_TABLE;
-    return ks_select("SELECT reference_id, url, node_id FROM $REFERENCES_TABLE JOIN $NODES_TABLE ON $NODES_TABLE.node_id = $REFERENCES_TABLE.node_id WHERE $NODES_TABLE.space_id = %i", $space_id);
+    return ks_select("SELECT reference_id, url, node_id FROM $REFERENCES_TABLE JOIN $NODES_TABLE ON $NODES_TABLE.node_id = $REFERENCES_TABLE.node_id WHERE $NODES_TABLE.space_id = %d", $space_id);
+}
+
+function ks_select_node_references($node_id)
+{
+    global $REFERENCES_TABLE;
+    return ks_select("SELECT * FROM $REFERENCES_TABLE WHERE node_id = %d", $node_id);
 }
 
 function ks_select($query, $parameters = array())
 {
     global $wpdb;
-
     $sql = $wpdb->prepare($query, $parameters);
-    $results = $wpdb->get_results($sql) or die(mysql_error());
+    return $wpdb->get_results($sql);
+}
 
-    return $results;
+function ks_select_single($query, $parameters = array())
+{
+    $result = ks_select($query, $parameters);
+
+    if ($result) {
+        return $result[0];
+    } else {
+        return null;
+    }
 }
diff --git a/editor/js/interactions.js b/editor/js/interactions.js
index 60917d1..e1c66ea 100644
--- a/editor/js/interactions.js
+++ b/editor/js/interactions.js
@@ -17,7 +17,7 @@ export function initInteractions() {
         Object.keys(spaces).forEach(space_id => {
             var selectedTxt = "";
             var space = spaces[space_id];
-            if (space.name === SPACE) {
+            if (space_id === SPACE) {
                 selectedTxt = "selected ";
             }
 
-- 
GitLab