from apollo_utils.service.schemas.base import RequestSchema 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 MESSAGES_CHUNK_MAX_SIZE from server.schemas.messages import mixins from server.schemas.messages.fields import BulkField from server.schemas.mixins import CreatedUpdatedAtMixin class BaseMessageCreateRequestItem( mixins.TTLMixin, mixins.MessageRelationMixin, mixins.MetaDataNoneMixin, Schema # do not use RequestSchema here ): """Basic message item for bulk creation request.""" class Meta: strict = True unknown = EXCLUDE class BaseMessageBulkCreateRequest(mixins.PublicMixin, RequestSchema): """Basic message bulk creation request.""" data = BulkField( fields.Nested(BaseMessageCreateRequestItem), required=True, validate=validate.Length(min=1, max=MESSAGES_CHUNK_MAX_SIZE), ) class BaseMessageBulkCreateResponse(Schema): """Basic message bulk creation response.""" class OkItem(Schema): index = fields.Int() id = fields.Int() class FailedItem(Schema): class ErrorItem(Schema): type = fields.Str(default=None) data = fields.Dict(default=None) index = fields.Int() error = fields.Nested(ErrorItem, default=None) ok = fields.List(fields.Nested(OkItem, default=None)) failed = fields.List(fields.Nested(FailedItem, default=None)) class BaseMessageListRequest( get_int_id_list_mixin(min_len=0, max_len=MESSAGES_CHUNK_MAX_SIZE), mixins.MessageIncludeMixin, RequestSchema ): """Basic message bulk get request.""" event_id = fields.Integer() @post_load def validate_playlist(self, data, **kwargs): if not data.get("id_list") and not data.get("event_id"): raise ValidationError("Need to set at least one of 'id' or 'event_id'.") return data class BaseMessageListResponseItem( mixins.TTLMixin, mixins.PublicMixin, CreatedUpdatedAtMixin, mixins.MessageRelationMixin, mixins.MetaDataNoneMixin, mixins.ContextNoneMixin, Schema, ): """Basic message item for bulk get response.""" id = fields.Int()