Files
growth_report/src/main/ipc/studentIpc.ts
T

217 lines
4.8 KiB
TypeScript

import { ipcMain } from 'electron'
import {
deleteClassWithProfiles,
deleteStudentProfile,
getStudentProfile,
generateStudentComment,
listStudentProfiles,
loadStudentData,
migrateStoredImagesToFiles,
migrateLocalStudentData,
replaceProfilesForClass,
saveClasses,
updateStudentProfile
} from '../services/studentService'
import type {
ClassProfile,
ChildProfile,
DeleteClassResponse,
DeleteStudentProfileResponse,
GenerateStudentCommentInput,
GenerateStudentCommentResponse,
GetStudentProfileResponse,
LoadStudentDataInput,
ListStudentProfilesInput,
ListStudentProfilesResponse,
LoadStudentDataResponse,
ReplaceClassProfilesResponse,
SaveClassesResponse,
UpdateStudentProfileInput,
UpdateStudentProfileResponse
} from '../types/student'
function getErrorMessage(error: unknown): string {
return error instanceof Error ? error.message : '数据库操作失败'
}
export function registerStudentIpc(): void {
void migrateStoredImagesToFiles().catch((error) => {
console.error('[图片迁移] 迁移 SQLite 内图片到文件失败', error)
})
ipcMain.handle('student:load', async (_, payload?: LoadStudentDataInput): Promise<LoadStudentDataResponse> => {
try {
const studentData = await loadStudentData(payload)
return {
ok: true,
...studentData
}
} catch (error) {
return {
ok: false,
message: getErrorMessage(error)
}
}
})
ipcMain.handle(
'student:list',
async (_, payload: ListStudentProfilesInput): Promise<ListStudentProfilesResponse> => {
try {
return {
ok: true,
...(await listStudentProfiles(payload))
}
} catch (error) {
return {
ok: false,
message: getErrorMessage(error)
}
}
}
)
ipcMain.handle(
'student:get-profile',
async (_, profileId: string): Promise<GetStudentProfileResponse> => {
try {
return {
ok: true,
profile: await getStudentProfile(profileId)
}
} catch (error) {
return {
ok: false,
message: getErrorMessage(error)
}
}
}
)
ipcMain.handle(
'student:update-profile',
async (_, payload: UpdateStudentProfileInput): Promise<UpdateStudentProfileResponse> => {
try {
return {
ok: true,
profile: await updateStudentProfile(payload)
}
} catch (error) {
return {
ok: false,
message: getErrorMessage(error)
}
}
}
)
ipcMain.handle(
'student:generate-comment',
async (_, payload: GenerateStudentCommentInput): Promise<GenerateStudentCommentResponse> => {
try {
return {
ok: true,
profile: await generateStudentComment(payload.profileId)
}
} catch (error) {
return {
ok: false,
message: getErrorMessage(error)
}
}
}
)
ipcMain.handle(
'student:save-classes',
async (_, classes: ClassProfile[]): Promise<SaveClassesResponse> => {
try {
await saveClasses(classes)
return {
ok: true
}
} catch (error) {
return {
ok: false,
message: getErrorMessage(error)
}
}
}
)
ipcMain.handle(
'student:replace-class-profiles',
async (
_,
payload: { classItem: ClassProfile; profiles: ChildProfile[] }
): Promise<ReplaceClassProfilesResponse> => {
try {
await replaceProfilesForClass(payload.classItem, payload.profiles)
return {
ok: true
}
} catch (error) {
return {
ok: false,
message: getErrorMessage(error)
}
}
}
)
ipcMain.handle(
'student:delete-class',
async (_, classId: string): Promise<DeleteClassResponse> => {
try {
await deleteClassWithProfiles(classId)
return {
ok: true
}
} catch (error) {
return {
ok: false,
message: getErrorMessage(error)
}
}
}
)
ipcMain.handle(
'student:delete-profile',
async (_, profileId: string): Promise<DeleteStudentProfileResponse> => {
try {
await deleteStudentProfile(profileId)
return {
ok: true
}
} catch (error) {
return {
ok: false,
message: getErrorMessage(error)
}
}
}
)
ipcMain.handle(
'student:migrate-local',
async (
_,
payload: { classes: ClassProfile[]; profiles: ChildProfile[] }
): Promise<SaveClassesResponse> => {
try {
await migrateLocalStudentData(payload.classes, payload.profiles)
return {
ok: true
}
} catch (error) {
return {
ok: false,
message: getErrorMessage(error)
}
}
}
)
}