From 95b3939e227375bcc608711a6f3f491660fb268f Mon Sep 17 00:00:00 2001 From: orgrimarr <25098751+orgrimarr@users.noreply.github.com> Date: Wed, 14 Feb 2024 17:55:14 +0100 Subject: [PATCH 1/2] feat: Store iconUrl in workspace.data https://github.com/ferdium/ferdium-app/pull/1240 --- app/Controllers/Http/WorkspaceController.ts | 53 +++++++++++++++------ app/Models/Workspace.ts | 7 ++- 2 files changed, 44 insertions(+), 16 deletions(-) diff --git a/app/Controllers/Http/WorkspaceController.ts b/app/Controllers/Http/WorkspaceController.ts index 70af343e..055336a8 100644 --- a/app/Controllers/Http/WorkspaceController.ts +++ b/app/Controllers/Http/WorkspaceController.ts @@ -1,6 +1,6 @@ import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; import { validator, schema } from '@ioc:Adonis/Core/Validator'; -import Workspace from 'App/Models/Workspace'; +import Workspace, { type CustomData } from 'App/Models/Workspace'; import { v4 as uuid } from 'uuid'; const createSchema = schema.create({ @@ -89,6 +89,16 @@ export default class WorkspaceController { const data = request.all(); const { id } = params; + const currentWorkspace = await Workspace.query() + .where('workspaceId', id) + .where('userId', user.id) + .firstOrFail(); + const customData: CustomData = JSON.parse(currentWorkspace.data || '{}'); + Object.assign(customData, { + name: data.name, + iconUrl: data.iconUrl, + }); + // Update data in database await Workspace.query() .where('workspaceId', id) @@ -96,6 +106,7 @@ export default class WorkspaceController { .update({ name: data.name, services: JSON.stringify(data.services), + data: JSON.stringify(customData), }); // Get updated row @@ -106,10 +117,11 @@ export default class WorkspaceController { return response.send({ id: workspace.workspaceId, - name: data.name, + name: workspace.name, order: workspace.order, - services: data.services, + services: workspace.services, userId: user.id, + iconUrl: customData.iconUrl, }); } @@ -165,19 +177,30 @@ export default class WorkspaceController { const workspaces = await user.related('workspaces').query(); // Convert to array with all data Franz wants - let workspacesArray: object[] = []; + let workspacesArray: Workspace[] = []; if (workspaces) { - // eslint-disable-next-line @typescript-eslint/no-explicit-any - workspacesArray = workspaces.map((workspace: any) => ({ - id: workspace.workspaceId, - name: workspace.name, - order: workspace.order, - services: - typeof workspace.services === 'string' - ? JSON.parse(workspace.services) - : workspace.services, - userId: user.id, - })); + workspacesArray = workspaces.map((workspace: Workspace) => { + let data: CustomData = {}; + try { + data = JSON.parse(workspace.data); + } catch (error) { + console.warn( + `[WorkspaceController] list ${workspace.workspaceId}. Error parsing data JSON`, + error, + ); + } + return { + id: workspace.workspaceId, + name: workspace.name, + order: workspace.order, + services: + typeof workspace.services === 'string' + ? JSON.parse(workspace.services) + : workspace.services, + userId: user.id, + iconUrl: data.iconUrl ?? '', + }; + }); } return response.send(workspacesArray); diff --git a/app/Models/Workspace.ts b/app/Models/Workspace.ts index 8648e02f..36994880 100644 --- a/app/Models/Workspace.ts +++ b/app/Models/Workspace.ts @@ -31,7 +31,7 @@ export default class Workspace extends BaseModel { public services: string; @column() - public data: string; + public data: string; // JSON string that match type CustomData @column.dateTime({ autoCreate: true }) public createdAt: DateTime; @@ -39,3 +39,8 @@ export default class Workspace extends BaseModel { @column.dateTime({ autoCreate: true, autoUpdate: true }) public updatedAt: DateTime; } + +export interface CustomData { + name?: string; + iconUrl?: string; +} From d61be09464123d8ddff7dedfbc1a81898b427afb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Andr=C3=A9=20Oliveira?= Date: Thu, 15 Feb 2024 10:19:28 +0000 Subject: [PATCH 2/2] Add iconUrl logic --- app/Controllers/Http/WorkspaceController.ts | 55 ++++++------------- app/Models/Workspace.ts | 10 ++-- .../1707993515903_add_workspace_icon_urls.ts | 17 ++++++ 3 files changed, 38 insertions(+), 44 deletions(-) create mode 100644 database/migrations/1707993515903_add_workspace_icon_urls.ts diff --git a/app/Controllers/Http/WorkspaceController.ts b/app/Controllers/Http/WorkspaceController.ts index 055336a8..6cc6bee4 100644 --- a/app/Controllers/Http/WorkspaceController.ts +++ b/app/Controllers/Http/WorkspaceController.ts @@ -1,6 +1,6 @@ import type { HttpContextContract } from '@ioc:Adonis/Core/HttpContext'; import { validator, schema } from '@ioc:Adonis/Core/Validator'; -import Workspace, { type CustomData } from 'App/Models/Workspace'; +import Workspace from 'App/Models/Workspace'; import { v4 as uuid } from 'uuid'; const createSchema = schema.create({ @@ -89,16 +89,6 @@ export default class WorkspaceController { const data = request.all(); const { id } = params; - const currentWorkspace = await Workspace.query() - .where('workspaceId', id) - .where('userId', user.id) - .firstOrFail(); - const customData: CustomData = JSON.parse(currentWorkspace.data || '{}'); - Object.assign(customData, { - name: data.name, - iconUrl: data.iconUrl, - }); - // Update data in database await Workspace.query() .where('workspaceId', id) @@ -106,7 +96,7 @@ export default class WorkspaceController { .update({ name: data.name, services: JSON.stringify(data.services), - data: JSON.stringify(customData), + iconUrl: data.iconUrl, }); // Get updated row @@ -117,11 +107,10 @@ export default class WorkspaceController { return response.send({ id: workspace.workspaceId, - name: workspace.name, + name: data.name, order: workspace.order, - services: workspace.services, + services: data.services, userId: user.id, - iconUrl: customData.iconUrl, }); } @@ -177,30 +166,20 @@ export default class WorkspaceController { const workspaces = await user.related('workspaces').query(); // Convert to array with all data Franz wants - let workspacesArray: Workspace[] = []; + let workspacesArray: object[] = []; if (workspaces) { - workspacesArray = workspaces.map((workspace: Workspace) => { - let data: CustomData = {}; - try { - data = JSON.parse(workspace.data); - } catch (error) { - console.warn( - `[WorkspaceController] list ${workspace.workspaceId}. Error parsing data JSON`, - error, - ); - } - return { - id: workspace.workspaceId, - name: workspace.name, - order: workspace.order, - services: - typeof workspace.services === 'string' - ? JSON.parse(workspace.services) - : workspace.services, - userId: user.id, - iconUrl: data.iconUrl ?? '', - }; - }); + // eslint-disable-next-line @typescript-eslint/no-explicit-any + workspacesArray = workspaces.map((workspace: any) => ({ + id: workspace.workspaceId, + name: workspace.name, + iconUrl: workspace.iconUrl, + order: workspace.order, + services: + typeof workspace.services === 'string' + ? JSON.parse(workspace.services) + : workspace.services, + userId: user.id, + })); } return response.send(workspacesArray); diff --git a/app/Models/Workspace.ts b/app/Models/Workspace.ts index 36994880..8e8f78d4 100644 --- a/app/Models/Workspace.ts +++ b/app/Models/Workspace.ts @@ -31,7 +31,10 @@ export default class Workspace extends BaseModel { public services: string; @column() - public data: string; // JSON string that match type CustomData + public data: string; + + @column() + public iconUrl: string; @column.dateTime({ autoCreate: true }) public createdAt: DateTime; @@ -39,8 +42,3 @@ export default class Workspace extends BaseModel { @column.dateTime({ autoCreate: true, autoUpdate: true }) public updatedAt: DateTime; } - -export interface CustomData { - name?: string; - iconUrl?: string; -} diff --git a/database/migrations/1707993515903_add_workspace_icon_urls.ts b/database/migrations/1707993515903_add_workspace_icon_urls.ts new file mode 100644 index 00000000..c1d89929 --- /dev/null +++ b/database/migrations/1707993515903_add_workspace_icon_urls.ts @@ -0,0 +1,17 @@ +import BaseSchema from '@ioc:Adonis/Lucid/Schema' + +export default class extends BaseSchema { + protected tableName = 'workspaces' + + public async up () { + this.schema.alterTable(this.tableName, (table) => { + table.string('icon_url').nullable() + }) + } + + public async down () { + this.schema.alterTable(this.tableName, (table) => { + table.dropColumn('icon_url') + }) + } +}