feat(cache): add targeted server-side response caching

This commit is contained in:
2026-04-30 16:13:12 +03:30
parent 08e1793765
commit 054bb5a582
8 changed files with 432 additions and 16 deletions

View File

@@ -42,6 +42,17 @@ from apps.workspaces.services import (
update_workspace_user_rate,
)
from core.paginations.limit_offset import CustomLimitOffsetPagination
from core.services.cache import (
CACHE_NAMESPACE_PRICE_UNITS,
CACHE_NAMESPACE_WORKSPACE_MEMBERSHIPS,
CACHE_NAMESPACE_WORKSPACE_RATES,
get_namespace_version,
get_or_set_cache_payload,
)
REFERENCE_CACHE_TTL_SECONDS = 60 * 5
PRICE_UNITS_CACHE_TTL_SECONDS = 60 * 60
class WorkspaceViewSet(ModelViewSet):
@@ -129,7 +140,15 @@ class WorkspaceMembershipViewSet(ModelViewSet):
status=status.HTTP_403_FORBIDDEN,
)
return super().list(request, *args, **kwargs)
payload = get_or_set_cache_payload(
CACHE_NAMESPACE_WORKSPACE_MEMBERSHIPS,
ttl_seconds=REFERENCE_CACHE_TTL_SECONDS,
builder=lambda: super(WorkspaceMembershipViewSet, self).list(request, *args, **kwargs).data,
user_id=request.user.id,
workspace_id=workspace_id,
params=request.query_params,
)
return Response(payload)
def create(self, request, *args, **kwargs):
"""
@@ -271,6 +290,16 @@ class PriceUnitViewSet(ModelViewSet):
def get_queryset(self):
return PriceUnit.objects.filter(is_deleted=False)
def list(self, request, *args, **kwargs):
payload = get_or_set_cache_payload(
CACHE_NAMESPACE_PRICE_UNITS,
ttl_seconds=PRICE_UNITS_CACHE_TTL_SECONDS,
builder=lambda: super(PriceUnitViewSet, self).list(request, *args, **kwargs).data,
user_id=request.user.id,
params=request.query_params,
)
return Response(payload)
class WorkspaceUserRateViewSet(ModelViewSet):
serializer_class = WorkspaceUserRateSerializer
@@ -310,7 +339,18 @@ class WorkspaceUserRateViewSet(ModelViewSet):
)
workspace = get_object_or_404(Workspace, id=workspace_id, is_deleted=False)
self._ensure_manage_access(request.user, workspace)
return super().list(request, *args, **kwargs)
payload = get_or_set_cache_payload(
CACHE_NAMESPACE_WORKSPACE_RATES,
ttl_seconds=REFERENCE_CACHE_TTL_SECONDS,
builder=lambda: super(WorkspaceUserRateViewSet, self).list(request, *args, **kwargs).data,
user_id=request.user.id,
workspace_id=workspace_id,
params=request.query_params,
extra_versions={
CACHE_NAMESPACE_PRICE_UNITS: get_namespace_version(CACHE_NAMESPACE_PRICE_UNITS),
},
)
return Response(payload)
def create(self, request, *args, **kwargs):
serializer = self.get_serializer(data=request.data)