// Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved. // See LICENSE.txt for license information. import {switchToChannelById} from '@actions/remote/channel'; import {fetchConfigAndLicense} from '@actions/remote/systems'; import DatabaseManager from '@database/manager'; import {prepareCommonSystemValues, getCommonSystemValues, getCurrentTeamId, getWebSocketLastDisconnected, setCurrentTeamAndChannelId, getCurrentChannelId} from '@queries/servers/system'; import {getCurrentUser} from '@queries/servers/user'; import {deleteV1Data} from '@utils/file'; import {isTablet} from '@utils/helpers'; import {deferredAppEntryActions, entry, registerDeviceToken, syncOtherServers, verifyPushProxy} from './common'; export async function appEntry(serverUrl: string, since = 0) { const operator = DatabaseManager.serverDatabases[serverUrl]?.operator; if (!operator) { return {error: `${serverUrl} database not found`}; } const {database} = operator; if (!since) { registerDeviceToken(serverUrl); } // clear lastUnreadChannelId const removeLastUnreadChannelId = await prepareCommonSystemValues(operator, {lastUnreadChannelId: ''}); if (removeLastUnreadChannelId) { operator.batchRecords(removeLastUnreadChannelId); } const tabletDevice = await isTablet(); const currentTeamId = await getCurrentTeamId(database); const currentChannelId = await getCurrentChannelId(database); const lastDisconnectedAt = (await getWebSocketLastDisconnected(database)) || since; const entryData = await entry(serverUrl, currentTeamId, currentChannelId, since); if ('error' in entryData) { return {error: entryData.error}; } const {models, initialTeamId, initialChannelId, prefData, teamData, chData} = entryData; let switchToChannel = false; // Immediately set the new team as the current team in the database so that the UI // renders the correct team. if (tabletDevice && initialChannelId) { switchToChannel = true; switchToChannelById(serverUrl, initialChannelId, initialTeamId); } else { setCurrentTeamAndChannelId(operator, initialTeamId, initialChannelId); } await operator.batchRecords(models); const {id: currentUserId, locale: currentUserLocale} = (await getCurrentUser(database))!; const {config, license} = await getCommonSystemValues(database); await deferredAppEntryActions(serverUrl, lastDisconnectedAt, currentUserId, currentUserLocale, prefData.preferences, config, license, teamData, chData, initialTeamId, switchToChannel ? initialChannelId : undefined); if (!since) { // Load data from other servers syncOtherServers(serverUrl); } verifyPushProxy(serverUrl); return {userId: currentUserId}; } export async function upgradeEntry(serverUrl: string) { const dt = Date.now(); const operator = DatabaseManager.serverDatabases[serverUrl]?.operator; if (!operator) { return {error: `${serverUrl} database not found`}; } try { const configAndLicense = await fetchConfigAndLicense(serverUrl, false); const entryData = await appEntry(serverUrl); const error = configAndLicense.error || entryData.error; if (!error) { const models = await prepareCommonSystemValues(operator, {currentUserId: entryData.userId}); if (models?.length) { await operator.batchRecords(models); } DatabaseManager.updateServerIdentifier(serverUrl, configAndLicense.config!.DiagnosticId); DatabaseManager.setActiveServerDatabase(serverUrl); deleteV1Data(); } return {error, time: Date.now() - dt}; } catch (e) { return {error: e, time: Date.now() - dt}; } }