from apollo_utils.service.schemas.base import RequestSchema from apollo_utils.service.schemas.fields.list import SplitUniqueListField from apollo_utils.service.schemas.mixins.misc import get_int_id_list_mixin from marshmallow import EXCLUDE, Schema, ValidationError, fields, post_load, validate from server.constants.messages import EVENTS_CHUNK_MAX_SIZE from server.schemas.messages import mixins from server.schemas.messages.fields import BulkField from server.schemas.mixins import CreatedUpdatedAtMixin class BaseEventMixin( mixins.ExternalIdNoneMixin, mixins.EventIdNoneMixin, mixins.MetaDataNoneMixin, mixins.CodeMixin, mixins.TTLMixin ): pass class ExistingEventMixin(BaseEventMixin, mixins.PublicMixin, mixins.ContextNoneMixin, CreatedUpdatedAtMixin): id = fields.Int() class BaseEventListRequest( get_int_id_list_mixin(min_len=0, max_len=EVENTS_CHUNK_MAX_SIZE), mixins.MessageIncludeMixin, RequestSchema ): """Basic events bulk get request.""" external_id_list = SplitUniqueListField( fields.Int(required=True), data_key="external_id", validate=validate.Length(min=0, max=EVENTS_CHUNK_MAX_SIZE) ) @post_load def validate_id(self, data, **kwargs): if not data.get("id_list") and not data.get("external_id_list"): raise ValidationError("Need to set at least one of 'id' or 'external_id'.") return data # do not use RequestSchema here, because the schema is created to be used inside BulkField class BaseEventCreateRequestItem(BaseEventMixin, Schema): """Basic message item for bulk creation request.""" class Meta: strict = True unknown = EXCLUDE class BaseEventBulkCreateRequest(mixins.PublicMixin, mixins.CheckUniqueMixin, RequestSchema): """Basic message bulk creation request.""" data = BulkField( fields.Nested(BaseEventCreateRequestItem), required=True, validate=validate.Length(min=1, max=EVENTS_CHUNK_MAX_SIZE), )