Skip to content

Latest commit

 

History

History
278 lines (217 loc) · 12.8 KB

PROJECT_INFO.md

File metadata and controls

278 lines (217 loc) · 12.8 KB

Сервис вакансий - Backend (Yii2)

Описание проекта

Backend-сервис для хранения и управления вакансиями, реализованный на фреймворке Yii2 с REST API.

Технологический стек

  • Framework: Yii2 (2.0.53)
  • PHP: 8.0+
  • Database: MySQL 5.7+ / PostgreSQL 9.5+
  • API: REST JSON
  • CORS: Настроен для работы с frontend

Основные возможности

1. Получение списка вакансий

  • Пагинация (10 вакансий на страницу)
  • Сортировка по зарплате (возрастание/убывание)
  • Сортировка по дате создания (возрастание/убывание)
  • Возвращаемые поля: id, название, зарплата, описание
  • Кеширование результатов (5 минут) для повышения производительности

2. Полнотекстовый поиск 🔍

  • Поиск по названию и описанию вакансий
  • PostgreSQL: tsvector с русской морфологией
  • MySQL: FULLTEXT индексы
  • Ранжирование результатов по релевантности
  • 10-100x быстрее обычного LIKE поиска
  • Кеширование результатов поиска (5 минут)

3. Получение конкретной вакансии

  • Обязательные поля: id, название, зарплата, описание
  • Опциональные поля через параметр fields: выборочное отображение полей
  • Поддержка дополнительных полей в формате JSON
  • Кеширование отдельных вакансий (10 минут)

4. Создание, обновление и удаление вакансий

  • Принимает: название, описание, зарплата
  • Опционально: дополнительные поля (JSON)
  • Валидация данных
  • Автоматическая инвалидация кеша

5. Безопасность и производительность

  • Rate Limiting: 100 запросов в час на IP
  • CORS: Настраиваемый список разрешенных доменов
  • HTTPS: Готовая конфигурация для Nginx/Apache
  • Кеширование: Автоматическое с FileCache/Redis

API Endpoints

Метод Endpoint Описание
GET /vacancy Получение списка вакансий с пагинацией и сортировкой
GET /vacancy/search?q=... Полнотекстовый поиск вакансий
GET /vacancy/{id} Получение конкретной вакансии
GET /vacancy/{id}?fields=title,salary Получение вакансии с выбранными полями
POST /vacancy Создание новой вакансии
PUT /vacancy/{id} Обновление существующей вакансии
DELETE /vacancy/{id} Удаление вакансии

Структура базы данных

Таблица vacancy

Поле Тип Описание
id INTEGER Первичный ключ (автоинкремент)
title VARCHAR(255) Название вакансии
description TEXT Описание вакансии
salary INTEGER Зарплата
additional_fields JSON Дополнительные поля (опционально)
created_at INTEGER Дата создания (UNIX timestamp)
updated_at INTEGER Дата обновления (UNIX timestamp)

Индексы:

  • idx-vacancy-salary на поле salary (для быстрой сортировки)
  • idx-vacancy-created_at на поле created_at (для быстрой сортировки)
  • idx-vacancy-title на поле title (для быстрого поиска)
  • PostgreSQL: idx_vacancy_search_vector (GIN индекс для полнотекстового поиска)
  • MySQL: idx_vacancy_fulltext (FULLTEXT индекс на title и description)

Архитектура проекта

vakansii-back/
├── config/
│   ├── db.php                    # Конфигурация БД
│   ├── web.php                   # Основная конфигурация
│   └── params.php                # Параметры приложения
├── controllers/
│   └── VacancyController.php     # REST API контроллер
├── models/
│   └── Vacancy.php               # ActiveRecord модель
├── repositories/
│   ├── VacancyRepositoryInterface.php  # Интерфейс репозитория
│   └── VacancyRepository.php     # Реализация репозитория
├── services/
│   └── VacancyService.php        # Бизнес-логика
├── migrations/
│   ├── m250204_000000_create_vacancy_table.php
│   └── m250206_000000_add_fulltext_search.php  # FULLTEXT индексы
├── tests/
│   ├── api/                      # API тесты
│   └── unit/                     # Unit тесты
├── web/
│   ├── index.php                 # Входная точка
│   ├── openapi.yaml              # OpenAPI спецификация
│   ├── swagger-ui.html           # Swagger UI
│   └── redoc.html                # ReDoc документация
├── docker/
│   ├── nginx/                    # Конфигурация Nginx с HTTPS
│   └── apache/                   # Конфигурация Apache с HTTPS
├── .github/workflows/            # GitHub Actions CI/CD
├── runtime/                      # Временные файлы, логи
├── vendor/                       # Composer зависимости
├── setup_db.sh                   # Скрипт настройки БД
├── setup_ssl_certificates.sh     # Скрипт настройки HTTPS
├── seed_data.php                 # Тестовые данные
├── README.md                     # Основная документация
├── README_API.md                 # Полная документация API
├── QUICKSTART.md                 # Быстрый старт
├── FULLTEXT_SEARCH.md            # Документация полнотекстового поиска
├── SETUP_GUIDE.md                # Руководство по настройке
└── PROJECT_INFO.md               # Этот файл

