Refactor IPC handlers to integrate new models and improve maintainability

- Replaced `Book`-based references with specialized models (`Act`, `Issue`, `World`, `GuideLine`, etc.) for enhanced modularity.
- Updated synchronization, story, guideline, plot, and world-related methods to align with new models.
- Removed redundant type definitions and adjusted interfaces for consistency.
This commit is contained in:
natreex
2026-01-12 13:49:51 -05:00
parent cf6fb97bf0
commit cc7d03bee9

View File

@@ -1,9 +1,18 @@
import { ipcMain } from 'electron'; import { ipcMain } from 'electron';
import { createHandler } from '../database/LocalSystem.js'; import { createHandler } from '../database/LocalSystem.js';
import Book, {BookSyncCompare, CompleteBook, SyncedBook} from '../database/models/Book.js'; import Book, {BookSyncCompare, CompleteBook, SyncedBook} from '../database/models/Book.js';
import type { BookProps, GuideLine, GuideLineAI, Act, Issue, WorldProps } from '../database/models/Book.js'; import type { BookProps } from '../database/models/Book.js';
import Chapter from '../database/models/Chapter.js'; import Chapter from '../database/models/Chapter.js';
import type { ChapterProps } from '../database/models/Chapter.js'; import type { ChapterProps } from '../database/models/Chapter.js';
import Act, {ActProps} from "@/electron/database/models/Act";
import Issue, {IssueProps} from "@/electron/database/models/Issue";
import Sync from "@/electron/database/models/Sync";
import Download from "@/electron/database/models/Download";
import Upload from "@/electron/database/models/Upload";
import GuideLine, {GuideLineAI} from "@/electron/database/models/GuideLine";
import Incident from "@/electron/database/models/Incident";
import PlotPoint from "@/electron/database/models/PlotPoint";
import World, {WorldProps} from "@/electron/database/models/World";
interface UpdateBookBasicData { interface UpdateBookBasicData {
title: string; title: string;
@@ -29,14 +38,14 @@ interface UpdateGuideLineData {
} }
interface StoryData { interface StoryData {
acts: Act[]; acts: ActProps[];
issues: Issue[]; issues: IssueProps[];
mainChapter: ChapterProps[]; mainChapter: ChapterProps[];
} }
interface UpdateStoryData { interface UpdateStoryData {
bookId: string; bookId: string;
acts: Act[]; acts: ActProps[];
mainChapters: ChapterProps[]; mainChapters: ChapterProps[];
} }
@@ -97,6 +106,11 @@ interface GetGuidelineData {
id: string; id: string;
} }
interface UpdateWorldData {
bookId: string;
world: WorldProps;
}
// GET /books - Get all books // GET /books - Get all books
ipcMain.handle('db:book:books', createHandler<void, BookProps[]>( ipcMain.handle('db:book:books', createHandler<void, BookProps[]>(
async function(userId: string, _body: void, lang: 'fr' | 'en'):Promise<BookProps[]> { async function(userId: string, _body: void, lang: 'fr' | 'en'):Promise<BookProps[]> {
@@ -108,14 +122,14 @@ ipcMain.handle('db:book:books', createHandler<void, BookProps[]>(
// GET /books/synced - Get all synced books // GET /books/synced - Get all synced books
ipcMain.handle('db:books:synced', createHandler<void, SyncedBook[]>( ipcMain.handle('db:books:synced', createHandler<void, SyncedBook[]>(
async function(userId: string, _body: void, lang: 'fr' | 'en'):Promise<SyncedBook[]> { async function(userId: string, _body: void, lang: 'fr' | 'en'):Promise<SyncedBook[]> {
return await Book.getSyncedBooks(userId, lang); return await Sync.getSyncedBooks(userId, lang);
}) })
); );
// POST /book/sync/save - Save complete book // POST /book/sync/save - Save complete book
ipcMain.handle('db:book:syncSave', createHandler<CompleteBook, boolean>( ipcMain.handle('db:book:syncSave', createHandler<CompleteBook, boolean>(
async function(userId: string, data: CompleteBook, lang: 'fr' | 'en'):Promise<boolean> { async function(userId: string, data: CompleteBook, lang: 'fr' | 'en'):Promise<boolean> {
return await Book.saveCompleteBook(userId, data, lang); return await Download.saveCompleteBook(userId, data, lang);
}) })
); );
@@ -130,7 +144,7 @@ ipcMain.handle('db:book:bookBasicInformation', createHandler<string, BookProps>(
// GET // GET
ipcMain.handle('db:book:uploadToServer', createHandler<string, CompleteBook>( ipcMain.handle('db:book:uploadToServer', createHandler<string, CompleteBook>(
async function(userId: string, bookId: string, lang: 'fr' | 'en'):Promise<CompleteBook> { async function(userId: string, bookId: string, lang: 'fr' | 'en'):Promise<CompleteBook> {
return await Book.uploadBookForSync(userId, bookId, lang); return await Upload.uploadBookForSync(userId, bookId, lang);
} }
) )
); );
@@ -146,7 +160,7 @@ ipcMain.handle('db:book:updateBasicInformation', createHandler<UpdateBookBasicDa
// GET /book/sync/to-client - Get book data to sync to client // GET /book/sync/to-client - Get book data to sync to client
ipcMain.handle('db:book:sync:toServer', createHandler<BookSyncCompare, CompleteBook>( ipcMain.handle('db:book:sync:toServer', createHandler<BookSyncCompare, CompleteBook>(
async function(userId: string, data:BookSyncCompare, lang: 'fr' | 'en'):Promise<CompleteBook> { async function(userId: string, data:BookSyncCompare, lang: 'fr' | 'en'):Promise<CompleteBook> {
return await Book.getCompleteSyncBook(userId, data, lang); return await Sync.getCompleteSyncBook(userId, data, lang);
} }
) )
); );
@@ -154,7 +168,7 @@ ipcMain.handle('db:book:sync:toServer', createHandler<BookSyncCompare, CompleteB
// GET /book/sync/from-server - Get book data to sync from server // GET /book/sync/from-server - Get book data to sync from server
ipcMain.handle('db:book:sync:toClient', createHandler<CompleteBook, boolean>( ipcMain.handle('db:book:sync:toClient', createHandler<CompleteBook, boolean>(
async function(userId: string, data:CompleteBook, lang: 'fr' | 'en'):Promise<boolean> { async function(userId: string, data:CompleteBook, lang: 'fr' | 'en'):Promise<boolean> {
return await Book.syncBookFromServerToClient(userId, data, lang); return await Sync.syncBookFromServerToClient(userId, data, lang);
} }
) )
); );
@@ -162,7 +176,7 @@ ipcMain.handle('db:book:sync:toClient', createHandler<CompleteBook, boolean>(
// GET /book/guide-line - Get guideline // GET /book/guide-line - Get guideline
ipcMain.handle('db:book:guideline:get', ipcMain.handle('db:book:guideline:get',
createHandler<GetGuidelineData, GuideLine | null>(async function(userId: string, data: GetGuidelineData, lang: 'fr' | 'en') { createHandler<GetGuidelineData, GuideLine | null>(async function(userId: string, data: GetGuidelineData, lang: 'fr' | 'en') {
return await Book.getGuideLine(userId, data.id, lang); return await GuideLine.getGuideLine(userId, data.id, lang);
} }
) )
); );
@@ -170,7 +184,7 @@ ipcMain.handle('db:book:guideline:get',
// POST /book/guide-line - Update guideline // POST /book/guide-line - Update guideline
ipcMain.handle('db:book:guideline:update', createHandler<UpdateGuideLineData, boolean>( ipcMain.handle('db:book:guideline:update', createHandler<UpdateGuideLineData, boolean>(
async function(userId: string, data: UpdateGuideLineData, lang: 'fr' | 'en') { async function(userId: string, data: UpdateGuideLineData, lang: 'fr' | 'en') {
return await Book.updateGuideLine( return await GuideLine.updateGuideLine(
userId, userId,
data.bookId, data.bookId,
data.tone, data.tone,
@@ -195,8 +209,8 @@ interface GetStoryData {
} }
ipcMain.handle('db:book:story:get', createHandler<GetStoryData, StoryData>( ipcMain.handle('db:book:story:get', createHandler<GetStoryData, StoryData>(
async function(userId: string, data: GetStoryData, lang: 'fr' | 'en'):Promise<StoryData> { async function(userId: string, data: GetStoryData, lang: 'fr' | 'en'):Promise<StoryData> {
const acts:Act[] = await Book.getActsData(userId, data.bookid, lang); const acts:ActProps[] = await Act.getActsData(userId, data.bookid, lang);
const issues:Issue[] = await Book.getIssuesFromBook(userId, data.bookid, lang); const issues:IssueProps[] = await Issue.getIssuesFromBook(userId, data.bookid, lang);
const mainChapter:ChapterProps[] = Chapter.getAllChaptersFromABook(userId, data.bookid, lang); const mainChapter:ChapterProps[] = Chapter.getAllChaptersFromABook(userId, data.bookid, lang);
return { return {
acts, acts,
@@ -210,7 +224,7 @@ ipcMain.handle('db:book:story:get', createHandler<GetStoryData, StoryData>(
// POST /book/story - Update story (acts + mainChapters) // POST /book/story - Update story (acts + mainChapters)
ipcMain.handle('db:book:story:update', createHandler<UpdateStoryData, boolean>( ipcMain.handle('db:book:story:update', createHandler<UpdateStoryData, boolean>(
function(userId: string, data: UpdateStoryData, lang: 'fr' | 'en'):boolean { function(userId: string, data: UpdateStoryData, lang: 'fr' | 'en'):boolean {
return Book.updateStory(userId, data.bookId, data.acts, data.mainChapters, lang); return Act.updateStory(userId, data.bookId, data.acts, data.mainChapters, lang);
} }
) )
); );
@@ -240,7 +254,7 @@ ipcMain.handle(
'db:book:incident:add', 'db:book:incident:add',
createHandler<AddIncidentData, string>( createHandler<AddIncidentData, string>(
function(userId: string, data: AddIncidentData, lang: 'fr' | 'en') { function(userId: string, data: AddIncidentData, lang: 'fr' | 'en') {
return Book.addNewIncident(userId, data.bookId, data.name, lang, data.incidentId); return Incident.addNewIncident(userId, data.bookId, data.name, lang, data.incidentId);
} }
) )
); );
@@ -253,15 +267,15 @@ interface RemoveIncidentData {
ipcMain.handle('db:book:incident:remove', createHandler<RemoveIncidentData, boolean>( ipcMain.handle('db:book:incident:remove', createHandler<RemoveIncidentData, boolean>(
function(userId: string, data: RemoveIncidentData, lang: 'fr' | 'en') { function(userId: string, data: RemoveIncidentData, lang: 'fr' | 'en') {
return Book.removeIncident(userId, data.bookId, data.incidentId, lang); return Incident.removeIncident(userId, data.bookId, data.incidentId, lang);
} }
) )
); );
// POST /book/plot/new - Add plot point // POST /book/plot/new - Add plot point
ipcMain.handle('db:book:plot:add', createHandler<AddPlotPointData, string>( ipcMain.handle('db:book:plot:add', createHandler<AddPlotPointData, string>(
function(userId: string, data: AddPlotPointData, lang: 'fr' | 'en') { function(userId: string, data: AddPlotPointData, lang: 'fr' | 'en'):string {
return Book.addNewPlotPoint( return PlotPoint.addNewPlotPoint(
userId, userId,
data.bookId, data.bookId,
data.incidentId, data.incidentId,
@@ -281,7 +295,7 @@ ipcMain.handle(
'db:book:plot:remove', 'db:book:plot:remove',
createHandler<RemovePlotData, boolean>( createHandler<RemovePlotData, boolean>(
function(userId: string, data: RemovePlotData, lang: 'fr' | 'en') { function(userId: string, data: RemovePlotData, lang: 'fr' | 'en') {
return Book.removePlotPoint(userId, data.plotId, lang); return PlotPoint.removePlotPoint(userId, data.plotId, lang);
} }
) )
); );
@@ -289,7 +303,7 @@ ipcMain.handle(
// POST /book/issue/add - Add issue // POST /book/issue/add - Add issue
ipcMain.handle('db:book:issue:add', createHandler<AddIssueData, string>( ipcMain.handle('db:book:issue:add', createHandler<AddIssueData, string>(
function(userId: string, data: AddIssueData, lang: 'fr' | 'en') { function(userId: string, data: AddIssueData, lang: 'fr' | 'en') {
return Book.addNewIssue(userId, data.bookId, data.name, lang, data.issueId); return Issue.addNewIssue(userId, data.bookId, data.name, lang, data.issueId);
} }
) )
); );
@@ -301,7 +315,7 @@ interface RemoveIssueData {
} }
ipcMain.handle('db:book:issue:remove', createHandler<RemoveIssueData, boolean>( ipcMain.handle('db:book:issue:remove', createHandler<RemoveIssueData, boolean>(
function(userId: string, data: RemoveIssueData, lang: 'fr' | 'en') { function(userId: string, data: RemoveIssueData, lang: 'fr' | 'en') {
return Book.removeIssue(userId, data.issueId, lang); return Issue.removeIssue(userId, data.issueId, lang);
} }
) )
); );
@@ -312,7 +326,7 @@ interface GetWorldsData {
} }
ipcMain.handle('db:book:worlds:get', createHandler<GetWorldsData, WorldProps[]>( ipcMain.handle('db:book:worlds:get', createHandler<GetWorldsData, WorldProps[]>(
function(userId: string, data: GetWorldsData, lang: 'fr' | 'en') { function(userId: string, data: GetWorldsData, lang: 'fr' | 'en') {
return Book.getWorlds(userId, data.bookid, lang); return World.getWorlds(userId, data.bookid, lang);
} }
) )
); );
@@ -320,7 +334,7 @@ ipcMain.handle('db:book:worlds:get', createHandler<GetWorldsData, WorldProps[]>(
// POST /book/world/add - Add world // POST /book/world/add - Add world
ipcMain.handle('db:book:world:add', createHandler<AddWorldData, string>( ipcMain.handle('db:book:world:add', createHandler<AddWorldData, string>(
function(userId: string, data: AddWorldData, lang: 'fr' | 'en') { function(userId: string, data: AddWorldData, lang: 'fr' | 'en') {
return Book.addNewWorld(userId, data.bookId, data.worldName, lang, data.id); return World.addNewWorld(userId, data.bookId, data.worldName, lang, data.id);
} }
) )
); );
@@ -328,7 +342,7 @@ ipcMain.handle('db:book:world:add', createHandler<AddWorldData, string>(
// POST /book/world/element/add - Add element to world // POST /book/world/element/add - Add element to world
ipcMain.handle('db:book:world:element:add', createHandler<AddWorldElementData, string>( ipcMain.handle('db:book:world:element:add', createHandler<AddWorldElementData, string>(
function(userId: string, data: AddWorldElementData, lang: 'fr' | 'en') { function(userId: string, data: AddWorldElementData, lang: 'fr' | 'en') {
return Book.addNewElementToWorld( return World.addNewElementToWorld(
userId, userId,
data.worldId, data.worldId,
data.elementName, data.elementName,
@@ -345,7 +359,7 @@ interface RemoveWorldElementData {
} }
ipcMain.handle('db:book:world:element:remove', createHandler<RemoveWorldElementData, boolean>( ipcMain.handle('db:book:world:element:remove', createHandler<RemoveWorldElementData, boolean>(
function(userId: string, data: RemoveWorldElementData, lang: 'fr' | 'en') { function(userId: string, data: RemoveWorldElementData, lang: 'fr' | 'en') {
return Book.removeElementFromWorld(userId, data.elementId, lang); return World.removeElementFromWorld(userId, data.elementId, lang);
} }
) )
); );
@@ -367,7 +381,7 @@ interface GetAIGuidelineData {
} }
ipcMain.handle('db:book:guideline:ai:get', createHandler<GetAIGuidelineData, GuideLineAI>( ipcMain.handle('db:book:guideline:ai:get', createHandler<GetAIGuidelineData, GuideLineAI>(
function(userId: string, data: GetAIGuidelineData, lang: 'fr' | 'en') { function(userId: string, data: GetAIGuidelineData, lang: 'fr' | 'en') {
return Book.getGuideLineAI(userId, data.id, lang); return GuideLine.getGuideLineAI(userId, data.id, lang);
} }
) )
); );
@@ -375,7 +389,7 @@ ipcMain.handle('db:book:guideline:ai:get', createHandler<GetAIGuidelineData, Gui
// POST /book/ai/guideline (set) - Set AI guideline // POST /book/ai/guideline (set) - Set AI guideline
ipcMain.handle('db:book:guideline:ai:set', createHandler<SetAIGuideLineData, boolean>( ipcMain.handle('db:book:guideline:ai:set', createHandler<SetAIGuideLineData, boolean>(
function(userId: string, data: SetAIGuideLineData, lang: 'fr' | 'en') { function(userId: string, data: SetAIGuideLineData, lang: 'fr' | 'en') {
return Book.setAIGuideLine( return GuideLine.setAIGuideLine(
userId, userId,
data.bookId, data.bookId,
data.narrativeType, data.narrativeType,
@@ -392,14 +406,9 @@ ipcMain.handle('db:book:guideline:ai:set', createHandler<SetAIGuideLineData, boo
); );
// PUT /book/world/update - Update world // PUT /book/world/update - Update world
interface UpdateWorldData {
bookId: string;
world: WorldProps;
}
ipcMain.handle('db:book:world:update', createHandler<UpdateWorldData, boolean>( ipcMain.handle('db:book:world:update', createHandler<UpdateWorldData, boolean>(
function(userId: string, data: UpdateWorldData, lang: 'fr' | 'en') { function(userId: string, data: UpdateWorldData, lang: 'fr' | 'en') {
return Book.updateWorld(userId, data.world, lang); return World.updateWorld(userId, data.world, lang);
} }
) )
); );