from apollo_utils.service.schemas.base import RequestSchema from apollo_utils.service.schemas.fields.enum import EnumField, EnumListField from apollo_utils.service.schemas.fields.list import SplitUniqueListField from marshmallow import Schema, ValidationError, fields, post_load, validate from server import config from server.constants.private import AccountsDeleteInclude, AccountsGetInclude, MessagesType class Accounts: class Get: class Request(RequestSchema): id_list = SplitUniqueListField(fields.Integer(required=True), data_key="id") user_id_list = SplitUniqueListField( fields.String(required=True, validate=validate.Length(min=1, max=100)), data_key="user_id" ) is_active = fields.Boolean(missing=None) days_count = fields.Integer(data_key="days", missing=None) include = EnumField(AccountsGetInclude, missing=AccountsGetInclude.ID) class Response(Schema): items = fields.List(fields.Raw()) class Delete: class Request(RequestSchema): id_list = SplitUniqueListField(fields.Integer(required=True), data_key="id", missing=None) user_id_list = SplitUniqueListField( fields.String(required=True, validate=validate.Length(min=1, max=100)), data_key="user_id", missing=None, ) include_list = EnumListField( AccountsDeleteInclude, data_key="include", as_enum=True, allow_all=True, missing=[] ) limit = fields.Integer(missing=None) @post_load def validate_schema(self, data, **kwargs): if not data["user_id_list"] and not data["id_list"]: raise ValidationError("Account ID or user ID required.") return data class Response(Schema): items = fields.Dict(fields.String(), fields.List(fields.Integer())) class AccountsInactive: class Delete: class Request(RequestSchema): id_list = SplitUniqueListField(fields.Integer(required=True), data_key="id", missing=None) user_id_list = SplitUniqueListField( fields.String(required=True, validate=validate.Length(min=1, max=100)), data_key="user_id", missing=None, ) days_count = fields.Integer( data_key="days", missing=config.ALLOW_DELETE_ACCOUNTS_AFTER_DAYS, validate=validate.Range(min=config.ALLOW_DELETE_ACCOUNTS_AFTER_DAYS), ) include_list = EnumListField(MessagesType, data_key="include", as_enum=True, allow_all=True, missing=[]) limit = fields.Integer(missing=None) class Response(Schema): items = fields.Dict(fields.String(), fields.List(fields.Integer()))