mirror of
https://github.com/encounter/decomp.me.git
synced 2026-03-30 11:06:27 -07:00
87a58959da
* Add cache-control headers * Tweaks
49 lines
1.5 KiB
Python
49 lines
1.5 KiB
Python
from rest_framework.views import APIView
|
|
from rest_framework.response import Response
|
|
|
|
from ..decorators.cache import globally_cacheable
|
|
from ..middleware import Request
|
|
from ..models.preset import Preset
|
|
from ..models.scratch import Scratch
|
|
from ..models.profile import Profile
|
|
from ..serializers import PresetSerializer, TerseScratchSerializer, serialize_profile
|
|
|
|
|
|
class SearchViewSet(APIView):
|
|
@globally_cacheable(max_age=60, stale_while_revalidate=30)
|
|
def get(self, request: Request) -> Response:
|
|
query = request.query_params.get("search", "")
|
|
page_size = int(request.query_params.get("page_size", "5"))
|
|
|
|
user_qs = Profile.objects.filter(user__username__icontains=query)[:page_size]
|
|
preset_qs = Preset.objects.filter(name__icontains=query)[:page_size]
|
|
scratch_qs = Scratch.objects.filter(name__icontains=query)[:page_size]
|
|
|
|
results = []
|
|
|
|
for user in user_qs:
|
|
results.append(
|
|
{
|
|
"type": "user",
|
|
"item": serialize_profile(user),
|
|
}
|
|
)
|
|
|
|
for preset in PresetSerializer(preset_qs, many=True).data:
|
|
results.append(
|
|
{
|
|
"type": "preset",
|
|
"item": preset,
|
|
}
|
|
)
|
|
|
|
for scratch in TerseScratchSerializer(scratch_qs, many=True).data:
|
|
results.append(
|
|
{
|
|
"type": "scratch",
|
|
"item": scratch,
|
|
}
|
|
)
|
|
|
|
return Response(results)
|