Implemented Forum

This commit is contained in:
Torsten Schulz
2024-10-24 11:22:40 +02:00
parent 663564aa96
commit f74a16e58e
8 changed files with 270 additions and 3 deletions

View File

@@ -58,6 +58,31 @@ const forumController = {
console.error('Error in createTopic:', error);
res.status(400).json({ error: error.message });
}
},
async getTopic(req, res) {
try {
const { userid: userId } = req.headers;
const { id: topicId } = req.params;
const topic = await forumService.getTopic(userId, topicId);
res.status(200).json(topic);
} catch (error) {
console.error('Error in getTopic:', error);
res.status(400).json({ error: error.message });
}
},
async addMessage(req, res) {
try {
const { userid: userId } = req.headers;
const { id: topicId } = req.params;
const { content } = req.body;
const result = await forumService.addMessage(userId, topicId, content);
res.status(201).json(result);
} catch (error) {
console.error('Error in addMessage:', error);
res.status(400).json({ error: error.message });
}
}
};

View File

@@ -2,6 +2,11 @@ import { sequelize } from '../../utils/sequelize.js';
import { DataTypes } from 'sequelize';
const Title = sequelize.define('title', {
id: {
type: DataTypes.INTEGER,
primaryKey: true,
autoIncrement: true
},
title: {
type: DataTypes.STRING,
allowNull: false

View File

@@ -6,7 +6,9 @@ const forumRouter = Router();
forumRouter.use(authenticate);
forumRouter.post('/topic/:id/message', forumController.addMessage);
forumRouter.post('/topic', forumController.createTopic);
forumRouter.get('/topic/:id', forumController.getTopic);
forumRouter.post('/', forumController.createForum);
forumRouter.delete('/:forumId', forumController.deleteForum);
forumRouter.get('/:forumId/:page', forumController.getForum);

View File

@@ -196,6 +196,103 @@ class ForumService extends BaseService {
return this.getForum(hashedUserId, forumId, 1);
}
async getTopic(hashedUserId, topicId) {
console.log('[ForumService.getTopic] - start');
const user = await User.findOne({
where: {
hashedId: hashedUserId
}
});
if (!user) {
throw new Error('User not found.');
}
const topic = await Title.findByPk(topicId, {
include: [
{
model: Message,
as:'messages',
include: [
{
model: User,
as: 'lastMessageUser',
attributes: ['hashedId', 'username'],
order: [['createdAt', 'ASC']]
}
]
},
{
model: User,
as: 'createdByUser',
attributes: ['username', 'hashedId']
},
{
model: Forum,
as: 'forum',
attributes: ['id', 'name']
}
]
});
if (!topic) {
throw new Error('Topic not found.');
}
console.log('[ForumService.getTopic] - check user permissions');
const hasAccess = await this.checkForumAccess(topic.forum, user);
if (!hasAccess) {
throw new Error('Access denied.');
}
console.log('[ForumService.getTopic] - return topic');
return topic;
}
async addMessage(hashedUserId, topicId, content) {
console.log('[ForumService.addMessage] - start');
const user = await User.findOne({
where: {
hashedId: hashedUserId
}
});
if (!user) {
throw new Error('User not found.');
}
const topic = await Title.findByPk(topicId, {
include: [
{
model: Message,
as:'messages',
include: [
{
model: User,
as: 'lastMessageUser',
attributes: ['hashedId', 'username'],
order: [['createdAt', 'ASC']]
}
]
},
{
model: User,
as: 'createdByUser',
attributes: ['username', 'hashedId']
},
{
model: Forum,
as: 'forum',
attributes: ['id', 'name']
}
]
});
if (!topic) {
throw new Error('Topic not found.');
}
const hasAccess = await this.checkForumAccess(topic.forum, user);
if (!hasAccess) {
throw new Error('Access denied.');
}
console.log('[ForumService.addMessage] - create new message');
await Message.create({ titleId: topicId, text: content, createdBy: user.id });
console.log('[ForumService.addMessage] - return topic');
return this.getTopic(hashedUserId, topicId);
}
async checkForumAccess(forum, user) {
console.log('[ForumService.checkForumAccess] - start');
const { age } = user;