feat(cache): add targeted server-side response caching
This commit is contained in:
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user