{
    "consumes": [
        "application/json"
    ],
    "produces": [
        "application/json"
    ],
    "schemes": [
        "https"
    ],
    "swagger": "2.0",
    "info": {
        "description": "This is the API for Recipinned",
        "title": "Recipinned",
        "contact": {},
        "version": "1.0"
    },
    "host": "app.recipinned.com",
    "basePath": "/api",
    "paths": {
        "/v1/auth/login": {
            "post": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Auth",
                    "Public"
                ],
                "summary": "Login a user",
                "parameters": [
                    {
                        "description": "User Login",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/services.UserLogin"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/services.AuthToken"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/auth/logout": {
            "post": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Auth",
                    "Public"
                ],
                "summary": "Login a user",
                "parameters": [
                    {
                        "description": "User Login",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/services.UserLogin"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/auth/refresh": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Auth",
                    "Public"
                ],
                "summary": "Refresh a user's session",
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/services.AuthToken"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/calendar/mealplan": {
            "get": {
                "produces": [
                    "text/calendar",
                    "application/json"
                ],
                "tags": [
                    "Meal Plans",
                    "Public"
                ],
                "summary": "Get meal plan ical",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Calendar Key",
                        "name": "key",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Start date",
                        "name": "start",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "description": "End date",
                        "name": "end",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "description": "Tags",
                        "name": "tags",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Get collections of the user",
                "parameters": [
                    {
                        "enum": [
                            "all",
                            "editor"
                        ],
                        "type": "string",
                        "description": "Filter",
                        "name": "filter",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Collections",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.Collection"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Create collection",
                "parameters": [
                    {
                        "description": "Collection",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.CollectionCreate"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Created",
                        "schema": {
                            "$ref": "#/definitions/stores.Collection"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/invitations": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection: Invitations",
                    "Public"
                ],
                "summary": "Use invitations of the collection",
                "parameters": [
                    {
                        "description": "User Join Payload",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.UserJoinPayload"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/invitations/{token}": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection: Invitations",
                    "Public"
                ],
                "summary": "Get invitations of the collection (requires role: admin)",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Token",
                        "name": "token",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.Collection"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/join": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Join a collection by using a join token",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Join a collection",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Invitation Token",
                        "name": "token",
                        "in": "query",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/controller.CollectionJoinResponse"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/recipes/resolve-id": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Resolve collection ID from recipe ID",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "recipe_id",
                        "in": "query",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/controller.IDResponse"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Get collections of the user",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Collection",
                        "schema": {
                            "$ref": "#/definitions/stores.Collection"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Delete Collection",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "409": {
                        "description": "Collection is not in a valid state to be deleted",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "patch": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Update collection",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Collection",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.CollectionUpdate"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/stores.Collection"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/actions": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Get collection actions (and permissions)",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/stores.CollectionActions"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/cover-images": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Get cover images of the collection (requires role: read)",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Cover Images",
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/invitations": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Get invitations of the collection (requires role: admin)",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.CollectionInvite"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection: Invitations",
                    "Public"
                ],
                "summary": "Create collection invitation (requires role: admin)",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Collection Invite",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.CollectionInviteCreate"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Created",
                        "schema": {
                            "$ref": "#/definitions/stores.CollectionInvite"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/invitations/{id}": {
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection: Invitations",
                    "Public"
                ],
                "summary": "Delete Collection Invite",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Invitation ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/members": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Get members of the collection (requires role: read)",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "Skip",
                        "name": "skip",
                        "in": "query"
                    },
                    {
                        "type": "integer",
                        "description": "Take",
                        "name": "take",
                        "in": "query"
                    },
                    {
                        "type": "array",
                        "items": {
                            "enum": [
                                "admin",
                                "edit",
                                "read"
                            ],
                            "type": "string"
                        },
                        "collectionFormat": "csv",
                        "description": "Roles",
                        "name": "roles",
                        "in": "query"
                    },
                    {
                        "enum": [
                            "asc",
                            "desc"
                        ],
                        "type": "string",
                        "description": "Direction",
                        "name": "direction",
                        "in": "query"
                    },
                    {
                        "enum": [
                            "username",
                            "created_at"
                        ],
                        "type": "string",
                        "description": "Order by",
                        "name": "orderBy",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.CollectionMember"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection: Members",
                    "Public"
                ],
                "summary": "Add family member to collection (requires role: admin)",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Add User Request",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.AddUserBody"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/members/self": {
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Leave Recipe Collection",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "403": {
                        "description": "User cannot leave the collection, see /actions",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/members/{user-id}": {
            "put": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection: Members",
                    "Public"
                ],
                "summary": "modifies member permissions (requires role: admin)",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "User ID",
                        "name": "user-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Update Member Permissions",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.UpdateMemberPermissions"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Remove member from collection",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "User ID",
                        "name": "user-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "403": {
                        "description": "User does not have permission to remove member",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "409": {
                        "description": "User in invalid state to leave collection",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/permissions": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Get current users permissions for collection (requires role: read)",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Permissions",
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/recipes": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Create a new recipe",
                "parameters": [
                    {
                        "description": "Create Recipe",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.RecipeCreate"
                        }
                    },
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Recipe",
                        "schema": {
                            "$ref": "#/definitions/stores.Recipe"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/recipes/image": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Create a new recipe from an image (url)",
                "parameters": [
                    {
                        "description": "Create Recipe from Image",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.RecipeImageCreateRequest"
                        }
                    },
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Recipe",
                        "schema": {
                            "$ref": "#/definitions/stores.Recipe"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/recipes/parse": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Parse Recipe",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/services.RecipeParseRequest"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/stores.RecipeCreate"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/recipes/schema": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Import recipes from schema.org JSON",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Schema.org recipe JSON array",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.SchemaImportBody"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "When some recipes have failed",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/services.RecipeScrapeResult"
                            }
                        }
                    },
                    "201": {
                        "description": "When all created during the request",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/services.RecipeScrapeResult"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/recipes/scrape": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Scrape a recipe",
                "parameters": [
                    {
                        "description": "Scrape Recipe",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.ScrapeBody"
                        }
                    },
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "When some recipes have failed",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/services.RecipeScrapeResult"
                            }
                        }
                    },
                    "201": {
                        "description": "When all created during the request",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/services.RecipeScrapeResult"
                            }
                        }
                    },
                    "202": {
                        "description": "When all recipes have been queued for background processing",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/services.RecipeScrapeResult"
                            }
                        }
                    },
                    "409": {
                        "description": "When the recipe already exists",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/services.RecipeScrapeResult"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/recipes/{id}": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Get a recipe",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/stores.Recipe"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "put": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Updates a Recipe",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Update Recipe",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.RecipeUpdate"
                        }
                    },
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/stores.Recipe"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Deletes a Recipe (soft)",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Success"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/recipes/{id}/copy": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Get a recipe",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "recipe body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.RecipeCopyBody"
                        }
                    },
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/stores.Recipe"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/recipes/{id}/export": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "text/plain",
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Export a single recipe as text or JSON",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Export type (text or json, defaults to text)",
                        "name": "type",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Exported recipe file",
                        "schema": {
                            "type": "file"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/recipes/{id}/restore": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Restore a recipe from trash",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Success"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/recipes/{id}/review": {
            "put": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Updates the Current User's Review of a Recipe",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Recipe Review",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.CreateRecipeReview"
                        }
                    },
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Success"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Deletes the Current User's Review of a Recipe",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Success"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/recipes/{id}/schema": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Get a recipe schema definition",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/stores.Schema"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/share-links": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Get all active share links for a collection. Only collection administrators can list share links.",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "List share links for a collection",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.CollectionShareLink"
                            }
                        }
                    },
                    "403": {
                        "description": "User does not have admin permission",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Create a new share link for a collection. Only collection administrators can create share links.",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Create a share link for a collection",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Share link options",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.CollectionShareLinkCreate"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Created",
                        "schema": {
                            "$ref": "#/definitions/stores.CollectionShareLink"
                        }
                    },
                    "403": {
                        "description": "User does not have admin permission",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/collections/{collection-id}/share-links/{link-id}": {
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Revoke an existing share link for a collection. Only collection administrators can revoke share links.",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Collection",
                    "Public"
                ],
                "summary": "Revoke a share link",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collection-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Share link ID",
                        "name": "link-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "403": {
                        "description": "User does not have admin permission",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/dietitian/handouts/share/{token}": {
            "get": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Dietitian Handouts",
                    "Public"
                ],
                "summary": "Get public handout share view",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Share token",
                        "name": "token",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/stores.HandoutShareLinkPublicView"
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/dietitian/handouts/share/{token}/files": {
            "get": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Dietitian Handouts",
                    "Public"
                ],
                "summary": "List files in a public handout share",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Share token",
                        "name": "token",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.HandoutFile"
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/dietitian/handouts/share/{token}/files/{file-id}/download": {
            "get": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Dietitian Handouts",
                    "Public"
                ],
                "summary": "Get a download URL for a file in a public handout share",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Share token",
                        "name": "token",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "File ID",
                        "name": "file-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/controller.handoutPublicDownloadResponse"
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Family",
                    "Public"
                ],
                "summary": "Get your family",
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/models.Family"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "patch": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Family",
                    "Public"
                ],
                "summary": "Update your family",
                "parameters": [
                    {
                        "description": "Family Update",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.FamilyUpdate"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/models.Family"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/invite": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Family Invitations",
                    "Public"
                ],
                "summary": "Get all family member invitations",
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.FamilyMemberInvitation"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Family Invitations",
                    "Public"
                ],
                "summary": "Invite a user to your family",
                "parameters": [
                    {
                        "description": "Invite New Member",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/services.InviteNewMember"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/controller.FamilyInviteResponse"
                        }
                    },
                    "400": {
                        "description": "All slots are taken",
                        "schema": {
                            "type": "string"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/invite/{id}": {
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Family Invitations",
                    "Public"
                ],
                "summary": "Delete a family member invitation",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Invitation ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Success"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/members": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Family",
                    "Public"
                ],
                "summary": "Get your family members",
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.FamilyMember"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/members/{member-id}": {
            "patch": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Family",
                    "Public"
                ],
                "summary": "Update a family member",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Member User ID",
                        "name": "member-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Member Update Data",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.FamilyMemberUpdate"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/stores.FamilyMember"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/roles": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Family",
                    "Public"
                ],
                "summary": "Get your family permissions",
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/models.FamilyRole"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/shopping-favorites": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Get the items the family saved as favorites (family-scoped, not per-list)",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping List Favorites",
                    "Public"
                ],
                "summary": "Get Shopping List Favorites",
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.ShoppingListFavorite"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Save one or more items as favorites (family-scoped, not per-list). Returns all of the family's favorites.",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping List Favorites",
                    "Public"
                ],
                "summary": "Save Shopping List Favorites",
                "parameters": [
                    {
                        "description": "Request body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.ShoppingListFavoritesSaveRequest"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.ShoppingListFavorite"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/shopping-favorites/{id}": {
            "put": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Replace a favorite's text, quantity, unit and category (family-scoped, not per-list)",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping List Favorites",
                    "Public"
                ],
                "summary": "Update Shopping List Favorite",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Favorite ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Request body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingListFavoriteCreate"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingListFavorite"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Delete a favorite (family-scoped, not per-list)",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping List Favorites",
                    "Public"
                ],
                "summary": "Delete Shopping List Favorite",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Favorite ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/shopping-filters": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Get Shopping List Filters (family-scoped, not per-list)",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping List Filters",
                    "Public"
                ],
                "summary": "Get Shopping List Filters",
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.ShoppingListFilter"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Create Shopping List Filter (family-scoped, not per-list)",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping List Filters",
                    "Public"
                ],
                "summary": "Create Shopping List Filter",
                "parameters": [
                    {
                        "description": "Request body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingListFilterCreate"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Created",
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingListFilter"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/shopping-filters/{id}": {
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Delete Shopping List Filter (family-scoped, not per-list)",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping List Filters",
                    "Public"
                ],
                "summary": "Delete Shopping List Filter",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Filter ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "patch": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Patch Shopping List Filter (family-scoped, not per-list)",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping List Filters",
                    "Public"
                ],
                "summary": "Patch Shopping List Filter",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Filter ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Request body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingListFilterUpdate"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingListFilter"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/{family-id}/meal-plans": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Meal Plans",
                    "Public"
                ],
                "summary": "Get meal plans",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Family ID",
                        "name": "family-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Start date",
                        "name": "start",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "End date",
                        "name": "end",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Tags",
                        "name": "tags",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.MealPlan"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Meal Plans",
                    "Public"
                ],
                "summary": "Create a new meal plan",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Family ID",
                        "name": "family-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Create body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.MealPlanCreate"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Created",
                        "schema": {
                            "$ref": "#/definitions/stores.MealPlan"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "patch": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Meal Plans",
                    "Public"
                ],
                "summary": "Batch update meal plans entries",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Family ID",
                        "name": "family-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Update body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.MealPlanBatchRequest"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.MealPlan"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/{family-id}/meal-plans/auto-generate": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Meal Plans",
                    "Public"
                ],
                "summary": "Auto-generate meal plans",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Family ID",
                        "name": "family-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Generation parameters",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/mealplans.AutoGenerateRequest"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success with result",
                        "schema": {
                            "$ref": "#/definitions/mealplans.AutoGenerateResult"
                        }
                    },
                    "400": {
                        "description": "Validation error"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/{family-id}/meal-plans/auto-generate/availability/check": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Returns recipe counts for the provided tag configurations without saving. Used for live validation.",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Meal Plans",
                    "Public"
                ],
                "summary": "Check recipe availability with provided tag configuration",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Family ID",
                        "name": "family-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Tag configuration to check",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/mealplans.CheckRecipeAvailabilityRequest"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Recipe counts per meal type",
                        "schema": {
                            "$ref": "#/definitions/mealplans.MealTypeAvailabilityResponse"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/{family-id}/meal-plans/auto-generate/validate": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Checks if an auto-generation request can be fulfilled. Returns 200 with empty body on success, or 400 with validation error details.",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Meal Plans",
                    "Public"
                ],
                "summary": "Validate auto-generate request",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Family ID",
                        "name": "family-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Generation parameters",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/mealplans.AutoGenerateRequest"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Valid - request can be fulfilled"
                    },
                    "400": {
                        "description": "Validation failed with details",
                        "schema": {
                            "$ref": "#/definitions/mealplans.AutoGenerateValidationError"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/{family-id}/meal-plans/metadata": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Meal Plans",
                    "Public"
                ],
                "summary": "Get mealplan date overrides",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Family ID",
                        "name": "family-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/models.MealplanMetadata"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/{family-id}/meal-plans/modify": {
            "patch": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Meal Plans",
                    "Public"
                ],
                "summary": "Modify a meal plan",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Family ID",
                        "name": "family-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Mutation",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.MealPlanMutation"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/family/{family-id}/meal-plans/{id}": {
            "put": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Meal Plans",
                    "Public"
                ],
                "summary": "Update a meal plan",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Family ID",
                        "name": "family-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Meal Plan ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Update body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.MealPlanUpdate"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/stores.MealPlan"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Meal Plans",
                    "Public"
                ],
                "summary": "Delete a meal plan",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Family ID",
                        "name": "family-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Meal Plan ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Success"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/favorites": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Favorites",
                    "Public"
                ],
                "summary": "Get all favorited recipes",
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.RecipeSummary"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/favorites/{id}": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Favorites",
                    "Public"
                ],
                "summary": "Favorite a recipe",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Success"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Favorites",
                    "Public"
                ],
                "summary": "Unfavorite a recipe",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Success"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/foods": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Query Foods",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Foods",
                    "Public"
                ],
                "summary": "Query Foods",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Search query",
                        "name": "search",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/controller.FoodSearchResponse"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/organizers/domains": {
            "get": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Organizers",
                    "Public"
                ],
                "summary": "Returns all domains available for recipes in your account",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collectionId",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "User ID",
                        "name": "userId",
                        "in": "query",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Domain",
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/organizers/tags": {
            "get": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Organizers",
                    "Public"
                ],
                "summary": "Returns all tags available for recipes in your account",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Collection ID",
                        "name": "collectionId",
                        "in": "query",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "User ID",
                        "name": "userId",
                        "in": "query",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Tag",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.Tag"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/recipes": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Query Recipes using the MeiliSearch index.",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Query Recipes",
                "parameters": [
                    {
                        "type": "integer",
                        "description": "Skip (offset)",
                        "name": "skip",
                        "in": "query"
                    },
                    {
                        "type": "integer",
                        "description": "Take (limit)",
                        "name": "take",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "description": "Search String",
                        "name": "search",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "description": "A Time Query string such as `totalTime \u003c 30` time is in minutes",
                        "name": "totalTime",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/controller.RecipeSearchResponse"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/recipes/bulk": {
            "put": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Bulk Update Recipes",
                "parameters": [
                    {
                        "description": "Bulk Update Recipes",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.RecipeBulkMutation"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "Success"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/recipes/export": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json",
                    "text/plain",
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "Export user recipes by json",
                "parameters": [
                    {
                        "enum": [
                            "json",
                            "text"
                        ],
                        "type": "string",
                        "description": "Export Type",
                        "name": "type",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/recipes/trash": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Recipes",
                    "Public"
                ],
                "summary": "List deleted recipes in trash",
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.DeletedRecipeSummary"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shared/collection": {
            "get": {
                "description": "Get public information about a shared collection using a share token",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shared Collections",
                    "Public"
                ],
                "summary": "Get shared collection information",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Share token for authentication",
                        "name": "X-Share-Token",
                        "in": "header",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/controller.SharedCollectionResponse"
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shared/collection/domains": {
            "get": {
                "description": "Get all domains available for recipes in a shared collection using a share token",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shared Collections",
                    "Public"
                ],
                "summary": "Get domains in a shared collection",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Share token for authentication",
                        "name": "X-Share-Token",
                        "in": "header",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Domains",
                        "schema": {
                            "type": "array",
                            "items": {
                                "type": "string"
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shared/collection/recipes": {
            "get": {
                "description": "Get paginated list of recipes in a shared collection using search index",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shared Collections",
                    "Public"
                ],
                "summary": "Get recipes in a shared collection",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Share token for authentication",
                        "name": "X-Share-Token",
                        "in": "header",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "Skip (offset)",
                        "name": "skip",
                        "in": "query"
                    },
                    {
                        "type": "integer",
                        "description": "Take (limit, max: 50)",
                        "name": "take",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "description": "Search String",
                        "name": "search",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/controller.RecipeSearchResponse"
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shared/collection/tags": {
            "get": {
                "description": "Get all tags available for recipes in a shared collection using a share token",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shared Collections",
                    "Public"
                ],
                "summary": "Get tags in a shared collection",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Share token for authentication",
                        "name": "X-Share-Token",
                        "in": "header",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Tags",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.Tag"
                            }
                        }
                    },
                    "404": {
                        "description": "Not Found",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Get all shopping lists for the user's family with counts",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Get All Shopping Lists",
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.ShoppingListSummary"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Create a new shopping list",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Create Shopping List",
                "parameters": [
                    {
                        "description": "Request body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingListNameDto"
                        }
                    }
                ],
                "responses": {
                    "201": {
                        "description": "Created",
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingList"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists/{list-id}": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Get a single shopping list by ID",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Get Shopping List",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingList"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Delete a shopping list. Cannot delete the last list.",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Delete Shopping List",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "patch": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Update a shopping list",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Update Shopping List",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Request body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingListNameDto"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingList"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists/{list-id}/items": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Get Shopping List Items",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Get Shopping List Items",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "boolean",
                        "default": false,
                        "description": "Include checked items",
                        "name": "withChecked",
                        "in": "query"
                    },
                    {
                        "type": "boolean",
                        "default": true,
                        "description": "Include unchecked items",
                        "name": "withUnchecked",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.ShoppingListItem"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            },
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Add items to shopping list",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Add items to shopping list",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Request body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.ShoppingListAddItemsRequest"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists/{list-id}/items/check-all": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Mark every unchecked item in the shopping list as checked",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Check all items in the shopping list",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists/{list-id}/items/checked": {
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Delete every checked item in the shopping list",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Remove checked items from the shopping list",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists/{list-id}/items/text": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Parses each line, such as \"2 cups milk\" or \"eggs x12\", into a quantity, unit and name the same way the web app does, then adds the items. Blank lines are skipped. The response has one entry per added line, in order, and reports whether it merged into an item already on the list.",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Add items to a shopping list from typed lines",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Request body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.ShoppingListItemsAddText"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/controller.ShoppingListTextItemResult"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists/{list-id}/items/{id}": {
            "patch": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Modify Item in the shopping list",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Patch Item in the shopping list",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Item ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Request body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/stores.ShoppingListItemUpdate"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists/{list-id}/meal-plans/sync": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Sync meal plans to shopping list. Optionally clear all existing items before syncing.",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Sync meal plans to shopping list",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Request body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.ShoppingListMealPlanSyncRequest"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists/{list-id}/meal-plans/{id}": {
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Remove meal plan from shopping list",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Remove meal plan from shopping list",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Meal Plan ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists/{list-id}/recipes": {
            "post": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Add recipes to shopping list",
                "consumes": [
                    "application/json"
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Add recipes to shopping list",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Request body",
                        "name": "body",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.ShoppingListAddRecipeRequest"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists/{list-id}/recipes/{id}": {
            "delete": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Remove a recipe from shopping list",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Remove a recipe from shopping list",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Recipe ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/shopping-lists/{list-id}/references": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Get Linked Mealplans and Recipes for a Shopping List",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Shopping Lists",
                    "Public"
                ],
                "summary": "Get Linked References",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Shopping List ID",
                        "name": "list-id",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/shoppinglists.ShoppingListReferences"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/units": {
            "get": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "description": "Query units",
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "Units",
                    "Public"
                ],
                "summary": "Query units",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Search query",
                        "name": "search",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "OK",
                        "schema": {
                            "$ref": "#/definitions/controller.UnitSearchResponse"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/users/inbox": {
            "get": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "User",
                    "Public"
                ],
                "summary": "Get a user's inbox entries",
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "type": "array",
                            "items": {
                                "$ref": "#/definitions/stores.UserInboxEntry"
                            }
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/users/inbox/{id}": {
            "patch": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "User",
                    "Public"
                ],
                "summary": "Update a user's inbox entry",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Inbox Entry ID",
                        "name": "id",
                        "in": "path",
                        "required": true
                    },
                    {
                        "description": "Inbox Entry Data",
                        "name": "data",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.UserInboxEntryUpdate"
                        }
                    }
                ],
                "responses": {
                    "204": {
                        "description": "No Content"
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/users/self": {
            "patch": {
                "security": [
                    {
                        "Bearer": []
                    }
                ],
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "User",
                    "Public"
                ],
                "summary": "Update a user's profile",
                "parameters": [
                    {
                        "description": "User Data",
                        "name": "data",
                        "in": "body",
                        "required": true,
                        "schema": {
                            "$ref": "#/definitions/controller.UserUpdateSelf"
                        }
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/stores.User"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/users/{user}": {
            "get": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "User",
                    "Public"
                ],
                "summary": "Get a user's public profile by username",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Username",
                        "name": "user",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/controller.PublicUser"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/users/{user}/recipes": {
            "get": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "User Recipes",
                    "Public"
                ],
                "summary": "Get a user's recipes by username",
                "parameters": [
                    {
                        "type": "string",
                        "description": "User ID",
                        "name": "user",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "integer",
                        "description": "Skip (offset)",
                        "name": "skip",
                        "in": "query"
                    },
                    {
                        "type": "integer",
                        "description": "Take (limit), at most 100",
                        "name": "take",
                        "in": "query"
                    },
                    {
                        "type": "string",
                        "description": "Search String",
                        "name": "search",
                        "in": "query"
                    },
                    {
                        "type": "array",
                        "items": {
                            "type": "string"
                        },
                        "collectionFormat": "csv",
                        "description": "Tag slugs",
                        "name": "tags",
                        "in": "query"
                    },
                    {
                        "enum": [
                            "name",
                            "createdAt",
                            "updatedAt",
                            "averageRating"
                        ],
                        "type": "string",
                        "description": "Sort field",
                        "name": "orderBy",
                        "in": "query"
                    },
                    {
                        "enum": [
                            "asc",
                            "desc"
                        ],
                        "type": "string",
                        "description": "Sort direction",
                        "name": "direction",
                        "in": "query"
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/controller.RecipeSearchResponse"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/users/{user}/recipes/{recipe}": {
            "get": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "User Recipes",
                    "Public"
                ],
                "summary": "Get a user's recipe by username and recipe slug",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Username",
                        "name": "user",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Recipe Slug",
                        "name": "recipe",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/stores.Recipe"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        },
        "/v1/users/{user}/recipes/{recipe}/reviews": {
            "get": {
                "produces": [
                    "application/json"
                ],
                "tags": [
                    "User Recipes",
                    "Public"
                ],
                "summary": "Get reviews for a recipe",
                "parameters": [
                    {
                        "type": "string",
                        "description": "Username",
                        "name": "user",
                        "in": "path",
                        "required": true
                    },
                    {
                        "type": "string",
                        "description": "Recipe Slug",
                        "name": "recipe",
                        "in": "path",
                        "required": true
                    }
                ],
                "responses": {
                    "200": {
                        "description": "Success",
                        "schema": {
                            "$ref": "#/definitions/stores.RecipeReviews"
                        }
                    },
                    "default": {
                        "description": "Error",
                        "schema": {
                            "$ref": "#/definitions/server.ErrorResp"
                        }
                    }
                }
            }
        }
    },
    "definitions": {
        "controller.AddUserBody": {
            "type": "object",
            "required": [
                "roles",
                "userId"
            ],
            "properties": {
                "roles": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                        "$ref": "#/definitions/models.CollectionRole"
                    }
                },
                "userId": {
                    "type": "string",
                    "format": "uuid"
                }
            }
        },
        "controller.CollectionJoinResponse": {
            "type": "object",
            "required": [
                "collectionId",
                "redirectUrl"
            ],
            "properties": {
                "collectionId": {
                    "type": "string"
                },
                "redirectUrl": {
                    "type": "string"
                }
            }
        },
        "controller.FamilyInviteResponse": {
            "type": "object",
            "required": [
                "inviteToken"
            ],
            "properties": {
                "inviteToken": {
                    "type": "string"
                }
            }
        },
        "controller.FoodSearchResponse": {
            "type": "object",
            "required": [
                "estimatedTotalHits",
                "hits",
                "limit",
                "processedTimeMs",
                "query"
            ],
            "properties": {
                "estimatedTotalHits": {
                    "type": "integer"
                },
                "hits": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.Food"
                    }
                },
                "limit": {
                    "type": "integer"
                },
                "processedTimeMs": {
                    "type": "string"
                },
                "query": {
                    "type": "string"
                }
            }
        },
        "controller.IDResponse": {
            "type": "object",
            "required": [
                "id"
            ],
            "properties": {
                "id": {
                    "type": "string",
                    "format": "uuid"
                }
            }
        },
        "controller.MealPlanBatchRequest": {
            "type": "object",
            "required": [
                "items"
            ],
            "properties": {
                "items": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.MealPlanBatchUpdate"
                    }
                }
            }
        },
        "controller.PublicUser": {
            "type": "object",
            "required": [
                "about",
                "bannerImage",
                "displayName",
                "id",
                "profilePicture",
                "tier",
                "username"
            ],
            "properties": {
                "about": {
                    "type": "string"
                },
                "bannerImage": {
                    "type": "string"
                },
                "displayName": {
                    "type": "string"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "professionalProfile": {
                    "$ref": "#/definitions/models.ProfessionalProfile"
                },
                "profilePicture": {
                    "type": "string"
                },
                "tier": {
                    "$ref": "#/definitions/models.FamilyTier"
                },
                "username": {
                    "type": "string"
                }
            }
        },
        "controller.RecipeBulkMutation": {
            "type": "object",
            "required": [
                "mutations",
                "recipeIds",
                "searchQuery"
            ],
            "properties": {
                "mutations": {
                    "type": "array",
                    "maxItems": 3,
                    "minItems": 1,
                    "items": {
                        "$ref": "#/definitions/stores.RecipeMutation"
                    }
                },
                "recipeIds": {
                    "type": "array",
                    "maxItems": 100,
                    "minItems": 1,
                    "items": {
                        "type": "string",
                        "format": "uuid"
                    },
                    "x-nullable": true
                },
                "searchQuery": {
                    "allOf": [
                        {
                            "$ref": "#/definitions/stores.RecipeDocumentQuery"
                        }
                    ],
                    "x-nullable": true
                }
            }
        },
        "controller.RecipeCopyBody": {
            "type": "object",
            "required": [
                "newCollectionId"
            ],
            "properties": {
                "newCollectionId": {
                    "type": "string",
                    "format": "uuid"
                }
            }
        },
        "controller.RecipeImageCreateRequest": {
            "type": "object",
            "required": [
                "url"
            ],
            "properties": {
                "url": {
                    "type": "string"
                }
            }
        },
        "controller.RecipeSearchResponse": {
            "type": "object",
            "required": [
                "estimatedTotalHits",
                "hits",
                "limit",
                "offset",
                "processingTimeMs",
                "query"
            ],
            "properties": {
                "estimatedTotalHits": {
                    "type": "integer"
                },
                "hits": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.RecipeSearchHit"
                    }
                },
                "limit": {
                    "type": "integer"
                },
                "offset": {
                    "type": "integer"
                },
                "processingTimeMs": {
                    "type": "integer"
                },
                "query": {
                    "type": "string"
                }
            }
        },
        "controller.SchemaImportBody": {
            "type": "object",
            "required": [
                "recipes"
            ],
            "properties": {
                "recipes": {
                    "type": "array",
                    "maxItems": 25,
                    "minItems": 1,
                    "items": {
                        "type": "object"
                    }
                }
            }
        },
        "controller.ScrapeBody": {
            "type": "object",
            "required": [
                "collectionId",
                "urls"
            ],
            "properties": {
                "collectionId": {
                    "type": "string",
                    "format": "uuid"
                },
                "urls": {
                    "type": "array",
                    "maxItems": 10,
                    "minItems": 1,
                    "items": {
                        "type": "string"
                    }
                }
            }
        },
        "controller.SharedCollectionResponse": {
            "type": "object",
            "required": [
                "description",
                "id",
                "name"
            ],
            "properties": {
                "description": {
                    "type": "string"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "name": {
                    "type": "string"
                }
            }
        },
        "controller.ShoppingListAddItemsRequest": {
            "type": "object",
            "required": [
                "items"
            ],
            "properties": {
                "items": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                        "$ref": "#/definitions/stores.ShoppingListItemCreateDto"
                    }
                }
            }
        },
        "controller.ShoppingListAddRecipeRequest": {
            "type": "object",
            "required": [
                "ids"
            ],
            "properties": {
                "ids": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                        "type": "string",
                        "format": "uuid"
                    }
                },
                "scales": {
                    "description": "Scales multiplies the ingredient amounts of each recipe ID it holds.\nRecipes without an entry are added as written.",
                    "type": "object",
                    "additionalProperties": {
                        "type": "number",
                        "format": "float64"
                    },
                    "x-nullable": true
                }
            }
        },
        "controller.ShoppingListFavoritesSaveRequest": {
            "type": "object",
            "required": [
                "items"
            ],
            "properties": {
                "items": {
                    "type": "array",
                    "maxItems": 100,
                    "minItems": 1,
                    "items": {
                        "$ref": "#/definitions/stores.ShoppingListFavoriteCreate"
                    }
                }
            }
        },
        "controller.ShoppingListItemsAddText": {
            "type": "object",
            "required": [
                "lines"
            ],
            "properties": {
                "lines": {
                    "type": "array",
                    "maxItems": 50,
                    "minItems": 1,
                    "items": {
                        "type": "string"
                    }
                }
            }
        },
        "controller.ShoppingListMealPlanSyncRequest": {
            "type": "object",
            "required": [
                "clearBeforeSync",
                "endDate",
                "startDate"
            ],
            "properties": {
                "clearBeforeSync": {
                    "type": "boolean"
                },
                "endDate": {
                    "type": "string",
                    "format": "date"
                },
                "startDate": {
                    "type": "string",
                    "format": "date"
                }
            }
        },
        "controller.ShoppingListTextItemResult": {
            "type": "object",
            "required": [
                "merged",
                "text"
            ],
            "properties": {
                "merged": {
                    "type": "boolean"
                },
                "text": {
                    "description": "Text is the item's name as it now reads on the list, which is the\nexisting item's when the line merged into it.",
                    "type": "string"
                }
            }
        },
        "controller.UnitSearchResponse": {
            "type": "object",
            "required": [
                "estimatedTotalHits",
                "hits",
                "limit",
                "processedTimeMs",
                "query"
            ],
            "properties": {
                "estimatedTotalHits": {
                    "type": "integer"
                },
                "hits": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.Unit"
                    }
                },
                "limit": {
                    "type": "integer"
                },
                "processedTimeMs": {
                    "type": "string"
                },
                "query": {
                    "type": "string"
                }
            }
        },
        "controller.UpdateMemberPermissions": {
            "type": "object",
            "required": [
                "role"
            ],
            "properties": {
                "role": {
                    "enum": [
                        "admin",
                        "editor",
                        "viewer"
                    ],
                    "allOf": [
                        {
                            "$ref": "#/definitions/models.CollectionRole"
                        }
                    ]
                }
            }
        },
        "controller.UserInboxEntryUpdate": {
            "type": "object",
            "required": [
                "action"
            ],
            "properties": {
                "action": {
                    "type": "string",
                    "enum": [
                        "dismiss",
                        "complete"
                    ]
                }
            }
        },
        "controller.UserJoinPayload": {
            "type": "object",
            "required": [
                "token"
            ],
            "properties": {
                "token": {
                    "type": "string"
                }
            }
        },
        "controller.UserUpdateSelf": {
            "type": "object",
            "required": [
                "email"
            ],
            "properties": {
                "about": {
                    "type": "string",
                    "x-nullable": true
                },
                "bannerImage": {
                    "type": "string",
                    "maxLength": 2048,
                    "x-nullable": true
                },
                "displayName": {
                    "type": "string",
                    "x-nullable": true
                },
                "email": {
                    "type": "string",
                    "x-nullable": true
                },
                "professionalProfile": {
                    "allOf": [
                        {
                            "$ref": "#/definitions/models.ProfessionalProfile"
                        }
                    ],
                    "x-nullable": true
                },
                "profilePicture": {
                    "type": "string",
                    "maxLength": 2048,
                    "x-nullable": true
                },
                "publicProfile": {
                    "type": "boolean",
                    "x-nullable": true
                },
                "username": {
                    "type": "string",
                    "maxLength": 32,
                    "minLength": 3,
                    "x-nullable": true
                }
            }
        },
        "controller.handoutPublicDownloadResponse": {
            "type": "object",
            "required": [
                "url"
            ],
            "properties": {
                "url": {
                    "type": "string"
                }
            }
        },
        "mealplans.AutoGenerateRequest": {
            "type": "object",
            "required": [
                "allowRepeats",
                "clearExisting",
                "endDate",
                "mealTypes",
                "startDate"
            ],
            "properties": {
                "allowRepeats": {
                    "type": "boolean"
                },
                "clearExisting": {
                    "type": "boolean"
                },
                "endDate": {
                    "type": "string",
                    "format": "date"
                },
                "includeWeekdays": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.Weekday"
                    }
                },
                "mealTypes": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                        "type": "string"
                    }
                },
                "startDate": {
                    "type": "string",
                    "format": "date"
                }
            }
        },
        "mealplans.AutoGenerateResult": {
            "type": "object",
            "required": [
                "mealsGenerated"
            ],
            "properties": {
                "mealsGenerated": {
                    "type": "integer"
                }
            }
        },
        "mealplans.AutoGenerateValidationError": {
            "type": "object",
            "required": [
                "message"
            ],
            "properties": {
                "details": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/mealplans.MealTypeShortfall"
                    }
                },
                "message": {
                    "type": "string"
                }
            }
        },
        "mealplans.CheckRecipeAvailabilityRequest": {
            "type": "object",
            "required": [
                "mealConfigs"
            ],
            "properties": {
                "mealConfigs": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/models.MealTypeConfig"
                    }
                }
            }
        },
        "mealplans.MealTypeAvailability": {
            "type": "object",
            "required": [
                "includeTags",
                "mealType",
                "recipesAvailable",
                "recipesRequired"
            ],
            "properties": {
                "includeTags": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "mealType": {
                    "type": "string"
                },
                "recipesAvailable": {
                    "description": "RecipesAvailable is the count of recipes matching tags that haven't been used recently.\nThis excludes recipes used within the NonRepeatDays window.",
                    "type": "integer"
                },
                "recipesRequired": {
                    "type": "integer"
                },
                "recipesTotal": {
                    "description": "RecipesTotal is the total count of recipes matching tags (before exclusions).\nWhen RecipesTotal \u003e 0 but RecipesAvailable == 0, all recipes were recently used.",
                    "type": "integer"
                }
            }
        },
        "mealplans.MealTypeAvailabilityResponse": {
            "type": "object",
            "required": [
                "mealTypes",
                "nonRepeatDays"
            ],
            "properties": {
                "mealTypes": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/mealplans.MealTypeAvailability"
                    }
                },
                "nonRepeatDays": {
                    "type": "integer"
                }
            }
        },
        "mealplans.MealTypeShortfall": {
            "type": "object",
            "required": [
                "mealType",
                "recipesAvailable",
                "recipesRequired"
            ],
            "properties": {
                "mealType": {
                    "type": "string"
                },
                "recipesAvailable": {
                    "description": "RecipesAvailable is the count of recipes matching tags that haven't been used recently.\nThis excludes recipes used within the NonRepeatDays window.",
                    "type": "integer"
                },
                "recipesRequired": {
                    "type": "integer"
                },
                "recipesTotal": {
                    "description": "RecipesTotal is the total count of recipes matching tags (before exclusions).\nWhen RecipesTotal \u003e 0 but RecipesAvailable == 0, all recipes were recently used.",
                    "type": "integer"
                }
            }
        },
        "models.AutoGenerateSettings": {
            "type": "object",
            "required": [
                "mealConfigs",
                "nonRepeatDays"
            ],
            "properties": {
                "mealConfigs": {
                    "type": "object",
                    "additionalProperties": {
                        "$ref": "#/definitions/models.MealTypeConfig"
                    }
                },
                "nonRepeatDays": {
                    "type": "integer",
                    "maximum": 365,
                    "minimum": 0
                }
            }
        },
        "models.BlockType": {
            "type": "string",
            "enum": [
                "text",
                "note",
                "instruction",
                "ingredients",
                "image",
                "title"
            ],
            "x-enum-varnames": [
                "BlockTypeText",
                "BlockTypeNote",
                "BlockTypeInstruction",
                "BlockTypeIngredients",
                "BlockTypeImage",
                "BlockTypeTitle"
            ]
        },
        "models.CollectionRole": {
            "type": "string",
            "enum": [
                "owner",
                "admin",
                "editor",
                "viewer"
            ],
            "x-enum-varnames": [
                "CollectionRoleOwner",
                "CollectionRoleAdmin",
                "CollectionRoleEditor",
                "CollectionRoleViewer"
            ]
        },
        "models.Family": {
            "type": "object",
            "required": [
                "avatarUrl",
                "collectionId",
                "description",
                "features",
                "id",
                "mealPlanKey",
                "mealPlanTimes",
                "name",
                "organizationSubscriptionEndsOn",
                "ownerId",
                "recipeSettings",
                "settings",
                "slots",
                "subscribed",
                "subscribedEnd",
                "tier",
                "timezone",
                "trialEnd"
            ],
            "properties": {
                "avatarUrl": {
                    "type": "string"
                },
                "collectionId": {
                    "type": "string",
                    "format": "uuid"
                },
                "description": {
                    "type": "string"
                },
                "features": {
                    "$ref": "#/definitions/models.FamilyFeatureFlags"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "mealPlanKey": {
                    "type": "string"
                },
                "mealPlanTimes": {
                    "$ref": "#/definitions/models.MealPlanTimes"
                },
                "name": {
                    "type": "string"
                },
                "organizationSubscriptionEndsOn": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date"
                },
                "ownerId": {
                    "type": "string",
                    "format": "uuid"
                },
                "recipeSettings": {
                    "$ref": "#/definitions/models.FamilyRecipeSettings"
                },
                "settings": {
                    "$ref": "#/definitions/models.FamilySettings"
                },
                "slots": {
                    "type": "integer"
                },
                "subscribed": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "subscribedEnd": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "tier": {
                    "$ref": "#/definitions/models.FamilyTier"
                },
                "timezone": {
                    "type": "string"
                },
                "trialEnd": {
                    "type": "string",
                    "format": "date-time"
                }
            }
        },
        "models.FamilyFeatureFlags": {
            "type": "object",
            "required": [
                "advancedNutrition",
                "cookBookBulkPrint",
                "dietitian",
                "mealPlanNutritionAnalysis",
                "mealPlanServings",
                "mealplanTemplates",
                "multiRecipeImport",
                "recipeNutritionAnalysis"
            ],
            "properties": {
                "advancedNutrition": {
                    "description": "AdvancedNutrition is a feature that allows for Food Group management on recipes.\nIt adds micronutrients, food groups and nutrition model management on top of\nRecipeNutritionAnalysis. With MealPlanNutritionAnalysis on, it also adds food groups\nto the meal plan and template analysis.",
                    "type": "boolean"
                },
                "cookBookBulkPrint": {
                    "description": "CookBookBulkPrint is a feature that allows the family to print their cook book in bulk.\nThis feature uses server side rendered PDFs in a synchronous manner to generate PDFs\nand allow the user to download all their recipes at once.\n\nWe're feature flagging this for now to gate in-case of performance concerns and evaluate\nif this feature is worth another putting on another 'tier' of user.",
                    "type": "boolean"
                },
                "dietitian": {
                    "description": "Dietitian is a feature that enables professional profile fields (credentials,\nspecialties, website URL) and the ability to mark recipes as dietitian-verified.",
                    "type": "boolean"
                },
                "mealPlanNutritionAnalysis": {
                    "description": "MealPlanNutritionAnalysis enables nutrition analysis on the meal planner and on meal plan\ntemplates:\n\n  - per-meal indicators of whether the meal meets the nutrition model's guidelines\n  - selecting a meal for analysis in the nutrition pane\n  - nutrition and model compliance in the planner's advanced print\n\nIt totals recipe nutrition, so it has no effect without RecipeNutritionAnalysis. The\nanalysis runs in the browser over data the recipe flag already exposes, so no route\nchecks it.",
                    "type": "boolean"
                },
                "mealPlanServings": {
                    "description": "MealPlanServings is a feature that enabled the meal planner to be 'servings' aware.\nthis means that users can plan 'servings' of a recipe per person and take those quanties\ninto account when generating a shopping list.",
                    "type": "boolean"
                },
                "mealplanTemplates": {
                    "description": "MealplanTemplates is a feature that allows the family to create meal plan templates.",
                    "type": "boolean"
                },
                "multiRecipeImport": {
                    "description": "MultiRecipeImport allows importing multiple recipe URLs in one request.",
                    "type": "boolean"
                },
                "recipeNutritionAnalysis": {
                    "description": "RecipeNutritionAnalysis enables recipe level nutrition analysis using the USDA database as a source.\nOn its own it covers the core nutrients (calories, fat, protein and carbohydrates), manages\ncustom ingredients, and can read, but not manage, nutrition models.",
                    "type": "boolean"
                }
            }
        },
        "models.FamilyMealplanSettings": {
            "type": "object",
            "required": [
                "autoGenerate",
                "defaultPeopleToServe",
                "enabledMeals"
            ],
            "properties": {
                "autoGenerate": {
                    "$ref": "#/definitions/models.AutoGenerateSettings"
                },
                "defaultPeopleToServe": {
                    "type": "number"
                },
                "enabledMeals": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                }
            }
        },
        "models.FamilyRecipeSettings": {
            "type": "object",
            "required": [
                "autoTagging",
                "privateByDefault"
            ],
            "properties": {
                "autoTagging": {
                    "description": "AutoTagging, when true all recipes created as apart of this family\nwill be tagged automatically based on \"smart\" rules.",
                    "type": "boolean"
                },
                "privateByDefault": {
                    "description": "PrivateByDefault, when true all recipes created as apart of this family\nwill be private by default.",
                    "type": "boolean"
                }
            }
        },
        "models.FamilyRole": {
            "type": "string",
            "enum": [
                "family-admin",
                "family-user"
            ],
            "x-enum-varnames": [
                "FamilyRoleFamilyAdmin",
                "FamilyRoleFamilyUser"
            ]
        },
        "models.FamilySettings": {
            "type": "object",
            "required": [
                "mealplans",
                "multipleShoppingLists",
                "tidyUp"
            ],
            "properties": {
                "mealplans": {
                    "$ref": "#/definitions/models.FamilyMealplanSettings"
                },
                "multipleShoppingLists": {
                    "type": "boolean"
                },
                "tidyUp": {
                    "$ref": "#/definitions/models.FamilyTidyUpSettings"
                }
            }
        },
        "models.FamilyTidyUpSettings": {
            "type": "object",
            "required": [
                "disabledChecks"
            ],
            "properties": {
                "disabledChecks": {
                    "description": "DisabledChecks lists the checks the family switched off. Stored as an\nexclusion list so a check added later starts enabled for everyone.",
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.TidyUpCheck"
                    }
                }
            }
        },
        "models.FamilyTier": {
            "type": "string",
            "enum": [
                "default",
                "dietitian_starter",
                "dietitian_pro",
                "enterprise"
            ],
            "x-enum-varnames": [
                "FamilyTierDefault",
                "FamilyTierDietitianStarter",
                "FamilyTierDietitianPro",
                "FamilyTierEnterprise"
            ]
        },
        "models.InboxEntryLevel": {
            "type": "string",
            "enum": [
                "info",
                "warning",
                "error",
                "security"
            ],
            "x-enum-varnames": [
                "InboxEntryLevelInfo",
                "InboxEntryLevelWarning",
                "InboxEntryLevelError",
                "InboxEntryLevelSecurity"
            ]
        },
        "models.InboxEntryStatus": {
            "type": "string",
            "enum": [
                "new",
                "dismissed",
                "complete"
            ],
            "x-enum-varnames": [
                "InboxEntryStatusNew",
                "InboxEntryStatusDismissed",
                "InboxEntryStatusComplete"
            ]
        },
        "models.InboxEntryType": {
            "type": "string",
            "enum": [
                "new_user_onboarding",
                "recipe_import_complete"
            ],
            "x-enum-varnames": [
                "InboxEntryTypeNewUserOnboarding",
                "InboxEntryTypeRecipeImportComplete"
            ]
        },
        "models.Ingredient": {
            "type": "object",
            "required": [
                "food",
                "id",
                "note",
                "order",
                "originalText",
                "quantity",
                "unit"
            ],
            "properties": {
                "food": {
                    "type": "string"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "note": {
                    "type": "string"
                },
                "order": {
                    "type": "integer"
                },
                "originalText": {
                    "type": "string"
                },
                "quantity": {
                    "type": "number"
                },
                "unit": {
                    "type": "string"
                }
            }
        },
        "models.MealPlanTimes": {
            "type": "object",
            "required": [
                "breakfast",
                "dinner",
                "lunch",
                "notes",
                "prep",
                "snack"
            ],
            "properties": {
                "breakfast": {
                    "type": "string",
                    "x-nullable": true
                },
                "dinner": {
                    "type": "string",
                    "x-nullable": true
                },
                "lunch": {
                    "type": "string",
                    "x-nullable": true
                },
                "notes": {
                    "type": "string",
                    "x-nullable": true
                },
                "prep": {
                    "type": "string",
                    "x-nullable": true
                },
                "snack": {
                    "type": "string",
                    "x-nullable": true
                }
            }
        },
        "models.MealTypeConfig": {
            "type": "object",
            "required": [
                "allowRepeats",
                "includeTags"
            ],
            "properties": {
                "allowRepeats": {
                    "type": "boolean"
                },
                "includeTags": {
                    "type": "array",
                    "maxItems": 5,
                    "minItems": 1,
                    "items": {
                        "type": "string"
                    }
                }
            }
        },
        "models.MealplanMetadata": {
            "type": "object",
            "required": [
                "servingOverrides"
            ],
            "properties": {
                "servingOverrides": {
                    "type": "object",
                    "additionalProperties": {
                        "type": "number",
                        "format": "float64"
                    }
                }
            }
        },
        "models.ProfessionalProfile": {
            "type": "object",
            "required": [
                "credentials",
                "socialLinks",
                "specialties",
                "verified",
                "websiteUrl"
            ],
            "properties": {
                "credentials": {
                    "type": "string",
                    "maxLength": 500
                },
                "socialLinks": {
                    "$ref": "#/definitions/models.SocialLinks"
                },
                "specialties": {
                    "type": "string",
                    "maxLength": 500
                },
                "verified": {
                    "type": "boolean"
                },
                "websiteUrl": {
                    "type": "string",
                    "maxLength": 2048
                }
            }
        },
        "models.RecipeScalePreset": {
            "type": "object",
            "required": [
                "name",
                "scale"
            ],
            "properties": {
                "name": {
                    "type": "string",
                    "maxLength": 50
                },
                "scale": {
                    "type": "number",
                    "maximum": 100
                }
            }
        },
        "models.ShoppingListFilterType": {
            "type": "string",
            "enum": [
                "exact",
                "contains"
            ],
            "x-enum-varnames": [
                "ShoppingListFilterTypeExact",
                "ShoppingListFilterTypeContains"
            ]
        },
        "models.SocialLinks": {
            "type": "object",
            "required": [
                "bluesky",
                "facebook",
                "instagram",
                "linkedin",
                "tiktok",
                "twitter",
                "youtube"
            ],
            "properties": {
                "bluesky": {
                    "type": "string",
                    "maxLength": 500
                },
                "facebook": {
                    "type": "string",
                    "maxLength": 500
                },
                "instagram": {
                    "type": "string",
                    "maxLength": 500
                },
                "linkedin": {
                    "type": "string",
                    "maxLength": 500
                },
                "tiktok": {
                    "type": "string",
                    "maxLength": 500
                },
                "twitter": {
                    "type": "string",
                    "maxLength": 500
                },
                "youtube": {
                    "type": "string",
                    "maxLength": 500
                }
            }
        },
        "models.TidyUpCheck": {
            "type": "string",
            "enum": [
                "needs_review",
                "untagged",
                "no_nutrition",
                "unverified"
            ],
            "x-enum-varnames": [
                "TidyUpCheckNeedsReview",
                "TidyUpCheckUntagged",
                "TidyUpCheckNoNutrition",
                "TidyUpCheckUnverified"
            ]
        },
        "models.Weekday": {
            "type": "string",
            "enum": [
                "sunday",
                "monday",
                "tuesday",
                "wednesday",
                "thursday",
                "friday",
                "saturday"
            ],
            "x-enum-varnames": [
                "WeekdaySunday",
                "WeekdayMonday",
                "WeekdayTuesday",
                "WeekdayWednesday",
                "WeekdayThursday",
                "WeekdayFriday",
                "WeekdaySaturday"
            ]
        },
        "nutrition.Carbohydrates": {
            "type": "object",
            "required": [
                "addedSugars",
                "carbohydrateContent",
                "fiber",
                "sugar"
            ],
            "properties": {
                "addedSugars": {
                    "description": "AddedSugars in grams",
                    "type": "number"
                },
                "carbohydrateContent": {
                    "description": "Total in grams includes specific breakdowns (Fiber, Sugar, AddedSugars) - e.g. don't add anything to calculate",
                    "type": "number"
                },
                "fiber": {
                    "description": "Fiber in grams",
                    "type": "number"
                },
                "sugar": {
                    "description": "Sugar in grams",
                    "type": "number"
                }
            }
        },
        "nutrition.FoodGroups": {
            "type": "object",
            "required": [
                "dairy",
                "fruits",
                "grains",
                "oils",
                "proteins",
                "vegetables"
            ],
            "properties": {
                "dairy": {
                    "description": "Dairy in cups",
                    "type": "number"
                },
                "fruits": {
                    "description": "Fruits in cups",
                    "type": "number"
                },
                "grains": {
                    "$ref": "#/definitions/nutrition.Grains"
                },
                "oils": {
                    "description": "Oils in grams",
                    "type": "number"
                },
                "proteins": {
                    "$ref": "#/definitions/nutrition.Proteins"
                },
                "vegetables": {
                    "$ref": "#/definitions/nutrition.Vegetables"
                }
            }
        },
        "nutrition.Grains": {
            "type": "object",
            "required": [
                "refinedGrains",
                "wholeGrains"
            ],
            "properties": {
                "refinedGrains": {
                    "description": "RefinedGrains in grams",
                    "type": "number"
                },
                "wholeGrains": {
                    "description": "WholeGrains in grams",
                    "type": "number"
                }
            }
        },
        "nutrition.Macros": {
            "type": "object",
            "required": [
                "calories",
                "carbohydrates",
                "fat",
                "protein"
            ],
            "properties": {
                "calories": {
                    "description": "Calories in kilocalories",
                    "type": "number"
                },
                "carbohydrates": {
                    "$ref": "#/definitions/nutrition.Carbohydrates"
                },
                "fat": {
                    "description": "Fat in Grams",
                    "type": "number"
                },
                "protein": {
                    "description": "Protein in grams",
                    "type": "number"
                }
            }
        },
        "nutrition.Micros": {
            "type": "object",
            "required": [
                "magnesium",
                "phosphorus",
                "potassium",
                "sodium"
            ],
            "properties": {
                "magnesium": {
                    "description": "Magnesium in milligrams",
                    "type": "number"
                },
                "phosphorus": {
                    "description": "Phosphorus in milligrams",
                    "type": "number"
                },
                "potassium": {
                    "description": "Potassium in milligrams",
                    "type": "number"
                },
                "sodium": {
                    "description": "Sodium in milligrams",
                    "type": "number"
                }
            }
        },
        "nutrition.Nutrition": {
            "type": "object",
            "required": [
                "additionalProperties",
                "foodGroups",
                "macros",
                "micros"
            ],
            "properties": {
                "additionalProperties": {
                    "description": "AdditionalProperties is the old way that nutrition data was stored and edited. It used free-form data\nfor input and processing. As requirements changed for more informed analysis we moved to\na strict data input format.\n\nWe will keep this to support users specifying custom nutritional metrics that fall outside\nof the standard array that we use for analysis. These can include things like\n\n - Trans Fats\n - Saturated Fats\n - Sodium Contents\n - Cholesterol\n\nNote: These values are all defined as apart of the schema.org specification for recipes\n\nsee: https://schema.org/NutritionInformation",
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/nutrition.NutritionValue"
                    }
                },
                "foodGroups": {
                    "$ref": "#/definitions/nutrition.FoodGroups"
                },
                "macros": {
                    "$ref": "#/definitions/nutrition.Macros"
                },
                "micros": {
                    "$ref": "#/definitions/nutrition.Micros"
                }
            }
        },
        "nutrition.NutritionValue": {
            "type": "object",
            "required": [
                "name",
                "unit",
                "value"
            ],
            "properties": {
                "name": {
                    "type": "string"
                },
                "unit": {
                    "type": "string"
                },
                "value": {
                    "type": "number"
                }
            }
        },
        "nutrition.Proteins": {
            "type": "object",
            "required": [
                "meatsPoultryEggs",
                "nutsSeedsSoy",
                "seafood"
            ],
            "properties": {
                "meatsPoultryEggs": {
                    "description": "Meats, Poultry and Egg protein in grams",
                    "type": "number"
                },
                "nutsSeedsSoy": {
                    "description": "NutsSeedsSoy in grams",
                    "type": "number"
                },
                "seafood": {
                    "description": "Seafood in grams",
                    "type": "number"
                }
            }
        },
        "nutrition.Vegetables": {
            "type": "object",
            "required": [
                "beansPeasLentils",
                "darkGreen",
                "other",
                "redOrange",
                "starchy"
            ],
            "properties": {
                "beansPeasLentils": {
                    "description": "BeansPeasLentils in cups",
                    "type": "number"
                },
                "darkGreen": {
                    "description": "DarkGreen in cups",
                    "type": "number"
                },
                "other": {
                    "description": "Other in cups",
                    "type": "number"
                },
                "redOrange": {
                    "description": "RedOrange in cups",
                    "type": "number"
                },
                "starchy": {
                    "description": "Starchy in cups",
                    "type": "number"
                }
            }
        },
        "server.ErrorResp": {
            "type": "object",
            "required": [
                "message",
                "statusCode"
            ],
            "properties": {
                "data": {},
                "message": {
                    "type": "string"
                },
                "requestId": {
                    "type": "string"
                },
                "statusCode": {
                    "type": "integer"
                }
            }
        },
        "services.AuthToken": {
            "type": "object",
            "required": [
                "expires_at",
                "token"
            ],
            "properties": {
                "expires_at": {
                    "type": "string",
                    "format": "date-time"
                },
                "token": {
                    "type": "string"
                }
            }
        },
        "services.InviteNewMember": {
            "type": "object",
            "required": [
                "email",
                "firstname",
                "lastname",
                "roles"
            ],
            "properties": {
                "email": {
                    "type": "string"
                },
                "firstname": {
                    "type": "string"
                },
                "lastname": {
                    "type": "string"
                },
                "roles": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                        "$ref": "#/definitions/models.FamilyRole"
                    }
                }
            }
        },
        "services.RecipeParseRequest": {
            "type": "object",
            "required": [
                "ingredients",
                "instructions",
                "name",
                "url"
            ],
            "properties": {
                "ingredients": {
                    "type": "string"
                },
                "instructions": {
                    "type": "string"
                },
                "name": {
                    "type": "string"
                },
                "url": {
                    "type": "string"
                }
            }
        },
        "services.RecipeScrapeResult": {
            "type": "object",
            "properties": {
                "error": {
                    "$ref": "#/definitions/services.ScrapeError"
                },
                "existingSlug": {
                    "description": "Slug of existing recipe when error is already-exists",
                    "type": "string"
                },
                "recipe": {
                    "$ref": "#/definitions/stores.Recipe"
                },
                "status": {
                    "$ref": "#/definitions/services.ScrapeStatus"
                },
                "url": {
                    "type": "string"
                }
            }
        },
        "services.ScrapeError": {
            "type": "string",
            "enum": [
                "already-exists",
                "no-schema-data",
                "network-error",
                "no-recipe-found",
                "unviable-recipe",
                "no-parser-match",
                "unknown",
                "post-unavailable",
                "ai-disabled"
            ],
            "x-enum-varnames": [
                "ScrapeErrorAlreadyExists",
                "ScrapeErrorNoSchemaData",
                "ScrapeErrorNetworkError",
                "ScrapeErrorNoRecipeFound",
                "ScrapeErrorUnviableRecipe",
                "ScrapeErrorNoParserMatch",
                "ScrapeErrorUnknown",
                "ScrapeErrorPostUnavailable",
                "ScrapeErrorAIDisabled"
            ]
        },
        "services.ScrapeStatus": {
            "type": "string",
            "enum": [
                "queued",
                "finished",
                "failed",
                "skipped"
            ],
            "x-enum-varnames": [
                "ScrapeStatusQueued",
                "ScrapeStatusFinished",
                "ScrapeStatusFailed",
                "ScrapeStatusSkipped"
            ]
        },
        "services.UserLogin": {
            "type": "object",
            "required": [
                "password",
                "rememberMe",
                "username"
            ],
            "properties": {
                "password": {
                    "type": "string",
                    "maxLength": 100,
                    "minLength": 8
                },
                "rememberMe": {
                    "type": "boolean"
                },
                "username": {
                    "type": "string",
                    "maxLength": 255,
                    "minLength": 3
                }
            }
        },
        "shoppinglists.ShoppingListReferences": {
            "type": "object",
            "required": [
                "mealPlans",
                "recipes"
            ],
            "properties": {
                "mealPlans": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.MealPlan"
                    }
                },
                "recipes": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.RecipeSummary"
                    }
                }
            }
        },
        "stores.Collection": {
            "type": "object",
            "required": [
                "avatarUrl",
                "color",
                "description",
                "id",
                "name"
            ],
            "properties": {
                "avatarUrl": {
                    "type": "string"
                },
                "color": {
                    "type": "string"
                },
                "description": {
                    "type": "string"
                },
                "id": {
                    "type": "string"
                },
                "name": {
                    "type": "string"
                }
            }
        },
        "stores.CollectionActions": {
            "type": "object",
            "required": [
                "canDelete",
                "canLeave"
            ],
            "properties": {
                "canDelete": {
                    "type": "boolean"
                },
                "canDeleteMsg": {
                    "type": "string"
                },
                "canLeave": {
                    "type": "boolean"
                },
                "canLeaveMsg": {
                    "type": "string"
                }
            }
        },
        "stores.CollectionCreate": {
            "type": "object",
            "required": [
                "avatarUrl",
                "color",
                "description",
                "name"
            ],
            "properties": {
                "avatarUrl": {
                    "type": "string",
                    "x-nullable": true
                },
                "color": {
                    "type": "string",
                    "x-nullable": true
                },
                "description": {
                    "type": "string",
                    "maxLength": 1000,
                    "x-nullable": true
                },
                "name": {
                    "type": "string",
                    "maxLength": 100
                }
            }
        },
        "stores.CollectionInvite": {
            "type": "object",
            "required": [
                "createdAt",
                "expiresAt",
                "id",
                "lastUsed",
                "role",
                "token",
                "uses"
            ],
            "properties": {
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "expiresAt": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "lastUsed": {
                    "type": "string",
                    "format": "date-time"
                },
                "role": {
                    "allOf": [
                        {
                            "$ref": "#/definitions/models.CollectionRole"
                        }
                    ],
                    "x-nullable": true
                },
                "token": {
                    "type": "string"
                },
                "uses": {
                    "type": "integer"
                }
            }
        },
        "stores.CollectionInviteCreate": {
            "type": "object",
            "required": [
                "expiresAt",
                "role",
                "uses"
            ],
            "properties": {
                "expiresAt": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "role": {
                    "enum": [
                        "admin",
                        "editor",
                        "viewer"
                    ],
                    "allOf": [
                        {
                            "$ref": "#/definitions/models.CollectionRole"
                        }
                    ]
                },
                "uses": {
                    "type": "integer",
                    "maximum": 100,
                    "minimum": -1,
                    "x-nullable": true
                }
            }
        },
        "stores.CollectionMember": {
            "type": "object",
            "required": [
                "about",
                "displayName",
                "id",
                "joinedAt",
                "profilePicture",
                "roles",
                "username"
            ],
            "properties": {
                "about": {
                    "type": "string"
                },
                "displayName": {
                    "type": "string"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "joinedAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "profilePicture": {
                    "type": "string"
                },
                "roles": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.CollectionRole"
                    }
                },
                "username": {
                    "type": "string"
                }
            }
        },
        "stores.CollectionShareLink": {
            "type": "object",
            "required": [
                "collectionID",
                "createdAt",
                "deletedAt",
                "expiresAt",
                "id",
                "name",
                "token"
            ],
            "properties": {
                "collectionID": {
                    "type": "string",
                    "format": "uuid"
                },
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "deletedAt": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "expiresAt": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "name": {
                    "type": "string"
                },
                "token": {
                    "type": "string"
                }
            }
        },
        "stores.CollectionShareLinkCreate": {
            "type": "object",
            "required": [
                "expiresAt",
                "name"
            ],
            "properties": {
                "expiresAt": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "name": {
                    "type": "string"
                }
            }
        },
        "stores.CollectionUpdate": {
            "type": "object",
            "required": [
                "avatarUrl",
                "color",
                "description",
                "name"
            ],
            "properties": {
                "avatarUrl": {
                    "type": "string",
                    "x-nullable": true
                },
                "color": {
                    "type": "string",
                    "x-nullable": true
                },
                "description": {
                    "type": "string",
                    "x-nullable": true
                },
                "name": {
                    "type": "string",
                    "x-nullable": true
                }
            }
        },
        "stores.CreateRecipeReview": {
            "type": "object",
            "required": [
                "rating"
            ],
            "properties": {
                "rating": {
                    "type": "integer",
                    "maximum": 5,
                    "minimum": 1
                }
            }
        },
        "stores.DeletedRecipeSummary": {
            "type": "object",
            "required": [
                "collectionId",
                "cookTime",
                "createdAt",
                "deletedAt",
                "description",
                "dietitianVerified",
                "id",
                "imageUrl",
                "isPrivate",
                "name",
                "needsReview",
                "originalUrl",
                "performTime",
                "prepTime",
                "serves",
                "servings",
                "servingsText",
                "slug",
                "totalTime",
                "updatedAt",
                "user",
                "userId"
            ],
            "properties": {
                "collectionId": {
                    "type": "string",
                    "format": "uuid"
                },
                "cookTime": {
                    "type": "integer"
                },
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "deletedAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "description": {
                    "type": "string"
                },
                "dietitianVerified": {
                    "description": "DietitianVerified indicates a verified dietitian has reviewed the recipe's\ningredients and nutrition. Drives the \"Dietitian Verified\" badge.",
                    "type": "boolean"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "imageUrl": {
                    "type": "string"
                },
                "isPrivate": {
                    "description": "Settings Fields",
                    "type": "boolean"
                },
                "name": {
                    "type": "string"
                },
                "needsReview": {
                    "type": "boolean"
                },
                "nutrition": {
                    "$ref": "#/definitions/nutrition.Nutrition"
                },
                "originalUrl": {
                    "type": "string"
                },
                "performTime": {
                    "type": "integer"
                },
                "prepTime": {
                    "type": "integer"
                },
                "serves": {
                    "description": "Servings",
                    "type": "number"
                },
                "servings": {
                    "type": "number"
                },
                "servingsText": {
                    "type": "string"
                },
                "slug": {
                    "type": "string"
                },
                "totalTime": {
                    "description": "Time Fields",
                    "type": "integer"
                },
                "updatedAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "user": {
                    "$ref": "#/definitions/stores.RecipeUser"
                },
                "userId": {
                    "type": "string",
                    "format": "uuid"
                }
            }
        },
        "stores.FamilyMember": {
            "type": "object",
            "required": [
                "displayName",
                "email",
                "id",
                "profilePicture",
                "roles",
                "username"
            ],
            "properties": {
                "displayName": {
                    "type": "string"
                },
                "email": {
                    "type": "string"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "profilePicture": {
                    "type": "string"
                },
                "roles": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.FamilyRole"
                    }
                },
                "username": {
                    "type": "string"
                }
            }
        },
        "stores.FamilyMemberInvitation": {
            "type": "object",
            "required": [
                "createdAt",
                "email",
                "familyId",
                "firstname",
                "id",
                "lastname",
                "updatedAt"
            ],
            "properties": {
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "email": {
                    "type": "string"
                },
                "familyId": {
                    "type": "string",
                    "format": "uuid"
                },
                "firstname": {
                    "type": "string"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "lastname": {
                    "type": "string"
                },
                "updatedAt": {
                    "type": "string",
                    "format": "date-time"
                }
            }
        },
        "stores.FamilyMemberUpdate": {
            "type": "object",
            "required": [
                "roles"
            ],
            "properties": {
                "roles": {
                    "type": "array",
                    "minItems": 1,
                    "items": {
                        "$ref": "#/definitions/models.FamilyRole"
                    }
                }
            }
        },
        "stores.FamilyUpdate": {
            "type": "object",
            "required": [
                "avatarUrl",
                "description",
                "mealPlanTimes",
                "name",
                "recipeSettings",
                "settings",
                "timezone"
            ],
            "properties": {
                "avatarUrl": {
                    "type": "string",
                    "x-nullable": true
                },
                "description": {
                    "type": "string",
                    "maxLength": 1000,
                    "x-nullable": true
                },
                "mealPlanTimes": {
                    "allOf": [
                        {
                            "$ref": "#/definitions/models.MealPlanTimes"
                        }
                    ],
                    "x-nullable": true
                },
                "name": {
                    "type": "string",
                    "maxLength": 255,
                    "minLength": 3,
                    "x-nullable": true
                },
                "recipeSettings": {
                    "allOf": [
                        {
                            "$ref": "#/definitions/models.FamilyRecipeSettings"
                        }
                    ],
                    "x-nullable": true
                },
                "settings": {
                    "allOf": [
                        {
                            "$ref": "#/definitions/models.FamilySettings"
                        }
                    ],
                    "x-nullable": true
                },
                "timezone": {
                    "type": "string",
                    "x-nullable": true
                }
            }
        },
        "stores.Food": {
            "type": "object",
            "required": [
                "category",
                "createdAt",
                "id",
                "immutable",
                "name",
                "plural",
                "updatedAt"
            ],
            "properties": {
                "category": {
                    "type": "string"
                },
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "immutable": {
                    "type": "boolean"
                },
                "name": {
                    "type": "string"
                },
                "plural": {
                    "type": "string"
                },
                "updatedAt": {
                    "type": "string",
                    "format": "date-time"
                }
            }
        },
        "stores.HandoutFile": {
            "type": "object",
            "required": [
                "createdAt",
                "downloadCount",
                "folderId",
                "id",
                "mimeType",
                "originalFilename",
                "uploadedBy"
            ],
            "properties": {
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "downloadCount": {
                    "type": "integer"
                },
                "folderId": {
                    "type": "string",
                    "format": "uuid"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "mimeType": {
                    "type": "string"
                },
                "originalFilename": {
                    "type": "string"
                },
                "uploadedBy": {
                    "description": "UploadedBy is nil once the uploader's account is deleted.",
                    "type": "string",
                    "x-nullable": true,
                    "format": "uuid"
                }
            }
        },
        "stores.HandoutShareLinkDietitian": {
            "type": "object",
            "required": [
                "about",
                "bannerImage",
                "displayName",
                "profilePicture",
                "publicProfile",
                "username"
            ],
            "properties": {
                "about": {
                    "type": "string"
                },
                "bannerImage": {
                    "type": "string"
                },
                "displayName": {
                    "type": "string"
                },
                "professionalProfile": {
                    "$ref": "#/definitions/models.ProfessionalProfile"
                },
                "profilePicture": {
                    "type": "string"
                },
                "publicProfile": {
                    "type": "boolean"
                },
                "username": {
                    "type": "string"
                }
            }
        },
        "stores.HandoutShareLinkPublicView": {
            "type": "object",
            "required": [
                "createdAt",
                "createdBy",
                "dietitian",
                "expiresAt",
                "familyId",
                "folderDescription",
                "folderId",
                "folderName",
                "id",
                "lastAccessedAt",
                "token",
                "viewCount"
            ],
            "properties": {
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "createdBy": {
                    "description": "CreatedBy is nil once the creator's account is deleted.",
                    "type": "string",
                    "x-nullable": true,
                    "format": "uuid"
                },
                "dietitian": {
                    "description": "Dietitian is nil once the link creator's account is deleted.",
                    "allOf": [
                        {
                            "$ref": "#/definitions/stores.HandoutShareLinkDietitian"
                        }
                    ],
                    "x-nullable": true
                },
                "expiresAt": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "familyId": {
                    "type": "string",
                    "format": "uuid"
                },
                "fileId": {
                    "type": "string",
                    "format": "uuid"
                },
                "fileMimeType": {
                    "type": "string"
                },
                "fileName": {
                    "type": "string"
                },
                "folderDescription": {
                    "type": "string",
                    "x-nullable": true
                },
                "folderId": {
                    "type": "string",
                    "format": "uuid"
                },
                "folderName": {
                    "type": "string",
                    "x-nullable": true
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "lastAccessedAt": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "token": {
                    "type": "string"
                },
                "viewCount": {
                    "type": "integer"
                }
            }
        },
        "stores.MealPlan": {
            "type": "object",
            "required": [
                "date",
                "id",
                "leftovers",
                "position",
                "servings",
                "tag"
            ],
            "properties": {
                "date": {
                    "type": "string",
                    "format": "date"
                },
                "description": {
                    "type": "string"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "leftovers": {
                    "type": "boolean"
                },
                "position": {
                    "type": "integer"
                },
                "recipe": {
                    "$ref": "#/definitions/stores.RecipeSummary"
                },
                "recipeId": {
                    "type": "string",
                    "format": "uuid"
                },
                "servings": {
                    "type": "number"
                },
                "tag": {
                    "type": "string"
                },
                "title": {
                    "type": "string"
                }
            }
        },
        "stores.MealPlanBatchUpdate": {
            "type": "object",
            "properties": {
                "id": {
                    "type": "string"
                },
                "updates": {
                    "$ref": "#/definitions/stores.MealPlanUpdate"
                }
            }
        },
        "stores.MealPlanCreate": {
            "type": "object",
            "required": [
                "date",
                "description",
                "leftovers",
                "position",
                "recipeId",
                "servings",
                "tag",
                "title"
            ],
            "properties": {
                "date": {
                    "type": "string",
                    "format": "date"
                },
                "description": {
                    "type": "string",
                    "maxLength": 1000
                },
                "leftovers": {
                    "type": "boolean"
                },
                "position": {
                    "type": "integer",
                    "x-nullable": true
                },
                "recipeId": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "uuid"
                },
                "servings": {
                    "description": "Servings defaults to 1 when omitted.",
                    "type": "number",
                    "maximum": 99,
                    "x-nullable": true
                },
                "tag": {
                    "type": "string",
                    "enum": [
                        "Prep",
                        "Breakfast",
                        "Lunch",
                        "Dinner",
                        "Snack",
                        "Notes"
                    ]
                },
                "title": {
                    "type": "string",
                    "maxLength": 300
                }
            }
        },
        "stores.MealPlanMutation": {
            "type": "object",
            "required": [
                "action",
                "sourceEndDate",
                "sourceStartDate",
                "targetStartDate"
            ],
            "properties": {
                "action": {
                    "enum": [
                        "delete",
                        "move",
                        "copy",
                        "swap"
                    ],
                    "allOf": [
                        {
                            "$ref": "#/definitions/stores.MealPlanMutationAction"
                        }
                    ]
                },
                "sourceEndDate": {
                    "type": "string",
                    "format": "date"
                },
                "sourceStartDate": {
                    "type": "string",
                    "format": "date"
                },
                "targetStartDate": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date"
                }
            }
        },
        "stores.MealPlanMutationAction": {
            "type": "string",
            "enum": [
                "delete",
                "move",
                "copy",
                "swap"
            ],
            "x-enum-varnames": [
                "MealPlanMutationActionDelete",
                "MealPlanMutationActionMove",
                "MealPlanMutationActionCopy",
                "MealPlanMutationActionSwap"
            ]
        },
        "stores.MealPlanUpdate": {
            "type": "object",
            "required": [
                "date",
                "description",
                "leftovers",
                "position",
                "recipeId",
                "servings",
                "tag",
                "title"
            ],
            "properties": {
                "date": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "date"
                },
                "description": {
                    "type": "string",
                    "maxLength": 1000,
                    "x-nullable": true
                },
                "leftovers": {
                    "type": "boolean",
                    "x-nullable": true
                },
                "position": {
                    "type": "integer",
                    "x-nullable": true
                },
                "recipeId": {
                    "description": "Note that this value is only valid for creation on batch calls",
                    "type": "string",
                    "x-nullable": true,
                    "format": "uuid"
                },
                "servings": {
                    "type": "number",
                    "maximum": 99,
                    "x-nullable": true
                },
                "tag": {
                    "type": "string",
                    "enum": [
                        "Prep",
                        "Breakfast",
                        "Lunch",
                        "Dinner",
                        "Snack",
                        "Notes"
                    ],
                    "x-nullable": true
                },
                "title": {
                    "type": "string",
                    "maxLength": 300,
                    "x-nullable": true
                }
            }
        },
        "stores.Operator": {
            "type": "string",
            "enum": [
                "AND",
                "OR"
            ],
            "x-enum-varnames": [
                "OpAnd",
                "OpOr"
            ]
        },
        "stores.Recipe": {
            "type": "object",
            "required": [
                "anonymousUrl",
                "blocks",
                "collectionId",
                "cookTime",
                "createdAt",
                "description",
                "dietitianVerified",
                "id",
                "imageUrl",
                "isPrivate",
                "name",
                "needsReview",
                "nutrition",
                "originalUrl",
                "performTime",
                "prepTime",
                "scalePresets",
                "serves",
                "servings",
                "servingsText",
                "slug",
                "tags",
                "totalTime",
                "updatedAt",
                "user",
                "userId"
            ],
            "properties": {
                "anonymousUrl": {
                    "type": "string"
                },
                "blocks": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.RecipeBlock"
                    }
                },
                "collectionId": {
                    "type": "string",
                    "format": "uuid"
                },
                "cookTime": {
                    "type": "integer"
                },
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "description": {
                    "type": "string"
                },
                "dietitianVerified": {
                    "description": "DietitianVerified indicates a verified dietitian has reviewed the recipe's\ningredients and nutrition. Drives the \"Dietitian Verified\" badge.",
                    "type": "boolean"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "imageUrl": {
                    "type": "string"
                },
                "isPrivate": {
                    "description": "Settings Fields",
                    "type": "boolean"
                },
                "name": {
                    "type": "string"
                },
                "needsReview": {
                    "type": "boolean"
                },
                "nutrition": {
                    "$ref": "#/definitions/nutrition.Nutrition"
                },
                "originalUrl": {
                    "type": "string"
                },
                "performTime": {
                    "type": "integer"
                },
                "prepTime": {
                    "type": "integer"
                },
                "scalePresets": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.RecipeScalePreset"
                    }
                },
                "serves": {
                    "description": "Servings",
                    "type": "number"
                },
                "servings": {
                    "type": "number"
                },
                "servingsText": {
                    "type": "string"
                },
                "slug": {
                    "type": "string"
                },
                "tags": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.Tag"
                    }
                },
                "totalTime": {
                    "description": "Time Fields",
                    "type": "integer"
                },
                "updatedAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "user": {
                    "$ref": "#/definitions/stores.RecipeUser"
                },
                "userId": {
                    "type": "string",
                    "format": "uuid"
                }
            }
        },
        "stores.RecipeBlock": {
            "type": "object",
            "required": [
                "id",
                "ingredients",
                "order",
                "type"
            ],
            "properties": {
                "id": {
                    "description": "ID is the unique identifier for the block.",
                    "type": "string"
                },
                "image": {
                    "description": "ImageURL is the image for the recipe.\nThis field is only valid when Type is BlockTypeImage.",
                    "type": "string"
                },
                "ingredients": {
                    "description": "Ingredients is the list of ingredients for the recipe.\nThis field is only valid when Type is BlockTypeIngredients.",
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/models.Ingredient"
                    }
                },
                "order": {
                    "type": "integer"
                },
                "text": {
                    "description": "Text is the text for the block.\nThis field is only valid when Type is:\n- BlockTypeText\n- BlockTypeNote\n- BlockTypeTitle\n- BlockTypeInstruction\n- BlockTypeImage (alt text / caption)",
                    "type": "string"
                },
                "type": {
                    "$ref": "#/definitions/models.BlockType"
                }
            }
        },
        "stores.RecipeCreate": {
            "type": "object",
            "required": [
                "blocks",
                "cookTime",
                "description",
                "imageUrl",
                "isPrivate",
                "name",
                "nutrition",
                "performTime",
                "prepTime",
                "scalePresets",
                "serves",
                "servings",
                "servingsText",
                "tags",
                "totalTime"
            ],
            "properties": {
                "blocks": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.RecipeBlock"
                    }
                },
                "cookTime": {
                    "type": "integer"
                },
                "description": {
                    "type": "string"
                },
                "imageUrl": {
                    "type": "string"
                },
                "isPrivate": {
                    "type": "boolean"
                },
                "name": {
                    "type": "string"
                },
                "nutrition": {
                    "$ref": "#/definitions/nutrition.Nutrition"
                },
                "performTime": {
                    "type": "integer"
                },
                "prepTime": {
                    "type": "integer"
                },
                "scalePresets": {
                    "type": "array",
                    "maxItems": 20,
                    "items": {
                        "$ref": "#/definitions/models.RecipeScalePreset"
                    }
                },
                "serves": {
                    "description": "Servings",
                    "type": "number",
                    "maximum": 1000
                },
                "servings": {
                    "type": "number",
                    "maximum": 1000
                },
                "servingsText": {
                    "type": "string"
                },
                "tags": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "totalTime": {
                    "description": "Time Fields",
                    "type": "integer"
                }
            }
        },
        "stores.RecipeDocumentQuery": {
            "type": "object",
            "required": [
                "averageRating",
                "collections",
                "direction",
                "domains",
                "favoritedBy",
                "favoritedByOperator",
                "ingredients",
                "ingredientsOperator",
                "orderBy",
                "search",
                "skip",
                "tagOperator",
                "tags",
                "take",
                "totalTime",
                "type",
                "username"
            ],
            "properties": {
                "averageRating": {
                    "type": "string"
                },
                "collections": {
                    "type": "array",
                    "items": {
                        "type": "string",
                        "format": "uuid"
                    }
                },
                "direction": {
                    "type": "string",
                    "enum": [
                        "asc",
                        "desc"
                    ]
                },
                "domains": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "favoritedBy": {
                    "type": "array",
                    "items": {
                        "type": "string",
                        "format": "uuid"
                    }
                },
                "favoritedByOperator": {
                    "enum": [
                        "AND",
                        "OR"
                    ],
                    "allOf": [
                        {
                            "$ref": "#/definitions/stores.Operator"
                        }
                    ]
                },
                "ingredients": {
                    "description": "Advanced",
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "ingredientsOperator": {
                    "enum": [
                        "AND",
                        "OR"
                    ],
                    "allOf": [
                        {
                            "$ref": "#/definitions/stores.Operator"
                        }
                    ]
                },
                "orderBy": {
                    "type": "string",
                    "enum": [
                        "name",
                        "createdAt",
                        "updatedAt",
                        "averageRating"
                    ]
                },
                "search": {
                    "type": "string"
                },
                "skip": {
                    "type": "integer",
                    "minimum": 0
                },
                "tagOperator": {
                    "enum": [
                        "AND",
                        "OR"
                    ],
                    "allOf": [
                        {
                            "$ref": "#/definitions/stores.Operator"
                        }
                    ]
                },
                "tags": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "take": {
                    "type": "integer",
                    "maximum": 100,
                    "minimum": 0
                },
                "totalTime": {
                    "type": "string"
                },
                "type": {
                    "type": "string",
                    "enum": [
                        "recipes",
                        "ingredients"
                    ]
                },
                "username": {
                    "type": "string"
                }
            }
        },
        "stores.RecipeMutation": {
            "type": "object",
            "required": [
                "type"
            ],
            "properties": {
                "collectionId": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "uuid"
                },
                "collectionName": {
                    "type": "string",
                    "maxLength": 128,
                    "minLength": 1,
                    "x-nullable": true
                },
                "tags": {
                    "type": "array",
                    "maxItems": 20,
                    "minItems": 1,
                    "items": {
                        "type": "string"
                    },
                    "x-nullable": true
                },
                "type": {
                    "enum": [
                        "set-collection-id",
                        "delete",
                        "add-tags",
                        "remove-tags"
                    ],
                    "allOf": [
                        {
                            "$ref": "#/definitions/stores.RecipeMutationType"
                        }
                    ]
                }
            }
        },
        "stores.RecipeMutationType": {
            "type": "string",
            "enum": [
                "set-collection-id",
                "delete",
                "add-tags",
                "remove-tags"
            ],
            "x-enum-varnames": [
                "RecipeMutationTypeSetCollectionID",
                "RecipeMutationTypeDelete",
                "RecipeMutationTypeAddTag",
                "RecipeMutationTypeRemoveTag"
            ]
        },
        "stores.RecipeReview": {
            "type": "object",
            "required": [
                "rating",
                "recipeId",
                "username"
            ],
            "properties": {
                "rating": {
                    "type": "integer"
                },
                "recipeId": {
                    "type": "string",
                    "format": "uuid"
                },
                "username": {
                    "type": "string"
                }
            }
        },
        "stores.RecipeReviews": {
            "type": "object",
            "required": [
                "average",
                "reviews"
            ],
            "properties": {
                "average": {
                    "type": "number"
                },
                "reviews": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.RecipeReview"
                    }
                }
            }
        },
        "stores.RecipeSearchHit": {
            "type": "object",
            "required": [
                "anonymousURL",
                "averageRating",
                "collectionId",
                "createdAt",
                "description",
                "favoritedBy",
                "id",
                "imageUrl",
                "name",
                "serves",
                "servings",
                "servingsText",
                "slug",
                "tags",
                "totalTime",
                "updatedAt",
                "username"
            ],
            "properties": {
                "anonymousURL": {
                    "type": "string"
                },
                "averageRating": {
                    "type": "number"
                },
                "collectionId": {
                    "type": "string",
                    "format": "uuid"
                },
                "createdAt": {
                    "type": "integer"
                },
                "description": {
                    "type": "string"
                },
                "favoritedBy": {
                    "type": "array",
                    "items": {
                        "type": "string",
                        "format": "uuid"
                    }
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "imageUrl": {
                    "type": "string"
                },
                "name": {
                    "type": "string"
                },
                "serves": {
                    "type": "number"
                },
                "servings": {
                    "type": "number"
                },
                "servingsText": {
                    "type": "string"
                },
                "slug": {
                    "type": "string"
                },
                "tags": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "totalTime": {
                    "type": "integer"
                },
                "updatedAt": {
                    "type": "integer"
                },
                "username": {
                    "type": "string"
                }
            }
        },
        "stores.RecipeSummary": {
            "type": "object",
            "required": [
                "collectionId",
                "cookTime",
                "createdAt",
                "description",
                "dietitianVerified",
                "id",
                "imageUrl",
                "isPrivate",
                "name",
                "needsReview",
                "originalUrl",
                "performTime",
                "prepTime",
                "serves",
                "servings",
                "servingsText",
                "slug",
                "totalTime",
                "updatedAt",
                "user",
                "userId"
            ],
            "properties": {
                "collectionId": {
                    "type": "string",
                    "format": "uuid"
                },
                "cookTime": {
                    "type": "integer"
                },
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "description": {
                    "type": "string"
                },
                "dietitianVerified": {
                    "description": "DietitianVerified indicates a verified dietitian has reviewed the recipe's\ningredients and nutrition. Drives the \"Dietitian Verified\" badge.",
                    "type": "boolean"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "imageUrl": {
                    "type": "string"
                },
                "isPrivate": {
                    "description": "Settings Fields",
                    "type": "boolean"
                },
                "name": {
                    "type": "string"
                },
                "needsReview": {
                    "type": "boolean"
                },
                "nutrition": {
                    "$ref": "#/definitions/nutrition.Nutrition"
                },
                "originalUrl": {
                    "type": "string"
                },
                "performTime": {
                    "type": "integer"
                },
                "prepTime": {
                    "type": "integer"
                },
                "serves": {
                    "description": "Servings",
                    "type": "number"
                },
                "servings": {
                    "type": "number"
                },
                "servingsText": {
                    "type": "string"
                },
                "slug": {
                    "type": "string"
                },
                "totalTime": {
                    "description": "Time Fields",
                    "type": "integer"
                },
                "updatedAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "user": {
                    "$ref": "#/definitions/stores.RecipeUser"
                },
                "userId": {
                    "type": "string",
                    "format": "uuid"
                }
            }
        },
        "stores.RecipeUpdate": {
            "type": "object",
            "required": [
                "blocks",
                "collectionId",
                "cookTime",
                "description",
                "dietitianVerified",
                "imageUrl",
                "isPrivate",
                "name",
                "needsReview",
                "nutrition",
                "performTime",
                "prepTime",
                "scalePresets",
                "serves",
                "servings",
                "servingsText",
                "slug",
                "tags",
                "totalTime"
            ],
            "properties": {
                "blocks": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.RecipeBlock"
                    },
                    "x-nullable": true
                },
                "collectionId": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "uuid"
                },
                "cookTime": {
                    "type": "integer",
                    "x-nullable": true
                },
                "description": {
                    "type": "string",
                    "x-nullable": true
                },
                "dietitianVerified": {
                    "description": "DietitianVerified marks the recipe as reviewed by a verified dietitian.\nSetting this requires the family's Dietitian feature flag to be enabled.",
                    "type": "boolean",
                    "x-nullable": true
                },
                "imageUrl": {
                    "type": "string",
                    "x-nullable": true
                },
                "isPrivate": {
                    "description": "Settings",
                    "type": "boolean",
                    "x-nullable": true
                },
                "name": {
                    "type": "string",
                    "x-nullable": true
                },
                "needsReview": {
                    "type": "boolean",
                    "x-nullable": true
                },
                "nutrition": {
                    "allOf": [
                        {
                            "$ref": "#/definitions/nutrition.Nutrition"
                        }
                    ],
                    "x-nullable": true
                },
                "performTime": {
                    "type": "integer",
                    "x-nullable": true
                },
                "prepTime": {
                    "type": "integer",
                    "x-nullable": true
                },
                "scalePresets": {
                    "type": "array",
                    "maxItems": 20,
                    "items": {
                        "$ref": "#/definitions/models.RecipeScalePreset"
                    },
                    "x-nullable": true
                },
                "serves": {
                    "description": "Servings",
                    "type": "number",
                    "x-nullable": true
                },
                "servings": {
                    "type": "number",
                    "x-nullable": true
                },
                "servingsText": {
                    "type": "string",
                    "x-nullable": true
                },
                "slug": {
                    "type": "string",
                    "x-nullable": true
                },
                "tags": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    },
                    "x-nullable": true
                },
                "totalTime": {
                    "description": "Time Fields",
                    "type": "integer",
                    "x-nullable": true
                }
            }
        },
        "stores.RecipeUser": {
            "type": "object",
            "required": [
                "displayName",
                "id",
                "username"
            ],
            "properties": {
                "displayName": {
                    "type": "string"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "username": {
                    "type": "string"
                }
            }
        },
        "stores.RefMutation": {
            "type": "object",
            "required": [
                "refId",
                "type"
            ],
            "properties": {
                "refId": {
                    "type": "string",
                    "format": "uuid"
                },
                "type": {
                    "enum": [
                        "remove-ref"
                    ],
                    "allOf": [
                        {
                            "$ref": "#/definitions/stores.RefMutationType"
                        }
                    ]
                }
            }
        },
        "stores.RefMutationType": {
            "type": "string",
            "enum": [
                "remove-ref"
            ],
            "x-enum-varnames": [
                "RefMutationTypeRemoveRef"
            ]
        },
        "stores.Schema": {
            "type": "object",
            "properties": {
                "@context": {
                    "type": "string"
                },
                "@type": {
                    "type": "string"
                },
                "cookTime": {
                    "type": "string"
                },
                "description": {
                    "type": "string"
                },
                "image": {
                    "type": "string"
                },
                "name": {
                    "type": "string"
                },
                "prepTime": {
                    "type": "string"
                },
                "recipeIngredient": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "recipeInstructions": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "recipinnedExtras": {
                    "description": "Extra properties not included in schema",
                    "allOf": [
                        {
                            "$ref": "#/definitions/stores.SchemaExtras"
                        }
                    ]
                },
                "tags": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "totalTime": {
                    "type": "string"
                }
            }
        },
        "stores.SchemaExtras": {
            "type": "object",
            "required": [
                "notes"
            ],
            "properties": {
                "notes": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                }
            }
        },
        "stores.ShoppingList": {
            "type": "object",
            "required": [
                "createdAt",
                "familyId",
                "id",
                "isDefault",
                "name"
            ],
            "properties": {
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "familyId": {
                    "type": "string",
                    "format": "uuid"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "isDefault": {
                    "type": "boolean"
                },
                "name": {
                    "type": "string"
                }
            }
        },
        "stores.ShoppingListFavorite": {
            "type": "object",
            "required": [
                "category",
                "createdAt",
                "foodKeys",
                "id",
                "quantity",
                "text",
                "unit",
                "updatedAt"
            ],
            "properties": {
                "category": {
                    "type": "string"
                },
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "foodKeys": {
                    "description": "FoodKeys match ShoppingListItem.FoodKeys; a favorite is on a list when\nan item there shares one.",
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "quantity": {
                    "type": "number"
                },
                "text": {
                    "type": "string"
                },
                "unit": {
                    "type": "string"
                },
                "updatedAt": {
                    "type": "string",
                    "format": "date-time"
                }
            }
        },
        "stores.ShoppingListFavoriteCreate": {
            "type": "object",
            "required": [
                "category",
                "quantity",
                "text",
                "unit"
            ],
            "properties": {
                "category": {
                    "type": "string",
                    "maxLength": 255
                },
                "quantity": {
                    "type": "number",
                    "minimum": 0
                },
                "text": {
                    "type": "string",
                    "maxLength": 255
                },
                "unit": {
                    "type": "string",
                    "maxLength": 255
                }
            }
        },
        "stores.ShoppingListFilter": {
            "type": "object",
            "required": [
                "createdAt",
                "filterType",
                "id",
                "text",
                "updatedAt"
            ],
            "properties": {
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "filterType": {
                    "$ref": "#/definitions/models.ShoppingListFilterType"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "text": {
                    "type": "string"
                },
                "updatedAt": {
                    "type": "string",
                    "format": "date-time"
                }
            }
        },
        "stores.ShoppingListFilterCreate": {
            "type": "object",
            "required": [
                "filterType",
                "text"
            ],
            "properties": {
                "filterType": {
                    "enum": [
                        "exact",
                        "contains"
                    ],
                    "allOf": [
                        {
                            "$ref": "#/definitions/models.ShoppingListFilterType"
                        }
                    ]
                },
                "text": {
                    "type": "string",
                    "maxLength": 255
                }
            }
        },
        "stores.ShoppingListFilterUpdate": {
            "type": "object",
            "required": [
                "filterType",
                "id",
                "text"
            ],
            "properties": {
                "filterType": {
                    "enum": [
                        "exact",
                        "contains"
                    ],
                    "allOf": [
                        {
                            "$ref": "#/definitions/models.ShoppingListFilterType"
                        }
                    ],
                    "x-nullable": true
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "text": {
                    "type": "string",
                    "maxLength": 255,
                    "x-nullable": true
                }
            }
        },
        "stores.ShoppingListIngredient": {
            "type": "object",
            "required": [
                "food",
                "id",
                "mealPlanId",
                "quantity",
                "recipeId",
                "unit"
            ],
            "properties": {
                "food": {
                    "type": "string"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "mealPlanId": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "uuid"
                },
                "quantity": {
                    "description": "Quantity represents the scaled quantity of the ingredient, if applicable it should take into acount the factor.",
                    "type": "number"
                },
                "recipeId": {
                    "type": "string",
                    "format": "uuid"
                },
                "unit": {
                    "type": "string"
                }
            }
        },
        "stores.ShoppingListItem": {
            "type": "object",
            "required": [
                "category",
                "checked",
                "foodKeys",
                "id",
                "ingredients",
                "order",
                "quantity",
                "shoppingListId",
                "text",
                "unit"
            ],
            "properties": {
                "category": {
                    "type": "string"
                },
                "checked": {
                    "type": "boolean"
                },
                "foodKeys": {
                    "description": "FoodKeys are set on reads; items that share a key are the same food.",
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "ingredients": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.ShoppingListItemRef"
                    }
                },
                "order": {
                    "type": "integer"
                },
                "quantity": {
                    "type": "number"
                },
                "shoppingListId": {
                    "type": "string",
                    "format": "uuid"
                },
                "text": {
                    "type": "string"
                },
                "unit": {
                    "type": "string"
                }
            }
        },
        "stores.ShoppingListItemCreateDto": {
            "type": "object",
            "required": [
                "category",
                "quantity",
                "text",
                "unit"
            ],
            "properties": {
                "category": {
                    "type": "string",
                    "maxLength": 255
                },
                "quantity": {
                    "type": "number",
                    "minimum": 0
                },
                "text": {
                    "type": "string",
                    "maxLength": 255
                },
                "unit": {
                    "type": "string",
                    "maxLength": 255
                }
            }
        },
        "stores.ShoppingListItemRef": {
            "type": "object",
            "required": [
                "factor",
                "id",
                "ingredient",
                "mealPlanId",
                "shoppingListItemId"
            ],
            "properties": {
                "factor": {
                    "type": "number"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "ingredient": {
                    "$ref": "#/definitions/stores.ShoppingListIngredient"
                },
                "mealPlanId": {
                    "type": "string",
                    "x-nullable": true,
                    "format": "uuid"
                },
                "shoppingListItemId": {
                    "type": "string",
                    "format": "uuid"
                }
            }
        },
        "stores.ShoppingListItemUpdate": {
            "type": "object",
            "required": [
                "category",
                "checked",
                "mutations",
                "order",
                "quantity",
                "text",
                "unit"
            ],
            "properties": {
                "category": {
                    "type": "string",
                    "maxLength": 255,
                    "x-nullable": true
                },
                "checked": {
                    "type": "boolean",
                    "x-nullable": true
                },
                "mutations": {
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.RefMutation"
                    }
                },
                "order": {
                    "type": "integer",
                    "minimum": 0,
                    "x-nullable": true
                },
                "quantity": {
                    "type": "number",
                    "minimum": 0,
                    "x-nullable": true
                },
                "text": {
                    "type": "string",
                    "maxLength": 255,
                    "x-nullable": true
                },
                "unit": {
                    "type": "string",
                    "maxLength": 255,
                    "x-nullable": true
                }
            }
        },
        "stores.ShoppingListNameDto": {
            "type": "object",
            "required": [
                "name"
            ],
            "properties": {
                "name": {
                    "type": "string",
                    "maxLength": 255
                }
            }
        },
        "stores.ShoppingListRecipePreview": {
            "type": "object",
            "required": [
                "id",
                "imageUrl",
                "name"
            ],
            "properties": {
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "imageUrl": {
                    "type": "string"
                },
                "name": {
                    "type": "string"
                }
            }
        },
        "stores.ShoppingListSummary": {
            "type": "object",
            "required": [
                "createdAt",
                "familyId",
                "id",
                "isDefault",
                "itemsCount",
                "mealPlansCount",
                "name",
                "recipes",
                "recipesCount"
            ],
            "properties": {
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "familyId": {
                    "type": "string",
                    "format": "uuid"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "isDefault": {
                    "type": "boolean"
                },
                "itemsCount": {
                    "type": "integer"
                },
                "mealPlansCount": {
                    "type": "integer"
                },
                "name": {
                    "type": "string"
                },
                "recipes": {
                    "description": "Recipes holds up to three recipes behind the list's unchecked items,\nrecipes with a photo of their own first.",
                    "type": "array",
                    "items": {
                        "$ref": "#/definitions/stores.ShoppingListRecipePreview"
                    }
                },
                "recipesCount": {
                    "type": "integer"
                }
            }
        },
        "stores.Tag": {
            "type": "object",
            "required": [
                "id",
                "name",
                "slug"
            ],
            "properties": {
                "id": {
                    "type": "string"
                },
                "name": {
                    "type": "string"
                },
                "slug": {
                    "type": "string"
                }
            }
        },
        "stores.Unit": {
            "type": "object",
            "required": [
                "abbreviation",
                "abbreviation_plural",
                "createdAt",
                "id",
                "immutable",
                "name",
                "plural",
                "updatedAt",
                "weight"
            ],
            "properties": {
                "abbreviation": {
                    "type": "string"
                },
                "abbreviation_plural": {
                    "type": "string"
                },
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "immutable": {
                    "type": "boolean"
                },
                "name": {
                    "type": "string"
                },
                "plural": {
                    "type": "string"
                },
                "updatedAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "weight": {
                    "type": "integer"
                }
            }
        },
        "stores.User": {
            "type": "object",
            "required": [
                "about",
                "aiConsentAt",
                "analyticsOptOutAt",
                "bannerImage",
                "createdAt",
                "displayName",
                "email",
                "familyId",
                "familyTier",
                "id",
                "isVerified",
                "locked",
                "newsletterConsentAt",
                "privateCollectionId",
                "profilePicture",
                "publicProfile",
                "recentlyEmailed",
                "updatedAt",
                "username"
            ],
            "properties": {
                "about": {
                    "type": "string"
                },
                "aiConsentAt": {
                    "description": "AIConsentAt is when the user turned AI features on, or nil while they\nare off.",
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "analyticsOptOutAt": {
                    "description": "AnalyticsOptOutAt is when the user turned off usage analytics and error\nreports, or nil while they share them.",
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "bannerImage": {
                    "type": "string"
                },
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "displayName": {
                    "type": "string"
                },
                "email": {
                    "type": "string"
                },
                "familyId": {
                    "type": "string",
                    "format": "uuid"
                },
                "familyTier": {
                    "description": "FamilyTier mirrors Family.Tier and is derived from the SQL join on families.\nIt is read-only and authoritative on Family, not User.",
                    "allOf": [
                        {
                            "$ref": "#/definitions/models.FamilyTier"
                        }
                    ]
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "isVerified": {
                    "type": "boolean"
                },
                "locked": {
                    "type": "boolean"
                },
                "newsletterConsentAt": {
                    "description": "NewsletterConsentAt is when the user asked for the newsletter, or nil if\nthey have not. Unsubscribing from an email does not clear it, so it is not\nthe subscription state.",
                    "type": "string",
                    "x-nullable": true,
                    "format": "date-time"
                },
                "privateCollectionId": {
                    "description": "FamilyCollectionID is the ID for the collection that the user is assigned to by default\nand where all their private recipes are stored.",
                    "type": "string",
                    "format": "uuid"
                },
                "professionalProfile": {
                    "$ref": "#/definitions/models.ProfessionalProfile"
                },
                "profilePicture": {
                    "type": "string"
                },
                "publicProfile": {
                    "type": "boolean"
                },
                "recentlyEmailed": {
                    "type": "array",
                    "items": {
                        "type": "string"
                    }
                },
                "updatedAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "username": {
                    "type": "string"
                }
            }
        },
        "stores.UserInboxEntry": {
            "type": "object",
            "required": [
                "createdAt",
                "id",
                "level",
                "message",
                "properties",
                "status",
                "title",
                "type",
                "userId"
            ],
            "properties": {
                "createdAt": {
                    "type": "string",
                    "format": "date-time"
                },
                "id": {
                    "type": "string",
                    "format": "uuid"
                },
                "level": {
                    "$ref": "#/definitions/models.InboxEntryLevel"
                },
                "message": {
                    "type": "string"
                },
                "properties": {
                    "type": "object",
                    "additionalProperties": {
                        "type": "string"
                    }
                },
                "status": {
                    "$ref": "#/definitions/models.InboxEntryStatus"
                },
                "title": {
                    "type": "string"
                },
                "type": {
                    "$ref": "#/definitions/models.InboxEntryType"
                },
                "userId": {
                    "type": "string",
                    "format": "uuid"
                }
            }
        }
    },
    "securityDefinitions": {
        "Bearer": {
            "description": "\"Type 'Bearer TOKEN' to correctly set the API Key\"",
            "type": "apiKey",
            "name": "Authorization",
            "in": "header"
        }
    }
}