mattermost-mobile-upstream/app/database/schema/server/test.ts
Pablo Vélez 7df4a0ab97
Some checks are pending
ci / lint-typecheck (push) Waiting to run
ci / detox-lint-typecheck (push) Waiting to run
ci / test (push) Waiting to run
Mm 68219 show placeholder for redacted files (#9719)
* MM-68219 - Add redacted files placeholder and related functionality

* add feature flag control and e2e tests

* adjust placeholder design, polish code, fix permalink preview issue

* polish code and add missing test

* use import path with right path

* gate post refetch behind the feature flag, refetch the open thread and avoid observeCount

* restore filesInfo for the permalink files prop added upstream

* fix stale redaction on background servers, consume the flag on every fetch path and share the viewport emitter

* replace the in-memory redaction flag with a persisted per-post epoch so ABAC file decisions survive restarts and stale posts stay hidden

* raise the redaction epoch on every resync, capture the epoch counter, only invalidate channels on role changes, and store the newer epoch when a re-verified post is otherwise unchanged

* store superseded responses unverified instead of dropping them, keep the since-fetch when re-verifying, verify permalink embeds against the linked channel, and capture the websocket epoch on arrival

* nvalidate file decisions when a user attribute field changes or all its values are cleared

* batch channel invalidations, close file viewers only when affected, reset the epoch on unstamped redaction changes, and only  re-verify the newest page's attachment posts

* re-check older channel posts a page at a time instead of one request per post

* skip the unstamped epoch lookup for posts with no files, redacted count or permalink

* keep the attribute-view retry after later invalidations, retry linked posts unless refused for the current epoch, and stop older payloads from rolling back edits via the redaction check

* MM-70905 - disable and grey out the attachment button when an ABAC pe… (#10195)

* MM-70905 - disable and grey out the attachment button when an ABAC permission policy denies uploads in the channel

* only back off render permission fetches when the server request fails, and log other errors without retrying

* remove the disableServer helper and have removeServer do both steps

* split defaultAllowed into allowWhenUnenforced and allowWhenNotEvaluated, and treat render permissions as unenforced  on servers without the decisions API

* MM-69627: Add playbook task requirements support on mobile (#10035)

* MM-69627: Add playbook task requirements support on mobile

Allow filling required task fields when checking off checklist items during
a run, gated by the same Playbooks beta setting used on web.

Co-authored-by: Cursor <cursoragent@cursor.com>

* MM-69627: Address PR review feedback for task requirements

Propagate settings write failures, harden fill-requirements save/title handling, and add missing unit coverage.

Co-authored-by: Cursor <cursoragent@cursor.com>

* MM-69627: Fix TypeScript errors in new unit tests

Co-authored-by: Cursor <cursoragent@cursor.com>

* MM-69627: Use defineMessages for fill requirements titles

Keep i18n extraction able to find the header titles after moving them to the route.

Co-authored-by: Cursor <cursoragent@cursor.com>

* MM-69627: Address review feedback for task requirements

Update checklist items locally when saving requirement values instead of
refetching the run, add missing query/navigation tests, and apply small
callback/reduce cleanups from review.

Co-authored-by: Cursor <cursoragent@cursor.com>

* MM-69627: Fix task requirements review follow-ups

Propagate local checklist write failures, clear a stale task-requirements
flag when playbooks is unsupported, and cap fill values at the desktop/
server max length.

Co-authored-by: Cursor <cursoragent@cursor.com>

* MM-69627: Move requirement field into its own component

Keep one component per file on the fill-requirements screen.

Co-authored-by: Cursor <cursoragent@cursor.com>

---------

Co-authored-by: Cursor <cursoragent@cursor.com>

* MM-69122: Add file element support to interactive dialogs (#9898)

* Implement Interactive Dialog - file upload

* update demo plugin version for e2etests

* fix and add e2etests

* review fixes

* Fix version bump checkout when a tag shares the branch name (#10229)

* Fix Android crashes caused by animated custom emoji (#10030)

* Route GIF decoding through Glide

- Keep APNG4Android for APNG, animated WebP, and animated AVIF support.
- Prepend Glide's GIF decoders to avoid APNG4Android's native GIF overflow.

* Clear Expo image resources with Glide targets

- Detach drawables when Glide clears their custom target.
- Prevent recycled GIF frame resources from remaining attached to Expo image views.

* Preserve foreground image during GIF target recycling

---------

Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Scott Bishel <scott.bishel@mattermost.com>
Co-authored-by: Nuno Simões <nuno.simoes@mattermost.com>
Co-authored-by: MangelSpec <74370284+MangelSpec@users.noreply.github.com>

* detox - fix clobbering of feature flags that cause failures in other suites.  Also small fix of a incorrectly set test-id

---------

Co-authored-by: Asaad Mahmood <asaadmahmood@users.noreply.github.com>
Co-authored-by: Cursor <cursoragent@cursor.com>
Co-authored-by: Scott Bishel <scott.bishel@mattermost.com>
Co-authored-by: Nuno Simões <nuno.simoes@mattermost.com>
Co-authored-by: MangelSpec <74370284+MangelSpec@users.noreply.github.com>
Co-authored-by: Nate Schlossberg <nate.schlossberg@mattermost.com>
2026-10-15 15:59:13 -07:00

1102 lines
60 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
/* eslint-disable max-lines */
import {BOARDS_TABLES} from '@boards/constants/database';
import {AGENTS_TABLES} from '@agents/constants/database';
import {MM_TABLES} from '@constants/database';
import {PLAYBOOK_TABLES} from '@playbooks/constants/database';
import {serverSchema} from './index';
const {AI_BOT, AI_THREAD} = AGENTS_TABLES;
const {BOARD_VIEW} = BOARDS_TABLES;
const {
CATEGORY,
CATEGORY_CHANNEL,
CHANNEL,
CHANNEL_BOOKMARK,
CHANNEL_INFO,
CHANNEL_MEMBERSHIP,
CONFIG,
CUSTOM_EMOJI,
CUSTOM_PROFILE_FIELD,
CUSTOM_PROFILE_ATTRIBUTE,
DRAFT,
FILE,
GROUP,
GROUP_CHANNEL,
GROUP_MEMBERSHIP,
GROUP_TEAM,
MY_CHANNEL,
MY_CHANNEL_SETTINGS,
MY_TEAM,
POST,
POSTS_IN_CHANNEL,
POSTS_IN_THREAD,
PREFERENCE,
PROPERTY_FIELD,
PROPERTY_VALUE,
REACTION,
ROLE,
SCHEDULED_POST,
SYSTEM,
TEAM,
TEAM_CHANNEL_HISTORY,
TEAM_MEMBERSHIP,
TEAM_SEARCH_HISTORY,
THREAD,
THREAD_PARTICIPANT,
THREADS_IN_TEAM,
TEAM_THREADS_SYNC,
USER,
} = MM_TABLES.SERVER;
const {PLAYBOOK_RUN, PLAYBOOK_CHECKLIST, PLAYBOOK_CHECKLIST_ITEM, PLAYBOOK_RUN_ATTRIBUTE, PLAYBOOK_RUN_ATTRIBUTE_VALUE} = PLAYBOOK_TABLES;
describe('*** Test schema for SERVER database ***', () => {
it('=> The SERVER SCHEMA should strictly match', () => {
expect(serverSchema).toEqual({
version: 23,
unsafeSql: undefined,
tables: {
[AI_BOT]: {
name: AI_BOT,
unsafeSql: undefined,
columns: {
display_name: {name: 'display_name', type: 'string'},
username: {name: 'username', type: 'string'},
last_icon_update: {name: 'last_icon_update', type: 'number'},
dm_channel_id: {name: 'dm_channel_id', type: 'string', isIndexed: true},
channel_access_level: {name: 'channel_access_level', type: 'number'},
channel_ids: {name: 'channel_ids', type: 'string'},
user_access_level: {name: 'user_access_level', type: 'number'},
user_ids: {name: 'user_ids', type: 'string'},
team_ids: {name: 'team_ids', type: 'string'},
},
columnArray: [
{name: 'display_name', type: 'string'},
{name: 'username', type: 'string'},
{name: 'last_icon_update', type: 'number'},
{name: 'dm_channel_id', type: 'string', isIndexed: true},
{name: 'channel_access_level', type: 'number'},
{name: 'channel_ids', type: 'string'},
{name: 'user_access_level', type: 'number'},
{name: 'user_ids', type: 'string'},
{name: 'team_ids', type: 'string'},
],
},
[AI_THREAD]: {
name: AI_THREAD,
unsafeSql: undefined,
columns: {
message: {name: 'message', type: 'string'},
title: {name: 'title', type: 'string'},
channel_id: {name: 'channel_id', type: 'string', isIndexed: true},
reply_count: {name: 'reply_count', type: 'number'},
update_at: {name: 'update_at', type: 'number', isIndexed: true},
},
columnArray: [
{name: 'message', type: 'string'},
{name: 'title', type: 'string'},
{name: 'channel_id', type: 'string', isIndexed: true},
{name: 'reply_count', type: 'number'},
{name: 'update_at', type: 'number', isIndexed: true},
],
},
[CATEGORY]: {
name: CATEGORY,
unsafeSql: undefined,
columns: {
collapsed: {name: 'collapsed', type: 'boolean'},
display_name: {name: 'display_name', type: 'string'},
muted: {name: 'muted', type: 'boolean'},
sort_order: {name: 'sort_order', type: 'number'},
sorting: {name: 'sorting', type: 'string'},
team_id: {name: 'team_id', type: 'string', isIndexed: true},
type: {name: 'type', type: 'string'},
},
columnArray: [
{name: 'collapsed', type: 'boolean'},
{name: 'display_name', type: 'string'},
{name: 'muted', type: 'boolean'},
{name: 'sort_order', type: 'number'},
{name: 'sorting', type: 'string'},
{name: 'team_id', type: 'string', isIndexed: true},
{name: 'type', type: 'string'},
],
},
[CATEGORY_CHANNEL]: {
name: CATEGORY_CHANNEL,
unsafeSql: undefined,
columns: {
category_id: {name: 'category_id', type: 'string', isIndexed: true},
channel_id: {name: 'channel_id', type: 'string', isIndexed: true},
sort_order: {name: 'sort_order', type: 'number'},
},
columnArray: [
{name: 'category_id', type: 'string', isIndexed: true},
{name: 'channel_id', type: 'string', isIndexed: true},
{name: 'sort_order', type: 'number'},
],
},
[CHANNEL_INFO]: {
name: CHANNEL_INFO,
unsafeSql: undefined,
columns: {
guest_count: {name: 'guest_count', type: 'number'},
header: {name: 'header', type: 'string'},
member_count: {name: 'member_count', type: 'number'},
pinned_post_count: {name: 'pinned_post_count', type: 'number'},
files_count: {name: 'files_count', type: 'number'},
purpose: {name: 'purpose', type: 'string'},
},
columnArray: [
{name: 'guest_count', type: 'number'},
{name: 'header', type: 'string'},
{name: 'member_count', type: 'number'},
{name: 'pinned_post_count', type: 'number'},
{name: 'files_count', type: 'number'},
{name: 'purpose', type: 'string'},
],
},
[CHANNEL]: {
name: CHANNEL,
unsafeSql: undefined,
columns: {
create_at: {name: 'create_at', type: 'number'},
creator_id: {name: 'creator_id', type: 'string', isIndexed: true},
delete_at: {name: 'delete_at', type: 'number'},
display_name: {name: 'display_name', type: 'string'},
is_group_constrained: {
name: 'is_group_constrained',
type: 'boolean',
},
name: {name: 'name', type: 'string', isIndexed: true},
shared: {name: 'shared', type: 'boolean'},
team_id: {name: 'team_id', type: 'string', isIndexed: true},
type: {name: 'type', type: 'string'},
update_at: {name: 'update_at', type: 'number'},
banner_info: {name: 'banner_info', type: 'string', isOptional: true},
abac_policy_enforced: {name: 'abac_policy_enforced', type: 'boolean', isOptional: true},
autotranslation: {name: 'autotranslation', type: 'boolean', isOptional: true},
},
columnArray: [
{name: 'create_at', type: 'number'},
{name: 'creator_id', type: 'string', isIndexed: true},
{name: 'delete_at', type: 'number'},
{name: 'display_name', type: 'string'},
{name: 'is_group_constrained', type: 'boolean'},
{name: 'name', type: 'string', isIndexed: true},
{name: 'shared', type: 'boolean'},
{name: 'team_id', type: 'string', isIndexed: true},
{name: 'type', type: 'string'},
{name: 'update_at', type: 'number'},
{name: 'banner_info', type: 'string', isOptional: true},
{name: 'abac_policy_enforced', type: 'boolean', isOptional: true},
{name: 'autotranslation', type: 'boolean', isOptional: true},
],
},
[CHANNEL_BOOKMARK]: {
name: CHANNEL_BOOKMARK,
unsafeSql: undefined,
columns: {
create_at: {name: 'create_at', type: 'number'},
update_at: {name: 'update_at', type: 'number'},
delete_at: {name: 'delete_at', type: 'number'},
channel_id: {name: 'channel_id', type: 'string', isIndexed: true},
owner_id: {name: 'owner_id', type: 'string'},
file_id: {name: 'file_id', type: 'string', isOptional: true},
display_name: {name: 'display_name', type: 'string'},
sort_order: {name: 'sort_order', type: 'number'},
link_url: {name: 'link_url', type: 'string', isOptional: true},
image_url: {name: 'image_url', type: 'string', isOptional: true},
emoji: {name: 'emoji', type: 'string', isOptional: true},
type: {name: 'type', type: 'string'},
original_id: {name: 'original_id', type: 'string', isOptional: true},
parent_id: {name: 'parent_id', type: 'string', isOptional: true},
},
columnArray: [
{name: 'create_at', type: 'number'},
{name: 'update_at', type: 'number'},
{name: 'delete_at', type: 'number'},
{name: 'channel_id', type: 'string', isIndexed: true},
{name: 'owner_id', type: 'string'},
{name: 'file_id', type: 'string', isOptional: true},
{name: 'display_name', type: 'string'},
{name: 'sort_order', type: 'number'},
{name: 'link_url', type: 'string', isOptional: true},
{name: 'image_url', type: 'string', isOptional: true},
{name: 'emoji', type: 'string', isOptional: true},
{name: 'type', type: 'string'},
{name: 'original_id', type: 'string', isOptional: true},
{name: 'parent_id', type: 'string', isOptional: true},
],
},
[CHANNEL_MEMBERSHIP]: {
name: CHANNEL_MEMBERSHIP,
unsafeSql: undefined,
columns: {
channel_id: {name: 'channel_id', type: 'string', isIndexed: true},
user_id: {name: 'user_id', type: 'string', isIndexed: true},
scheme_admin: {name: 'scheme_admin', type: 'boolean'},
},
columnArray: [
{name: 'channel_id', type: 'string', isIndexed: true},
{name: 'user_id', type: 'string', isIndexed: true},
{name: 'scheme_admin', type: 'boolean'},
],
},
[CONFIG]: {
name: CONFIG,
unsafeSql: undefined,
columns: {
value: {name: 'value', type: 'string'},
},
columnArray: [
{name: 'value', type: 'string'},
],
},
[CUSTOM_EMOJI]: {
name: CUSTOM_EMOJI,
unsafeSql: undefined,
columns: {
name: {name: 'name', type: 'string', isIndexed: true},
},
columnArray: [{name: 'name', type: 'string', isIndexed: true}],
},
[CUSTOM_PROFILE_FIELD]: {
name: CUSTOM_PROFILE_FIELD,
unsafeSql: undefined,
columns: {
group_id: {name: 'group_id', type: 'string'},
name: {name: 'name', type: 'string'},
type: {name: 'type', type: 'string'},
target_id: {name: 'target_id', type: 'string'},
target_type: {name: 'target_type', type: 'string'},
create_at: {name: 'create_at', type: 'number'},
update_at: {name: 'update_at', type: 'number'},
delete_at: {name: 'delete_at', type: 'number'},
attrs: {name: 'attrs', type: 'string', isOptional: true},
},
columnArray: [
{name: 'group_id', type: 'string'},
{name: 'name', type: 'string'},
{name: 'type', type: 'string'},
{name: 'target_id', type: 'string'},
{name: 'target_type', type: 'string'},
{name: 'create_at', type: 'number'},
{name: 'update_at', type: 'number'},
{name: 'delete_at', type: 'number'},
{name: 'attrs', type: 'string', isOptional: true},
],
},
[CUSTOM_PROFILE_ATTRIBUTE]: {
name: CUSTOM_PROFILE_ATTRIBUTE,
unsafeSql: undefined,
columns: {
field_id: {name: 'field_id', type: 'string', isIndexed: true},
user_id: {name: 'user_id', type: 'string', isIndexed: true},
value: {name: 'value', type: 'string'},
},
columnArray: [
{name: 'field_id', type: 'string', isIndexed: true},
{name: 'user_id', type: 'string', isIndexed: true},
{name: 'value', type: 'string'},
],
},
[MY_CHANNEL]: {
name: MY_CHANNEL,
unsafeSql: undefined,
columns: {
is_unread: {name: 'is_unread', type: 'boolean'},
last_post_at: {name: 'last_post_at', type: 'number'},
last_viewed_at: {name: 'last_viewed_at', type: 'number'},
manually_unread: {name: 'manually_unread', type: 'boolean'},
mentions_count: {name: 'mentions_count', type: 'number'},
message_count: {name: 'message_count', type: 'number'},
roles: {name: 'roles', type: 'string'},
viewed_at: {name: 'viewed_at', type: 'number'},
last_fetched_at: {name: 'last_fetched_at', type: 'number', isIndexed: true},
last_playbook_runs_fetch_at: {name: 'last_playbook_runs_fetch_at', type: 'number'},
autotranslation_disabled: {name: 'autotranslation_disabled', type: 'boolean', isOptional: true},
urgent_mention_count: {name: 'urgent_mention_count', type: 'number'},
redaction_required_epoch: {name: 'redaction_required_epoch', type: 'number'},
},
columnArray: [
{name: 'is_unread', type: 'boolean'},
{name: 'last_post_at', type: 'number'},
{name: 'last_viewed_at', type: 'number'},
{name: 'manually_unread', type: 'boolean'},
{name: 'mentions_count', type: 'number'},
{name: 'message_count', type: 'number'},
{name: 'roles', type: 'string'},
{name: 'viewed_at', type: 'number'},
{name: 'last_fetched_at', type: 'number', isIndexed: true},
{name: 'last_playbook_runs_fetch_at', type: 'number'},
{name: 'autotranslation_disabled', type: 'boolean', isOptional: true},
{name: 'urgent_mention_count', type: 'number'},
{name: 'redaction_required_epoch', type: 'number'},
],
},
[MY_CHANNEL_SETTINGS]: {
name: MY_CHANNEL_SETTINGS,
unsafeSql: undefined,
columns: {
notify_props: {name: 'notify_props', type: 'string'},
},
columnArray: [
{name: 'notify_props', type: 'string'},
],
},
[POSTS_IN_CHANNEL]: {
name: POSTS_IN_CHANNEL,
unsafeSql: undefined,
columns: {
channel_id: {name: 'channel_id', type: 'string', isIndexed: true},
earliest: {name: 'earliest', type: 'number'},
latest: {name: 'latest', type: 'number'},
},
columnArray: [
{name: 'channel_id', type: 'string', isIndexed: true},
{name: 'earliest', type: 'number'},
{name: 'latest', type: 'number'},
],
},
[DRAFT]: {
name: DRAFT,
unsafeSql: undefined,
columns: {
channel_id: {name: 'channel_id', type: 'string', isIndexed: true},
files: {name: 'files', type: 'string'},
message: {name: 'message', type: 'string'},
root_id: {name: 'root_id', type: 'string', isIndexed: true},
metadata: {name: 'metadata', type: 'string', isOptional: true},
update_at: {name: 'update_at', type: 'number'},
type: {name: 'type', type: 'string', isOptional: true},
},
columnArray: [
{name: 'channel_id', type: 'string', isIndexed: true},
{name: 'files', type: 'string'},
{name: 'message', type: 'string'},
{name: 'root_id', type: 'string', isIndexed: true},
{name: 'metadata', type: 'string', isOptional: true},
{name: 'update_at', type: 'number'},
{name: 'type', type: 'string', isOptional: true},
],
},
[FILE]: {
name: FILE,
unsafeSql: undefined,
columns: {
extension: {name: 'extension', type: 'string'},
height: {name: 'height', type: 'number'},
image_thumbnail: {name: 'image_thumbnail', type: 'string'},
local_path: {name: 'local_path', type: 'string', isOptional: true},
mime_type: {name: 'mime_type', type: 'string'},
name: {name: 'name', type: 'string'},
post_id: {name: 'post_id', type: 'string', isIndexed: true},
size: {name: 'size', type: 'number'},
width: {name: 'width', type: 'number'},
is_blocked: {name: 'is_blocked', type: 'boolean'},
},
columnArray: [
{name: 'extension', type: 'string'},
{name: 'height', type: 'number'},
{name: 'image_thumbnail', type: 'string'},
{name: 'local_path', type: 'string', isOptional: true},
{name: 'mime_type', type: 'string'},
{name: 'name', type: 'string'},
{name: 'post_id', type: 'string', isIndexed: true},
{name: 'size', type: 'number'},
{name: 'width', type: 'number'},
{name: 'is_blocked', type: 'boolean'},
],
},
[GROUP]: {
name: GROUP,
unsafeSql: undefined,
columns: {
display_name: {name: 'display_name', type: 'string'},
name: {name: 'name', type: 'string', isIndexed: true},
description: {name: 'description', type: 'string'},
source: {name: 'source', type: 'string'},
remote_id: {name: 'remote_id', type: 'string', isIndexed: true},
created_at: {name: 'created_at', type: 'number'},
updated_at: {name: 'updated_at', type: 'number'},
deleted_at: {name: 'deleted_at', type: 'number'},
member_count: {name: 'member_count', type: 'number'},
},
columnArray: [
{name: 'display_name', type: 'string'},
{name: 'name', type: 'string', isIndexed: true},
{name: 'description', type: 'string'},
{name: 'source', type: 'string'},
{name: 'remote_id', type: 'string', isIndexed: true},
{name: 'created_at', type: 'number'},
{name: 'updated_at', type: 'number'},
{name: 'deleted_at', type: 'number'},
{name: 'member_count', type: 'number'},
],
},
[GROUP_CHANNEL]: {
name: GROUP_CHANNEL,
unsafeSql: undefined,
columns: {
group_id: {name: 'group_id', type: 'string', isIndexed: true},
channel_id: {name: 'channel_id', type: 'string', isIndexed: true},
created_at: {name: 'created_at', type: 'number'},
updated_at: {name: 'updated_at', type: 'number'},
deleted_at: {name: 'deleted_at', type: 'number'},
},
columnArray: [
{name: 'group_id', type: 'string', isIndexed: true},
{name: 'channel_id', type: 'string', isIndexed: true},
{name: 'created_at', type: 'number'},
{name: 'updated_at', type: 'number'},
{name: 'deleted_at', type: 'number'},
],
},
[GROUP_MEMBERSHIP]: {
name: GROUP_MEMBERSHIP,
unsafeSql: undefined,
columns: {
group_id: {name: 'group_id', type: 'string', isIndexed: true},
user_id: {name: 'user_id', type: 'string', isIndexed: true},
created_at: {name: 'created_at', type: 'number'},
updated_at: {name: 'updated_at', type: 'number'},
deleted_at: {name: 'deleted_at', type: 'number'},
},
columnArray: [
{name: 'group_id', type: 'string', isIndexed: true},
{name: 'user_id', type: 'string', isIndexed: true},
{name: 'created_at', type: 'number'},
{name: 'updated_at', type: 'number'},
{name: 'deleted_at', type: 'number'},
],
},
[GROUP_TEAM]: {
name: GROUP_TEAM,
unsafeSql: undefined,
columns: {
group_id: {name: 'group_id', type: 'string', isIndexed: true},
team_id: {name: 'team_id', type: 'string', isIndexed: true},
created_at: {name: 'created_at', type: 'number'},
updated_at: {name: 'updated_at', type: 'number'},
deleted_at: {name: 'deleted_at', type: 'number'},
},
columnArray: [
{name: 'group_id', type: 'string', isIndexed: true},
{name: 'team_id', type: 'string', isIndexed: true},
{name: 'created_at', type: 'number'},
{name: 'updated_at', type: 'number'},
{name: 'deleted_at', type: 'number'},
],
},
[PLAYBOOK_RUN]: {
name: PLAYBOOK_RUN,
unsafeSql: undefined,
columns: {
playbook_id: {name: 'playbook_id', type: 'string'},
name: {name: 'name', type: 'string'},
description: {name: 'description', type: 'string'},
is_active: {name: 'is_active', type: 'boolean', isIndexed: true},
owner_user_id: {name: 'owner_user_id', type: 'string'},
team_id: {name: 'team_id', type: 'string'},
channel_id: {name: 'channel_id', type: 'string', isIndexed: true},
post_id: {name: 'post_id', type: 'string', isOptional: true},
create_at: {name: 'create_at', type: 'number'},
end_at: {name: 'end_at', type: 'number'},
active_stage: {name: 'active_stage', type: 'number'},
active_stage_title: {name: 'active_stage_title', type: 'string'},
participant_ids: {name: 'participant_ids', type: 'string'}, // JSON string
summary: {name: 'summary', type: 'string'},
current_status: {name: 'current_status', type: 'string', isIndexed: true},
last_status_update_at: {name: 'last_status_update_at', type: 'number'},
retrospective_enabled: {name: 'retrospective_enabled', type: 'boolean'},
retrospective: {name: 'retrospective', type: 'string'},
retrospective_published_at: {name: 'retrospective_published_at', type: 'number'},
sync: {name: 'sync', type: 'string', isIndexed: true, isOptional: true},
last_sync_at: {name: 'last_sync_at', type: 'number', isOptional: true},
items_order: {name: 'items_order', type: 'string'},
previous_reminder: {name: 'previous_reminder', type: 'number', isOptional: true},
update_at: {name: 'update_at', type: 'number'},
type: {name: 'type', type: 'string'},
},
columnArray: [
{name: 'playbook_id', type: 'string'},
{name: 'name', type: 'string'},
{name: 'description', type: 'string'},
{name: 'is_active', type: 'boolean', isIndexed: true},
{name: 'owner_user_id', type: 'string'},
{name: 'team_id', type: 'string'},
{name: 'channel_id', type: 'string', isIndexed: true},
{name: 'post_id', type: 'string', isOptional: true},
{name: 'create_at', type: 'number'},
{name: 'end_at', type: 'number'},
{name: 'active_stage', type: 'number'},
{name: 'active_stage_title', type: 'string'},
{name: 'participant_ids', type: 'string'}, // JSON string
{name: 'summary', type: 'string'},
{name: 'current_status', type: 'string', isIndexed: true},
{name: 'last_status_update_at', type: 'number'},
{name: 'retrospective_enabled', type: 'boolean'},
{name: 'retrospective', type: 'string'},
{name: 'retrospective_published_at', type: 'number'},
{name: 'sync', type: 'string', isIndexed: true, isOptional: true},
{name: 'last_sync_at', type: 'number', isOptional: true},
{name: 'previous_reminder', type: 'number', isOptional: true},
{name: 'items_order', type: 'string'},
{name: 'update_at', type: 'number'},
{name: 'type', type: 'string'},
],
},
[PLAYBOOK_CHECKLIST]: {
name: PLAYBOOK_CHECKLIST,
unsafeSql: undefined,
columns: {
run_id: {name: 'run_id', type: 'string', isIndexed: true},
title: {name: 'title', type: 'string'},
sync: {name: 'sync', type: 'string', isIndexed: true, isOptional: true},
last_sync_at: {name: 'last_sync_at', type: 'number', isOptional: true},
items_order: {name: 'items_order', type: 'string'},
update_at: {name: 'update_at', type: 'number'},
},
columnArray: [
{name: 'run_id', type: 'string', isIndexed: true},
{name: 'title', type: 'string'},
{name: 'sync', type: 'string', isIndexed: true, isOptional: true},
{name: 'last_sync_at', type: 'number', isOptional: true},
{name: 'items_order', type: 'string'},
{name: 'update_at', type: 'number'},
],
},
[PLAYBOOK_CHECKLIST_ITEM]: {
name: PLAYBOOK_CHECKLIST_ITEM,
unsafeSql: undefined,
columns: {
checklist_id: {name: 'checklist_id', type: 'string', isIndexed: true},
title: {name: 'title', type: 'string'},
state: {name: 'state', type: 'string', isIndexed: true},
state_modified: {name: 'state_modified', type: 'number'},
assignee_id: {name: 'assignee_id', type: 'string', isOptional: true},
assignee_modified: {name: 'assignee_modified', type: 'number'},
command: {name: 'command', type: 'string', isOptional: true},
command_last_run: {name: 'command_last_run', type: 'number'},
description: {name: 'description', type: 'string'},
due_date: {name: 'due_date', type: 'number'},
completed_at: {name: 'completed_at', type: 'number'},
task_actions: {name: 'task_actions', type: 'string', isOptional: true}, // JSON string
requirements: {name: 'requirements', type: 'string', isOptional: true}, // JSON string
condition_action: {name: 'condition_action', type: 'string'},
condition_reason: {name: 'condition_reason', type: 'string'},
sync: {name: 'sync', type: 'string', isIndexed: true, isOptional: true},
last_sync_at: {name: 'last_sync_at', type: 'number', isOptional: true},
update_at: {name: 'update_at', type: 'number'},
},
columnArray: [
{name: 'checklist_id', type: 'string', isIndexed: true},
{name: 'title', type: 'string'},
{name: 'state', type: 'string', isIndexed: true},
{name: 'state_modified', type: 'number'},
{name: 'assignee_id', type: 'string', isOptional: true},
{name: 'assignee_modified', type: 'number'},
{name: 'command', type: 'string', isOptional: true},
{name: 'command_last_run', type: 'number'},
{name: 'description', type: 'string'},
{name: 'due_date', type: 'number'},
{name: 'completed_at', type: 'number'},
{name: 'task_actions', type: 'string', isOptional: true}, // JSON string
{name: 'requirements', type: 'string', isOptional: true}, // JSON string
{name: 'condition_action', type: 'string'},
{name: 'condition_reason', type: 'string'},
{name: 'sync', type: 'string', isIndexed: true, isOptional: true},
{name: 'last_sync_at', type: 'number', isOptional: true},
{name: 'update_at', type: 'number'},
],
},
[PLAYBOOK_RUN_ATTRIBUTE]: {
name: PLAYBOOK_RUN_ATTRIBUTE,
unsafeSql: undefined,
columns: {
group_id: {name: 'group_id', type: 'string'},
name: {name: 'name', type: 'string'},
type: {name: 'type', type: 'string'},
target_id: {name: 'target_id', type: 'string'},
target_type: {name: 'target_type', type: 'string'},
create_at: {name: 'create_at', type: 'number'},
update_at: {name: 'update_at', type: 'number'},
delete_at: {name: 'delete_at', type: 'number'},
attrs: {name: 'attrs', type: 'string', isOptional: true},
},
columnArray: [
{name: 'group_id', type: 'string'},
{name: 'name', type: 'string'},
{name: 'type', type: 'string'},
{name: 'target_id', type: 'string'},
{name: 'target_type', type: 'string'},
{name: 'create_at', type: 'number'},
{name: 'update_at', type: 'number'},
{name: 'delete_at', type: 'number'},
{name: 'attrs', type: 'string', isOptional: true},
],
},
[PLAYBOOK_RUN_ATTRIBUTE_VALUE]: {
name: PLAYBOOK_RUN_ATTRIBUTE_VALUE,
unsafeSql: undefined,
columns: {
attribute_id: {name: 'attribute_id', type: 'string', isIndexed: true},
run_id: {name: 'run_id', type: 'string', isIndexed: true},
value: {name: 'value', type: 'string'},
update_at: {name: 'update_at', type: 'number'},
},
columnArray: [
{name: 'attribute_id', type: 'string', isIndexed: true},
{name: 'run_id', type: 'string', isIndexed: true},
{name: 'value', type: 'string'},
{name: 'update_at', type: 'number'},
],
},
[POSTS_IN_THREAD]: {
name: POSTS_IN_THREAD,
unsafeSql: undefined,
columns: {
earliest: {name: 'earliest', type: 'number'},
latest: {name: 'latest', type: 'number'},
root_id: {name: 'root_id', type: 'string', isIndexed: true},
},
columnArray: [
{name: 'earliest', type: 'number'},
{name: 'latest', type: 'number'},
{name: 'root_id', type: 'string', isIndexed: true},
],
},
[POST]: {
name: POST,
unsafeSql: undefined,
columns: {
channel_id: {name: 'channel_id', type: 'string', isIndexed: true},
create_at: {name: 'create_at', type: 'number'},
delete_at: {name: 'delete_at', type: 'number'},
edit_at: {name: 'edit_at', type: 'number'},
is_pinned: {name: 'is_pinned', type: 'boolean'},
message: {name: 'message', type: 'string'},
message_source: {name: 'message_source', type: 'string'},
metadata: {name: 'metadata', type: 'string', isOptional: true},
original_id: {name: 'original_id', type: 'string'},
pending_post_id: {name: 'pending_post_id', type: 'string', isIndexed: true},
previous_post_id: {name: 'previous_post_id', type: 'string'},
props: {name: 'props', type: 'string'},
redaction_verified_epoch: {name: 'redaction_verified_epoch', type: 'number'},
root_id: {name: 'root_id', type: 'string'},
type: {name: 'type', type: 'string', isIndexed: true},
update_at: {name: 'update_at', type: 'number'},
user_id: {name: 'user_id', type: 'string', isIndexed: true},
},
columnArray: [
{name: 'channel_id', type: 'string', isIndexed: true},
{name: 'create_at', type: 'number'},
{name: 'delete_at', type: 'number'},
{name: 'edit_at', type: 'number'},
{name: 'is_pinned', type: 'boolean'},
{name: 'message', type: 'string'},
{name: 'message_source', type: 'string'},
{name: 'metadata', type: 'string', isOptional: true},
{name: 'original_id', type: 'string'},
{name: 'pending_post_id', type: 'string', isIndexed: true},
{name: 'previous_post_id', type: 'string'},
{name: 'props', type: 'string'},
{name: 'redaction_verified_epoch', type: 'number'},
{name: 'root_id', type: 'string'},
{name: 'type', type: 'string', isIndexed: true},
{name: 'update_at', type: 'number'},
{name: 'user_id', type: 'string', isIndexed: true},
],
},
[PREFERENCE]: {
name: PREFERENCE,
unsafeSql: undefined,
columns: {
category: {name: 'category', type: 'string', isIndexed: true},
name: {name: 'name', type: 'string'},
user_id: {name: 'user_id', type: 'string', isIndexed: true},
value: {name: 'value', type: 'string'},
},
columnArray: [
{name: 'category', type: 'string', isIndexed: true},
{name: 'name', type: 'string'},
{name: 'user_id', type: 'string', isIndexed: true},
{name: 'value', type: 'string'},
],
},
[REACTION]: {
name: REACTION,
unsafeSql: undefined,
columns: {
create_at: {name: 'create_at', type: 'number'},
emoji_name: {name: 'emoji_name', type: 'string'},
post_id: {name: 'post_id', type: 'string', isIndexed: true},
user_id: {name: 'user_id', type: 'string', isIndexed: true},
},
columnArray: [
{name: 'create_at', type: 'number'},
{name: 'emoji_name', type: 'string'},
{name: 'post_id', type: 'string', isIndexed: true},
{name: 'user_id', type: 'string', isIndexed: true},
],
},
[MY_TEAM]: {
name: MY_TEAM,
unsafeSql: undefined,
columns: {
roles: {name: 'roles', type: 'string'},
},
columnArray: [
{name: 'roles', type: 'string'},
],
},
[ROLE]: {
name: ROLE,
unsafeSql: undefined,
columns: {
name: {name: 'name', type: 'string', isIndexed: true},
permissions: {name: 'permissions', type: 'string'},
},
columnArray: [
{name: 'name', type: 'string', isIndexed: true},
{name: 'permissions', type: 'string'},
],
},
[SCHEDULED_POST]: {
name: SCHEDULED_POST,
unsafeSql: undefined,
columns: {
channel_id: {name: 'channel_id', type: 'string', isIndexed: true},
message: {name: 'message', type: 'string'},
files: {name: 'files', type: 'string'},
root_id: {name: 'root_id', type: 'string', isIndexed: true},
metadata: {name: 'metadata', type: 'string', isOptional: true},
create_at: {name: 'create_at', type: 'number'},
update_at: {name: 'update_at', type: 'number'},
scheduled_at: {name: 'scheduled_at', type: 'number'},
processed_at: {name: 'processed_at', type: 'number'},
error_code: {name: 'error_code', type: 'string'},
type: {name: 'type', type: 'string', isOptional: true},
},
columnArray: [
{name: 'channel_id', type: 'string', isIndexed: true},
{name: 'files', type: 'string'},
{name: 'message', type: 'string'},
{name: 'root_id', type: 'string', isIndexed: true},
{name: 'metadata', type: 'string', isOptional: true},
{name: 'create_at', type: 'number'},
{name: 'update_at', type: 'number'},
{name: 'scheduled_at', type: 'number'},
{name: 'processed_at', type: 'number'},
{name: 'error_code', type: 'string'},
{name: 'type', type: 'string', isOptional: true},
],
},
[SYSTEM]: {
name: SYSTEM,
unsafeSql: undefined,
columns: {
value: {name: 'value', type: 'string'},
},
columnArray: [
{name: 'value', type: 'string'},
],
},
[TEAM]: {
name: TEAM,
unsafeSql: undefined,
columns: {
allowed_domains: {name: 'allowed_domains', type: 'string'},
description: {name: 'description', type: 'string'},
display_name: {name: 'display_name', type: 'string'},
is_allow_open_invite: {
name: 'is_allow_open_invite',
type: 'boolean',
},
is_group_constrained: {
name: 'is_group_constrained',
type: 'boolean',
},
last_team_icon_updated_at: {
name: 'last_team_icon_updated_at',
type: 'number',
},
name: {name: 'name', type: 'string'},
type: {name: 'type', type: 'string'},
update_at: {name: 'update_at', type: 'number'},
invite_id: {name: 'invite_id', type: 'string'},
},
columnArray: [
{name: 'allowed_domains', type: 'string'},
{name: 'description', type: 'string'},
{name: 'display_name', type: 'string'},
{name: 'is_allow_open_invite', type: 'boolean'},
{name: 'is_group_constrained', type: 'boolean'},
{name: 'last_team_icon_updated_at', type: 'number'},
{name: 'name', type: 'string'},
{name: 'type', type: 'string'},
{name: 'update_at', type: 'number'},
{name: 'invite_id', type: 'string'},
],
},
[TEAM_CHANNEL_HISTORY]: {
name: TEAM_CHANNEL_HISTORY,
unsafeSql: undefined,
columns: {
channel_ids: {name: 'channel_ids', type: 'string'},
},
columnArray: [
{name: 'channel_ids', type: 'string'},
],
},
[TEAM_MEMBERSHIP]: {
name: TEAM_MEMBERSHIP,
unsafeSql: undefined,
columns: {
team_id: {name: 'team_id', type: 'string', isIndexed: true},
user_id: {name: 'user_id', type: 'string', isIndexed: true},
scheme_admin: {name: 'scheme_admin', type: 'boolean'},
},
columnArray: [
{name: 'team_id', type: 'string', isIndexed: true},
{name: 'user_id', type: 'string', isIndexed: true},
{name: 'scheme_admin', type: 'boolean'},
],
},
[TEAM_SEARCH_HISTORY]: {
name: TEAM_SEARCH_HISTORY,
unsafeSql: undefined,
columns: {
created_at: {name: 'created_at', type: 'number'},
display_term: {name: 'display_term', type: 'string'},
team_id: {name: 'team_id', type: 'string', isIndexed: true},
term: {name: 'term', type: 'string'},
},
columnArray: [
{name: 'created_at', type: 'number'},
{name: 'display_term', type: 'string'},
{name: 'team_id', type: 'string', isIndexed: true},
{name: 'term', type: 'string'},
],
},
[THREAD]: {
name: THREAD,
unsafeSql: undefined,
columns: {
is_following: {name: 'is_following', type: 'boolean'},
last_reply_at: {name: 'last_reply_at', type: 'number'},
last_viewed_at: {name: 'last_viewed_at', type: 'number'},
reply_count: {name: 'reply_count', type: 'number'},
unread_mentions: {name: 'unread_mentions', type: 'number'},
unread_replies: {name: 'unread_replies', type: 'number'},
viewed_at: {name: 'viewed_at', type: 'number'},
last_fetched_at: {name: 'last_fetched_at', type: 'number', isIndexed: true},
},
columnArray: [
{name: 'is_following', type: 'boolean'},
{name: 'last_reply_at', type: 'number'},
{name: 'last_viewed_at', type: 'number'},
{name: 'reply_count', type: 'number'},
{name: 'unread_mentions', type: 'number'},
{name: 'unread_replies', type: 'number'},
{name: 'viewed_at', type: 'number'},
{name: 'last_fetched_at', type: 'number', isIndexed: true},
],
},
[THREAD_PARTICIPANT]: {
name: THREAD_PARTICIPANT,
unsafeSql: undefined,
columns: {
thread_id: {name: 'thread_id', type: 'string', isIndexed: true},
user_id: {name: 'user_id', type: 'string', isIndexed: true},
},
columnArray: [
{name: 'thread_id', type: 'string', isIndexed: true},
{name: 'user_id', type: 'string', isIndexed: true},
],
},
[THREADS_IN_TEAM]: {
name: THREADS_IN_TEAM,
unsafeSql: undefined,
columns: {
team_id: {name: 'team_id', type: 'string', isIndexed: true},
thread_id: {name: 'thread_id', type: 'string', isIndexed: true},
},
columnArray: [
{name: 'team_id', type: 'string', isIndexed: true},
{name: 'thread_id', type: 'string', isIndexed: true},
],
},
[TEAM_THREADS_SYNC]: {
name: TEAM_THREADS_SYNC,
unsafeSql: undefined,
columns: {
earliest: {name: 'earliest', type: 'number'},
latest: {name: 'latest', type: 'number'},
},
columnArray: [
{name: 'earliest', type: 'number'},
{name: 'latest', type: 'number'},
],
},
[USER]: {
name: USER,
unsafeSql: undefined,
columns: {
auth_service: {name: 'auth_service', type: 'string'},
delete_at: {name: 'delete_at', type: 'number'},
email: {name: 'email', type: 'string'},
first_name: {name: 'first_name', type: 'string'},
is_bot: {name: 'is_bot', type: 'boolean'},
is_guest: {name: 'is_guest', type: 'boolean'},
last_name: {name: 'last_name', type: 'string'},
last_picture_update: {name: 'last_picture_update', type: 'number'},
locale: {name: 'locale', type: 'string'},
nickname: {name: 'nickname', type: 'string'},
notify_props: {name: 'notify_props', type: 'string'},
position: {name: 'position', type: 'string'},
props: {name: 'props', type: 'string'},
remote_id: {name: 'remote_id', type: 'string', isOptional: true},
roles: {name: 'roles', type: 'string'},
status: {name: 'status', type: 'string'},
timezone: {name: 'timezone', type: 'string'},
update_at: {name: 'update_at', type: 'number'},
username: {name: 'username', type: 'string'},
terms_of_service_create_at: {name: 'terms_of_service_create_at', type: 'number'},
terms_of_service_id: {name: 'terms_of_service_id', type: 'string'},
},
columnArray: [
{name: 'auth_service', type: 'string'},
{name: 'delete_at', type: 'number'},
{name: 'email', type: 'string'},
{name: 'first_name', type: 'string'},
{name: 'is_bot', type: 'boolean'},
{name: 'is_guest', type: 'boolean'},
{name: 'last_name', type: 'string'},
{name: 'last_picture_update', type: 'number'},
{name: 'locale', type: 'string'},
{name: 'nickname', type: 'string'},
{name: 'notify_props', type: 'string'},
{name: 'position', type: 'string'},
{name: 'props', type: 'string'},
{name: 'remote_id', type: 'string', isOptional: true},
{name: 'roles', type: 'string'},
{name: 'status', type: 'string'},
{name: 'timezone', type: 'string'},
{name: 'update_at', type: 'number'},
{name: 'username', type: 'string'},
{name: 'terms_of_service_id', type: 'string'},
{name: 'terms_of_service_create_at', type: 'number'},
],
},
[BOARD_VIEW]: {
name: BOARD_VIEW,
unsafeSql: undefined,
columns: {
channel_id: {name: 'channel_id', type: 'string', isIndexed: true},
type: {name: 'type', type: 'string'},
creator_id: {name: 'creator_id', type: 'string'},
title: {name: 'title', type: 'string'},
description: {name: 'description', type: 'string', isOptional: true},
sort_order: {name: 'sort_order', type: 'number'},
props: {name: 'props', type: 'string', isOptional: true},
create_at: {name: 'create_at', type: 'number'},
update_at: {name: 'update_at', type: 'number', isIndexed: true},
delete_at: {name: 'delete_at', type: 'number'},
},
columnArray: [
{name: 'channel_id', type: 'string', isIndexed: true},
{name: 'type', type: 'string'},
{name: 'creator_id', type: 'string'},
{name: 'title', type: 'string'},
{name: 'description', type: 'string', isOptional: true},
{name: 'sort_order', type: 'number'},
{name: 'props', type: 'string', isOptional: true},
{name: 'create_at', type: 'number'},
{name: 'update_at', type: 'number', isIndexed: true},
{name: 'delete_at', type: 'number'},
],
},
[PROPERTY_FIELD]: {
name: PROPERTY_FIELD,
unsafeSql: undefined,
columns: {
group_id: {name: 'group_id', type: 'string'},
name: {name: 'name', type: 'string'},
type: {name: 'type', type: 'string'},
attrs: {name: 'attrs', type: 'string', isOptional: true},
object_type: {name: 'object_type', type: 'string'},
target_id: {name: 'target_id', type: 'string', isIndexed: true},
target_type: {name: 'target_type', type: 'string'},
protected: {name: 'protected', type: 'boolean'},
permission_field: {name: 'permission_field', type: 'string', isOptional: true},
permission_values: {name: 'permission_values', type: 'string', isOptional: true},
permission_options: {name: 'permission_options', type: 'string', isOptional: true},
create_at: {name: 'create_at', type: 'number'},
update_at: {name: 'update_at', type: 'number', isIndexed: true},
delete_at: {name: 'delete_at', type: 'number'},
created_by: {name: 'created_by', type: 'string'},
updated_by: {name: 'updated_by', type: 'string'},
},
columnArray: [
{name: 'group_id', type: 'string'},
{name: 'name', type: 'string'},
{name: 'type', type: 'string'},
{name: 'attrs', type: 'string', isOptional: true},
{name: 'object_type', type: 'string'},
{name: 'target_id', type: 'string', isIndexed: true},
{name: 'target_type', type: 'string'},
{name: 'protected', type: 'boolean'},
{name: 'permission_field', type: 'string', isOptional: true},
{name: 'permission_values', type: 'string', isOptional: true},
{name: 'permission_options', type: 'string', isOptional: true},
{name: 'create_at', type: 'number'},
{name: 'update_at', type: 'number', isIndexed: true},
{name: 'delete_at', type: 'number'},
{name: 'created_by', type: 'string'},
{name: 'updated_by', type: 'string'},
],
},
[PROPERTY_VALUE]: {
name: PROPERTY_VALUE,
unsafeSql: undefined,
columns: {
field_id: {name: 'field_id', type: 'string', isIndexed: true},
target_id: {name: 'target_id', type: 'string', isIndexed: true},
target_type: {name: 'target_type', type: 'string'},
group_id: {name: 'group_id', type: 'string'},
value: {name: 'value', type: 'string'},
create_at: {name: 'create_at', type: 'number'},
update_at: {name: 'update_at', type: 'number'},
delete_at: {name: 'delete_at', type: 'number'},
created_by: {name: 'created_by', type: 'string'},
updated_by: {name: 'updated_by', type: 'string'},
},
columnArray: [
{name: 'field_id', type: 'string', isIndexed: true},
{name: 'target_id', type: 'string', isIndexed: true},
{name: 'target_type', type: 'string'},
{name: 'group_id', type: 'string'},
{name: 'value', type: 'string'},
{name: 'create_at', type: 'number'},
{name: 'update_at', type: 'number'},
{name: 'delete_at', type: 'number'},
{name: 'created_by', type: 'string'},
{name: 'updated_by', type: 'string'},
],
},
},
});
});
});