from marshmallow import Schema, ValidationError, fields, validates_schema from src import config from src.enums import MusicService, ServiceType # ================= Request schemas ================= class AddServiceAccountRequestSchema(Schema): marketid = fields.Integer(attribute="market_id", required=True) class ServiceTypeSchema(Schema): service_type = fields.Enum(ServiceType, required=True) MarketIdSchema = Schema.from_dict({config.MARKET_ID_COOKIE_NAME: fields.Integer(attribute="market_id", required=True)}) class AppleMusicTokenSchema(Schema): token = fields.String() class BaseCallbackSchema(Schema): code = fields.String() error = fields.String() sa_marketid = fields.String() name = fields.String() redirect_uri = fields.String() @validates_schema def check_error_or_code(self, data, **kwargs): if ("error" in data) == ("code" in data): # XOR operation raise ValidationError("Either 'error' or 'code' should be provided.") class YoutubeCallbackRequestSchema(BaseCallbackSchema): state = fields.String() scope = fields.String() class DeezerCallbackRequestSchema(BaseCallbackSchema): error_reason = fields.String() redirect_uri = fields.String() class SpotifyCallbackRequestSchema(BaseCallbackSchema): state = fields.String() class AppleMusicCallbackSchema(BaseCallbackSchema): pass ExtraInfoRequestSchema = Schema.from_dict( {"extra": fields.Boolean(missing=True), **{st.name: fields.List(fields.String) for st in ServiceType}} ) # ================= Response schemas ================= class ListServiceAccountResponseSchema(Schema): id = fields.Integer() serviceType = fields.Enum(ServiceType, by_value=True, attribute="service_type") musicServiceId = fields.Enum(MusicService, by_value=True, attribute="music_service") displayName = fields.String(attribute="display_name") userIdentifier = fields.String(attribute="user_identifier") updatedDate = fields.DateTime(attribute="updated_at", format=config.DATETIME_FORMAT) applicationId = fields.Integer(attribute="application_id") class ExtraInfoResponseSchema(Schema): displayName = fields.String(attribute="display_name") imageURI = fields.URL(attribute="image_url") userIdentifier = fields.String(attribute="user_identifier")