Код ревью контроллера
Помогите правильно реализовать контроллер.
Вот примерная структура проекта:

Слышал что запросы к бд в контроллере писать не стоит. Тогда где их лучше разместить?
А еще можно ли улучшить запросы?
Вот кусок кода
class TaskController {
async createTask(req, res) {
try {
const { name, description, priority, status, deadline } = req.body
const task = await Task.create({ name, description, priority, status, deadline })
await UserTask.create({ userId: req.user.id, taskId: task.id })
return res.status(201).json(task);
} catch (e) {
console.log(e)
return res.status(400).json(e)
}
}
async getTasks(req, res) {
try {
const startDate = req.query.startDate;
const endDate = req.query.endDate;
const tasks = await sequelize.query(
`SELECT tasks.*, GROUP_CONCAT(users.firstName) AS 'usersName'
FROM users
INNER JOIN usertasks ON usertasks.userId = users.id
INNER JOIN tasks ON usertasks.taskId = tasks.id AND tasks.deadline BETWEEN '${startDate}' AND '${endDate}'
WHERE usertasks.taskId IN (SELECT usertasks.taskId FROM usertasks INNER JOIN users ON users.id = usertasks.userId WHERE users.id = ${req.user.id})
GROUP BY tasks.id`, {
type: QueryTypes.SELECT,
})
return res.status(200).json(tasks);
} catch (e) {
console.log(e)
}
}
async deleteTask(req, res) {
try {
const task = await Task.findOne({
include: {
model: User,
where: {
id: req.user.id
},
attributes: [],
},
where: {
id: req.query.id
}
})
await task.destroy()
return res.json({ message: 'Task was deleted' });
} catch (e) {
console.log(e)
}
}
async updateTask(req, res) {
try {
const { id, priority, status } = req.body
const task = await Task.findOne({
attributes: {
include: [
[
sequelize.literal(`(
SELECT GROUP_CONCAT(users.firstName)
FROM users
INNER JOIN usertasks ON usertasks.userId=users.id
INNER JOIN tasks ON usertasks.taskId=tasks.id AND tasks.id=${id}
WHERE usertasks.taskId IN (SELECT usertasks.taskId FROM usertasks INNER JOIN users ON users.id=usertasks.userId WHERE users.id=${req.user.id})
)`),
'usersName'
]
]
},
where: { id: id },
})
await task.update({
priority: priority,
status: status,
})
await task.save()
return res.json(task);
} catch (e) {
console.log(e)
return res.status(400).json(e)
}
}
async searchTasks(req, res) {
try {
const searchName = req.query.search;
const tasks = await sequelize.query(
`SELECT tasks.*, GROUP_CONCAT(users.firstName) AS 'usersName'
FROM users
INNER JOIN usertasks ON usertasks.userId = users.id
INNER JOIN tasks ON usertasks.taskId = tasks.id AND (tasks.name LIKE '%${searchName}%' OR tasks.description LIKE '%${searchName}%' OR tasks.deadline LIKE '%${searchName}%')
WHERE usertasks.taskId IN (SELECT usertasks.taskId FROM usertasks INNER JOIN users ON users.id = usertasks.userId WHERE users.id = ${req.user.id})
GROUP BY tasks.id
ORDER BY tasks.deadline DESC
LIMIT 10 `, {
type: QueryTypes.SELECT,
})
return res.json(tasks);
} catch (e) {
console.log(e)
return res.status(400).json({ message: 'Search error' })
}
}
async getCounts(req, res) {
try {
const counts = await sequelize.query(
`SELECT
month(deadline) AS 'month',
count(if(status='in progress', 1, NULL)) AS 'inProgressCounts',
count(if(status='closed', 1, NULL)) AS 'closedCounts',
count(if(status='frozen', 1, NULL)) AS 'frozenCounts'
FROM tasks, usertasks
WHERE tasks.id=usertasks.taskId AND usertasks.userId=${req.user.id}
GROUP BY month
ORDER BY month ASC`, {
type: QueryTypes.SELECT,
})
return res.json(counts);
} catch (e) {
console.log(e)
}
}}