diff --git a/apps/cory/apps.json b/apps/cory/apps.json index 93880c48..4e9ac099 100644 --- a/apps/cory/apps.json +++ b/apps/cory/apps.json @@ -1 +1 @@ -{"type":"tildefriends-app","files":{"app.js":"&5hVx7GCBbUh81CFIPkWJCyDZ9Pp1KBne6BiLbKklwCQ=.sha256"}} \ No newline at end of file +{"type":"tildefriends-app","files":{"app.js":"&C82YfV2CQsreGCcY0FHR4owqVOaN10yvVW7OZxFC8sE=.sha256"}} \ No newline at end of file diff --git a/apps/cory/apps/app.js b/apps/cory/apps/app.js index fdb5b735..bd856fd0 100644 --- a/apps/cory/apps/app.js +++ b/apps/cory/apps/app.js @@ -1,21 +1,28 @@ async function main() { var apps = await core.apps(); + var core_apps = await core.apps('core'); var doc = `

Apps

+

Core Apps

+ ` app.setDocument(doc); diff --git a/core/core.js b/core/core.js index f90bf6c2..b1b2da82 100644 --- a/core/core.js +++ b/core/core.js @@ -192,11 +192,18 @@ async function getProcessBlob(blobId, key, options) { }, 'getUser': getUser.bind(null, process, process), 'user': getUser(process, process), - 'apps': function() { + 'apps': function(name) { if (process.credentials && process.credentials.session && process.credentials.session.name) { - var db = new Database(process.credentials.session.name); + if (name && name !== process.credentials.session.name && name !== 'core') { + return {}; + } else if (!name) { + name = process.credentials.session.name; + } + } + if (name) { + var db = new Database(name); try { var names = JSON.parse(db.get('apps')); return Object.fromEntries(names.map(name => [name, db.get('path:' + name)])); diff --git a/src/ssb.import.c b/src/ssb.import.c index 8f6c5183..edb11914 100644 --- a/src/ssb.import.c +++ b/src/ssb.import.c @@ -3,6 +3,7 @@ #include "ssb.db.h" #include "ssb.h" +#include #include #include #include @@ -28,6 +29,49 @@ static void _tf_ssb_import_file_close(uv_fs_t* req) free(req->data); } +static void _tf_ssb_import_add_app(tf_ssb_t* ssb, const char* user, const char* app) +{ + sqlite3_stmt* statement; + JSContext* context = tf_ssb_get_context(ssb); + JSValue apps = JS_UNDEFINED; + if (sqlite3_prepare(tf_ssb_get_db(ssb), "SELECT value FROM properties WHERE id = $1 AND key = 'apps'", -1, &statement, NULL) == SQLITE_OK) + { + if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK && + sqlite3_step(statement) == SQLITE_ROW) + { + const char* json = (const char*)sqlite3_column_text(statement, 0); + apps = JS_ParseJSON(context, json, strlen(json), NULL); + } + sqlite3_finalize(statement); + } + + if (!JS_IsArray(context, apps)) + { + JS_FreeValue(context, apps); + apps = JS_NewArray(context); + } + int32_t length = 0; + JSValue lengthval = JS_GetPropertyStr(context, apps, "length"); + JS_ToInt32(context, &length, lengthval); + JS_SetPropertyUint32(context, apps, length, JS_NewString(context, app)); + + JSValue json = JS_JSONStringify(context, apps, JS_NULL, JS_NULL); + const char* text = JS_ToCString(context, json); + if (sqlite3_prepare(tf_ssb_get_db(ssb), "INSERT OR REPLACE INTO properties (id, key, value) VALUES ($1, 'apps', $2)", -1, &statement, NULL) == SQLITE_OK) + { + if (sqlite3_bind_text(statement, 1, user, -1, NULL) == SQLITE_OK && + sqlite3_bind_text(statement, 2, text, -1, NULL) == SQLITE_OK && + sqlite3_step(statement) == SQLITE_OK) + { + } + sqlite3_finalize(statement); + } + JS_FreeCString(context, text); + JS_FreeValue(context, json); + + JS_FreeValue(context, apps); +} + static void _tf_ssb_import_file_read(uv_fs_t* req) { tf_import_file_t* file = req->data; @@ -49,6 +93,7 @@ static void _tf_ssb_import_file_read(uv_fs_t* req) sqlite3_step(statement) == SQLITE_DONE) { printf("Registered %s path:%s as %s.\n", file->user, file->name, id); + _tf_ssb_import_add_app(file->ssb, file->user, file->name); } sqlite3_finalize(statement); }