feat: Android APP V1 - Experimental Alpha

This commit is contained in:
2026-06-05 07:40:25 +02:00
parent bf4e6891d1
commit 9a1305f976
179 changed files with 8031 additions and 120 deletions

View File

@@ -0,0 +1,157 @@
/** Native SQLite database name for Capacitor mobile shells. */
export const MOBILE_SQLITE_DATABASE_NAME = 'metoyou';
/** Bump when adding DDL statements; stored in meta table. */
export const MOBILE_SQLITE_SCHEMA_VERSION = 2;
const META_SCHEMA_VERSION_KEY = 'mobile_sqlite_schema_version';
/** DDL mirrored from Electron TypeORM entities under `electron/entities/`. */
export function buildMobileSqliteSchemaStatements(): string[] {
return [
`CREATE TABLE IF NOT EXISTS messages (
id TEXT PRIMARY KEY NOT NULL,
roomId TEXT NOT NULL,
ownerUserId TEXT,
channelId TEXT,
senderId TEXT NOT NULL,
senderName TEXT NOT NULL,
content TEXT NOT NULL,
timestamp INTEGER NOT NULL,
editedAt INTEGER,
isDeleted INTEGER NOT NULL DEFAULT 0,
replyToId TEXT,
linkMetadata TEXT,
kind TEXT,
systemEvent TEXT
)`,
'CREATE INDEX IF NOT EXISTS idx_messages_room_id ON messages(roomId)',
'CREATE INDEX IF NOT EXISTS idx_messages_timestamp ON messages(timestamp)',
`CREATE TABLE IF NOT EXISTS users (
id TEXT PRIMARY KEY NOT NULL,
oderId TEXT,
username TEXT,
displayName TEXT,
description TEXT,
profileUpdatedAt INTEGER,
avatarUrl TEXT,
avatarHash TEXT,
avatarMime TEXT,
avatarUpdatedAt INTEGER,
status TEXT,
role TEXT,
joinedAt INTEGER,
peerId TEXT,
isOnline INTEGER NOT NULL DEFAULT 0,
isAdmin INTEGER NOT NULL DEFAULT 0,
isRoomOwner INTEGER NOT NULL DEFAULT 0,
voiceState TEXT,
screenShareState TEXT,
homeSignalServerUrl TEXT
)`,
`CREATE TABLE IF NOT EXISTS rooms (
id TEXT PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
description TEXT,
topic TEXT,
hostId TEXT NOT NULL,
password TEXT,
hasPassword INTEGER NOT NULL DEFAULT 0,
isPrivate INTEGER NOT NULL DEFAULT 0,
createdAt INTEGER NOT NULL,
userCount INTEGER NOT NULL DEFAULT 0,
maxUsers INTEGER,
icon TEXT,
iconUpdatedAt INTEGER,
slowModeInterval INTEGER NOT NULL DEFAULT 0,
sourceId TEXT,
sourceName TEXT,
sourceUrl TEXT
)`,
'CREATE INDEX IF NOT EXISTS idx_rooms_created_at ON rooms(createdAt)',
`CREATE TABLE IF NOT EXISTS reactions (
id TEXT PRIMARY KEY NOT NULL,
messageId TEXT NOT NULL,
oderId TEXT,
userId TEXT,
emoji TEXT NOT NULL,
timestamp INTEGER NOT NULL
)`,
'CREATE INDEX IF NOT EXISTS idx_reactions_message_id ON reactions(messageId)',
`CREATE TABLE IF NOT EXISTS bans (
oderId TEXT NOT NULL,
roomId TEXT NOT NULL,
userId TEXT,
bannedBy TEXT NOT NULL,
displayName TEXT,
reason TEXT,
expiresAt INTEGER,
timestamp INTEGER NOT NULL,
PRIMARY KEY (oderId, roomId)
)`,
'CREATE INDEX IF NOT EXISTS idx_bans_room_id ON bans(roomId)',
`CREATE TABLE IF NOT EXISTS attachments (
id TEXT PRIMARY KEY NOT NULL,
messageId TEXT NOT NULL,
filename TEXT NOT NULL,
size INTEGER NOT NULL,
mime TEXT NOT NULL,
isImage INTEGER NOT NULL DEFAULT 0,
uploaderPeerId TEXT,
filePath TEXT,
savedPath TEXT
)`,
'CREATE INDEX IF NOT EXISTS idx_attachments_message_id ON attachments(messageId)',
`CREATE TABLE IF NOT EXISTS custom_emojis (
id TEXT PRIMARY KEY NOT NULL,
name TEXT NOT NULL,
creatorUserId TEXT NOT NULL,
dataUrl TEXT NOT NULL,
hash TEXT NOT NULL,
mime TEXT NOT NULL,
size INTEGER NOT NULL,
createdAt INTEGER NOT NULL,
updatedAt INTEGER NOT NULL
)`,
'CREATE INDEX IF NOT EXISTS idx_custom_emojis_updated_at ON custom_emojis(updatedAt)',
`CREATE TABLE IF NOT EXISTS meta (
key TEXT PRIMARY KEY NOT NULL,
value TEXT
)`,
`CREATE TABLE IF NOT EXISTS push_device_tokens (
id TEXT PRIMARY KEY NOT NULL,
userId TEXT NOT NULL,
platform TEXT NOT NULL,
token TEXT NOT NULL,
updatedAt INTEGER NOT NULL
)`,
'CREATE INDEX IF NOT EXISTS idx_push_device_tokens_user_id ON push_device_tokens(userId)',
`INSERT OR REPLACE INTO meta (key, value) VALUES ('${META_SCHEMA_VERSION_KEY}', '${MOBILE_SQLITE_SCHEMA_VERSION}')`
];
}
const SCHEMA_V2_MESSAGE_COLUMNS = [
'ALTER TABLE messages ADD COLUMN linkMetadata TEXT',
'ALTER TABLE messages ADD COLUMN kind TEXT',
'ALTER TABLE messages ADD COLUMN systemEvent TEXT'
];
/** Returns DDL statements that still need to run for the stored schema version. */
export function resolveMobileSqliteMigrationStatements(storedVersion: number): string[] {
if (storedVersion >= MOBILE_SQLITE_SCHEMA_VERSION) {
return [];
}
if (storedVersion <= 0) {
return buildMobileSqliteSchemaStatements();
}
const statements: string[] = [];
if (storedVersion < 2) {
statements.push(...SCHEMA_V2_MESSAGE_COLUMNS);
statements.push(`INSERT OR REPLACE INTO meta (key, value) VALUES ('${META_SCHEMA_VERSION_KEY}', '2')`);
}
return statements;
}