From b31f72475a1c95b45aeb8f10e39aceac10e151cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Sebastian=20B=C3=B6ckelmann?= Date: Wed, 20 Mar 2024 09:26:52 +0100 Subject: [PATCH] Introduce Project Service as interface to persistance of gamemodel --- app/storage/FileUtils.js | 17 ++++++++ app/storage/ModelComponentFileDirectory.js | 11 ++++++ app/storage/StoreComponent.js | 12 ++++++ app/storage/StoredGameModel.js | 11 ++++++ app/storage/loader/GameModelLoader.js | 32 +++++++++++++++ app/storage/loader/ScriptAccountLoader.js | 31 +++++++++++++++ src/app/project/project.service.spec.ts | 16 ++++++++ src/app/project/project.service.ts | 45 ++++++++++++++++++++++ 8 files changed, 175 insertions(+) create mode 100644 app/storage/FileUtils.js create mode 100644 app/storage/ModelComponentFileDirectory.js create mode 100644 app/storage/StoreComponent.js create mode 100644 app/storage/StoredGameModel.js create mode 100644 app/storage/loader/GameModelLoader.js create mode 100644 app/storage/loader/ScriptAccountLoader.js create mode 100644 src/app/project/project.service.spec.ts create mode 100644 src/app/project/project.service.ts diff --git a/app/storage/FileUtils.js b/app/storage/FileUtils.js new file mode 100644 index 0000000..6a966ba --- /dev/null +++ b/app/storage/FileUtils.js @@ -0,0 +1,17 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.FileUtils = void 0; +const fs = require("fs"); +const path = require("node:path"); +class FileUtils { + static listFilesInDirectory(directory) { + if (fs.lstatSync(directory).isDirectory()) { + return fs.readdirSync(directory).map(fileName => path.join(directory, fileName)); + } + else { + return []; + } + } +} +exports.FileUtils = FileUtils; +//# sourceMappingURL=FileUtils.js.map \ No newline at end of file diff --git a/app/storage/ModelComponentFileDirectory.js b/app/storage/ModelComponentFileDirectory.js new file mode 100644 index 0000000..9e2de51 --- /dev/null +++ b/app/storage/ModelComponentFileDirectory.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ModelComponentFileDirectory = void 0; +class ModelComponentFileDirectory { +} +exports.ModelComponentFileDirectory = ModelComponentFileDirectory; +ModelComponentFileDirectory.SCRIPTACCOUNT_DIR_NAME = "script-accounts"; +ModelComponentFileDirectory.GAMESYSTEM_DIR_NAME = "gamesystems"; +ModelComponentFileDirectory.GAMESYSTEM_SIMPLE_DIR_NAME = "simple"; +ModelComponentFileDirectory.GAMESYSTEM_PRODUCT_DIR_NAME = "product"; +//# sourceMappingURL=ModelComponentFileDirectory.js.map \ No newline at end of file diff --git a/app/storage/StoreComponent.js b/app/storage/StoreComponent.js new file mode 100644 index 0000000..a4ca044 --- /dev/null +++ b/app/storage/StoreComponent.js @@ -0,0 +1,12 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.StoreComponent = void 0; +class StoreComponent { + constructor(jsonString, fileName, componentType) { + this.jsonString = jsonString; + this.fileName = fileName; + this.componentType = componentType; + } +} +exports.StoreComponent = StoreComponent; +//# sourceMappingURL=StoreComponent.js.map \ No newline at end of file diff --git a/app/storage/StoredGameModel.js b/app/storage/StoredGameModel.js new file mode 100644 index 0000000..076e1a0 --- /dev/null +++ b/app/storage/StoredGameModel.js @@ -0,0 +1,11 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.StoredGameModel = void 0; +class StoredGameModel { + constructor(gameModelName, loadedModels) { + this.gameModelName = gameModelName; + this.loadedModels = loadedModels; + } +} +exports.StoredGameModel = StoredGameModel; +//# sourceMappingURL=StoredGameModel.js.map \ No newline at end of file diff --git a/app/storage/loader/GameModelLoader.js b/app/storage/loader/GameModelLoader.js new file mode 100644 index 0000000..33c28fb --- /dev/null +++ b/app/storage/loader/GameModelLoader.js @@ -0,0 +1,32 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.GameModelLoader = void 0; +const StoredGameModel_1 = require("../StoredGameModel"); +const path = require("node:path"); +const ModelComponentFileDirectory_1 = require("../ModelComponentFileDirectory"); +const ScriptAccountLoader_1 = require("./ScriptAccountLoader"); +class GameModelLoader { + constructor(gameModelDir) { + this.gameModelDir = gameModelDir; + } + loadGameModel() { + const gameModelName = path.basename(this.gameModelDir); + const gameModelComponents = this.loadGameModelComponents(); + return new StoredGameModel_1.StoredGameModel(gameModelName, gameModelComponents); + } + loadGameModelComponents() { + let gameModelComponents = this.loadScriptAccountComponents(); + gameModelComponents = gameModelComponents.concat(this.loadGamesystems()); + return gameModelComponents; + } + loadScriptAccountComponents() { + const scriptAccountDir = path.join(this.gameModelDir, ModelComponentFileDirectory_1.ModelComponentFileDirectory.SCRIPTACCOUNT_DIR_NAME); + const scriptAccountLoader = new ScriptAccountLoader_1.ScriptAccountLoader(scriptAccountDir); + return scriptAccountLoader.loadScriptAccounts(); + } + loadGamesystems() { + return []; + } +} +exports.GameModelLoader = GameModelLoader; +//# sourceMappingURL=GameModelLoader.js.map \ No newline at end of file diff --git a/app/storage/loader/ScriptAccountLoader.js b/app/storage/loader/ScriptAccountLoader.js new file mode 100644 index 0000000..5b5c1a2 --- /dev/null +++ b/app/storage/loader/ScriptAccountLoader.js @@ -0,0 +1,31 @@ +"use strict"; +Object.defineProperty(exports, "__esModule", { value: true }); +exports.ScriptAccountLoader = void 0; +const StoreComponent_1 = require("../StoreComponent"); +const FileUtils_1 = require("../FileUtils"); +const ModelComponentType_1 = require("../../../src/app/project/game-model/ModelComponentType"); +const fs = require("fs"); +class ScriptAccountLoader { + constructor(scriptAccountDir) { + this.scriptAccountDir = scriptAccountDir; + } + loadScriptAccounts() { + const scriptAccountFiles = FileUtils_1.FileUtils.listFilesInDirectory(this.scriptAccountDir); + const loadedScriptAccounts = []; + scriptAccountFiles.forEach(scriptAccountFile => { + const loadedScriptAccount = this.loadScriptAccount(scriptAccountFile); + if (loadedScriptAccount != undefined) { + loadedScriptAccounts.push(loadedScriptAccount); + } + }); + return loadedScriptAccounts; + } + loadScriptAccount(scriptAccountFile) { + if (scriptAccountFile.endsWith(".json")) { + const scriptAccountData = fs.readFileSync(scriptAccountFile, 'utf-8'); + return new StoreComponent_1.StoreComponent(scriptAccountData, scriptAccountFile, ModelComponentType_1.ModelComponentType.SCRIPTACCOUNT); + } + } +} +exports.ScriptAccountLoader = ScriptAccountLoader; +//# sourceMappingURL=ScriptAccountLoader.js.map \ No newline at end of file diff --git a/src/app/project/project.service.spec.ts b/src/app/project/project.service.spec.ts new file mode 100644 index 0000000..c70ac34 --- /dev/null +++ b/src/app/project/project.service.spec.ts @@ -0,0 +1,16 @@ +import { TestBed } from '@angular/core/testing'; + +import { ProjectService } from './project.service'; + +describe('ProjectService', () => { + let service: ProjectService; + + beforeEach(() => { + TestBed.configureTestingModule({}); + service = TestBed.inject(ProjectService); + }); + + it('should be created', () => { + expect(service).toBeTruthy(); + }); +}); diff --git a/src/app/project/project.service.ts b/src/app/project/project.service.ts new file mode 100644 index 0000000..b06fb8f --- /dev/null +++ b/src/app/project/project.service.ts @@ -0,0 +1,45 @@ +import { Injectable } from '@angular/core'; +import {ElectronService} from "../core/services"; +import {GameModel} from "./game-model/GameModel"; +import {StoredGameModel} from "../../../app/storage/StoredGameModel"; +import {ScriptAccount} from "./game-model/scriptAccounts/ScriptAccount"; +import {ModelComponentType} from "./game-model/ModelComponentType"; +import {ScriptAccountParser} from "./parser/ScriptAccountParser"; + +@Injectable({ + providedIn: 'root' +}) +export class ProjectService { + + gameModel: GameModel = new GameModel("New GameModel") + constructor(private electronService: ElectronService) { + if(electronService.isElectron) { + electronService.ipcRenderer.on('get-project-data', (event: any, message: string) => { + this.saveProject(); + }) + + electronService.ipcRenderer.on('open-project', (event: any, loadedProject: StoredGameModel) => { + this.loadProject(loadedProject); + }) + } + } + + saveProject() { + + } + + loadProject(storedGameModel: StoredGameModel) { + const gameModel = new GameModel(storedGameModel.gameModelName) + storedGameModel.loadedModels.forEach(storedComponent => { + switch (storedComponent.componentType) { + case ModelComponentType.SCRIPTACCOUNT: { + const scriptAccount = ScriptAccountParser.parseScriptAccount(storedComponent); + gameModel.addScriptAccount(scriptAccount); + } + } + }) + this.gameModel = gameModel; + } + + +}