import { ipcMain } from 'electron'; import { createHandler } from '../database/LocalSystem.js'; import Book from '../database/models/Book.js'; import type { BookProps, GuideLine, GuideLineAI, Act, Issue, WorldProps } from '../database/models/Book.js'; // ============================================================ // 1. GET /books - Get all books // ============================================================ ipcMain.handle('db:book:books', createHandler( async function(userId: string, _body: void, lang: 'fr' | 'en'):Promise { return await Book.getBooks(userId, lang); } ) ); // ============================================================ // 2. GET /book/:id - Get single book // ============================================================ ipcMain.handle('db:book:bookBasicInformation', createHandler( async function(userId: string, bookId: string, lang: 'fr' | 'en'):Promise { return await Book.getBook(bookId, userId); } ) ); // ============================================================ // 3. POST /book/basic-information - Update book basic info // ============================================================ interface UpdateBookBasicData { title: string; subTitle: string; summary: string; publicationDate: string; wordCount: number; bookId: string; } ipcMain.handle( 'db:book:updateBasicInformation', createHandler( function(userId: string, data: UpdateBookBasicData, lang: 'fr' | 'en') { return Book.updateBookBasicInformation( userId, data.title, data.subTitle, data.summary, data.publicationDate, data.wordCount, data.bookId, lang ); } ) ); // Frontend: invoke('db:book:updateBasicInformation', data) // ============================================================ // 4. GET /book/guide-line - Get guideline // ============================================================ ipcMain.handle( 'db:book:guideline:get', createHandler( async function(userId: string, bookId: string, lang: 'fr' | 'en') { return await Book.getGuideLine(userId, bookId, lang); } ) ); // Frontend: invoke('db:book:guideline:get', bookId) // ============================================================ // 5. POST /book/guide-line - Update guideline // ============================================================ interface UpdateGuideLineData { bookId: string; tone: string | null; atmosphere: string | null; writingStyle: string | null; themes: string | null; symbolism: string | null; motifs: string | null; narrativeVoice: string | null; pacing: string | null; keyMessages: string | null; intendedAudience: string | null; } ipcMain.handle( 'db:book:guideline:update', createHandler( async function(userId: string, data: UpdateGuideLineData, lang: 'fr' | 'en') { return await Book.updateGuideLine( userId, data.bookId, data.tone, data.atmosphere, data.writingStyle, data.themes, data.symbolism, data.motifs, data.narrativeVoice, data.pacing, data.keyMessages, data.intendedAudience, lang ); } ) ); // Frontend: invoke('db:book:guideline:update', data) // ============================================================ // 6. GET /book/story - Get story data (acts + issues) // ============================================================ interface StoryData { acts: Act[]; issues: Issue[]; } ipcMain.handle( 'db:book:story:get', createHandler( async function(userId: string, bookId: string, lang: 'fr' | 'en') { const acts = await Book.getActsData(userId, bookId, lang); const issues = await Book.getIssuesFromBook(userId, bookId, lang); return { acts, issues }; } ) ); // Frontend: invoke('db:book:story:get', bookId) // ============================================================ // 7. POST /book/story - Update story // TODO: Implement updateStory in Book.ts // ============================================================ // interface StoryUpdateData { // bookId: string; // acts: Act[]; // mainChapters: ChapterProps[]; // } // // ipcMain.handle( // 'db:book:story:update', // createHandler( // function(userId: string, data: StoryUpdateData, lang: 'fr' | 'en') { // return Book.updateStory(userId, data.bookId, data.acts, data.mainChapters, lang); // } // ) // ); // // Frontend: invoke('db:book:story:update', data) // ============================================================ // 8. POST /book/add - Create new book // ============================================================ interface CreateBookData { title: string; subTitle: string | null; summary: string | null; type: string; serieId: number | null; desiredReleaseDate: string | null; desiredWordCount: number | null; } ipcMain.handle( 'db:book:create', createHandler( function(userId: string, data: CreateBookData, lang: 'fr' | 'en') { return Book.addBook( null, userId, data.title, data.subTitle || '', data.summary || '', data.type, data.serieId || 0, data.desiredReleaseDate || '', data.desiredWordCount || 0, lang ); } ) ); // Frontend: invoke('db:book:create', data) // ============================================================ // 9. POST /book/cover - Update book cover // TODO: Implement updateBookCover in Book.ts // ============================================================ // interface UpdateCoverData { // bookId: string; // coverImageName: string; // } // // ipcMain.handle( // 'db:book:cover:update', // createHandler( // function(userId: string, data: UpdateCoverData, lang: 'fr' | 'en') { // return Book.updateBookCover(userId, data.bookId, data.coverImageName, lang); // } // ) // ); // // Frontend: invoke('db:book:cover:update', { bookId, coverImageName }) // ============================================================ // 10. POST /book/incident/new - Add incident // ============================================================ interface AddIncidentData { bookId: string; name: string; } ipcMain.handle( 'db:book:incident:add', createHandler( function(userId: string, data: AddIncidentData, lang: 'fr' | 'en') { return Book.addNewIncident(userId, data.bookId, data.name, lang); } ) ); // Frontend: invoke('db:book:incident:add', { bookId, name }) // ============================================================ // 11. DELETE /book/incident/remove - Remove incident // ============================================================ interface RemoveIncidentData { bookId: string; incidentId: string; } ipcMain.handle( 'db:book:incident:remove', createHandler( function(userId: string, data: RemoveIncidentData, lang: 'fr' | 'en') { return Book.removeIncident(userId, data.bookId, data.incidentId, lang); } ) ); // Frontend: invoke('db:book:incident:remove', { bookId, incidentId }) // ============================================================ // 12. POST /book/plot/new - Add plot point // ============================================================ interface AddPlotPointData { bookId: string; name: string; incidentId: string; } ipcMain.handle( 'db:book:plot:add', createHandler( function(userId: string, data: AddPlotPointData, lang: 'fr' | 'en') { return Book.addNewPlotPoint( userId, data.bookId, data.incidentId, data.name, lang ); } ) ); // Frontend: invoke('db:book:plot:add', { bookId, name, incidentId }) // ============================================================ // 13. DELETE /book/plot/remove - Remove plot point // ============================================================ ipcMain.handle( 'db:book:plot:remove', createHandler( function(userId: string, plotPointId: string, lang: 'fr' | 'en') { return Book.removePlotPoint(userId, plotPointId, lang); } ) ); // Frontend: invoke('db:book:plot:remove', plotPointId) // ============================================================ // 14. POST /book/issue/add - Add issue // ============================================================ interface AddIssueData { bookId: string; name: string; } ipcMain.handle( 'db:book:issue:add', createHandler( function(userId: string, data: AddIssueData, lang: 'fr' | 'en') { return Book.addNewIssue(userId, data.bookId, data.name, lang); } ) ); // Frontend: invoke('db:book:issue:add', { bookId, name }) // ============================================================ // 15. DELETE /book/issue/remove - Remove issue // ============================================================ ipcMain.handle( 'db:book:issue:remove', createHandler( function(userId: string, issueId: string, lang: 'fr' | 'en') { return Book.removeIssue(userId, issueId, lang); } ) ); // Frontend: invoke('db:book:issue:remove', issueId) // ============================================================ // 16. GET /book/worlds - Get worlds for book // ============================================================ ipcMain.handle( 'db:book:worlds:get', createHandler( function(userId: string, bookId: string, lang: 'fr' | 'en') { return Book.getWorlds(userId, bookId, lang); } ) ); // Frontend: invoke('db:book:worlds:get', bookId) // ============================================================ // 17. POST /book/world/add - Add world // ============================================================ interface AddWorldData { bookId: string; worldName: string; } ipcMain.handle( 'db:book:world:add', createHandler( function(userId: string, data: AddWorldData, lang: 'fr' | 'en') { return Book.addNewWorld(userId, data.bookId, data.worldName, lang); } ) ); // Frontend: invoke('db:book:world:add', { bookId, worldName }) // ============================================================ // 18. POST /book/world/element/add - Add element to world // ============================================================ interface AddWorldElementData { worldId: string; elementName: string; elementType: number; } ipcMain.handle( 'db:book:world:element:add', createHandler( function(userId: string, data: AddWorldElementData, lang: 'fr' | 'en') { return Book.addNewElementToWorld( userId, data.worldId, data.elementName, data.elementType.toString(), lang ); } ) ); // Frontend: invoke('db:book:world:element:add', { worldId, elementName, elementType }) // ============================================================ // 19. DELETE /book/world/element/delete - Remove element from world // ============================================================ ipcMain.handle( 'db:book:world:element:remove', createHandler( function(userId: string, elementId: string, lang: 'fr' | 'en') { return Book.removeElementFromWorld(userId, elementId, lang); } ) ); // Frontend: invoke('db:book:world:element:remove', elementId) // ============================================================ // 20. PUT /book/world/update - Update world // TODO: Implement updateWorld in Book.ts // ============================================================ // ipcMain.handle( // 'db:book:world:update', // createHandler( // function(userId: string, world: WorldProps, lang: 'fr' | 'en') { // return Book.updateWorld(userId, world, lang); // } // ) // ); // // Frontend: invoke('db:book:world:update', worldData) // ============================================================ // 21. DELETE /book/cover/delete - Delete book cover // TODO: Implement deleteCoverPicture in Book.ts // ============================================================ // ipcMain.handle( // 'db:book:cover:delete', // createHandler( // function(userId: string, bookId: string, lang: 'fr' | 'en') { // return Book.deleteCoverPicture(userId, bookId, lang); // } // ) // ); // // Frontend: invoke('db:book:cover:delete', bookId) // ============================================================ // 22. DELETE /book/delete - Delete book // ============================================================ ipcMain.handle( 'db:book:delete', createHandler( function(userId: string, bookId: string, lang: 'fr' | 'en') { return Book.removeBook(userId, bookId, lang); } ) ); // Frontend: invoke('db:book:delete', bookId) // ============================================================ // 23. 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); } ) ); // Frontend: invoke('db:book:guideline:ai:get', bookId) // ============================================================ // 24. POST /book/ai/guideline (set) - Set AI guideline // ============================================================ interface SetAIGuideLineData { bookId: string; narrativeType: number; dialogueType: number; globalResume: string; atmosphere: string; verbeTense: number; langue: number; themes: string; } ipcMain.handle( 'db:book:guideline:ai:set', createHandler( function(userId: string, data: SetAIGuideLineData, lang: 'fr' | 'en') { return Book.setAIGuideLine( data.bookId, userId, data.narrativeType, data.dialogueType, data.globalResume, data.atmosphere, data.verbeTense, data.langue, data.themes, lang ); } ) ); // Frontend: invoke('db:book:guideline:ai:set', data) // ============================================================ // 25. GET /book/transform/epub - Export to EPUB // TODO: Implement transformToEpub in Book.ts // ============================================================ // ipcMain.handle( // 'db:book:export:epub', // createHandler( // function(userId: string, bookId: string, lang: 'fr' | 'en') { // return Book.transformToEpub(userId, bookId, lang); // } // ) // ); // // Frontend: invoke('db:book:export:epub', bookId) // ============================================================ // 26. GET /book/transform/pdf - Export to PDF // TODO: Implement transformToPDF in Book.ts // ============================================================ // ipcMain.handle( // 'db:book:export:pdf', // createHandler( // function(userId: string, bookId: string, lang: 'fr' | 'en') { // return Book.transformToPDF(userId, bookId, lang); // } // ) // ); // // Frontend: invoke('db:book:export:pdf', bookId) // ============================================================ // 27. GET /book/transform/docx - Export to DOCX // TODO: Implement transformToDOCX in Book.ts // ============================================================ // ipcMain.handle( // 'db:book:export:docx', // createHandler( // function(userId: string, bookId: string, lang: 'fr' | 'en') { // return Book.transformToDOCX(userId, bookId, lang); // } // ) // ); // // Frontend: invoke('db:book:export:docx', bookId) // ============================================================ // 28. GET /book/tags - Get tags from book // TODO: Implement getTagsFromBook in Book.ts // ============================================================ // interface BookTags { // characters: Tag[]; // locations: Tag[]; // objects: Tag[]; // worldElements: Tag[]; // } // // ipcMain.handle( // 'db:book:tags:get', // createHandler( // function(userId: string, bookId: string, lang: 'fr' | 'en') { // return Book.getTagsFromBook(userId, bookId, lang); // } // ) // ); // // Frontend: invoke('db:book:tags:get', bookId) console.log('[IPC] Book handlers registered');