// src/main/ipc/template-handlers.ts // Phase 12.3: 딕테이션 템플릿 IPC 핸들러 import { ipcMain } from 'electron' import { IPC_CHANNELS } from '@d3ro/core/ipc-channels' import { ErrorCode, ipcSuccess, ipcError } from '@d3ro/core/errors' import { getDictationTemplateService } from '../services/DictationTemplateService' import { getLogger } from '../services/LoggerService' import type { CreateTemplateParams, UpdateTemplateParams, DeleteTemplateParams, StartTemplateSessionParams, SetFieldValueParams, } from '@d3ro/core/types' const logger = getLogger('template-handlers') export function registerTemplateHandlers(): void { ipcMain.handle(IPC_CHANNELS.DICTATION_TEMPLATE.GET_ALL, async () => { try { return ipcSuccess(getDictationTemplateService().getAll()) } catch (err) { const msg = err instanceof Error ? err.message : String(err) return ipcError(ErrorCode.UnknownError, msg) } }) ipcMain.handle( IPC_CHANNELS.DICTATION_TEMPLATE.CREATE, async (_event, params: CreateTemplateParams) => { try { // 라이센스 체크 try { const { getLicenseService } = await import('../services/LicenseService') const { Feature } = await import('@d3ro/core/types') const license = getLicenseService() const access = license.canUse(Feature.DICTATION_TEMPLATE) if (!access.allowed) { license.promptUpgrade(Feature.DICTATION_TEMPLATE, 'tier_required') return ipcError(ErrorCode.FeatureNotAvailable, 'Pro+ required') } } catch { // LicenseService 미초기화 시 허용 } const result = getDictationTemplateService().create(params) return ipcSuccess(result) } catch (err) { const msg = err instanceof Error ? err.message : String(err) logger.error('Template create failed:', msg) return ipcError(ErrorCode.TemplateInvalidFormat, msg) } }, ) ipcMain.handle( IPC_CHANNELS.DICTATION_TEMPLATE.UPDATE, async (_event, params: UpdateTemplateParams) => { try { const result = getDictationTemplateService().update(params) return ipcSuccess(result) } catch (err) { const msg = err instanceof Error ? err.message : String(err) return ipcError(ErrorCode.TemplateNotFound, msg) } }, ) ipcMain.handle( IPC_CHANNELS.DICTATION_TEMPLATE.DELETE, async (_event, params: DeleteTemplateParams) => { try { getDictationTemplateService().delete(params.id) return ipcSuccess(undefined) } catch (err) { const msg = err instanceof Error ? err.message : String(err) return ipcError(ErrorCode.TemplateNotFound, msg) } }, ) ipcMain.handle( IPC_CHANNELS.DICTATION_TEMPLATE.START_SESSION, async (_event, params: StartTemplateSessionParams) => { try { getDictationTemplateService().startSession(params.templateId) return ipcSuccess(undefined) } catch (err) { const msg = err instanceof Error ? err.message : String(err) logger.error('Template session start failed:', msg) return ipcError(ErrorCode.TemplateSessionAlreadyActive, msg) } }, ) ipcMain.handle(IPC_CHANNELS.DICTATION_TEMPLATE.CANCEL_SESSION, async () => { try { getDictationTemplateService().cancelSession() return ipcSuccess(undefined) } catch (err) { const msg = err instanceof Error ? err.message : String(err) return ipcError(ErrorCode.TemplateSessionNotActive, msg) } }) ipcMain.handle(IPC_CHANNELS.DICTATION_TEMPLATE.GET_SESSION_STATE, async () => { try { return ipcSuccess(getDictationTemplateService().getSessionState()) } catch (err) { const msg = err instanceof Error ? err.message : String(err) return ipcError(ErrorCode.UnknownError, msg) } }) ipcMain.handle( IPC_CHANNELS.DICTATION_TEMPLATE.SET_FIELD_VALUE, async (_event, params: SetFieldValueParams) => { try { getDictationTemplateService().setFieldValue(params.fieldId, params.value) return ipcSuccess(undefined) } catch (err) { const msg = err instanceof Error ? err.message : String(err) return ipcError(ErrorCode.TemplateFieldRecordingFailed, msg) } }, ) }