Основные компоненты

VacancyController

REST API контроллер, наследующий yii\rest\ActiveController:

  • actionIndex() - Получение списка вакансий с пагинацией и сортировкой
  • actionView($id) - Получение конкретной вакансии с возможностью фильтрации полей
  • actionCreate() - Создание новой вакансии

Особенности:

  • Поддержка CORS для интеграции с frontend
  • JSON формат запросов и ответов
  • Валидация входных данных
  • Обработка ошибок с понятными сообщениями

Vacancy Model

ActiveRecord модель с:

  • Автоматическими timestamp (created_at, updated_at)
  • Правилами валидации для всех полей
  • Поддержкой JSON для дополнительных полей

Migration

Миграция для создания таблицы вакансий с:

  • Индексами для оптимизации запросов
  • Поддержкой JSON для гибкости данных
  • Правильной кодировкой (utf8mb4)

Безопасность

  • Валидация всех входных данных
  • Защита от SQL инъекций (через ActiveRecord)
  • CORS настроен (можно ограничить для production)
  • Подготовленные запросы для всех операций с БД

Производительность

  • Кеширование: Списки (5 мин), отдельные вакансии (10 мин), поиск (5 мин)
  • FULLTEXT индексы: 10-100x быстрее обычного поиска
  • Индексы БД: на полях сортировки (salary, created_at, title)
  • Пагинация: ограничение объема данных (10 записей на страницу)
  • ActiveDataProvider: эффективная работа с большими наборами данных
  • Rate Limiting: защита от перегрузки (100 запросов/час)

Тестирование

Для быстрого тестирования можно использовать:

# Запуск встроенного PHP сервера
php yii serve --docroot=web --port=8080

# Добавление тестовых данных
php seed_data.php

Интеграция с Frontend (Nuxt3)

API готов для интеграции с Nuxt3 frontend:

// Пример использования в Nuxt3
const { data } = await useFetch('http://localhost:8080/vacancy', {
  params: {
    page: 1,
    sort: 'salary',
    order: 'desc'
  }
});

Масштабирование

Для production окружения рекомендуется:

  1. Использовать nginx/apache вместо встроенного PHP сервера
  2. Включить кэширование схемы БД
  3. Настроить индексы БД под нагрузку
  4. Ограничить CORS определенными доменами
  5. Включить логирование API запросов
  6. Настроить rate limiting

Реализованные улучшения

  • ✅ Полнотекстовый поиск с FULLTEXT индексами (PostgreSQL/MySQL)
  • ✅ Кеширование для повышения производительности (10-100x)
  • ✅ Rate Limiting для защиты от злоупотреблений
  • ✅ HTTPS конфигурация (Nginx/Apache + Let's Encrypt)
  • ✅ CI/CD пайплайны (GitHub Actions + GitLab CI)
  • ✅ Swagger/OpenAPI документация
  • ✅ Полное покрытие тестами (unit, functional, API)

Возможности для дальнейшего развития

  • Аутентификация через JWT
  • Фильтрация по компании, локации, требованиям
  • Версионирование API (v1, v2)
  • Мягкое удаление (soft delete)
  • Работа с избранными вакансиями
  • Система откликов на вакансии
  • WebSocket для real-time уведомлений
  • GraphQL API в дополнение к REST

Документация

Требования для разработки

  • PHP 8.0+
  • Composer
  • MySQL 5.7+ или PostgreSQL 9.5+
  • Git

Запуск в режиме разработки

# 1. Установка зависимостей
composer install

# 2. Настройка БД
./setup_db.sh

# 3. Добавление тестовых данных
php seed_data.php

# 4. Запуск сервера
php yii serve --docroot=web --port=8080

Production Deployment

См. раздел "Настройка веб-сервера" в README_API.md

Лицензия

MIT

Контакты

Для вопросов и предложений создавайте issue в репозитории проекта.