From 2dfb3433c98ba681708ce6811aa4ddc5de465739 Mon Sep 17 00:00:00 2001 From: Avinash Lingaloo Date: Tue, 24 Nov 2020 13:58:20 +0400 Subject: [PATCH] MM-30475 [v2] watermelondb default schema (#4977) * MM_30475 : ADDED default schema * MM_30475 : Updated typings and references to MM_TABLES * MM_30475 : Removed the app_id (The id field will be overwritten at the time of creation.) * MM_30475 : Updated PR as per comments --- app/constants/database.ts | 44 +++++++++++++++++++++++++ app/database/default/migration/index.ts | 8 +++++ app/database/default/models/app.ts | 14 ++++++++ app/database/default/models/global.ts | 18 ++++++++++ app/database/default/models/server.ts | 16 +++++++++ app/database/default/schema/index.ts | 35 ++++++++++++++++++++ ios/Podfile.lock | 4 +-- package-lock.json | 12 ++++--- tsconfig.json | 1 + types/database/app.d.ts | 9 +++++ types/database/global.d.ts | 10 ++++++ types/database/server.d.ts | 11 +++++++ 12 files changed, 175 insertions(+), 7 deletions(-) create mode 100644 app/constants/database.ts create mode 100644 app/database/default/migration/index.ts create mode 100644 app/database/default/models/app.ts create mode 100644 app/database/default/models/global.ts create mode 100644 app/database/default/models/server.ts create mode 100644 app/database/default/schema/index.ts create mode 100644 types/database/app.d.ts create mode 100644 types/database/global.d.ts create mode 100644 types/database/server.d.ts diff --git a/app/constants/database.ts b/app/constants/database.ts new file mode 100644 index 0000000000..8467b63923 --- /dev/null +++ b/app/constants/database.ts @@ -0,0 +1,44 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +export const MM_TABLES = { + DEFAULT: { + APP: 'app', + GLOBAL: 'global', + SERVERS: 'servers', + }, + SERVER: { + CHANNEL: 'Channel', + CHANNEL_INFO: 'ChannelInfo', + CHANNEL_MEMBERSHIP: 'ChannelMembership', + CUSTOM_EMOJI: 'CustomEmoji', + DRAFT: 'Draft', + FILE: 'File', + GROUP: 'Group', + GROUPS_IN_CHANNEL: 'GroupsInChannel', + GROUPS_IN_TEAM: 'GroupsInTeam', + GROUP_MEMBERSHIP: 'GroupMembership', + MY_CHANNEL: 'MyChannel', + MY_CHANNEL_SETTINGS: 'MyChannelSettings', + MY_TEAM: 'MyTeam', + POST: 'Post', + POSTS_IN_CHANNEL: 'PostsInChannel', + POSTS_IN_THREAD: 'PostsInThread', + POST_METADATA: 'PostMetadata', + PREFERENCE: 'Preference', + REACTION: 'Reaction', + ROLE: 'Role', + SLASH_COMMAND: 'SlashCommand', + SYSTEM: 'System', + TEAM: 'Team', + TEAM_CHANNEL_HISTORY: 'TeamChannelHistory', + TEAM_MEMBERSHIP: 'TeamMembership', + TEAM_SEARCH_HISTORY: 'TeamSearchHistory', + TERMS_OF_SERVICE: 'TermsOfService', + USER: 'User', + }, +}; + +export default { + MM_TABLES, +}; diff --git a/app/database/default/migration/index.ts b/app/database/default/migration/index.ts new file mode 100644 index 0000000000..a63214a573 --- /dev/null +++ b/app/database/default/migration/index.ts @@ -0,0 +1,8 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +import {schemaMigrations} from '@nozbe/watermelondb/Schema/migrations'; + +// NOTE : To implement migration, please follow this document +// https://nozbe.github.io/WatermelonDB/Advanced/Migrations.html + +export default schemaMigrations({migrations: []}); diff --git a/app/database/default/models/app.ts b/app/database/default/models/app.ts new file mode 100644 index 0000000000..8bab79d103 --- /dev/null +++ b/app/database/default/models/app.ts @@ -0,0 +1,14 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {Model} from '@nozbe/watermelondb'; +import {MM_TABLES} from '@constants/database'; +import field from '@nozbe/watermelondb/decorators/field'; + +export default class App extends Model { + static table = MM_TABLES.DEFAULT.APP + + @field('build_number') buildNumber!: string + @field('created_at') createdAt!: number + @field('version_number') versionNumber!: string +} diff --git a/app/database/default/models/global.ts b/app/database/default/models/global.ts new file mode 100644 index 0000000000..081e19ef44 --- /dev/null +++ b/app/database/default/models/global.ts @@ -0,0 +1,18 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. + +import {Model} from '@nozbe/watermelondb'; +import {MM_TABLES} from '@constants/database'; +import field from '@nozbe/watermelondb/decorators/field'; +import json from '@nozbe/watermelondb/decorators/json'; + +export default class Global extends Model { + static table = MM_TABLES.DEFAULT.GLOBAL + + @field('name') name!: string + + // TODO : add TS definitions to sanitizer function signature. + + // TODO : atm, the return type for 'value' is string[]. However, this return type can change to string/number/etc. A broader definition will need to be applied and this return type updated accordingly. + @json('value', (rawJson) => rawJson) value!: string[] +} diff --git a/app/database/default/models/server.ts b/app/database/default/models/server.ts new file mode 100644 index 0000000000..0b35c06a34 --- /dev/null +++ b/app/database/default/models/server.ts @@ -0,0 +1,16 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +import {Model} from '@nozbe/watermelondb'; +import field from '@nozbe/watermelondb/decorators/field'; + +import {MM_TABLES} from '@constants/database'; + +export default class Server extends Model { + static table = MM_TABLES.DEFAULT.SERVERS + + @field('db_path') dbPath!: string + @field('display_name') displayName!: string + @field('mention_count') mentionCount!: number + @field('unread_count') unreadCount!: number + @field('url') url!: string +} diff --git a/app/database/default/schema/index.ts b/app/database/default/schema/index.ts new file mode 100644 index 0000000000..01d75a42f1 --- /dev/null +++ b/app/database/default/schema/index.ts @@ -0,0 +1,35 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +import {AppSchema, appSchema, tableSchema} from '@nozbe/watermelondb'; +import {MM_TABLES} from '@constants/database'; + +export const defaultSchema: AppSchema = appSchema({ + version: 1, + tables: [ + tableSchema({ + name: MM_TABLES.DEFAULT.APP, + columns: [ + {name: 'build_number', type: 'string'}, + {name: 'created_at', type: 'number'}, + {name: 'version_number', type: 'string'}, + ], + }), + tableSchema({ + name: MM_TABLES.DEFAULT.GLOBAL, + columns: [ + {name: 'name', type: 'string', isIndexed: true}, + {name: 'value', type: 'string'}, + ], + }), + tableSchema({ + name: MM_TABLES.DEFAULT.SERVERS, + columns: [ + {name: 'db_path', type: 'string'}, + {name: 'display_name', type: 'string'}, + {name: 'mention_count', type: 'number'}, + {name: 'unread_count', type: 'number'}, + {name: 'url', type: 'string', isIndexed: true}, + ], + }), + ], +}); diff --git a/ios/Podfile.lock b/ios/Podfile.lock index 3c1305c379..080507bdde 100644 --- a/ios/Podfile.lock +++ b/ios/Podfile.lock @@ -741,11 +741,11 @@ SPEC CHECKSUMS: UMReactNativeAdapter: 2c175f151cfe5ff011ced7bc79ccb08bf124f6c3 UMSensorsInterface: 1df848f22690ccd23a821777f00df230fe5a28e3 UMTaskManagerInterface: dfc62edf51844ae87dafc1fe849b594871fda1e5 - WatermelonDB: 553035ef459ca26be2dbb5a73b183d1976c47a35 + WatermelonDB: 0aa53ec3f017fd52cd953ad6e69e4eec36c04044 XCDYouTubeKit: 79baadb0560673a67c771eba45f83e353fd12c1f Yoga: 7d13633d129fd179e01b8953d38d47be90db185a YoutubePlayer-in-WKWebView: af2f5929fc78882d94bfdfeea999b661b78d9717 PODFILE CHECKSUM: 93ddf37519d321c69692a52e0a30c3e7fb27b0e0 -COCOAPODS: 1.10.0.rc.1 +COCOAPODS: 1.10.0 diff --git a/package-lock.json b/package-lock.json index 36151dfbcf..a3bec1bbe6 100644 --- a/package-lock.json +++ b/package-lock.json @@ -5965,6 +5965,13 @@ "rambdax": "2.15.0", "rxjs": "^6.5.3", "sql-escape-string": "^1.1.0" + }, + "dependencies": { + "lokijs": { + "version": "npm:@nozbe/lokijs@1.5.10-wmelon3", + "resolved": "https://registry.npmjs.org/@nozbe/lokijs/-/lokijs-1.5.10-wmelon3.tgz", + "integrity": "sha512-yfuj/SzYiVVn0e3OP8vjcbekumUR62Df90deG8uH7+5nqJqTLe4HkEzlmwJfss9UE0K8PsTQLACFOUq/2aAJ2A==" + } } }, "@nozbe/with-observables": { @@ -22743,11 +22750,6 @@ } } }, - "lokijs": { - "version": "npm:@nozbe/lokijs@1.5.10-wmelon3", - "resolved": "https://registry.npmjs.org/@nozbe/lokijs/-/lokijs-1.5.10-wmelon3.tgz", - "integrity": "sha512-yfuj/SzYiVVn0e3OP8vjcbekumUR62Df90deG8uH7+5nqJqTLe4HkEzlmwJfss9UE0K8PsTQLACFOUq/2aAJ2A==" - }, "loose-envify": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", diff --git a/tsconfig.json b/tsconfig.json index 86732ac3ae..a056eafb8d 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -1,5 +1,6 @@ { "compilerOptions": { + "experimentalDecorators": true, "target": "esnext", "lib": [ "es6" diff --git a/types/database/app.d.ts b/types/database/app.d.ts new file mode 100644 index 0000000000..6d39bcef40 --- /dev/null +++ b/types/database/app.d.ts @@ -0,0 +1,9 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +import {Model} from '@nozbe/watermelondb'; +export default class App extends Model { + static table: string; + buildNumber: string; + createdAt: number; + versionNumber: string; +} diff --git a/types/database/global.d.ts b/types/database/global.d.ts new file mode 100644 index 0000000000..6d24200d42 --- /dev/null +++ b/types/database/global.d.ts @@ -0,0 +1,10 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +import {Model} from '@nozbe/watermelondb'; +export default class Global extends Model { + static table: string; + name: string; + + // TODO : atm, the return type for 'value' is string[]. However, this return type can change to string/number/etc. A broader definition will need to be applied and this return type updated accordingly. + value: string[]; +} diff --git a/types/database/server.d.ts b/types/database/server.d.ts new file mode 100644 index 0000000000..e5d7fe9877 --- /dev/null +++ b/types/database/server.d.ts @@ -0,0 +1,11 @@ +// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. +// See LICENSE.txt for license information. +import {Model} from '@nozbe/watermelondb'; +export default class Server extends Model { + static table: string; + dbPath: string; + displayName: string; + mentionCount: number; + unreadCount: number; + url: string; +}