diff --git a/src/app/service/db/Codium.ts b/src/app/service/db/Codium.ts index f18cc0e..01e8b32 100644 --- a/src/app/service/db/Codium.ts +++ b/src/app/service/db/Codium.ts @@ -9,6 +9,7 @@ export interface ICodium { UUID: string; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; } export class Codium extends Model implements ICodium { @@ -20,13 +21,14 @@ export class Codium extends Model implements ICodium { UUID: string; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; public static getTableName() { return 'codiums'; } public static getSchema() { - return '++id, Language, NodeId, PageId, code, UUID, needsServerUpdate, deleted'; + return '++id, Language, NodeId, PageId, code, UUID, needsServerUpdate, deleted, offlineUpdatedAt'; } constructor( @@ -37,6 +39,7 @@ export class Codium extends Model implements ICodium { UUID: string, needsServerUpdate?: boolean, deleted?: boolean, + offlineUpdatedAt?: string, id?: number ) { super(); @@ -55,6 +58,10 @@ export class Codium extends Model implements ICodium { this.deleted = deleted; } + if ( typeof offlineUpdatedAt !== 'undefined' ) { + this.offlineUpdatedAt = offlineUpdatedAt; + } + if ( id ) { this.id = id; } @@ -78,6 +85,7 @@ export class Codium extends Model implements ICodium { UUID: this.UUID, ...(typeof this.needsServerUpdate === 'undefined' ? {} : { needsServerUpdate: this.needsServerUpdate }), ...(typeof this.deleted === 'undefined' ? {} : { deleted: this.deleted }), + ...(typeof this.offlineUpdatedAt === 'undefined' ? {} : { offlineUpdatedAt: this.offlineUpdatedAt }), }; } diff --git a/src/app/service/db/Database.ts b/src/app/service/db/Database.ts index 9066a98..a8f4fb3 100644 --- a/src/app/service/db/Database.ts +++ b/src/app/service/db/Database.ts @@ -10,6 +10,7 @@ export interface IDatabase { Active: boolean; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; } export class Database extends Model implements IDatabase { @@ -22,13 +23,14 @@ export class Database extends Model implements IDatabase { Active: boolean; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; public static getTableName() { return 'databases'; } public static getSchema() { - return '++id, Name, NodeId, PageId, ColumnIds, UUID, Active, needsServerUpdate, deleted'; + return '++id, Name, NodeId, PageId, ColumnIds, UUID, Active, needsServerUpdate, deleted, offlineUpdatedAt'; } constructor( @@ -40,7 +42,8 @@ export class Database extends Model implements IDatabase { Active: boolean, needsServerUpdate?: boolean, deleted?: boolean, - id?: number + offlineUpdatedAt?: string, + id?: number, ) { super(); @@ -59,6 +62,10 @@ export class Database extends Model implements IDatabase { this.deleted = deleted; } + if ( typeof offlineUpdatedAt !== 'undefined' ) { + this.offlineUpdatedAt = offlineUpdatedAt; + } + if ( id ) { this.id = id; } @@ -84,6 +91,7 @@ export class Database extends Model implements IDatabase { Active: this.Active, ...(typeof this.needsServerUpdate === 'undefined' ? {} : { needsServerUpdate: this.needsServerUpdate }), ...(typeof this.deleted === 'undefined' ? {} : { deleted: this.deleted }), + ...(typeof this.offlineUpdatedAt === 'undefined' ? {} : { offlineUpdatedAt: this.offlineUpdatedAt }), }; } diff --git a/src/app/service/db/DatabaseColumn.ts b/src/app/service/db/DatabaseColumn.ts index 222494c..31bd002 100644 --- a/src/app/service/db/DatabaseColumn.ts +++ b/src/app/service/db/DatabaseColumn.ts @@ -10,6 +10,7 @@ export interface IDatabaseColumn { additionalData: string; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; } export class DatabaseColumn extends Model implements IDatabaseColumn { @@ -22,13 +23,14 @@ export class DatabaseColumn extends Model implements IDatabaseC additionalData: string; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; public static getTableName() { return 'databaseColumns'; } public static getSchema() { - return '++id, headerName, field, DatabaseId, UUID, Type, additionalData, needsServerUpdate, deleted'; + return '++id, headerName, field, DatabaseId, UUID, Type, additionalData, needsServerUpdate, deleted, offlineUpdatedAt'; } constructor( @@ -40,7 +42,8 @@ export class DatabaseColumn extends Model implements IDatabaseC additionalData: string, needsServerUpdate?: boolean, deleted?: boolean, - id?: number + offlineUpdatedAt?: string, + id?: number, ) { super(); @@ -59,6 +62,10 @@ export class DatabaseColumn extends Model implements IDatabaseC this.deleted = deleted; } + if ( typeof offlineUpdatedAt !== 'undefined' ) { + this.offlineUpdatedAt = offlineUpdatedAt; + } + if ( id ) { this.id = id; } @@ -84,6 +91,7 @@ export class DatabaseColumn extends Model implements IDatabaseC additionalData: this.additionalData, ...(typeof this.needsServerUpdate === 'undefined' ? {} : { needsServerUpdate: this.needsServerUpdate }), ...(typeof this.deleted === 'undefined' ? {} : { deleted: this.deleted }), + ...(typeof this.offlineUpdatedAt === 'undefined' ? {} : { offlineUpdatedAt: this.offlineUpdatedAt }), }; } diff --git a/src/app/service/db/DatabaseEntry.ts b/src/app/service/db/DatabaseEntry.ts index 660c8c0..f5878bb 100644 --- a/src/app/service/db/DatabaseEntry.ts +++ b/src/app/service/db/DatabaseEntry.ts @@ -7,6 +7,7 @@ export interface IDatabaseEntry { UUID: string; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; } export class DatabaseEntry extends Model implements IDatabaseEntry { @@ -16,13 +17,14 @@ export class DatabaseEntry extends Model implements IDatabaseEnt UUID: string; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; public static getTableName() { return 'databaseEntries'; } public static getSchema() { - return '++id, DatabaseId, RowDataJSON, UUID, needsServerUpdate, deleted'; + return '++id, DatabaseId, RowDataJSON, UUID, needsServerUpdate, deleted, offlineUpdatedAt'; } constructor( @@ -31,7 +33,8 @@ export class DatabaseEntry extends Model implements IDatabaseEnt UUID: string, needsServerUpdate?: boolean, deleted?: boolean, - id?: number + offlineUpdatedAt?: string, + id?: number, ) { super(); @@ -47,6 +50,10 @@ export class DatabaseEntry extends Model implements IDatabaseEnt this.deleted = deleted; } + if ( typeof offlineUpdatedAt !== 'undefined' ) { + this.offlineUpdatedAt = offlineUpdatedAt; + } + if ( id ) { this.id = id; } @@ -73,6 +80,7 @@ export class DatabaseEntry extends Model implements IDatabaseEnt UUID: this.UUID, ...(typeof this.needsServerUpdate === 'undefined' ? {} : { needsServerUpdate: this.needsServerUpdate }), ...(typeof this.deleted === 'undefined' ? {} : { deleted: this.deleted }), + ...(typeof this.offlineUpdatedAt === 'undefined' ? {} : { offlineUpdatedAt: this.offlineUpdatedAt }) }; } diff --git a/src/app/service/db/FileGroup.ts b/src/app/service/db/FileGroup.ts index e90b87d..cb135b3 100644 --- a/src/app/service/db/FileGroup.ts +++ b/src/app/service/db/FileGroup.ts @@ -9,6 +9,7 @@ export interface IFileGroup { UUID: string; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; } export class FileGroup extends Model implements IFileGroup { @@ -20,13 +21,14 @@ export class FileGroup extends Model implements IFileGroup { UUID: string; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; public static getTableName() { return 'fileGroups'; } public static getSchema() { - return '++id, NodeId, PageId, FileIds, filesJSON, UUID, needsServerUpdate, deleted'; + return '++id, NodeId, PageId, FileIds, filesJSON, UUID, needsServerUpdate, deleted, offlineUpdatedAt'; } constructor( @@ -37,7 +39,8 @@ export class FileGroup extends Model implements IFileGroup { UUID: string, needsServerUpdate?: boolean, deleted?: boolean, - id?: number + offlineUpdatedAt?: string, + id?: number, ) { super(); @@ -55,6 +58,10 @@ export class FileGroup extends Model implements IFileGroup { this.deleted = deleted; } + if ( typeof offlineUpdatedAt !== 'undefined' ) { + this.offlineUpdatedAt = offlineUpdatedAt; + } + if ( id ) { this.id = id; } @@ -88,6 +95,7 @@ export class FileGroup extends Model implements IFileGroup { UUID: this.UUID, ...(typeof this.needsServerUpdate === 'undefined' ? {} : { needsServerUpdate: this.needsServerUpdate }), ...(typeof this.deleted === 'undefined' ? {} : { deleted: this.deleted }), + ...(typeof this.offlineUpdatedAt === 'undefined' ? {} : { offlineUpdatedAt: this.offlineUpdatedAt }), }; } diff --git a/src/app/service/db/KeyValue.ts b/src/app/service/db/KeyValue.ts index 34bc195..44e24d0 100644 --- a/src/app/service/db/KeyValue.ts +++ b/src/app/service/db/KeyValue.ts @@ -5,6 +5,7 @@ export interface IKeyValue { key: string; value: string; json: boolean; + offlineUpdatedAt?: string; } export class KeyValue extends Model implements IKeyValue { @@ -12,21 +13,27 @@ export class KeyValue extends Model implements IKeyValue { key: string; value: string; json: boolean; + offlineUpdatedAt?: string; public static getTableName() { return 'keyValues'; } public static getSchema() { - return '++id, key, value, json'; + return '++id, key, value, json, offlineUpdatedAt'; } - constructor(key: string, value: string, json: boolean, id?: number) { + constructor(key: string, value: string, json: boolean, offlineUpdatedAt?: string, id?: number) { super(); this.key = key; this.value = value; this.json = json; + + if ( typeof offlineUpdatedAt !== 'undefined' ) { + this.offlineUpdatedAt = offlineUpdatedAt; + } + if ( id ) { this.id = id; } @@ -56,6 +63,7 @@ export class KeyValue extends Model implements IKeyValue { key: this.key, value: this.value, json: this.json, + ...(typeof this.offlineUpdatedAt === 'undefined' ? {} : { offlineUpdatedAt: this.offlineUpdatedAt }) }; } diff --git a/src/app/service/db/MenuItem.ts b/src/app/service/db/MenuItem.ts index ba11a77..683c9f6 100644 --- a/src/app/service/db/MenuItem.ts +++ b/src/app/service/db/MenuItem.ts @@ -12,6 +12,7 @@ export interface IMenuItem { type?: string; shared?: boolean; needsServerUpdate?: boolean; + offlineUpdatedAt?: string; } export class MenuItem extends Model implements IMenuItem { @@ -25,13 +26,14 @@ export class MenuItem extends Model implements IMenuItem { type?: string; shared?: boolean; needsServerUpdate?: boolean; + offlineUpdatedAt?: string; public static getTableName() { return 'menuItems'; } public static getSchema() { - return '++id, serverId, name, childIds, noDelete, noChildren, virtual, type, shared, needsServerUpdate'; + return '++id, serverId, name, childIds, noDelete, noChildren, virtual, type, shared, needsServerUpdate, offlineUpdatedAt'; } public static deflateTree(nodes: any[]): MenuItem[] { @@ -111,6 +113,7 @@ export class MenuItem extends Model implements IMenuItem { type?: string, shared?: boolean, needsServerUpdate?: boolean, + offlineUpdatedAt?: string, id?: number ) { super(); @@ -145,6 +148,10 @@ export class MenuItem extends Model implements IMenuItem { this.needsServerUpdate = needsServerUpdate; } + if ( typeof offlineUpdatedAt !== 'undefined' ) { + this.offlineUpdatedAt = offlineUpdatedAt; + } + if ( id ) { this.id = id; } @@ -166,6 +173,7 @@ export class MenuItem extends Model implements IMenuItem { ...(typeof this.type !== 'undefined' ? { type: this.type } : {}), ...(typeof this.shared !== 'undefined' ? { shared: this.shared } : {}), ...(typeof this.needsServerUpdate !== 'undefined' ? { needsServerUpdate: this.needsServerUpdate } : {}), + ...(typeof this.offlineUpdatedAt !== 'undefined' ? { offlineUpdatedAt: this.offlineUpdatedAt } : {}), }; } } diff --git a/src/app/service/db/Migration.ts b/src/app/service/db/Migration.ts index 11d5241..d83af55 100644 --- a/src/app/service/db/Migration.ts +++ b/src/app/service/db/Migration.ts @@ -4,26 +4,33 @@ export interface IMigration { id?: number; uuid: string; applied: boolean; + offlineUpdatedAt?: string; } export class Migration extends Model implements IMigration { id?: number; uuid: string; applied: boolean; + offlineUpdatedAt?: string; public static getTableName() { return 'migrations'; } public static getSchema() { - return '++id, uuid, applied'; + return '++id, uuid, applied, offlineUpdatedAt'; } - constructor(uuid: string, applied: boolean, id?: number) { + constructor(uuid: string, applied: boolean, offlineUpdatedAt?: string, id?: number) { super(); this.uuid = uuid; this.applied = applied; + + if ( typeof offlineUpdatedAt !== 'undefined' ) { + this.offlineUpdatedAt = offlineUpdatedAt; + } + if ( id ) { this.id = id; } @@ -34,6 +41,7 @@ export class Migration extends Model implements IMigration { ...(this.id ? { id: this.id } : {}), uuid: this.uuid, applied: this.applied, + ...(typeof this.offlineUpdatedAt === 'undefined' ? {} : { offlineUpdatedAt: this.offlineUpdatedAt }), }; } diff --git a/src/app/service/db/Model.ts b/src/app/service/db/Model.ts index de5a041..ec6d7f2 100644 --- a/src/app/service/db/Model.ts +++ b/src/app/service/db/Model.ts @@ -43,6 +43,8 @@ export abstract class Model { } } + record.offlineUpdatedAt = String(new Date()); + this.id = await this.getDatabase().put(record); } } diff --git a/src/app/service/db/Page.ts b/src/app/service/db/Page.ts index 1bdb040..d298402 100644 --- a/src/app/service/db/Page.ts +++ b/src/app/service/db/Page.ts @@ -19,6 +19,7 @@ export interface IPage { virtual: boolean; needsServerUpdate?: 0 | 1; deleted?: boolean; + offlineUpdatedAt?: string; } export class Page extends Model implements IPage { @@ -40,6 +41,7 @@ export class Page extends Model implements IPage { virtual: boolean; needsServerUpdate?: 0 | 1; deleted?: boolean; + offlineUpdatedAt?: string; public static getTableName() { return 'pages'; @@ -47,7 +49,7 @@ export class Page extends Model implements IPage { public static getSchema() { // tslint:disable-next-line:max-line-length - return '++id, UUID, Name, OrgUserId, IsPublic, IsVisibleInMenu, ParentId, NodeIds, CreatedAt, UpdatedAt, Active, CreatedUserId, UpdateUserId, ChildPageIds, noDelete, virtual, needsServerUpdate, deleted'; + return '++id, UUID, Name, OrgUserId, IsPublic, IsVisibleInMenu, ParentId, NodeIds, CreatedAt, UpdatedAt, Active, CreatedUserId, UpdateUserId, ChildPageIds, noDelete, virtual, needsServerUpdate, deleted, offlineUpdatedAt'; } constructor( @@ -68,6 +70,7 @@ export class Page extends Model implements IPage { virtual: boolean, needsServerUpdate?: 0 | 1, deleted?: boolean, + offlineUpdatedAt?: string, id?: number ) { super(); @@ -96,6 +99,10 @@ export class Page extends Model implements IPage { this.deleted = deleted; } + if ( typeof offlineUpdatedAt !== 'undefined' ) { + this.offlineUpdatedAt = offlineUpdatedAt; + } + if ( id ) { this.id = id; } @@ -141,6 +148,7 @@ export class Page extends Model implements IPage { virtual: this.virtual, ...(typeof this.needsServerUpdate === 'undefined' ? {} : { needsServerUpdate: this.needsServerUpdate }), ...(typeof this.deleted === 'undefined' ? {} : { deleted: this.deleted }), + ...(typeof this.offlineUpdatedAt === 'undefined' ? {} : { offlineUpdatedAt: this.offlineUpdatedAt }), }; } diff --git a/src/app/service/db/PageNode.ts b/src/app/service/db/PageNode.ts index a543005..6efbe04 100644 --- a/src/app/service/db/PageNode.ts +++ b/src/app/service/db/PageNode.ts @@ -12,6 +12,7 @@ export interface IPageNode { UpdateUserId: string; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; } export class PageNode extends Model implements IPageNode { @@ -26,6 +27,7 @@ export class PageNode extends Model implements IPageNode { UpdateUserId: string; needsServerUpdate?: boolean; deleted?: boolean; + offlineUpdatedAt?: string; public static getTableName() { return 'pageNodes'; @@ -33,7 +35,7 @@ export class PageNode extends Model implements IPageNode { public static getSchema() { // tslint:disable-next-line:max-line-length - return '++id, UUID, Type, ValueJSON, PageId, CreatedAt, UpdatedAt, CreatedUserId, UpdateUserId, needsServerUpdate, deleted'; + return '++id, UUID, Type, ValueJSON, PageId, CreatedAt, UpdatedAt, CreatedUserId, UpdateUserId, needsServerUpdate, deleted, offlineUpdatedAt'; } constructor( @@ -47,6 +49,7 @@ export class PageNode extends Model implements IPageNode { UpdateUserId: string, needsServerUpdate?: boolean, deleted?: boolean, + offlineUpdatedAt?: string, id?: number ) { super(); @@ -68,6 +71,10 @@ export class PageNode extends Model implements IPageNode { this.deleted = deleted; } + if ( typeof offlineUpdatedAt !== 'undefined' ) { + this.offlineUpdatedAt = offlineUpdatedAt; + } + if ( id ) { this.id = id; } @@ -104,6 +111,7 @@ export class PageNode extends Model implements IPageNode { UpdateUserId: this.UpdateUserId, ...(typeof this.needsServerUpdate === 'undefined' ? {} : { needsServerUpdate: this.needsServerUpdate }), ...(typeof this.deleted === 'undefined' ? {} : { deleted: this.deleted }), + ...(typeof this.offlineUpdatedAt === 'undefined' ? {} : { offlineUpdatedAt: this.offlineUpdatedAt }), }; } diff --git a/src/app/service/db/database.service.ts b/src/app/service/db/database.service.ts index 6d7310b..1daabe4 100644 --- a/src/app/service/db/database.service.ts +++ b/src/app/service/db/database.service.ts @@ -63,7 +63,7 @@ export class DatabaseService extends Dexie { schema[ModelClass.getTableName()] = ModelClass.getSchema(); } - await this.version(14).stores(schema); + await this.version(15).stores(schema); await this.open(); this.migrations = this.table('migrations');