from apollo_utils.service.schemas.base import RequestSchema from apollo_utils.service.schemas.fields.list import SplitUniqueListField from marshmallow import Schema, ValidationError, fields, post_load, validate from server.domains import applications as app_dom class BaseApplicationDataMixin: name = fields.String(validate=validate.Length(max=100), required=False) settings = fields.Dict(required=False) types = fields.List(fields.String(validate=validate.Length(max=30), required=True), required=False) class BaseApplicationMixin(BaseApplicationDataMixin): slug = fields.String(validate=validate.Length(max=30), required=True) class ApplicationResponse(BaseApplicationMixin, Schema): id = fields.Int() class ApplicationUpdateRequest(BaseApplicationMixin, RequestSchema): @post_load def validate_schema(self, data, **kwargs): for k in ("name", "settings", "types"): if k in data: return data raise ValidationError("There is no data to update.") class Applications: class Get: class Request(RequestSchema): slug = fields.String(validate=validate.Length(max=30), required=True) class Response(ApplicationResponse): pass class Create: class Request(BaseApplicationMixin, RequestSchema): @post_load def validate_settings(self, data, **kwargs): if not app_dom.is_valid(data.get("settings"), data.get("types")): raise ValidationError("Incorrect types and/or settings.") return data class Response(ApplicationResponse): pass class Update: class Request(ApplicationUpdateRequest): pass class Response(ApplicationResponse): pass class Delete: class Request(RequestSchema): slug = fields.String(validate=validate.Length(max=30), required=True) class ApplicationsBulk: class Get: class Request(RequestSchema): offset = fields.Int(missing=None) limit = fields.Int(missing=None) slug = SplitUniqueListField( fields.String(required=True), required=True, validate=validate.Length(min=1, max=5) ) class Update: class Request(RequestSchema): class RequestItem(BaseApplicationDataMixin, RequestSchema): _slug = fields.String(validate=validate.Length(max=30), required=True, data_key="slug") data = fields.List( fields.Nested(RequestItem, required=True), validate=validate.Length(max=5), required=True ) class Response(Schema): data = fields.List( fields.Nested(ApplicationResponse, required=True), validate=validate.Length(max=5), required=True )