Backend: - Created REST API endpoint /api/v1/search/ - Added SearchResultSerializer and SearchResponseSerializer - Implemented search_api_view with model formatters (employee, department, post, request, chat, message, event) - Registered search endpoint in api/v1/urls.py - Added permission check for requests (HR can see all, users only their own) Frontend: - Added SearchResponse, SearchResult, SearchModelType types - Added apiClient.search() method in lib/api.ts - Completely rewrote search/page.tsx: * Single API call instead of 6 parallel requests * Cleaner UI with icons for each result type * Real-time search with loading states * Meta information display (email, phone, status, etc.) * Better performance and UX Benefits: - Frontend: 220 lines → 178 lines (19% reduction) - 1 API request instead of 6 (83% less network calls) - Server-side full-text search via watson (better relevance) - Unified search results with metadata Testing: - API endpoint verified at /api/v1/search/?q=test - Returns JSON with query, results, counts, total - Requires authentication (IsAuthenticated decorator)
42 lines
1.6 KiB
Python
42 lines
1.6 KiB
Python
# backend/api/v1/search/serializers.py
|
|
"""
|
|
Сериализаторы для API поиска через django-watson.
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from rest_framework import serializers
|
|
from typing import Any
|
|
|
|
|
|
class SearchResultSerializer(serializers.Serializer):
|
|
"""Сериализатор для результата поиска watson."""
|
|
|
|
model_name = serializers.CharField(
|
|
help_text="Тип модели: post, employee, department, request, chat, message, event"
|
|
)
|
|
object_id = serializers.IntegerField(help_text="ID объекта")
|
|
title = serializers.CharField(help_text="Заголовок/имя объекта", allow_blank=True)
|
|
description = serializers.CharField(
|
|
help_text="Описание/превью контента",
|
|
allow_blank=True,
|
|
required=False
|
|
)
|
|
url = serializers.CharField(help_text="Ссылка на объект", allow_blank=True)
|
|
meta = serializers.DictField(
|
|
help_text="Дополнительные метаданные",
|
|
required=False,
|
|
allow_null=True
|
|
)
|
|
|
|
|
|
class SearchResponseSerializer(serializers.Serializer):
|
|
"""Сериализатор для ответа API поиска."""
|
|
|
|
query = serializers.CharField(help_text="Поисковый запрос")
|
|
results = SearchResultSerializer(many=True)
|
|
counts = serializers.DictField(
|
|
help_text="Количество результатов по типам",
|
|
child=serializers.IntegerField()
|
|
)
|
|
total = serializers.IntegerField(help_text="Общее количество результатов")
|