mirror of
https://github.com/mattermost/mattermost-mobile.git
synced 2026-11-04 18:08:54 +00:00
* 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>
509 lines
11 KiB
Markdown
509 lines
11 KiB
Markdown
# Server Database - Schema Version 23
|
|
# Please bump the version by 1, any time the schema changes.
|
|
# Also, include the migration plan under app/database/migration/server,
|
|
# update all models, relationships and types.
|
|
# Lastly, export all PNGs, SVGs, etc under the source project (./docs/database)
|
|
# If you have any question/queries that you would like to clarify, please reach out to the Mobile Platform Team.
|
|
|
|
|
|
Category
|
|
-
|
|
id PK string # server-generated
|
|
collapsed bool
|
|
display_name string
|
|
muted bool
|
|
sort_order number
|
|
sorting string # alpha, recent, manual
|
|
team_id string INDEX FK >- Team.id
|
|
type string # 'channels' | 'direct_messages' | 'favorites' | 'custom'
|
|
|
|
|
|
CategoryChannel
|
|
-
|
|
id PK string # composition ID Team.id_Channel.id
|
|
category_id string INDEX FK >- Category.id
|
|
channel_id string INDEX
|
|
sort_order number
|
|
|
|
|
|
Channel
|
|
-
|
|
id PK string FK - CategoryChannel.channel_id # server-generated
|
|
create_at string
|
|
creator_id string INDEX FK >- User.id
|
|
delete_at number
|
|
display_name string
|
|
is_group_constrained bool
|
|
name string INDEX
|
|
shared bool
|
|
team_id string INDEX FK >- Team.id
|
|
type string
|
|
update_at number
|
|
banner_info string
|
|
abac_policy_enforced boolean
|
|
autotranslation boolean
|
|
|
|
|
|
ChannelInfo
|
|
-
|
|
id PK string FK - Channel.id# same value as Channel.id
|
|
guest_count number
|
|
header string
|
|
member_count number
|
|
pinned_post_count number
|
|
files_count number
|
|
purpose string
|
|
|
|
ChannelMembership
|
|
-
|
|
id PK string # composition ID Channel.id-User.id
|
|
channel_id string INDEX FK >- Channel.id
|
|
user_id string INDEX FK >- User.id
|
|
scheme_admin bool
|
|
|
|
CustomEmoji
|
|
-
|
|
id PK string # auto-generated
|
|
name string
|
|
|
|
|
|
CustomProfileField
|
|
-
|
|
id PK string # server-generated
|
|
group_id string
|
|
name string
|
|
type string
|
|
target_id string
|
|
target_type string
|
|
create_at number
|
|
update_at number
|
|
delete_at number
|
|
attrs string NULL # stringified JSON
|
|
|
|
|
|
CustomProfileAttribute
|
|
-
|
|
id PK string # composition ID User.id-CustomProfileField.id
|
|
field_id string INDEX FK >- CustomProfileField.id
|
|
user_id string INDEX FK >- User.id
|
|
value string
|
|
|
|
|
|
Draft
|
|
-
|
|
id PK string # auto-generated
|
|
channel_id string INDEX FK >- Channel.id
|
|
files string #stringify (array)
|
|
message string
|
|
root_id string INDEX NULL FK >- Post.id
|
|
type string NULL
|
|
|
|
|
|
ScheduledPost
|
|
-
|
|
id PK string # auto-generated
|
|
channel_id string INDEX FK >- Channel.id
|
|
files string #stringify (array)
|
|
message string
|
|
root_id string INDEX NULL FK >- Post.id
|
|
metadata string NULL
|
|
create_at number
|
|
update_at number
|
|
scheduled_at number
|
|
processed_at number NULL
|
|
error_code string
|
|
type string NULL
|
|
|
|
|
|
File
|
|
-
|
|
id PK string # server-generated
|
|
extension string
|
|
height number
|
|
image_thumbnail string #base64 data string or filepath for video thumbnails
|
|
local_path string NULL
|
|
mime_type string
|
|
name string
|
|
post_id string INDEX FK >- Post.id
|
|
size number
|
|
width number
|
|
is_blocked bool #Determines if a file has been blocked and cannot be opened anymore
|
|
|
|
Group
|
|
-
|
|
id PK string # server-generated
|
|
name string INDEX
|
|
display_name string
|
|
description string
|
|
remote_id string INDEX
|
|
source string
|
|
created_at number
|
|
updated_at number
|
|
deleted_at number
|
|
|
|
GroupChannel
|
|
-
|
|
id PK string # composition ID Group.id-Channel.id
|
|
group_id string INDEX FK >- Group.id
|
|
channel_id string INDEX FK >- Channel.id
|
|
created_at number
|
|
updated_at number
|
|
deleted_at number
|
|
|
|
GroupMembership
|
|
-
|
|
id PK string # composition ID Group.id-User.id
|
|
group_id string INDEX FK >- Group.id
|
|
user_id string INDEX FK >- User.id
|
|
created_at number
|
|
updated_at number
|
|
deleted_at number
|
|
|
|
GroupTeam
|
|
-
|
|
id PK string # composition ID Group.id-Team.id
|
|
group_id string INDEX FK >- Group.id
|
|
team_id string INDEX FK >- Team.id
|
|
created_at number
|
|
updated_at number
|
|
deleted_at number
|
|
|
|
MyChannel
|
|
-
|
|
id PK string FK - Channel.id # same as Channel.id
|
|
is_unread boolean
|
|
last_post_at number
|
|
last_viewed_at number
|
|
manually_unread boolean
|
|
mentions_count number
|
|
urgent_mention_count number
|
|
message_count number
|
|
roles string
|
|
viewed_at number
|
|
autotranslation_disabled boolean
|
|
redaction_required_epoch number
|
|
|
|
|
|
MyChannelSettings
|
|
-
|
|
id PK string FK - MyChannel.id # same as Channel.id
|
|
notify_props string
|
|
|
|
|
|
MyTeam
|
|
-
|
|
id PK string FK - Team.id # same as Team.id
|
|
roles string
|
|
|
|
PlaybookRun
|
|
-
|
|
id PK string # server-generated
|
|
playbook_id string
|
|
name string
|
|
description string
|
|
is_active boolean
|
|
active_stage number
|
|
active_stage_title string
|
|
participant_ids string # stringified array of user IDs
|
|
summary string
|
|
current_status string # (valid values InProgres, Finished)
|
|
owner_user_id string INDEX FK >- User.id
|
|
team_id string INDEX FK >- Team.id
|
|
channel_id string INDEX FK >- Channel.id
|
|
post_id string INDEX FK >- Post.id
|
|
create_at number
|
|
end_at number
|
|
delete_at number
|
|
last_status_update_at number
|
|
retrospective_enabled boolean
|
|
retrospective string
|
|
retrospective_published_at number
|
|
synced string NULL INDEX # optional field for sync status
|
|
last_sync_at number NULL # optional field for last sync timestamp
|
|
|
|
PlaybookChecklist
|
|
-
|
|
id PK string # server-generated
|
|
run_id string INDEX FK >- PlaybookRun.id
|
|
title string
|
|
sort_order number
|
|
synced string NULL INDEX # optional field for sync status
|
|
last_sync_at number NULL # optional field for last sync timestamp
|
|
|
|
PlaybookChecklistItem
|
|
-
|
|
id PK string # server-generated
|
|
checklist_id string INDEX FK >- PlaybookChecklist.id
|
|
title string
|
|
description string
|
|
state string # e.g., 'open', 'closed'
|
|
state_modified number
|
|
assignee_id string INDEX FK >- User.id
|
|
assignee_modified number
|
|
command string
|
|
command_last_run number
|
|
due_date number
|
|
task_actions string # stringified array of TaskAction
|
|
requirements string NULL # stringified array of TaskRequirement ({id, label, value})
|
|
condition_action string # condition action for the checklist item (values should be '' or 'hidden')
|
|
condition_reason string # condition reason for the checklist item (default empty string meaning there is no condition affecting)
|
|
order number
|
|
completed_at number
|
|
synced string NULL INDEX # optional field for sync status
|
|
last_sync_at number NULL # optional field for last sync timestamp
|
|
|
|
PlaybookRunAttribute
|
|
-
|
|
id PK string # server-generated
|
|
group_id string
|
|
name string
|
|
type string
|
|
target_id string
|
|
target_type string
|
|
create_at number
|
|
update_at number
|
|
delete_at number
|
|
attrs string NULL # stringified JSON
|
|
|
|
PlaybookRunAttributeValue
|
|
-
|
|
id PK string # composition ID PlaybookRun.id-PlaybookRunAttribute.id
|
|
attribute_id string INDEX FK >- PlaybookRunAttribute.id
|
|
run_id string INDEX FK >- PlaybookRun.id
|
|
value string
|
|
|
|
Post
|
|
-
|
|
id PK string # server generated
|
|
channel_id string INDEX FK >- Channel.id
|
|
create_at number
|
|
delete_at number
|
|
edit_at number
|
|
is_pinned boolean
|
|
message string
|
|
metadata string NULL
|
|
original_id string
|
|
pending_post_id string INDEX
|
|
previous_post_id string
|
|
props string
|
|
redaction_verified_epoch number
|
|
root_id string
|
|
type string INDEX
|
|
update_at number
|
|
user_id string INDEX FK >- User.id
|
|
|
|
|
|
PostsInChannel
|
|
-
|
|
id PK string # auto-generated
|
|
channel_id string INDEX FK >- Channel.id
|
|
earliest number
|
|
latest number
|
|
|
|
|
|
PostsInThread
|
|
-
|
|
id PK string # auto-generated
|
|
earliest number
|
|
latest number
|
|
root_id string FK >- Post.id
|
|
|
|
|
|
Preference
|
|
-
|
|
id string PK # server-generated
|
|
category string INDEX
|
|
name string
|
|
user_id string INDEX FK >- User.id
|
|
value string
|
|
|
|
|
|
Reaction
|
|
-
|
|
id PK string # server-generated
|
|
create_at number
|
|
emoji_name string
|
|
post_id string INDEX FK >- Post.id
|
|
user_id string INDEX FK >- User.id
|
|
|
|
|
|
Role
|
|
-
|
|
id PK string # server-generated
|
|
name string
|
|
permissions string #stringify array
|
|
|
|
|
|
System
|
|
-
|
|
id PK string # SYSTEM_IDENTIFIERS
|
|
value string
|
|
|
|
|
|
Team
|
|
-
|
|
id PK string # server-generated
|
|
allowed_domains string
|
|
description string
|
|
display_name string
|
|
is_allow_open_invite boolean
|
|
is_group_constrained boolean
|
|
last_team_icon_updated_at number
|
|
name string
|
|
type string
|
|
update_at number
|
|
|
|
|
|
TeamChannelHistory
|
|
-
|
|
id PK string FK - Team.id # same as Team.id
|
|
channel_ids string # stringified JSON array; FIFO
|
|
|
|
|
|
TeamMembership
|
|
-
|
|
id PK string # auto-generated
|
|
team_id string INDEX FK >- Team.id
|
|
user_id string INDEX FK >- User.id
|
|
scheme_admin bool
|
|
|
|
|
|
TeamSearchHistory
|
|
-
|
|
id PK string # auto-generated
|
|
created_at number
|
|
display_term string
|
|
team_id string FK >- Team.id
|
|
term string
|
|
|
|
|
|
Thread
|
|
-
|
|
id PK string FK - Post.id # similar to Post.id but for root post only
|
|
is_following boolean
|
|
last_reply_at number
|
|
last_viewed_at number
|
|
reply_count number
|
|
unread_mentions number
|
|
unread_replies number
|
|
viewed_at number
|
|
|
|
|
|
ThreadsInTeam
|
|
-
|
|
id PK string # auto-generated
|
|
loaded_in_global_threads boolean
|
|
team_id string INDEX FK >- Team.id
|
|
thread_id string INDEX FK >- Thread.id
|
|
|
|
|
|
ThreadParticipant # who is participating in this conversation
|
|
-
|
|
id PK string # auto-generated
|
|
thread_id string INDEX FK >- Thread.id
|
|
user_id string INDEX FK >- User.id
|
|
|
|
|
|
User
|
|
-
|
|
id PK string # server generated
|
|
auth_service string
|
|
delete_at number
|
|
email string
|
|
first_name string
|
|
is_bot boolean
|
|
is_guest boolean
|
|
last_name string
|
|
last_picture_update number
|
|
locale string
|
|
nickname string
|
|
notify_props string
|
|
position string
|
|
props string
|
|
remote_id string NULL
|
|
roles string
|
|
status string
|
|
timezone string
|
|
update_at number
|
|
username string
|
|
|
|
|
|
AiBot
|
|
-
|
|
id PK string
|
|
display_name string
|
|
username string
|
|
last_icon_update number
|
|
dm_channel_id string INDEX
|
|
channel_access_level number
|
|
channel_ids string
|
|
user_access_level number
|
|
user_ids string
|
|
team_ids string
|
|
|
|
|
|
AiThread
|
|
-
|
|
id PK string
|
|
message string
|
|
title string
|
|
channel_id string INDEX FK >- Channel.id
|
|
reply_count number
|
|
update_at number INDEX
|
|
|
|
|
|
BoardView
|
|
-
|
|
# WatermelonDB table name is BoardView; the domain model class is BoardViewModel.
|
|
# "BoardView" avoids collision with SQL's reserved VIEW keyword (and with React Native's View) and encodes the boards semantics.
|
|
id PK string # server-generated
|
|
channel_id string INDEX FK >- Channel.id
|
|
type string # 'kanban'
|
|
creator_id string FK >- User.id
|
|
title string
|
|
description string
|
|
sort_order number
|
|
props string # JSON
|
|
create_at number
|
|
update_at number INDEX
|
|
delete_at number # soft-delete, 0 when active
|
|
|
|
|
|
PropertyField
|
|
-
|
|
# Definition of a card (or other object) property. Shared infrastructure reused by future property-based features.
|
|
id PK string # server-generated
|
|
group_id string # opaque; resolved server-side
|
|
name string
|
|
type string # 'text' | 'select' | 'multiselect' | ...
|
|
attrs string # JSON (options, sort_order, ...)
|
|
object_type string # 'card' | 'post' | 'user'
|
|
target_id string INDEX # scope target (channel/team id, empty for system)
|
|
target_type string # 'system' | 'team' | 'channel'
|
|
protected boolean
|
|
permission_field string
|
|
permission_values string # JSON
|
|
permission_options string # JSON
|
|
create_at number
|
|
update_at number INDEX
|
|
delete_at number # soft-delete, 0 when active
|
|
created_by string FK >- User.id
|
|
updated_by string FK >- User.id
|
|
|
|
|
|
PropertyValue
|
|
-
|
|
# Single object's value for a single PropertyField.
|
|
# target_id is polymorphic (keyed by target_type); no typed WatermelonDB relation is declared for it.
|
|
id PK string # server-generated
|
|
field_id string INDEX FK >- PropertyField.id
|
|
target_id string INDEX # polymorphic target
|
|
target_type string # 'post' | 'user' | ...
|
|
group_id string
|
|
value string # JSON (shape depends on field type)
|
|
create_at number
|
|
update_at number
|
|
delete_at number # soft-delete, 0 when active
|
|
created_by string FK >- User.id
|
|
updated_by string FK >- User.id
|