123 lines
2.9 KiB
TypeScript
123 lines
2.9 KiB
TypeScript
import { Request, Response } from 'express';
|
|
import { prisma } from '../../../../src/lib/prisma';
|
|
import { AuthRequest } from '../../../middleware/auth';
|
|
import { checkPermission } from '../../../utils/permissions.js';
|
|
|
|
export async function getArticle(req: Request, res: Response) {
|
|
try {
|
|
const article = await prisma.article.findUnique({
|
|
where: { id: req.params.id },
|
|
include: {
|
|
author: {
|
|
select: {
|
|
id: true,
|
|
displayName: true,
|
|
email: true
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
if (!article) {
|
|
return res.status(404).json({ error: 'Article not found' });
|
|
}
|
|
|
|
res.json(article);
|
|
} catch {
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
}
|
|
|
|
export async function createArticle(req: AuthRequest, res: Response) {
|
|
try {
|
|
const { title, excerpt, content, category, city, coverImage, readTime } = req.body;
|
|
|
|
if (!req.user || !checkPermission(req.user, category, 'create')) {
|
|
return res.status(403).json({ error: 'Permission denied' });
|
|
}
|
|
|
|
const article = await prisma.article.create({
|
|
data: {
|
|
title,
|
|
excerpt,
|
|
content,
|
|
category,
|
|
city,
|
|
coverImage,
|
|
readTime,
|
|
authorId: req.user.id
|
|
},
|
|
include: {
|
|
author: {
|
|
select: {
|
|
id: true,
|
|
displayName: true,
|
|
email: true
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
res.status(201).json(article);
|
|
} catch {
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
}
|
|
|
|
export async function updateArticle(req: AuthRequest, res: Response) {
|
|
try {
|
|
const article = await prisma.article.findUnique({
|
|
where: { id: req.params.id }
|
|
});
|
|
|
|
if (!article) {
|
|
return res.status(404).json({ error: 'Article not found' });
|
|
}
|
|
|
|
if (!req.user || !checkPermission(req.user, article.category, 'edit')) {
|
|
return res.status(403).json({ error: 'Permission denied' });
|
|
}
|
|
|
|
const updatedArticle = await prisma.article.update({
|
|
where: { id: req.params.id },
|
|
data: req.body,
|
|
include: {
|
|
author: {
|
|
select: {
|
|
id: true,
|
|
displayName: true,
|
|
email: true
|
|
}
|
|
}
|
|
}
|
|
});
|
|
|
|
res.json(updatedArticle);
|
|
} catch {
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
}
|
|
|
|
export async function deleteArticle(req: AuthRequest, res: Response) {
|
|
try {
|
|
const article = await prisma.article.findUnique({
|
|
where: { id: req.params.id }
|
|
});
|
|
|
|
if (!article) {
|
|
return res.status(404).json({ error: 'Article not found' });
|
|
}
|
|
|
|
if (!req.user || !checkPermission(req.user, article.category, 'delete')) {
|
|
return res.status(403).json({ error: 'Permission denied' });
|
|
}
|
|
|
|
await prisma.article.delete({
|
|
where: { id: req.params.id }
|
|
});
|
|
|
|
res.json({ message: 'Article deleted successfully' });
|
|
} catch {
|
|
res.status(500).json({ error: 'Server error' });
|
|
}
|
|
} |