- Admin: refund/cancel/mark-resolved/Bazaar-link actions need change permission; question and curriculum import need add/delete; content browser needs view_question; guest device ids are shown to superusers only. - Accounts: registering a guest's phone revokes the guest's earlier sessions; self-deletion keeps Redemption, UserOffer and the phone's OTP rows; the public demo guest cannot be deleted (DEMO_GUEST_DEVICE_IDS); display-name contact filter covers any separator and social handles. - Payment: callback without Authority is 400; a second Bazaar purchase on a paid order is 409; orders snapshot credits/hearts/days at creation (payment.0011). - Assistant: a broken diagram no longer makes a streamed answer free; a late off-topic marker refuses the answer (not stored, not cached); a disconnect saves the partial answer; only KNOWN_COLLECTIONS are searched. - Infra: secret-key file is created atomically (workers no longer split keys); no default INTERNAL_SERVICE_KEY; Kavenegar key and Bazaar token kept out of error logs; Swagger/ReDoc pinned; schema throttled; docker compose bound to 127.0.0.1; non-ASCII digit ids are 400; ticket text capped at 5000. - docs/security-before-production.md: remaining open items 24-31 and the guard tests. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
60 lines
2.0 KiB
Python
60 lines
2.0 KiB
Python
from rest_framework import serializers
|
|
|
|
|
|
class BugReportCreateRequestSerializer(serializers.Serializer):
|
|
title = serializers.CharField(max_length=150)
|
|
# سقف: پیشتر هر متن تا حدِ بدنهی درخواست (~۲٫۵ مگابایت) پذیرفته و ذخیره میشد.
|
|
description = serializers.CharField(max_length=5000)
|
|
screenshotUrl = serializers.URLField(required=False, allow_blank=True)
|
|
|
|
|
|
class BugReportCreateResponseSerializer(serializers.Serializer):
|
|
bugReportId = serializers.CharField()
|
|
status = serializers.CharField()
|
|
|
|
|
|
class TicketCreateRequestSerializer(serializers.Serializer):
|
|
subject = serializers.CharField(max_length=150)
|
|
category = serializers.CharField(max_length=30)
|
|
priority = serializers.ChoiceField(choices=['low', 'normal', 'high'], required=False)
|
|
|
|
|
|
class TicketCreateResponseSerializer(serializers.Serializer):
|
|
ticketId = serializers.CharField()
|
|
status = serializers.CharField()
|
|
|
|
|
|
class TicketSummarySerializer(serializers.Serializer):
|
|
ticketId = serializers.CharField()
|
|
subject = serializers.CharField()
|
|
category = serializers.CharField()
|
|
status = serializers.CharField()
|
|
createdAt = serializers.DateTimeField()
|
|
supportReplies = serializers.IntegerField()
|
|
|
|
|
|
class TicketListResponseSerializer(serializers.Serializer):
|
|
tickets = TicketSummarySerializer(many=True)
|
|
|
|
|
|
class TicketMessageItemSerializer(serializers.Serializer):
|
|
id = serializers.CharField()
|
|
sender = serializers.CharField()
|
|
text = serializers.CharField()
|
|
|
|
|
|
class TicketDetailResponseSerializer(serializers.Serializer):
|
|
ticketId = serializers.CharField()
|
|
subject = serializers.CharField()
|
|
status = serializers.CharField()
|
|
messages = TicketMessageItemSerializer(many=True)
|
|
|
|
|
|
class TicketMessageCreateRequestSerializer(serializers.Serializer):
|
|
text = serializers.CharField(max_length=5000)
|
|
|
|
|
|
class TicketMessageCreateResponseSerializer(serializers.Serializer):
|
|
messageId = serializers.CharField()
|
|
success = serializers.BooleanField()
|