from django.utils.text import slugify from rest_framework import serializers from apps.sync.models import ActiveSite def _normalize_code(value: str) -> str: code = slugify(str(value or "").strip())[:64] if not code: raise serializers.ValidationError("Kode tidak valid.") return code class ActiveSiteSerializer(serializers.ModelSerializer): id = serializers.IntegerField(source="pk", read_only=True) # Never echo the outbound site API key back to the browser by default. has_api_key = serializers.SerializerMethodField() managed_by_name = serializers.CharField( source="managed_by.display_name", read_only=True, allow_null=True ) class Meta: model = ActiveSite fields = [ "id", "code", "name", "source_site_id", "api_base_url", "has_api_key", "managed_by", "managed_by_name", "is_active", "last_synced_at", "last_sync_status", "last_sync_message", "created_at", "updated_at", ] read_only_fields = [ "id", "source_site_id", "has_api_key", "managed_by", "managed_by_name", "last_synced_at", "last_sync_status", "last_sync_message", "created_at", "updated_at", ] def get_has_api_key(self, obj: ActiveSite) -> bool: return bool(obj.api_key) class ActiveSiteWriteSerializer(serializers.ModelSerializer): id = serializers.IntegerField(source="pk", read_only=True) class Meta: model = ActiveSite fields = [ "id", "code", "name", "api_base_url", "api_key", "is_active", ] extra_kwargs = {"api_key": {"write_only": True, "required": False}} class ActiveSiteClaimSerializer(serializers.Serializer): """GM claims an ActiveSite that the site dashboard already registered.""" code = serializers.CharField(max_length=64) def validate_code(self, value: str) -> str: return _normalize_code(value) class SiteRegisterSerializer(serializers.Serializer): """Payload from a site dashboard registering into the ActiveSite registry.""" code = serializers.CharField(max_length=64) site_id = serializers.SlugField(max_length=64) name = serializers.CharField(max_length=120) api_base_url = serializers.URLField(max_length=255) api_key = serializers.CharField(max_length=255) def validate_code(self, value: str) -> str: return _normalize_code(value) def validate_site_id(self, value: str) -> str: site_id = str(value or "").strip()[:64] if not site_id: raise serializers.ValidationError("site_id wajib diisi.") return site_id def validate_name(self, value: str) -> str: name = str(value or "").strip() if not name: raise serializers.ValidationError("Nama wajib diisi.") return name[:120] def validate_api_key(self, value: str) -> str: key = str(value or "").strip() if not key: raise serializers.ValidationError("api_key wajib diisi.") return key