aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLibravatar Kristóf Marussy <kristof@marussy.com>2022-01-20 18:46:00 +0100
committerLibravatar Kristóf Marussy <kristof@marussy.com>2022-02-08 21:43:16 +0100
commit286abe8d982ec3b08580910157c6ed886aea20ca (patch)
treeb4289feb2bb9105c967b197b96d8e408170455e5
parentfeat: Add RuntimeService store (diff)
downloadsophie-286abe8d982ec3b08580910157c6ed886aea20ca.tar.gz
sophie-286abe8d982ec3b08580910157c6ed886aea20ca.tar.zst
sophie-286abe8d982ec3b08580910157c6ed886aea20ca.zip
refactor: Rename main services to infrastructure
Makes it clear that we are talking about wrappers for nodejs and electron functionality, and not the services being displayed by the application. Signed-off-by: Kristóf Marussy <kristof@marussy.com>
-rw-r--r--docs/architecture.md8
-rw-r--r--packages/main/src/controllers/__tests__/initConfig.spec.ts4
-rw-r--r--packages/main/src/controllers/initConfig.ts4
-rw-r--r--packages/main/src/infrastructure/ConfigPersistence.ts (renamed from packages/main/src/services/ConfigPersistenceService.ts)2
-rw-r--r--packages/main/src/infrastructure/impl/FileBasedConfigPersistence.ts (renamed from packages/main/src/services/impl/ConfigPersistenceServiceImpl.ts)12
-rw-r--r--packages/main/src/init.ts4
6 files changed, 16 insertions, 18 deletions
diff --git a/docs/architecture.md b/docs/architecture.md
index 0122809..791b57b 100644
--- a/docs/architecture.md
+++ b/docs/architecture.md
@@ -82,11 +82,11 @@ Instead, they purely rely on IPC messages to invoke actions in the main process
82 82
83In the main process, _controllers_ react to `MainStore` changes by invoking Electron APIs and subscribe to Electron events in order to invoke `MainStore` actions. 83In the main process, _controllers_ react to `MainStore` changes by invoking Electron APIs and subscribe to Electron events in order to invoke `MainStore` actions.
84 84
85For easier testability, controllers may rely on _services_ abstracting away the underlying Electron APIs. 85For better testability, controllers may rely on _infrastructure services_ (wrappers) abstracting away the underlying Electron APIs.
86The service has to come with a TypeScript interface and an implementation. 86Each infrastructure of the service has to come with a TypeScript interface and at least one implementation.
87In the tests, the default implementation of the interface is replaced by a mock. 87In the tests, the default implementations of the interfaces are replaced by mocks.
88 88
89The services and controllers are instatiated and connected to the `MainStore` in the [composition root](https://gitlab.com/say-hi-to-sophie/sophie/-/blob/main/packages/main/src/compositionRoot.ts). 89The infrastructure services and controllers are instantiated and connected to the `MainStore` in the [composition root](https://gitlab.com/say-hi-to-sophie/sophie/-/blob/main/packages/main/src/init.ts).
90 90
91**TODO:** 91**TODO:**
92While a service is a common term in MVC application architecture, we should come up with a different name to avoid clashing witch services, i.e., web sites loaded by Sophie. 92While a service is a common term in MVC application architecture, we should come up with a different name to avoid clashing witch services, i.e., web sites loaded by Sophie.
diff --git a/packages/main/src/controllers/__tests__/initConfig.spec.ts b/packages/main/src/controllers/__tests__/initConfig.spec.ts
index 241ab2d..dc00b9d 100644
--- a/packages/main/src/controllers/__tests__/initConfig.spec.ts
+++ b/packages/main/src/controllers/__tests__/initConfig.spec.ts
@@ -23,14 +23,14 @@ import { mocked } from 'jest-mock';
23import { getSnapshot } from 'mobx-state-tree'; 23import { getSnapshot } from 'mobx-state-tree';
24import ms from 'ms'; 24import ms from 'ms';
25 25
26import type ConfigPersistenceService from '../../services/ConfigPersistenceService'; 26import type ConfigPersistence from '../../infrastructure/ConfigPersistence';
27import { Config, config as configModel } from '../../stores/Config'; 27import { Config, config as configModel } from '../../stores/Config';
28import type Disposer from '../../utils/Disposer'; 28import type Disposer from '../../utils/Disposer';
29import { silenceLogger } from '../../utils/log'; 29import { silenceLogger } from '../../utils/log';
30import initConfig from '../initConfig'; 30import initConfig from '../initConfig';
31 31
32let config: Config; 32let config: Config;
33const persistenceService: ConfigPersistenceService = { 33const persistenceService: ConfigPersistence = {
34 readConfig: jest.fn(), 34 readConfig: jest.fn(),
35 writeConfig: jest.fn(), 35 writeConfig: jest.fn(),
36 watchConfig: jest.fn(), 36 watchConfig: jest.fn(),
diff --git a/packages/main/src/controllers/initConfig.ts b/packages/main/src/controllers/initConfig.ts
index 2dcabaf..c8cd335 100644
--- a/packages/main/src/controllers/initConfig.ts
+++ b/packages/main/src/controllers/initConfig.ts
@@ -23,7 +23,7 @@ import { debounce } from 'lodash-es';
23import { getSnapshot, onSnapshot } from 'mobx-state-tree'; 23import { getSnapshot, onSnapshot } from 'mobx-state-tree';
24import ms from 'ms'; 24import ms from 'ms';
25 25
26import type ConfigPersistenceService from '../services/ConfigPersistenceService'; 26import type ConfigPersistence from '../infrastructure/ConfigPersistence';
27import { Config, ConfigFileIn, ConfigSnapshotOut } from '../stores/Config'; 27import { Config, ConfigFileIn, ConfigSnapshotOut } from '../stores/Config';
28import type Disposer from '../utils/Disposer'; 28import type Disposer from '../utils/Disposer';
29import { getLogger } from '../utils/log'; 29import { getLogger } from '../utils/log';
@@ -34,7 +34,7 @@ const log = getLogger('config');
34 34
35export default async function initConfig( 35export default async function initConfig(
36 config: Config, 36 config: Config,
37 persistenceService: ConfigPersistenceService, 37 persistenceService: ConfigPersistence,
38 debounceTime: number = DEFAULT_CONFIG_DEBOUNCE_TIME, 38 debounceTime: number = DEFAULT_CONFIG_DEBOUNCE_TIME,
39): Promise<Disposer> { 39): Promise<Disposer> {
40 log.trace('Initializing config controller'); 40 log.trace('Initializing config controller');
diff --git a/packages/main/src/services/ConfigPersistenceService.ts b/packages/main/src/infrastructure/ConfigPersistence.ts
index ee5696d..4b96f01 100644
--- a/packages/main/src/services/ConfigPersistenceService.ts
+++ b/packages/main/src/infrastructure/ConfigPersistence.ts
@@ -25,7 +25,7 @@ export type ReadConfigResult =
25 | { found: true; data: unknown } 25 | { found: true; data: unknown }
26 | { found: false }; 26 | { found: false };
27 27
28export default interface ConfigPersistenceService { 28export default interface ConfigPersistence {
29 readConfig(): Promise<ReadConfigResult>; 29 readConfig(): Promise<ReadConfigResult>;
30 30
31 writeConfig(configSnapshot: ConfigSnapshotOut): Promise<void>; 31 writeConfig(configSnapshot: ConfigSnapshotOut): Promise<void>;
diff --git a/packages/main/src/services/impl/ConfigPersistenceServiceImpl.ts b/packages/main/src/infrastructure/impl/FileBasedConfigPersistence.ts
index a11a9da..06e3fab 100644
--- a/packages/main/src/services/impl/ConfigPersistenceServiceImpl.ts
+++ b/packages/main/src/infrastructure/impl/FileBasedConfigPersistence.ts
@@ -27,14 +27,12 @@ import throttle from 'lodash-es/throttle';
27import type { ConfigSnapshotOut } from '../../stores/Config'; 27import type { ConfigSnapshotOut } from '../../stores/Config';
28import type Disposer from '../../utils/Disposer'; 28import type Disposer from '../../utils/Disposer';
29import { getLogger } from '../../utils/log'; 29import { getLogger } from '../../utils/log';
30import type ConfigPersistenceService from '../ConfigPersistenceService'; 30import type ConfigPersistence from '../ConfigPersistence';
31import type { ReadConfigResult } from '../ConfigPersistenceService'; 31import type { ReadConfigResult } from '../ConfigPersistence';
32 32
33const log = getLogger('configPersistence'); 33const log = getLogger('fileBasedConfigPersistence');
34 34
35export default class ConfigPersistenceServiceImpl 35export default class FileBasedConfigPersistence implements ConfigPersistence {
36 implements ConfigPersistenceService
37{
38 private readonly configFilePath: string; 36 private readonly configFilePath: string;
39 37
40 private writingConfig = false; 38 private writingConfig = false;
@@ -50,7 +48,7 @@ export default class ConfigPersistenceServiceImpl
50 } 48 }
51 49
52 async readConfig(): Promise<ReadConfigResult> { 50 async readConfig(): Promise<ReadConfigResult> {
53 let configStr; 51 let configStr: string;
54 try { 52 try {
55 configStr = await readFile(this.configFilePath, 'utf8'); 53 configStr = await readFile(this.configFilePath, 'utf8');
56 } catch (error) { 54 } catch (error) {
diff --git a/packages/main/src/init.ts b/packages/main/src/init.ts
index f3794bb..236a075 100644
--- a/packages/main/src/init.ts
+++ b/packages/main/src/init.ts
@@ -22,12 +22,12 @@ import { app } from 'electron';
22 22
23import initConfig from './controllers/initConfig'; 23import initConfig from './controllers/initConfig';
24import initNativeTheme from './controllers/initNativeTheme'; 24import initNativeTheme from './controllers/initNativeTheme';
25import ConfigPersistenceServiceImpl from './services/impl/ConfigPersistenceServiceImpl'; 25import FileBasedConfigPersistence from './infrastructure/impl/FileBasedConfigPersistence';
26import { MainStore } from './stores/MainStore'; 26import { MainStore } from './stores/MainStore';
27import type Disposer from './utils/Disposer'; 27import type Disposer from './utils/Disposer';
28 28
29export default async function init(store: MainStore): Promise<Disposer> { 29export default async function init(store: MainStore): Promise<Disposer> {
30 const configPersistenceService = new ConfigPersistenceServiceImpl( 30 const configPersistenceService = new FileBasedConfigPersistence(
31 app.getPath('userData'), 31 app.getPath('userData'),
32 ); 32 );
33 const disposeConfigController = await initConfig( 33 const disposeConfigController = await initConfig(