{"id":31618067,"url":"https://github.com/graffskii/testtask-newsapi","last_synced_at":"2026-04-12T15:03:38.510Z","repository":{"id":317648122,"uuid":"1064503171","full_name":"Graffskii/testtask-newsapi","owner":"Graffskii","description":"Тестовое задание: fullstack приложение с упором на Backend и API составляющую для CRUD операций с новостями","archived":false,"fork":false,"pushed_at":"2025-10-02T06:04:49.000Z","size":794,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-10-02T07:20:05.803Z","etag":null,"topics":["docker","docker-compose","expressjs","nodejs","postman","react","typescript"],"latest_commit_sha":null,"homepage":"","language":"HTML","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/Graffskii.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-09-26T06:10:12.000Z","updated_at":"2025-10-02T06:04:53.000Z","dependencies_parsed_at":"2025-10-06T05:45:08.508Z","dependency_job_id":null,"html_url":"https://github.com/Graffskii/testtask-newsapi","commit_stats":null,"previous_names":["graffskii/testtask-newsapi"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/Graffskii/testtask-newsapi","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Graffskii%2Ftesttask-newsapi","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Graffskii%2Ftesttask-newsapi/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Graffskii%2Ftesttask-newsapi/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Graffskii%2Ftesttask-newsapi/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/Graffskii","download_url":"https://codeload.github.com/Graffskii/testtask-newsapi/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/Graffskii%2Ftesttask-newsapi/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278621843,"owners_count":26017253,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-06T02:00:05.630Z","response_time":65,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["docker","docker-compose","expressjs","nodejs","postman","react","typescript"],"created_at":"2025-10-06T13:45:20.590Z","updated_at":"2025-10-06T13:45:27.293Z","avatar_url":"https://github.com/Graffskii.png","language":"HTML","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Новостной API и Редактор статей \n\nВыполненное тестовое задание представляет собой fullstack-приложение, состоящее из API для новостного сервиса и клиентского редактора статей. Проект контейнеризирован с помощью Docker и Docker Compose для легкого запуска.\n\n## 🚀 Основные возможности\n\n### Backend\n- **Аутентификация:** Регистрация и вход на основе `JWT (JSON Web Tokens)`.\n- **CRUD для новостей:** Полный набор операций для управления новостными статьями (создание, чтение, обновление, удаление).\n- **Отложенная публикация:** Возможность запланировать публикацию статьи на определенную дату и время с помощью `node-cron`.\n- **Загрузка файлов:** Загрузка изображений для статей с использованием `multer`.\n- **Real-time уведомления:** Мгновенные уведомления о создании/изменении/удалении статей с помощью `Socket.IO`.\n- **Трехслойная архитектура:** Четкое разделение на слои контроллеров, сервисов и моделей данных.\n- **Документация API:** Интерактивная документация, сгенерированная с помощью `Swagger (OpenAPI)`.\n- **Документация кода:** Автоматически сгенерированная документация по коду с помощью `TypeDoc`.\n\n### Frontend\n- **Современный стек:** Построен на `React` с использованием функциональных компонентов и хуков.\n- **UI-компоненты:** Красивый интерфейс с библиотекой `MUI (Material-UI)`.\n- **WYSIWYG Редактор:** Редактор текста `TipTap` с возможностями форматирования (заголовки, жирный/курсив, цитаты).\n- **Клиентская маршрутизация:** Навигация по приложению реализована с помощью `React Router`.\n- **Защищенные роуты:** Доступ к страницам дашборда и редактора только для авторизованных пользователей.\n- **Предпросмотр статей:** Возможность посмотреть, как будет выглядеть статья перед публикацией.\n- **Real-time уведомления:** Интерактивный \"колокольчик\" для отображения уведомлений в реальном времени.\n\n## 📸 Скриншоты\n\n\u003ctable\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cstrong\u003eСтраница входа\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cstrong\u003eДашборд со статьями\u003c/strong\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"screenshots/login.png\" alt=\"Страница входа\" width=\"400\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"screenshots/dashboard.png\" alt=\"Дашборд\" width=\"400\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd align=\"center\"\u003e\u003cstrong\u003eРедактор статей\u003c/strong\u003e\u003c/td\u003e\n    \u003ctd align=\"center\"\u003e\u003cstrong\u003eДокументация API (Swagger)\u003c/strong\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n  \u003ctr\u003e\n    \u003ctd\u003e\u003cimg src=\"screenshots/editor.png\" alt=\"Редактор статей\" width=\"400\"/\u003e\u003c/td\u003e\n    \u003ctd\u003e\u003cimg src=\"screenshots/swagger.png\" alt=\"Документация API\" width=\"400\"/\u003e\u003c/td\u003e\n  \u003c/tr\u003e\n\u003c/table\u003e\n\n## 🛠️ Технологический стек\n\n| Область | Технология |\n|---|---|\n| 📦 **Backend** | Node.js, Express, TypeScript, MongoDB (Mongoose), JWT, bcryptjs, Socket.IO, Multer, node-cron |\n| 🖥️ **Frontend** | React, TypeScript, Vite, MUI (Material-UI), Axios, React Router, TipTap, Socket.IO Client, SCSS |\n| 🐳 **DevOps** | Docker, Docker Compose, Nginx (для раздачи статики фронтенда) |\n\n## ⚙️ Установка и запуск\n\nПроект полностью контейнеризирован, поэтому для запуска не нужно устанавливать Node.js или MongoDB локально.\n\n### Требования\n- Git\n- Docker\n- Docker Compose\n\n### Шаги для запуска\n1. **Клонируйте репозиторий:**\n   ```bash\n   git clone git@github.com:Graffskii/testtask-newsapi.git\n   cd testtask-newsapi\n   ```\n\n2. **Настройте переменные окружения:**\n   В папке `backend/` создайте `.env`.\n   ```bash\n   touch backend/.env\n   ```\n   Файл `backend/.env` должен выглядеть так:\n   ```env\n   PORT=3000\n\n   MONGO_URI=mongodb://mongo:27017/newsdb\n\n   JWT_SECRET=super_secret_key\n   ```\n\n3. **Соберите и запустите контейнеры:**\n   Выполните эту команду из **корневой папки** проекта:\n   ```bash\n   docker-compose up --build -d\n   ```\n   Эта команда скачает все образы, установит зависимости, соберет проекты и запустит все сервисы. \n\n## 🌐 Доступные сервисы\n\nПосле успешного запуска будут доступны следующие адреса:\n\n- **Frontend (Клиентское приложение):** [`http://localhost:5173`](http://localhost:5173)\n- **Backend (API):** [`http://localhost:3000`](http://localhost:3000)\n- **API Документация (Swagger UI):** [`http://localhost:3000/api-docs`](http://localhost:3000/api-docs)\n- **Документация кода (TypeDoc):** [`http://localhost:3000/app-docs`](http://localhost:3000/app-docs)\n\n## 📁 Структура проекта\n\n```\n.\n├── backend/              \n│   ├── src/\n│   ├── uploads/\n│   ├── Dockerfile\n│   ├── package.json\n│   └── ...\n├── frontend/              \n│   ├── src/\n│   ├── Dockerfile\n│   ├── package.json\n│   └── ...\n├── docker-compose.yml     \n└── README.md              \n```\n\n## 🧪 Тестирование с помощью Postman\n\nДля удобства тестирования API в репозиторий включена коллекция Postman, которая содержит все доступные эндпоинты.\n\nФайл коллекции можно найти в корне проекта: `testtask-newsapi.postman_collection.json`\n\n\n**Импортируйте коллекцию**: Откройте Postman, нажмите `File \u003e Import...` и выберите файл `testtask-newsapi.postman_collection.json` из репозитория.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraffskii%2Ftesttask-newsapi","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fgraffskii%2Ftesttask-newsapi","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fgraffskii%2Ftesttask-newsapi/lists"}