Skip to content

Commit

Permalink
Extract preferences related server handlers from main.ts to server/pr…
Browse files Browse the repository at this point in the history
…eferences/app.ts
  • Loading branch information
joel-jeremy committed Feb 21, 2025
1 parent f5a1293 commit 04f34ed
Show file tree
Hide file tree
Showing 4 changed files with 132 additions and 127 deletions.
100 changes: 1 addition & 99 deletions packages/loot-core/src/server/main.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,6 @@ import { logger } from '../platform/server/log';
import * as sqlite from '../platform/server/sqlite';
import * as monthUtils from '../shared/months';
import { q } from '../shared/query';
import { stringToInteger } from '../shared/util';
import { type Budget } from '../types/budget';
import { Handlers } from '../types/handlers';
import { OpenIdConfig } from '../types/models/openid';
Expand Down Expand Up @@ -501,103 +500,6 @@ handlers['query'] = async function (query) {
return aqlQuery(query);
};

handlers['save-global-prefs'] = async function (prefs) {
if ('maxMonths' in prefs) {
await asyncStorage.setItem('max-months', '' + prefs.maxMonths);
}
if ('documentDir' in prefs) {
if (await fs.exists(prefs.documentDir)) {
await asyncStorage.setItem('document-dir', prefs.documentDir);
}
}
if ('floatingSidebar' in prefs) {
await asyncStorage.setItem('floating-sidebar', '' + prefs.floatingSidebar);
}
if ('language' in prefs) {
await asyncStorage.setItem('language', prefs.language);
}
if ('theme' in prefs) {
await asyncStorage.setItem('theme', prefs.theme);
}
if ('preferredDarkTheme' in prefs) {
await asyncStorage.setItem(
'preferred-dark-theme',
prefs.preferredDarkTheme,
);
}
if ('serverSelfSignedCert' in prefs) {
await asyncStorage.setItem(
'server-self-signed-cert',
prefs.serverSelfSignedCert,
);
}
return 'ok';
};

handlers['load-global-prefs'] = async function () {
const [
[, floatingSidebar],
[, maxMonths],
[, documentDir],
[, encryptKey],
[, language],
[, theme],
[, preferredDarkTheme],
[, serverSelfSignedCert],
] = await asyncStorage.multiGet([
'floating-sidebar',
'max-months',
'document-dir',
'encrypt-key',
'language',
'theme',
'preferred-dark-theme',
'server-self-signed-cert',
] as const);
return {
floatingSidebar: floatingSidebar === 'true' ? true : false,
maxMonths: stringToInteger(maxMonths || ''),
documentDir: documentDir || getDefaultDocumentDir(),
keyId: encryptKey && JSON.parse(encryptKey).id,
language,
theme:
theme === 'light' ||
theme === 'dark' ||
theme === 'auto' ||
theme === 'development' ||
theme === 'midnight'
? theme
: 'auto',
preferredDarkTheme:
preferredDarkTheme === 'dark' || preferredDarkTheme === 'midnight'
? preferredDarkTheme
: 'dark',
serverSelfSignedCert: serverSelfSignedCert || undefined,
};
};

handlers['save-prefs'] = async function (prefsToSet) {
const { cloudFileId } = prefs.getPrefs();

// Need to sync the budget name on the server as well
if (prefsToSet.budgetName && cloudFileId) {
const userToken = await asyncStorage.getItem('user-token');

await post(getServer().SYNC_SERVER + '/update-user-filename', {
token: userToken,
fileId: cloudFileId,
name: prefsToSet.budgetName,
});
}

await prefs.savePrefs(prefsToSet);
return 'ok';
};

handlers['load-prefs'] = async function () {
return prefs.getPrefs();
};

handlers['sync-reset'] = async function () {
return await resetSync();
};
Expand Down Expand Up @@ -1606,7 +1508,7 @@ app.combine(
accountsApp,
);

