From 75e5d71c74ab95fc31e13f904da41bd156a5c699 Mon Sep 17 00:00:00 2001 From: natreex Date: Tue, 18 Nov 2025 22:42:18 -0500 Subject: [PATCH] Add `ipc/chapter.ipc.ts` to handle chapter-related database interactions - Introduce IPC handlers in `ipc/chapter.ipc.ts` for chapter CRUD, content management, and related operations. - Register chapter IPC module in `main.ts` for application-wide access. - Enhance type definitions for chapter functionalities, improving code consistency. - Refactor `ipc/book.ipc.ts` to include new `UpdateStoryData` interface and additional story update handler. --- electron/ipc/book.ipc.ts | 47 ++++++++--- electron/ipc/chapter.ipc.ts | 157 ++++++++++++++++++++++++++++++++++++ electron/main.ts | 7 +- 3 files changed, 196 insertions(+), 15 deletions(-) create mode 100644 electron/ipc/chapter.ipc.ts diff --git a/electron/ipc/book.ipc.ts b/electron/ipc/book.ipc.ts index 532689d..da2d0e5 100644 --- a/electron/ipc/book.ipc.ts +++ b/electron/ipc/book.ipc.ts @@ -31,6 +31,12 @@ interface StoryData { issues: Issue[]; } +interface UpdateStoryData { + bookId: string; + acts: Act[]; + mainChapters: any[]; // ChapterProps[] from your API +} + interface CreateBookData { title: string; subTitle: string | null; @@ -72,10 +78,10 @@ interface SetAIGuideLineData { bookId: string; narrativeType: number; dialogueType: number; - globalResume: string; - atmosphere: string; - verbeTense: number; - langue: number; + plotSummary: string; + toneAtmosphere: string; + verbTense: number; + language: number; themes: string; } @@ -147,6 +153,14 @@ ipcMain.handle('db:book:story:get', createHandler( ) ); +// POST /book/story - Update story (acts + mainChapters) +ipcMain.handle('db:book:story:update', createHandler( + function(userId: string, data: UpdateStoryData, lang: 'fr' | 'en'):boolean { + return Book.updateStory(userId, data.bookId, data.acts, data.mainChapters, lang); + } + ) +); + // POST /book/add - Create new book ipcMain.handle('db:book:create', createHandler( function(userId: string, data: CreateBookData, lang: 'fr' | 'en') { @@ -278,7 +292,7 @@ ipcMain.handle('db:book:delete', createHandler( // GET /book/ai/guideline - Get AI guideline ipcMain.handle('db:book:guideline:ai:get', createHandler( function(userId: string, bookId: string, lang: 'fr' | 'en') { - return Book.getGuideLineAI(bookId, userId, lang); + return Book.getGuideLineAI(userId, bookId, lang); } ) ); @@ -287,17 +301,30 @@ ipcMain.handle('db:book:guideline:ai:get', createHandler( ipcMain.handle('db:book:guideline:ai:set', createHandler( function(userId: string, data: SetAIGuideLineData, lang: 'fr' | 'en') { return Book.setAIGuideLine( - data.bookId, userId, + data.bookId, data.narrativeType, data.dialogueType, - data.globalResume, - data.atmosphere, - data.verbeTense, - data.langue, + data.plotSummary, + data.toneAtmosphere, + data.verbTense, + data.language, data.themes, lang ); } ) ); + +// PUT /book/world/update - Update world +interface UpdateWorldData { + bookId: string; + world: WorldProps; +} + +ipcMain.handle('db:book:world:update', createHandler( + function(userId: string, data: UpdateWorldData, lang: 'fr' | 'en') { + return Book.updateWorld(userId, data.world, lang); + } + ) +); diff --git a/electron/ipc/chapter.ipc.ts b/electron/ipc/chapter.ipc.ts new file mode 100644 index 0000000..2d4bf3a --- /dev/null +++ b/electron/ipc/chapter.ipc.ts @@ -0,0 +1,157 @@ +import { ipcMain } from 'electron'; +import { createHandler } from '../database/LocalSystem.js'; +import Chapter from '../database/models/Chapter.js'; +import type { ChapterProps, CompanionContent, ActStory } from '../database/models/Chapter.js'; + +interface GetWholeChapterData { + chapterId: string; + version: number; + bookId?: string; +} + +interface SaveChapterContentData { + chapterId: string; + version: number; + content: JSON; + totalWordCount: number; + currentTime: number; +} + +interface AddChapterData { + bookId: string; + title: string; + chapterOrder: number; +} + +interface UpdateChapterData { + chapterId: string; + title: string; + chapterOrder: number; +} + +interface AddChapterInformationData { + chapterId: string; + actId: number; + bookId: string; + plotId: string | null; + incidentId: string | null; +} + +interface GetChapterContentData { + chapterId: string; + version: number; +} + +// GET /book/chapters - Get all chapters from a book +ipcMain.handle('db:book:chapters', createHandler( + function(userId: string, bookId: string, lang: 'fr' | 'en'): ChapterProps[] { + return Chapter.getAllChaptersFromABook(userId, bookId, lang); + } + ) +); + +// GET /chapter/whole - Get whole chapter +ipcMain.handle('db:chapter:whole', createHandler( + function(userId: string, data: GetWholeChapterData, lang: 'fr' | 'en'): ChapterProps { + return Chapter.getWholeChapter(userId, data.chapterId, data.version, data.bookId, lang); + } + ) +); + +// GET /chapter/:id/story - Get chapter story +ipcMain.handle('db:chapter:story', createHandler( + function(userId: string, chapterId: string, lang: 'fr' | 'en'): ActStory[] { + return Chapter.getChapterStory(userId, chapterId, lang); + } + ) +); + +// GET /chapter/content/companion - Get companion content +ipcMain.handle('db:chapter:content:companion', createHandler( + function(userId: string, data: GetChapterContentData, lang: 'fr' | 'en'): CompanionContent { + return Chapter.getCompanionContent(userId, data.chapterId, data.version, lang); + } + ) +); + +// GET /chapter/content - Get chapter content by version +ipcMain.handle('db:chapter:content:get', createHandler( + function(userId: string, data: GetChapterContentData, lang: 'fr' | 'en'): string { + return Chapter.getChapterContentByVersion(userId, data.chapterId, data.version, lang); + } + ) +); + +// POST /chapter/content - Save chapter content +ipcMain.handle('db:chapter:content:save', createHandler( + function(userId: string, data: SaveChapterContentData, lang: 'fr' | 'en'): boolean { + return Chapter.saveChapterContent( + userId, + data.chapterId, + data.version, + data.content, + data.totalWordCount, + data.currentTime, + lang + ); + } + ) +); + +// GET /chapter/last-chapter - Get last chapter +ipcMain.handle('db:chapter:last', createHandler( + function(userId: string, bookId: string, lang: 'fr' | 'en'): ChapterProps | null { + return Chapter.getLastChapter(userId, bookId, lang); + } + ) +); + +// POST /chapter/add - Add new chapter +ipcMain.handle('db:chapter:create', createHandler( + function(userId: string, data: AddChapterData, lang: 'fr' | 'en'): string { + return Chapter.addChapter(userId, data.bookId, data.title, 0, data.chapterOrder, lang); + } + ) +); + +// DELETE /chapter/remove - Remove chapter +ipcMain.handle('db:chapter:delete', createHandler( + function(userId: string, chapterId: string, lang: 'fr' | 'en'): boolean { + return Chapter.removeChapter(userId, chapterId, lang); + } + ) +); + +// POST /chapter/update - Update chapter +ipcMain.handle('db:chapter:update', createHandler( + function(userId: string, data: UpdateChapterData, lang: 'fr' | 'en'): boolean { + return Chapter.updateChapter(userId, data.chapterId, data.title, data.chapterOrder, lang); + } + ) +); + +// POST /chapter/resume/add - Add chapter information +ipcMain.handle('db:chapter:information:add', createHandler( + function(userId: string, data: AddChapterInformationData, lang: 'fr' | 'en'): string { + return Chapter.addChapterInformation( + userId, + data.chapterId, + data.actId, + data.bookId, + data.plotId, + data.incidentId, + lang + ); + } + ) +); + +// DELETE /chapter/resume/remove - Remove chapter information +ipcMain.handle('db:chapter:information:remove', createHandler( + function(userId: string, chapterInfoId: string, lang: 'fr' | 'en') { + return Chapter.removeChapterInformation(userId, chapterInfoId, lang); + } + ) +); + +console.log('[IPC] Chapter handlers registered'); diff --git a/electron/main.ts b/electron/main.ts index 3f27341..81e105d 100644 --- a/electron/main.ts +++ b/electron/main.ts @@ -9,6 +9,7 @@ import { getDatabaseService } from './database/database.service.js'; // Import IPC handlers import './ipc/book.ipc.js'; import './ipc/user.ipc.js'; +import './ipc/chapter.ipc.js'; // Fix pour __dirname en ES modules const __filename = fileURLToPath(import.meta.url); @@ -204,7 +205,7 @@ ipcMain.handle('db:user:sync', async (_event, data: SyncUserData): Promise { - console.log('App ready, isDev:', isDev); - console.log('resourcesPath:', process.resourcesPath); - console.log('isPackaged:', app.isPackaged); - // Enregistrer le protocole custom app:// pour servir les fichiers depuis out/ if (!isDev) { const outPath = path.join(process.resourcesPath, 'app.asar.unpacked/out');