This commit is contained in:
2026-08-24 15:54:08 +03:30
commit 236002a87c
133 changed files with 5946 additions and 0 deletions
+57
View File
@@ -0,0 +1,57 @@
from rest_framework import serializers
from apps.billing.api.services import REFERRAL_MILESTONES, FeatureAccessService
from apps.billing.models import FeaturePlan, FeaturePlanTier, GemPack
class WalletSerializer(serializers.Serializer):
gem_balance = serializers.IntegerField()
is_in_trial = serializers.BooleanField()
trial_expires_at = serializers.DateTimeField()
referral_code = serializers.CharField()
referral_count = serializers.IntegerField()
next_referral_milestone = serializers.SerializerMethodField()
def get_next_referral_milestone(self, obj):
count = obj["referral_count"]
for milestone, bonus in sorted(REFERRAL_MILESTONES.items()):
if count < milestone:
return {"referrals_needed": milestone, "referrals_remaining": milestone - count, "bonus_gems": bonus}
return None
class FeaturePlanTierSerializer(serializers.ModelSerializer):
class Meta:
model = FeaturePlanTier
fields = ["duration_months", "gem_price"]
class FeaturePlanSerializer(serializers.ModelSerializer):
tiers = FeaturePlanTierSerializer(many=True, read_only=True)
is_active = serializers.SerializerMethodField()
expires_at = serializers.SerializerMethodField()
class Meta:
model = FeaturePlan
fields = ["key", "name", "tiers", "is_active", "expires_at"]
def get_is_active(self, obj: FeaturePlan) -> bool:
return FeatureAccessService.is_active(self.context["request"].user, obj.key)
def get_expires_at(self, obj: FeaturePlan):
return FeatureAccessService.expires_at(self.context["request"].user, obj.key)
class GemPackSerializer(serializers.ModelSerializer):
class Meta:
model = GemPack
fields = ["id", "bazaar_sku", "display_name", "gem_amount"]
class ActivateFeatureSerializer(serializers.Serializer):
duration_months = serializers.IntegerField(min_value=1)
class CreatePurchaseSerializer(serializers.Serializer):
gem_pack_id = serializers.IntegerField()
purchase_token = serializers.CharField(max_length=255)