From 3839afd8055d4eb482b99a180acba48db805c0aa Mon Sep 17 00:00:00 2001 From: KernelDeimos <7225168+KernelDeimos@users.noreply.github.com> Date: Tue, 23 Dec 2025 15:05:51 -0500 Subject: [PATCH] dev(data-access): add app owner relationship It turns out self-referencing tables add some nuances to what is and what isn't ambiguous in SQL queries, so getting this right took a little longer than expected. Following the entire chain doesn't seem to be possible so a compromise is made by only traversing one level of depth. (you can the uid of the owner of the app, but not the uid of the owner app's own owner) --- src/backend/src/modules/data-access/AppService.js | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/src/backend/src/modules/data-access/AppService.js b/src/backend/src/modules/data-access/AppService.js index 2b337215b..41b0173e2 100644 --- a/src/backend/src/modules/data-access/AppService.js +++ b/src/backend/src/modules/data-access/AppService.js @@ -45,12 +45,14 @@ export default class AppService extends BaseService { const userCanEditOnly = Array.prototype.includes.call(predicate, 'user-can-edit'); - const stmt = 'SELECT *, ' + + const stmt = 'SELECT apps.*, ' + 'owner_user.username AS owner_user_username, ' + - 'owner_user.uuid AS owner_user_uuid ' + + 'owner_user.uuid AS owner_user_uuid, ' + + 'app_owner.uid AS app_owner_uid ' + 'FROM apps ' + - 'LEFT JOIN user owner_user ON owner_user_id = owner_user.id ' + - `${userCanEditOnly ? 'WHERE owner_user_id=?' : ''} ` + + 'LEFT JOIN user owner_user ON apps.owner_user_id = owner_user.id ' + + 'LEFT JOIN apps app_owner ON apps.app_owner = app_owner.id ' + + `${userCanEditOnly ? 'WHERE apps.owner_user_id=?' : ''} ` + 'LIMIT 5000'; const values = userCanEditOnly ? [Context.get('user').id] : []; const rows = await db.read(stmt, values); @@ -83,6 +85,10 @@ export default class AppService extends BaseService { // app.filetype_associations = row.filetype_associations; // app.owner = row.owner; + app.app_owner = { + uid: row.app_owner_uid, + }; + { const owner_user = extract_from_prefix(row, 'owner_user_'); app.owner_user = user_to_client(owner_user);