function getDefaultDocumentDir() {
export function getDefaultDocumentDir() {
if (Platform.isMobile) {
// On mobile, unfortunately we need to be backwards compatible
// with the old folder structure which does not store files inside
Expand Down
140 changes: 131 additions & 9 deletions packages/loot-core/src/server/preferences/app.ts
Original file line number Diff line number Diff line change
@@ -1,24 +1,52 @@
import { type SyncedPrefs } from '../../types/prefs';
import * as asyncStorage from '../../platform/server/asyncStorage';
import * as fs from '../../platform/server/fs';
import { stringToInteger } from '../../shared/util';
import {
GlobalPrefs,
MetadataPrefs,
type SyncedPrefs,
} from '../../types/prefs';
import { createApp } from '../app';
import * as db from '../db';
import { getDefaultDocumentDir } from '../main';
import { mutator } from '../mutators';
import { post } from '../post';
import {
getPrefs as _getMetadataPrefs,
savePrefs as _saveMetadataPrefs,
} from '../prefs';
import { getServer } from '../server-config';
import { undoable } from '../undo';

import { PreferencesHandlers } from './types/handlers';
export interface PreferencesHandlers {
'preferences/save': typeof saveSyncedPrefs;
'preferences/get': typeof getSyncedPrefs;
'save-global-prefs': typeof saveGlobalPrefs;
'load-global-prefs': typeof loadGlobalPrefs;
'save-prefs': typeof saveMetadataPrefs;
'load-prefs': typeof loadMetadataPrefs;
}

export const app = createApp<PreferencesHandlers>();

const savePreferences = async ({
app.method('preferences/save', mutator(undoable(saveSyncedPrefs)));
app.method('preferences/get', getSyncedPrefs);
app.method('save-global-prefs', saveGlobalPrefs);
app.method('load-global-prefs', loadGlobalPrefs);
app.method('save-prefs', saveMetadataPrefs);
app.method('load-prefs', loadMetadataPrefs);

async function saveSyncedPrefs({
id,
value,
}: {
id: keyof SyncedPrefs;
value: string | undefined;
}) => {
}) {
await db.update('preferences', { id, value });
};
}

const getPreferences = async (): Promise<SyncedPrefs> => {
async function getSyncedPrefs(): Promise<SyncedPrefs> {
const prefs = (await db.all('SELECT id, value FROM preferences')) as Array<{
id: string;
value: string;
Expand All @@ -28,7 +56,101 @@ const getPreferences = async (): Promise<SyncedPrefs> => {
carry[id as keyof SyncedPrefs] = value;
return carry;
}, {});
};
}

async function saveGlobalPrefs(prefs: GlobalPrefs) {
if ('maxMonths' in prefs) {
await asyncStorage.setItem('max-months', '' + prefs.maxMonths);
}
if ('documentDir' in prefs) {
if (await fs.exists(prefs.documentDir)) {
await asyncStorage.setItem('document-dir', prefs.documentDir);
}
}
if ('floatingSidebar' in prefs) {
await asyncStorage.setItem('floating-sidebar', '' + prefs.floatingSidebar);
}
if ('language' in prefs) {
await asyncStorage.setItem('language', prefs.language);
}
if ('theme' in prefs) {
await asyncStorage.setItem('theme', prefs.theme);
}
if ('preferredDarkTheme' in prefs) {
await asyncStorage.setItem(
'preferred-dark-theme',
prefs.preferredDarkTheme,
);
}
if ('serverSelfSignedCert' in prefs) {
await asyncStorage.setItem(
'server-self-signed-cert',
prefs.serverSelfSignedCert,
);
}
return 'ok';
}

async function loadGlobalPrefs() {
const [
[, floatingSidebar],
[, maxMonths],
[, documentDir],
[, encryptKey],
[, language],
[, theme],
[, preferredDarkTheme],
[, serverSelfSignedCert],
] = await asyncStorage.multiGet([
'floating-sidebar',
'max-months',
'document-dir',
'encrypt-key',
'language',
'theme',
'preferred-dark-theme',
'server-self-signed-cert',
] as const);
return {
floatingSidebar: floatingSidebar === 'true' ? true : false,
maxMonths: stringToInteger(maxMonths || ''),
documentDir: documentDir || getDefaultDocumentDir(),
keyId: encryptKey && JSON.parse(encryptKey).id,
language,
theme:
theme === 'light' ||
theme === 'dark' ||
theme === 'auto' ||
theme === 'development' ||
theme === 'midnight'
? theme
: 'auto',
preferredDarkTheme:
preferredDarkTheme === 'dark' || preferredDarkTheme === 'midnight'
? preferredDarkTheme
: 'dark',
serverSelfSignedCert: serverSelfSignedCert || undefined,
};
}

async function saveMetadataPrefs(prefsToSet: MetadataPrefs) {
const { cloudFileId } = _getMetadataPrefs();

// Need to sync the budget name on the server as well
if (prefsToSet.budgetName && cloudFileId) {
const userToken = await asyncStorage.getItem('user-token');

await post(getServer().SYNC_SERVER + '/update-user-filename', {
token: userToken,
fileId: cloudFileId,
name: prefsToSet.budgetName,
});
}

await _saveMetadataPrefs(prefsToSet);
return 'ok';
}

app.method('preferences/save', mutator(undoable(savePreferences)));
app.method('preferences/get', getPreferences);
function loadMetadataPrefs(): MetadataPrefs {
return _getMetadataPrefs();
}
10 changes: 0 additions & 10 deletions packages/loot-core/src/server/preferences/types/handlers.d.ts

This file was deleted.

9 changes: 0 additions & 9 deletions packages/loot-core/src/types/server-handlers.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,6 @@ import {
PayeeEntity,
} from './models';
import { OpenIdConfig } from './models/openid';
import { GlobalPrefs, MetadataPrefs } from './prefs';
// eslint-disable-next-line import/no-unresolved
import { Query } from './query';
import { EmptyObject } from './util';
Expand Down Expand Up @@ -118,14 +117,6 @@ export interface ServerHandlers {
// eslint-disable-next-line @typescript-eslint/no-explicit-any
query: (query: Query) => Promise<{ data: any; dependencies: string[] }>;

'save-global-prefs': (prefs) => Promise<'ok'>;

'load-global-prefs': () => Promise<GlobalPrefs>;

'save-prefs': (prefsToSet) => Promise<'ok'>;

'load-prefs': () => Promise<MetadataPrefs | null>;

'sync-reset': () => Promise<{ error?: { reason: string; meta?: unknown } }>;

'sync-repair': () => Promise<unknown>;
Expand Down

0 comments on commit 04f34ed

Please sign in to comment.