Skip to content

Commit

Permalink
converted notes over to RA.
Browse files Browse the repository at this point in the history
  • Loading branch information
Morgul committed May 21, 2024
1 parent 0b56d7a commit 56f1f84
Show file tree
Hide file tree
Showing 8 changed files with 259 additions and 296 deletions.
7 changes: 1 addition & 6 deletions src/client/lib/models/notebook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,6 @@
//----------------------------------------------------------------------------------------------------------------------

// Models
import { NotebookOptions, NotePage } from '../../../common/interfaces/common';

//----------------------------------------------------------------------------------------------------------------------

export type NotebookPage = NotePage;
export type Notebook = NotebookOptions;
export { Notebook, NotebookPage } from '../../../common/interfaces/common';

//----------------------------------------------------------------------------------------------------------------------
2 changes: 1 addition & 1 deletion src/common/interfaces/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@
export { AccountOptions, AccountSettings, Account } from './models/account';
export { CharacterOptions, SystemDetails, Character } from './models/character';
export { DiceRoll } from './models/dice';
export { NotebookOptions, NotebookPageOptions, Notebook, NotePage } from './models/notebook';
export { NotebookOptions, NotebookPageOptions, Notebook, NotebookPage } from './models/notebook';
export { RoleOptions, Role } from './models/role';
export { RPGKMessage, RPGKEventMessage, RPGKRemoveMessage, RPGKUpdateMessage } from './models/messages';
export { SupplementOptions, Supplement } from './models/supplement';
Expand Down
4 changes: 2 additions & 2 deletions src/common/interfaces/models/notebook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,8 @@ export interface NotebookPageOptions {
// FIXME: Once Models are removed, `NotebookOptions` should be named 'Notebook'.
export type Notebook = NotebookOptions;

// FIXME: Once Models are removed, `NotebookPageOptions` should be named 'NotePage'.
export type NotePage = NotebookPageOptions;
// FIXME: Once Models are removed, `NotebookPageOptions` should be named 'NotebookPage'.
export type NotebookPage = NotebookPageOptions;

//----------------------------------------------------------------------------------------------------------------------

24 changes: 0 additions & 24 deletions src/server/decoders/notebook.ts

This file was deleted.

154 changes: 15 additions & 139 deletions src/server/managers/notebook.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,175 +3,51 @@
// ---------------------------------------------------------------------------------------------------------------------

// Models
import { Notebook, NotebookPage } from '../models/notebook';
import { Notebook, NotebookPage } from '../../common/interfaces/models/notebook';

// Utils
import { getDB } from '../utils/database';
import { shortID } from '../utils/misc';
import { MultipleResultsError, NotFoundError } from '../errors';

// ---------------------------------------------------------------------------------------------------------------------

export interface NoteFilters {
id : unknown,
email : unknown,
title : unknown
}
// Resource Access
import * as noteRA from '../resource-access/notebook';

// ---------------------------------------------------------------------------------------------------------------------

export async function get(notebookID : string) : Promise<Notebook>
{
const db = await getDB();
const pages = (await db('note_page as np')
.select(
'page_id as id',
'n.note_id as notebookID',
'content',
'title'
)
.join('note as n', 'n.note_id', '=', 'np.note_id')
.where({ 'n.note_id': notebookID }))
.map(NotebookPage.fromDB);

return Notebook.fromDB({ id: notebookID, pages });
return noteRA.get(notebookID);
}

export async function list(filters : NoteFilters) : Promise<Notebook[]>
export async function list(filters : noteRA.NoteFilters) : Promise<Notebook[]>
{
const db = await getDB();
const query = db('note as n')
.select('n.note_id as notebookID')
.distinct('n.note_id')
.leftJoin('note_page as np', 'np.note_id', '=', 'n.note_id')
.join('character as c', 'c.note_id', '=', 'n.note_id')
.join('account as a', 'a.account_id', '=', 'c.account_id');

if(filters.id)
{
query.where({ 'n.note_id': filters.id });
}

if(filters.email)
{
query.where({ 'a.email': filters.email });
}

if(filters.title)
{
query.where({ 'np.title': filters.title });
}

return Promise.all((await query)
.map(({ notebookID }) =>
{
return get(notebookID);
}));
return noteRA.list(filters);
}

export async function getPage(pageID : string | number) : Promise<NotebookPage>
{
const db = await getDB();
const pages = await db('note_page as np')
.select(
'page_id as id',
'n.note_id as notebookID',
'content',
'title'
)
.join('note as n', 'n.note_id', '=', 'np.note_id')
.where({ id: pageID });

if(pages.length > 1)
{
throw new MultipleResultsError('page');
}
else if(pages.length === 0)
{
throw new NotFoundError(`No page record found for id '${ pageID }'.`);
}
else
{
return NotebookPage.fromDB(pages[0]);
}
return noteRA.getPage(pageID);
}

export async function addPage(notebookID : string, page : Record<string, unknown>) : Promise<NotebookPage>
export async function addPage(notebookID : string, page : NotebookPage) : Promise<NotebookPage>
{
const db = await getDB();
const notePage = NotebookPage.fromJSON({ ...page, notebookID });

const [ pageID ] = await db('note_page')
.insert(notePage.toDB());

// Return the notebook page
return getPage(pageID);
return noteRA.addPage(notebookID, page);
}

export async function add(pages : Record<string, unknown>[] = []) : Promise<Notebook>
export async function add(pages : NotebookPage[] = []) : Promise<Notebook>
{
const db = await getDB();
const newNoteID = shortID();

await db('note')
.insert({ note_id: newNoteID });

// Add any pages that were specified
await Promise.all(pages.map(async(page) =>
{
await addPage(newNoteID, page);
}));

// Return the note
return get(newNoteID);
return noteRA.add(pages);
}

export async function updatePage(pageID : string | number, pageUpdate : Record<string, unknown>) : Promise<NotebookPage>
export async function updatePage(pageID : string | number, pageUpdate : Partial<NotebookPage>) : Promise<NotebookPage>
{
// Get the current page
const page = await getPage(pageID);

// Mix the current page with the allowed updates.
const allowedUpdate = {
...page.toJSON(),
title: pageUpdate.title ?? page.title,
content: pageUpdate.content ?? page.content
};

// Make a new page object
const newPage = NotebookPage.fromJSON(allowedUpdate);

// Drop the note_id from the update
const { note_id, ...dbRest } = newPage.toDB();

// Update the database
const db = await getDB();
await db('note_page')
.update(dbRest)
.where({ page_id: pageID });

// Return the updated record
return getPage(pageID);
return noteRA.updatePage(pageID, pageUpdate);
}

export async function removePage(pageID : string) : Promise<{ status : 'ok' }>
{
const db = await getDB();
await db('note_page')
.where({ page_id: pageID })
.delete();

return { status: 'ok' };
return noteRA.removePage(pageID);
}

export async function remove(notebookID : string) : Promise<{ status : 'ok' }>
{
const db = await getDB();
await db('note')
.where({ note_id: notebookID })
.delete();

return { status: 'ok' };
return noteRA.remove(notebookID);
}

// ---------------------------------------------------------------------------------------------------------------------
124 changes: 0 additions & 124 deletions src/server/models/notebook.ts

This file was deleted.

Loading

0 comments on commit 56f1f84

Please sign in to comment.