from apollo_utils.service.schemas.fields.datetime import DateTimeStringField from apollo_utils.service.schemas.fields.enum import EnumListField from apollo_utils.service.schemas.mixins.country_code import CountryCodeNoneMixin from marshmallow import fields, post_load, validate from server.constants import DSP from server.constants.distributors import DISTRIBUTORS from server.constants.users.visits import VisitType from server.schemas.base.schemas import RequestSchema, Schema class UsersVisits: class PostRequest(RequestSchema): instance_id = fields.String(required=True, data_key="id") visit_type = fields.String( data_key="type", required=True, validate=validate.OneOf((VisitType.TRACK, VisitType.PLAYLIST)) ) dsp = fields.String(validate=validate.OneOf((DSP.APPLE.value, DSP.SPOTIFY.value)), missing=DSP.SPOTIFY.value) class GetRequest(RequestSchema, CountryCodeNoneMixin): visit_type = fields.String(required=True, data_key="type") dsp = fields.String(validate=validate.OneOf((DSP.APPLE.value, DSP.SPOTIFY.value)), missing=DSP.SPOTIFY.value) distributors = EnumListField(DISTRIBUTORS, unify=True, missing=[DISTRIBUTORS.SME], as_enum=True) limit = fields.Integer(missing=6) @post_load def prepare_distributors(self, data, **kwargs): if data["visit_type"] != VisitType.TRACK: data.pop("distributors", None) return data class GetResponse(Schema): instance_id = fields.String(data_key="id") count = fields.Integer() dsp = fields.String() last_visit_at = DateTimeStringField() data = fields.Raw()