From b17d8a18a52711c4975e498cc67ae2b41c5173c6 Mon Sep 17 00:00:00 2001 From: garrettmills Date: Sun, 10 Apr 2022 03:59:08 -0500 Subject: [PATCH] Add endpoints to save, load, and list user pages --- .../controllers/api/EditorPage.controller.ts | 71 +++++++++++++++++++ src/app/http/routes/app.routes.ts | 14 +++- ...eateEditorPagesTableMigration.migration.ts | 44 ++++++++++++ src/app/models/EditorPage.model.ts | 19 +++++ 4 files changed, 147 insertions(+), 1 deletion(-) create mode 100644 src/app/http/controllers/api/EditorPage.controller.ts create mode 100644 src/app/migrations/2022-04-10T08:03:01.479Z_CreateEditorPagesTableMigration.migration.ts create mode 100644 src/app/models/EditorPage.model.ts diff --git a/src/app/http/controllers/api/EditorPage.controller.ts b/src/app/http/controllers/api/EditorPage.controller.ts new file mode 100644 index 0000000..f656f5e --- /dev/null +++ b/src/app/http/controllers/api/EditorPage.controller.ts @@ -0,0 +1,71 @@ +import {Controller, view, Inject, Injectable, SecurityContext, api, make, Logging} from '@extollo/lib' +import {EditorPage as Page} from '../../../models/EditorPage.model' + +/** + * EditorPage Controller + * ------------------------------------ + * Put some description here. + */ +@Injectable() +export class EditorPage extends Controller { + @Inject() + protected readonly security!: SecurityContext + + @Inject() + protected readonly logging!: Logging + + public async list() { + const pages = await Page.query() + .where('user_id', '=', this.security.user().getUniqueIdentifier()) + .get() + .toArray() + + return api.many(pages) + } + + public async load() { + const pageId = this.request.safe('pageId').integer() + const page = await Page.query() + .where('user_id', '=', this.security.user().getUniqueIdentifier()) + .whereKey(pageId) + .first() + + if ( !page ) { + return api.error('Page not found.') + } + + return api.one(page) + } + + public async save() { + // Check if page_id is specified + const serialData = this.request.safe('serialData').string() + const pageId = String(this.request.input('pageId') ?? '') + + // If so, look it up and update it + if ( pageId ) { + const page = await Page.query() + .whereKey(parseInt(pageId, 10)) + .where('user_id', '=', this.security.user().getUniqueIdentifier()) + .first() + + if ( !page ) { + return api.error('Invalid pageId.') + } + + page.serialData = serialData + await page.save() + return api.one(page) + } + + // If not, create new page and save it + this.logging.debug('userId:') + this.logging.debug(this.security.user().getUniqueIdentifier()) + const page = make(Page) + page.userId = String(this.security.user().getUniqueIdentifier()) + page.serialData = serialData + + await page.save() + return api.one(page) + } +} diff --git a/src/app/http/routes/app.routes.ts b/src/app/http/routes/app.routes.ts index f70a0b8..f665b53 100644 --- a/src/app/http/routes/app.routes.ts +++ b/src/app/http/routes/app.routes.ts @@ -1,6 +1,7 @@ import {Route, AuthRequiredMiddleware, GuestRequiredMiddleware, SessionAuthMiddleware} from '@extollo/lib' import {Home} from '../controllers/main/Home.controller' import {Login} from '../controllers/api/Login.controller' +import {EditorPage} from '../controllers/api/EditorPage.controller' Route.group('/', () => { Route.get('/') @@ -12,6 +13,17 @@ Route.group('/', () => { success: true, })) + Route.group('/editor', () => { + Route.post('/page') + .calls(EditorPage, page => page.save) + + Route.get('/page') + .calls(EditorPage, page => page.load) + + Route.get('/pages') + .calls(EditorPage, page => page.list) + }).pre(AuthRequiredMiddleware) + Route.group('/login', () => { Route.post('/') .pre(GuestRequiredMiddleware) @@ -23,7 +35,7 @@ Route.group('/', () => { Route.get('/user') .pre(AuthRequiredMiddleware) .calls(Login, login => login.user) - + }) Route.post('/register') diff --git a/src/app/migrations/2022-04-10T08:03:01.479Z_CreateEditorPagesTableMigration.migration.ts b/src/app/migrations/2022-04-10T08:03:01.479Z_CreateEditorPagesTableMigration.migration.ts new file mode 100644 index 0000000..d805ba7 --- /dev/null +++ b/src/app/migrations/2022-04-10T08:03:01.479Z_CreateEditorPagesTableMigration.migration.ts @@ -0,0 +1,44 @@ +import {Injectable, Migration, Inject, DatabaseService, FieldType} from '@extollo/lib' + +/** + * CreateEditorPagesTableMigration + * ---------------------------------- + * Put some description here. + */ +@Injectable() +export default class CreateEditorPagesTableMigration extends Migration { + @Inject() + protected readonly db!: DatabaseService + + /** + * Apply the migration. + */ + async up(): Promise { + const schema = this.db.get().schema() + const table = await schema.table('editor_pages') + + table.primaryKey('page_id').required() + + table.column('user_id') + .type(FieldType.varchar) + .required() + + table.column('serial_data') + .type(FieldType.text) + .required() + + await schema.commit(table) + } + + /** + * Undo the migration. + */ + async down(): Promise { + const schema = this.db.get().schema() + const table = await schema.table('editor_pages') + + table.dropIfExists() + + await schema.commit(table) + } +} diff --git a/src/app/models/EditorPage.model.ts b/src/app/models/EditorPage.model.ts new file mode 100644 index 0000000..9723d27 --- /dev/null +++ b/src/app/models/EditorPage.model.ts @@ -0,0 +1,19 @@ +import {Field, FieldType, Injectable, Model} from '@extollo/lib' + +/** + * EditorPage Model + */ +@Injectable() +export class EditorPage extends Model { + protected static table = 'editor_pages' + protected static key = 'page_id' + + @Field(FieldType.serial, 'page_id') + public pageId?: number + + @Field(FieldType.varchar, 'user_id') + public userId!: string + + @Field(FieldType.text, 'serial_data') + public serialData!: string +}