180 lines
4.3 KiB
JavaScript
180 lines
4.3 KiB
JavaScript
import { CreateBlogCommand } from '../../application/commands/CreateBlogCommand.js';
|
|
import { UpdateBlogCommand } from '../../application/commands/UpdateBlogCommand.js';
|
|
import { DeleteBlogCommand } from '../../application/commands/DeleteBlogCommand.js';
|
|
import { GetBlogQuery, GetAllBlogsQuery, GetUserBlogsQuery } from '../../application/queries/BlogQueries.js';
|
|
|
|
/**
|
|
* BlogController
|
|
* Blog műveletek kezelése
|
|
*/
|
|
export class BlogController {
|
|
constructor(createHandler, updateHandler, deleteHandler, queryHandler) {
|
|
this.createHandler = createHandler;
|
|
this.updateHandler = updateHandler;
|
|
this.deleteHandler = deleteHandler;
|
|
this.queryHandler = queryHandler;
|
|
}
|
|
|
|
/**
|
|
* Blog létrehozása
|
|
* POST /api/blogs
|
|
*/
|
|
async createBlog(req, res) {
|
|
try {
|
|
// FIGYELEM: req.user-t az auth middleware-nek kell beállítania
|
|
// Ez a feladat része - implementálandó!
|
|
const authorId = req.user?.id;
|
|
|
|
if (!authorId) {
|
|
return res.status(401).json({ error: 'Authentication required' });
|
|
}
|
|
|
|
const command = new CreateBlogCommand({
|
|
...req.body,
|
|
authorId
|
|
});
|
|
|
|
const blog = await this.createHandler.handle(command);
|
|
|
|
res.status(201).json({
|
|
success: true,
|
|
data: blog.toObject()
|
|
});
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Blog módosítása
|
|
* PUT /api/blogs/:id
|
|
*/
|
|
async updateBlog(req, res) {
|
|
try {
|
|
const userId = req.user?.id;
|
|
|
|
if (!userId) {
|
|
return res.status(401).json({ error: 'Authentication required' });
|
|
}
|
|
|
|
const command = new UpdateBlogCommand(req.params.id, req.body);
|
|
|
|
// FIGYELEM: Authorization ellenőrzés szükséges!
|
|
// Csak a szerző vagy admin módosíthatja
|
|
// Ez a feladat része - implementálandó!
|
|
|
|
const blog = await this.updateHandler.handle(command);
|
|
|
|
res.json({
|
|
success: true,
|
|
data: blog.toObject()
|
|
});
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Blog törlése
|
|
* DELETE /api/blogs/:id
|
|
*/
|
|
async deleteBlog(req, res) {
|
|
try {
|
|
const userId = req.user?.id;
|
|
|
|
if (!userId) {
|
|
return res.status(401).json({ error: 'Authentication required' });
|
|
}
|
|
|
|
const command = new DeleteBlogCommand(req.params.id, userId);
|
|
const result = await this.deleteHandler.handle(command);
|
|
|
|
res.json({
|
|
success: true,
|
|
message: result.message
|
|
});
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Egy blog lekérése
|
|
* GET /api/blogs/:id
|
|
*/
|
|
async getBlog(req, res) {
|
|
try {
|
|
const query = new GetBlogQuery(req.params.id);
|
|
const blog = await this.queryHandler.handleGetBlog(query);
|
|
|
|
res.json({
|
|
success: true,
|
|
data: blog.toObject()
|
|
});
|
|
} catch (error) {
|
|
res.status(404).json({
|
|
success: false,
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Összes blog lekérése
|
|
* GET /api/blogs
|
|
*/
|
|
async getAllBlogs(req, res) {
|
|
try {
|
|
const query = new GetAllBlogsQuery({
|
|
publishedOnly: req.query.published === 'true',
|
|
limit: req.query.limit ? parseInt(req.query.limit) : undefined,
|
|
offset: req.query.offset ? parseInt(req.query.offset) : 0
|
|
});
|
|
|
|
const blogs = await this.queryHandler.handleGetAllBlogs(query);
|
|
|
|
res.json({
|
|
success: true,
|
|
data: blogs.map(blog => blog.toObject()),
|
|
count: blogs.length
|
|
});
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
|
|
/**
|
|
* User blogjai
|
|
* GET /api/users/:userId/blogs
|
|
*/
|
|
async getUserBlogs(req, res) {
|
|
try {
|
|
const query = new GetUserBlogsQuery(req.params.userId);
|
|
const blogs = await this.queryHandler.handleGetUserBlogs(query);
|
|
|
|
res.json({
|
|
success: true,
|
|
data: blogs.map(blog => blog.toObject()),
|
|
count: blogs.length
|
|
});
|
|
} catch (error) {
|
|
res.status(400).json({
|
|
success: false,
|
|
error: error.message
|
|
});
|
|
}
|
|
}
|
|
}
|