chore: initial import to Nexus_Edu
This commit is contained in:
176
backend/src/controllers/common.controller.ts
Normal file
176
backend/src/controllers/common.controller.ts
Normal file
@@ -0,0 +1,176 @@
|
||||
import { Response } from 'express';
|
||||
import { AuthRequest } from '../middleware/auth.middleware';
|
||||
import prisma from '../utils/prisma';
|
||||
|
||||
// 获取消息列表
|
||||
export const getMessages = async (req: AuthRequest, res: Response) => {
|
||||
try {
|
||||
const userId = req.userId;
|
||||
if (!userId) return res.status(401).json({ error: 'Unauthorized' });
|
||||
|
||||
const messages = await prisma.message.findMany({
|
||||
where: { userId },
|
||||
orderBy: { createdAt: 'desc' }
|
||||
});
|
||||
|
||||
res.json(messages);
|
||||
} catch (error) {
|
||||
console.error('Get messages error:', error);
|
||||
res.status(500).json({ error: 'Failed to get messages' });
|
||||
}
|
||||
};
|
||||
|
||||
// 标记消息为已读
|
||||
export const markMessageRead = async (req: AuthRequest, res: Response) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
const userId = req.userId;
|
||||
|
||||
const message = await prisma.message.findUnique({ where: { id } });
|
||||
if (!message) return res.status(404).json({ error: 'Message not found' });
|
||||
if (message.userId !== userId) return res.status(403).json({ error: 'Forbidden' });
|
||||
|
||||
await prisma.message.update({
|
||||
where: { id },
|
||||
data: { isRead: true }
|
||||
});
|
||||
|
||||
res.json({ success: true });
|
||||
} catch (error) {
|
||||
console.error('Mark message read error:', error);
|
||||
res.status(500).json({ error: 'Failed to mark message read' });
|
||||
}
|
||||
};
|
||||
|
||||
// 创建消息
|
||||
export const createMessage = async (req: AuthRequest, res: Response) => {
|
||||
try {
|
||||
const userId = req.userId;
|
||||
const { title, content, type } = req.body;
|
||||
|
||||
if (!userId) return res.status(401).json({ error: 'Unauthorized' });
|
||||
if (!title || !content) {
|
||||
return res.status(400).json({ error: 'Title and content are required' });
|
||||
}
|
||||
|
||||
const message = await prisma.message.create({
|
||||
data: {
|
||||
userId,
|
||||
title,
|
||||
content,
|
||||
type: type || 'System',
|
||||
senderName: 'Me',
|
||||
isRead: false
|
||||
}
|
||||
});
|
||||
|
||||
res.json(message);
|
||||
} catch (error) {
|
||||
console.error('Create message error:', error);
|
||||
res.status(500).json({ error: 'Failed to create message' });
|
||||
}
|
||||
};
|
||||
|
||||
// 获取日程
|
||||
export const getSchedule = async (req: AuthRequest, res: Response) => {
|
||||
try {
|
||||
const userId = req.userId;
|
||||
if (!userId) return res.status(401).json({ error: 'Unauthorized' });
|
||||
|
||||
// 获取用户关联的班级
|
||||
const user = await prisma.applicationUser.findUnique({
|
||||
where: { id: userId },
|
||||
include: {
|
||||
classMemberships: {
|
||||
include: { class: true }
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (!user) return res.status(404).json({ error: 'User not found' });
|
||||
|
||||
const classIds = user.classMemberships.map(cm => cm.classId);
|
||||
|
||||
// 获取这些班级的日程
|
||||
const schedules = await prisma.schedule.findMany({
|
||||
where: { classId: { in: classIds } },
|
||||
include: { class: true }
|
||||
});
|
||||
|
||||
const scheduleDtos = schedules.map(s => ({
|
||||
id: s.id,
|
||||
startTime: s.startTime,
|
||||
endTime: s.endTime,
|
||||
className: s.class.name,
|
||||
subject: s.subject,
|
||||
room: s.room || '',
|
||||
isToday: s.dayOfWeek === new Date().getDay(),
|
||||
dayOfWeek: s.dayOfWeek,
|
||||
period: s.period
|
||||
}));
|
||||
|
||||
res.json(scheduleDtos);
|
||||
} catch (error) {
|
||||
console.error('Get schedule error:', error);
|
||||
res.status(500).json({ error: 'Failed to get schedule' });
|
||||
}
|
||||
};
|
||||
|
||||
// 获取周日程
|
||||
export const getWeekSchedule = async (req: AuthRequest, res: Response) => {
|
||||
// 复用 getSchedule 逻辑,因为我们返回了所有日程
|
||||
return getSchedule(req, res);
|
||||
};
|
||||
|
||||
// 添加日程 (仅教师)
|
||||
export const addEvent = async (req: AuthRequest, res: Response) => {
|
||||
try {
|
||||
const userId = req.userId;
|
||||
const { subject, className, classId, room, dayOfWeek, period, startTime, endTime } = req.body;
|
||||
|
||||
let resolvedClassId: string | null = null;
|
||||
if (classId) {
|
||||
const clsById = await prisma.class.findUnique({ where: { id: classId } });
|
||||
if (!clsById) return res.status(404).json({ error: 'Class not found' });
|
||||
resolvedClassId = clsById.id;
|
||||
} else if (className) {
|
||||
const clsByName = await prisma.class.findFirst({ where: { name: className } });
|
||||
if (!clsByName) return res.status(404).json({ error: 'Class not found' });
|
||||
resolvedClassId = clsByName.id;
|
||||
} else {
|
||||
return res.status(400).json({ error: 'classId or className is required' });
|
||||
}
|
||||
|
||||
// 检查权限 (简化:假设所有教师都可以添加)
|
||||
// 实际应检查是否是该班级的教师
|
||||
|
||||
await prisma.schedule.create({
|
||||
data: {
|
||||
classId: resolvedClassId!,
|
||||
subject,
|
||||
room,
|
||||
dayOfWeek,
|
||||
period,
|
||||
startTime,
|
||||
endTime
|
||||
}
|
||||
});
|
||||
|
||||
res.status(201).json({ success: true });
|
||||
} catch (error) {
|
||||
console.error('Add event error:', error);
|
||||
res.status(500).json({ error: 'Failed to add event' });
|
||||
}
|
||||
};
|
||||
|
||||
// 删除日程
|
||||
export const deleteEvent = async (req: AuthRequest, res: Response) => {
|
||||
try {
|
||||
const { id } = req.params;
|
||||
await prisma.schedule.delete({ where: { id } });
|
||||
res.json({ success: true });
|
||||
} catch (error) {
|
||||
console.error('Delete event error:', error);
|
||||
res.status(500).json({ error: 'Failed to delete event' });
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user