Implemented Forum
This commit is contained in:
@@ -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 });
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
Reference in New Issue
Block a user