/
Nnlbtz
/
knowledge-base-webapp
Обзор
Документация
Войти
/
Nnlbtz
/
knowledge-base-webapp
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/controllers/article.controller.ts
134 строки
4 KB
IS
Initial commit: Knowledge Base Web App
02 июн 2025, 14:01
02 июн 2025, 14:01
16bbe17
Код
Авторство
О чём код?
import { Context } from 'telegraf'; import { articleService } from '../services/article.service'; import { logger } from '../utils/logger'; // Состояния для создания статьи const articleStates = new Map<number, { state: 'title' | 'content' | 'category' | 'tags'; data: { title?: string; content?: string; categoryId?: number; tags?: string[]; }; }>(); export async function handleNewArticle(ctx: Context) { try { const userId = ctx.from?.id; if (!userId) { await ctx.reply('Ошибка: не удалось определить пользователя'); return; } articleStates.set(userId, { state: 'title', data: {} }); await ctx.reply('Введите заголовок статьи:'); } catch (error) { logger.error('Error in handleNewArticle:', error); await ctx.reply('Произошла ошибка. Пожалуйста, попробуйте позже.'); } } export async function handleArticleInput(ctx: Context) { try { const userId = ctx.from?.id; if (!userId) { await ctx.reply('Ошибка: не удалось определить пользователя'); return; } const state = articleStates.get(userId); if (!state) { return; } const text = ctx.message?.text; if (!text) { await ctx.reply('Пожалуйста, отправьте текстовое сообщение'); return; } switch (state.state) { case 'title': state.data.title = text; state.state = 'content'; await ctx.reply('Введите содержание статьи:'); break; case 'content': state.data.content = text; state.state = 'category'; await ctx.reply('Введите ID категории (или отправьте 0, чтобы пропустить):'); break; case 'category': const categoryId = parseInt(text); if (isNaN(categoryId)) { await ctx.reply('Пожалуйста, введите корректный ID категории'); return; } if (categoryId !== 0) { state.data.categoryId = categoryId; } state.state = 'tags'; await ctx.reply('Введите теги через запятую (или отправьте 0, чтобы пропустить):'); break; case 'tags': if (text !== '0') { state.data.tags = text.split(',').map(tag => tag.trim()); } // Создаем статью const article = await articleService.create({ ...state.data, authorId: userId }); articleStates.delete(userId); await ctx.reply( `Статья успешно создана!\n\n` + `Заголовок: ${article.title}\n` + `Категория: ${article.category?.name || 'Не указана'}\n` + `Теги: ${article.tags.map(t => t.name).join(', ') || 'Не указаны'}` ); break; } } catch (error) { logger.error('Error in handleArticleInput:', error); await ctx.reply('Произошла ошибка. Пожалуйста, попробуйте позже.'); articleStates.delete(userId); } } export async function handleSearch(ctx: Context) { try { const query = ctx.message?.text?.replace('/search', '').trim(); if (!query) { await ctx.reply('Пожалуйста, укажите поисковый запрос после команды /search'); return; } const articles = await articleService.search(query); if (articles.length === 0) { await ctx.reply('По вашему запросу ничего не найдено'); return; } const response = articles.map(article => `📚 ${article.title}\n` + `👤 Автор: ${article.author.username || 'Неизвестно'}\n` + `📅 Создано: ${article.createdAt.toLocaleDateString()}\n` + `🔗 ID: ${article.id}\n` ).join('\n'); await ctx.reply(response); } catch (error) { logger.error('Error in handleSearch:', error); await ctx.reply('Произошла ошибка при поиске. Пожалуйста, попробуйте позже.'); } }