mattermost-mobile-upstream/app/database/models/server/index.ts
Guillermo Vayá 354e956f43 feat(drafts): Phase 1 synchronized-drafts storage foundation
Adds the durable storage foundation for synchronized drafts (mobile-only,
no network behavior yet):

- Fix draft batch dedup in handleDraft to key by the composite
  (channel_id, root_id) instead of channel_id alone, so a channel draft
  and its thread reply drafts in the same batch no longer collapse.
- Add Draft columns: server_update_at (nullable ancestry hint, not a
  revision), props (JSON), file_ids (JSON portable server attachment IDs).
- Add the DraftOutbox table (one durable pending op per draft key) with
  operation/status const objects, generation, keep_local, retry fields,
  and a deleted_fingerprint column for delete-vs-newer-write disambiguation.
- Add buildDraftOutboxId, the serialized mutateDraftAndOutbox writer
  primitive (enters database.write before querying both tables, commits one
  batch), and deterministic repairDuplicateDrafts.
- Bump server schema 20 -> 21 with addColumns + createTable migration;
  register schema/model in the database managers, mocks, types, and docs.

Tests: composite-key survival, concurrent-mutation serialization, batch
failure atomicity, duplicate repair winner, model round-trip / migration
compatibility, and migration definition.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
2026-07-23 16:18:48 +02:00

43 lines
2.4 KiB
TypeScript

// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
// See LICENSE.txt for license information.
export {default as CategoryModel} from './category';
export {default as CategoryChannelModel} from './category_channel';
export {default as ChannelModel} from './channel';
export {default as ChannelBookmarkModel} from './channel_bookmark';
export {default as ChannelInfoModel} from './channel_info';
export {default as ChannelMembershipModel} from './channel_membership';
export {default as ConfigModel} from './config';
export {default as CustomEmojiModel} from './custom_emoji';
export {default as CustomProfileFieldModel} from './custom_profile_field';
export {default as CustomProfileAttributeModel} from './custom_profile_attribute';
export {default as DraftModel} from './draft';
export {default as DraftOutboxModel} from './draft_outbox';
export {default as FileModel} from './file';
export {default as GroupModel} from './group';
export {default as GroupChannelModel} from './group_channel';
export {default as GroupMembershipModel} from './group_membership';
export {default as GroupTeamModel} from './group_team';
export {default as MyChannelModel} from './my_channel';
export {default as MyChannelSettingsModel} from './my_channel_settings';
export {default as MyTeamModel} from './my_team';
export {default as PostModel} from './post';
export {default as PostsInChannelModel} from './posts_in_channel';
export {default as PostsInThreadModel} from './posts_in_thread';
export {default as PreferenceModel} from './preference';
export {default as PropertyFieldModel} from './property_field';
export {default as PropertyValueModel} from './property_value';
export {default as ReactionModel} from './reaction';
export {default as RoleModel} from './role';
export {default as ScheduledPostModel} from './scheduled_post';
export {default as SystemModel} from './system';
export {default as TeamChannelHistoryModel} from './team_channel_history';
export {default as TeamMembershipModel} from './team_membership';
export {default as TeamModel} from './team';
export {default as TeamSearchHistoryModel} from './team_search_history';
export {default as ThreadModel} from './thread';
export {default as ThreadInTeamModel} from './thread_in_team';
export {default as ThreadParticipantModel} from './thread_participant';
export {default as TeamThreadsSyncModel} from './team_threads_sync';
export {default as UserModel} from './user';