diff --git a/docs/docs.go b/docs/docs.go new file mode 100644 index 0000000..37662df --- /dev/null +++ b/docs/docs.go @@ -0,0 +1,1602 @@ +// Package docs Code generated by swaggo/swag. DO NOT EDIT +package docs + +import "github.com/swaggo/swag" + +const docTemplate = `{ + "schemes": {{ marshal .Schemes }}, + "swagger": "2.0", + "info": { + "description": "{{escape .Description}}", + "title": "{{.Title}}", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "name": "API Support", + "url": "http://www.swagger.io/support", + "email": "support@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "{{.Version}}" + }, + "host": "{{.Host}}", + "basePath": "{{.BasePath}}", + "paths": { + "/products/search": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Search for products by name", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "products" + ], + "summary": "Search products", + "parameters": [ + { + "type": "string", + "description": "Search query (min 3 chars)", + "name": "q", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "Limit results (default 10, max 100)", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/product.Product" + } + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/products/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Get a single product by its ID", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "products" + ], + "summary": "Get product by ID", + "parameters": [ + { + "type": "string", + "description": "Product ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/product.Product" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + } + }, + "definitions": { + "product.Product": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_keywords": { + "type": "array", + "items": { + "type": "string" + } + }, + "allergens": { + "type": "string" + }, + "allergens_from_ingredients": { + "type": "string" + }, + "allergens_from_user": { + "type": "string" + }, + "allergens_hierarchy": { + "type": "array", + "items": {} + }, + "allergens_tags": { + "type": "array", + "items": {} + }, + "brands": { + "type": "string" + }, + "brands_hierarchy": { + "type": "array", + "items": { + "type": "string" + } + }, + "brands_lc": { + "type": "string" + }, + "brands_old": { + "type": "string" + }, + "brands_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "categories_properties": { + "type": "object" + }, + "categories_properties_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "checkers_tags": { + "type": "array", + "items": {} + }, + "code": { + "type": "string" + }, + "codes_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "complete": { + "type": "integer" + }, + "completeness": { + "type": "number" + }, + "countries": { + "type": "string" + }, + "countries_hierarchy": { + "type": "array", + "items": { + "type": "string" + } + }, + "countries_lc": { + "type": "string" + }, + "countries_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "created_t": { + "type": "integer" + }, + "data_quality_info_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "data_quality_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "data_sources_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "ecoscore_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "entry_dates_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "environmental_score_data": { + "type": "object", + "properties": { + "adjustments": { + "type": "object", + "properties": { + "origins_of_ingredients": { + "type": "object", + "properties": { + "aggregated_origins": { + "type": "array", + "items": { + "type": "object", + "properties": { + "origin": { + "type": "string" + }, + "percent": { + "type": "integer" + } + } + } + }, + "epi_score": { + "type": "integer" + }, + "epi_value": { + "type": "integer" + }, + "origins_from_categories": { + "type": "array", + "items": { + "type": "string" + } + }, + "origins_from_origins_field": { + "type": "array", + "items": { + "type": "string" + } + }, + "transportation_scores": { + "type": "object", + "properties": { + "ad": { + "type": "number" + }, + "al": { + "type": "number" + }, + "at": { + "type": "number" + }, + "ax": { + "type": "number" + }, + "ba": { + "type": "number" + }, + "be": { + "type": "number" + }, + "bg": { + "type": "number" + }, + "ch": { + "type": "number" + }, + "cy": { + "type": "number" + }, + "cz": { + "type": "number" + }, + "de": { + "type": "number" + }, + "dk": { + "type": "number" + }, + "dz": { + "type": "number" + }, + "ee": { + "type": "number" + }, + "eg": { + "type": "number" + }, + "es": { + "type": "number" + }, + "fi": { + "type": "number" + }, + "fo": { + "type": "number" + }, + "fr": { + "type": "number" + }, + "gg": { + "type": "number" + }, + "gi": { + "type": "number" + }, + "gr": { + "type": "number" + }, + "hr": { + "type": "number" + }, + "hu": { + "type": "number" + }, + "ie": { + "type": "number" + }, + "il": { + "type": "number" + }, + "im": { + "type": "number" + }, + "is": { + "type": "number" + }, + "it": { + "type": "number" + }, + "je": { + "type": "number" + }, + "lb": { + "type": "number" + }, + "li": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lu": { + "type": "number" + }, + "lv": { + "type": "number" + }, + "ly": { + "type": "number" + }, + "ma": { + "type": "number" + }, + "mc": { + "type": "number" + }, + "md": { + "type": "number" + }, + "me": { + "type": "number" + }, + "mk": { + "type": "number" + }, + "mt": { + "type": "number" + }, + "nl": { + "type": "number" + }, + "no": { + "type": "number" + }, + "pl": { + "type": "number" + }, + "ps": { + "type": "number" + }, + "pt": { + "type": "number" + }, + "ro": { + "type": "number" + }, + "rs": { + "type": "number" + }, + "se": { + "type": "number" + }, + "si": { + "type": "number" + }, + "sj": { + "type": "number" + }, + "sk": { + "type": "number" + }, + "sm": { + "type": "number" + }, + "sy": { + "type": "number" + }, + "tn": { + "type": "number" + }, + "tr": { + "type": "number" + }, + "ua": { + "type": "number" + }, + "uk": { + "type": "number" + }, + "us": { + "type": "number" + }, + "va": { + "type": "number" + }, + "world": { + "type": "number" + }, + "xk": { + "type": "number" + } + } + }, + "transportation_values": { + "type": "object", + "properties": { + "ad": { + "type": "integer" + }, + "al": { + "type": "integer" + }, + "at": { + "type": "integer" + }, + "ax": { + "type": "integer" + }, + "ba": { + "type": "integer" + }, + "be": { + "type": "integer" + }, + "bg": { + "type": "integer" + }, + "ch": { + "type": "integer" + }, + "cy": { + "type": "integer" + }, + "cz": { + "type": "integer" + }, + "de": { + "type": "integer" + }, + "dk": { + "type": "integer" + }, + "dz": { + "type": "integer" + }, + "ee": { + "type": "integer" + }, + "eg": { + "type": "integer" + }, + "es": { + "type": "integer" + }, + "fi": { + "type": "integer" + }, + "fo": { + "type": "integer" + }, + "fr": { + "type": "integer" + }, + "gg": { + "type": "integer" + }, + "gi": { + "type": "integer" + }, + "gr": { + "type": "integer" + }, + "hr": { + "type": "integer" + }, + "hu": { + "type": "integer" + }, + "ie": { + "type": "integer" + }, + "il": { + "type": "integer" + }, + "im": { + "type": "integer" + }, + "is": { + "type": "integer" + }, + "it": { + "type": "integer" + }, + "je": { + "type": "integer" + }, + "lb": { + "type": "integer" + }, + "li": { + "type": "integer" + }, + "lt": { + "type": "integer" + }, + "lu": { + "type": "integer" + }, + "lv": { + "type": "integer" + }, + "ly": { + "type": "integer" + }, + "ma": { + "type": "integer" + }, + "mc": { + "type": "integer" + }, + "md": { + "type": "integer" + }, + "me": { + "type": "integer" + }, + "mk": { + "type": "integer" + }, + "mt": { + "type": "integer" + }, + "nl": { + "type": "integer" + }, + "no": { + "type": "integer" + }, + "pl": { + "type": "integer" + }, + "ps": { + "type": "integer" + }, + "pt": { + "type": "integer" + }, + "ro": { + "type": "integer" + }, + "rs": { + "type": "integer" + }, + "se": { + "type": "integer" + }, + "si": { + "type": "integer" + }, + "sj": { + "type": "integer" + }, + "sk": { + "type": "integer" + }, + "sm": { + "type": "integer" + }, + "sy": { + "type": "integer" + }, + "tn": { + "type": "integer" + }, + "tr": { + "type": "integer" + }, + "ua": { + "type": "integer" + }, + "uk": { + "type": "integer" + }, + "us": { + "type": "integer" + }, + "va": { + "type": "integer" + }, + "world": { + "type": "integer" + }, + "xk": { + "type": "integer" + } + } + }, + "values": { + "type": "object", + "properties": { + "ad": { + "type": "integer" + }, + "al": { + "type": "integer" + }, + "at": { + "type": "integer" + }, + "ax": { + "type": "integer" + }, + "ba": { + "type": "integer" + }, + "be": { + "type": "integer" + }, + "bg": { + "type": "integer" + }, + "ch": { + "type": "integer" + }, + "cy": { + "type": "integer" + }, + "cz": { + "type": "integer" + }, + "de": { + "type": "integer" + }, + "dk": { + "type": "integer" + }, + "dz": { + "type": "integer" + }, + "ee": { + "type": "integer" + }, + "eg": { + "type": "integer" + }, + "es": { + "type": "integer" + }, + "fi": { + "type": "integer" + }, + "fo": { + "type": "integer" + }, + "fr": { + "type": "integer" + }, + "gg": { + "type": "integer" + }, + "gi": { + "type": "integer" + }, + "gr": { + "type": "integer" + }, + "hr": { + "type": "integer" + }, + "hu": { + "type": "integer" + }, + "ie": { + "type": "integer" + }, + "il": { + "type": "integer" + }, + "im": { + "type": "integer" + }, + "is": { + "type": "integer" + }, + "it": { + "type": "integer" + }, + "je": { + "type": "integer" + }, + "lb": { + "type": "integer" + }, + "li": { + "type": "integer" + }, + "lt": { + "type": "integer" + }, + "lu": { + "type": "integer" + }, + "lv": { + "type": "integer" + }, + "ly": { + "type": "integer" + }, + "ma": { + "type": "integer" + }, + "mc": { + "type": "integer" + }, + "md": { + "type": "integer" + }, + "me": { + "type": "integer" + }, + "mk": { + "type": "integer" + }, + "mt": { + "type": "integer" + }, + "nl": { + "type": "integer" + }, + "no": { + "type": "integer" + }, + "pl": { + "type": "integer" + }, + "ps": { + "type": "integer" + }, + "pt": { + "type": "integer" + }, + "ro": { + "type": "integer" + }, + "rs": { + "type": "integer" + }, + "se": { + "type": "integer" + }, + "si": { + "type": "integer" + }, + "sj": { + "type": "integer" + }, + "sk": { + "type": "integer" + }, + "sm": { + "type": "integer" + }, + "sy": { + "type": "integer" + }, + "tn": { + "type": "integer" + }, + "tr": { + "type": "integer" + }, + "ua": { + "type": "integer" + }, + "uk": { + "type": "integer" + }, + "us": { + "type": "integer" + }, + "va": { + "type": "integer" + }, + "world": { + "type": "integer" + }, + "xk": { + "type": "integer" + } + } + }, + "warning": { + "type": "string" + } + } + }, + "packaging": { + "type": "object", + "properties": { + "value": { + "type": "integer" + }, + "warning": { + "type": "string" + } + } + }, + "production_system": { + "type": "object", + "properties": { + "labels": { + "type": "array", + "items": {} + }, + "value": { + "type": "integer" + }, + "warning": { + "type": "string" + } + } + }, + "threatened_species": { + "type": "object", + "properties": { + "warning": { + "type": "string" + } + } + } + } + }, + "agribalyse": { + "type": "object", + "properties": { + "warning": { + "type": "string" + } + } + }, + "grade": { + "type": "string" + }, + "missing": { + "type": "object", + "properties": { + "categories": { + "type": "integer" + }, + "ingredients": { + "type": "integer" + }, + "labels": { + "type": "integer" + }, + "origins": { + "type": "integer" + }, + "packagings": { + "type": "integer" + } + } + }, + "missing_agribalyse_match_warning": { + "type": "integer" + }, + "missing_key_data": { + "type": "integer" + }, + "status": { + "type": "string" + } + } + }, + "environmental_score_grade": { + "type": "string" + }, + "environmental_score_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "food_groups_tags": { + "type": "array", + "items": {} + }, + "id": { + "type": "string" + }, + "informers_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "lang": { + "type": "string" + }, + "languages_hierarchy": { + "type": "array", + "items": { + "type": "string" + } + }, + "languages_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "last_edit_dates_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "last_modified_t": { + "type": "integer" + }, + "last_updated_t": { + "type": "integer" + }, + "lc": { + "type": "string" + }, + "main_countries_tags": { + "type": "array", + "items": {} + }, + "max_imgid": { + "type": "string" + }, + "misc_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "no_nutrition_data": { + "type": "string" + }, + "nova_group_debug": { + "type": "string" + }, + "nova_groups_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "nutrient_levels": { + "type": "object" + }, + "nutriments": { + "type": "object", + "properties": { + "carbohydrates": { + "type": "number" + }, + "carbohydrates_100g": { + "type": "number" + }, + "carbohydrates_serving": { + "type": "number" + }, + "carbohydrates_unit": { + "type": "string" + }, + "carbohydrates_value": { + "type": "number" + }, + "energy": { + "type": "number" + }, + "energy-kcal": { + "type": "number" + }, + "energy-kcal_100g": { + "type": "number" + }, + "energy-kcal_serving": { + "type": "number" + }, + "energy-kcal_unit": { + "type": "string" + }, + "energy-kcal_value": { + "type": "number" + }, + "energy-kcal_value_computed": { + "type": "number" + }, + "energy_100g": { + "type": "number" + }, + "energy_serving": { + "type": "number" + }, + "energy_unit": { + "type": "string" + }, + "energy_value": { + "type": "number" + }, + "fat": { + "type": "number" + }, + "fat_100g": { + "type": "number" + }, + "fat_serving": { + "type": "number" + }, + "fat_unit": { + "type": "string" + }, + "fat_value": { + "type": "number" + }, + "fruits-vegetables-legumes-estimate-from-ingredients_100g": { + "type": "number" + }, + "fruits-vegetables-legumes-estimate-from-ingredients_serving": { + "type": "number" + }, + "fruits-vegetables-nuts-estimate-from-ingredients_100g": { + "type": "number" + }, + "fruits-vegetables-nuts-estimate-from-ingredients_serving": { + "type": "number" + }, + "monounsaturated-fat": { + "type": "number" + }, + "monounsaturated-fat_100g": { + "type": "number" + }, + "monounsaturated-fat_serving": { + "type": "number" + }, + "monounsaturated-fat_unit": { + "type": "string" + }, + "monounsaturated-fat_value": { + "type": "number" + }, + "nova-group": { + "type": "number" + }, + "nova-group_100g": { + "type": "number" + }, + "nova-group_serving": { + "type": "number" + }, + "nutrition-score-fr": { + "type": "number" + }, + "nutrition-score-fr_100g": { + "type": "number" + }, + "polyunsaturated-fat": { + "type": "number" + }, + "polyunsaturated-fat_100g": { + "type": "number" + }, + "polyunsaturated-fat_serving": { + "type": "number" + }, + "polyunsaturated-fat_unit": { + "type": "string" + }, + "polyunsaturated-fat_value": { + "type": "number" + }, + "proteins": { + "type": "number" + }, + "proteins_100g": { + "type": "number" + }, + "proteins_serving": { + "type": "number" + }, + "proteins_unit": { + "type": "string" + }, + "proteins_value": { + "type": "number" + }, + "salt": { + "type": "number" + }, + "salt_100g": { + "type": "number" + }, + "salt_serving": { + "type": "number" + }, + "salt_unit": { + "type": "string" + }, + "salt_value": { + "type": "number" + }, + "saturated-fat": { + "type": "number" + }, + "saturated-fat_100g": { + "type": "number" + }, + "saturated-fat_serving": { + "type": "number" + }, + "saturated-fat_unit": { + "type": "string" + }, + "saturated-fat_value": { + "type": "number" + }, + "sodium": { + "type": "number" + }, + "sodium_100g": { + "type": "number" + }, + "sodium_serving": { + "type": "number" + }, + "sodium_unit": { + "type": "string" + }, + "sodium_value": { + "type": "number" + }, + "trans-fat": { + "type": "number" + }, + "trans-fat_100g": { + "type": "number" + }, + "trans-fat_serving": { + "type": "number" + }, + "trans-fat_unit": { + "type": "string" + }, + "trans-fat_value": { + "type": "number" + } + } + }, + "nutriscore": { + "type": "object", + "properties": { + "2021": { + "type": "object", + "properties": { + "category_available": { + "type": "integer" + }, + "data": { + "type": "object", + "properties": { + "energy": { + "type": "integer" + }, + "fiber": { + "type": "integer" + }, + "fruits_vegetables_nuts_colza_walnut_olive_oils": { + "type": "integer" + }, + "is_beverage": { + "type": "integer" + }, + "is_cheese": { + "type": "integer" + }, + "is_fat": { + "type": "integer" + }, + "is_water": { + "type": "integer" + }, + "proteins": { + "type": "integer" + }, + "saturated_fat": { + "type": "integer" + }, + "saturated_fat_ratio": { + "type": "integer" + }, + "sodium": {}, + "sugars": { + "type": "number" + } + } + }, + "grade": { + "type": "string" + }, + "nutrients_available": { + "type": "integer" + }, + "nutriscore_applicable": { + "type": "integer" + }, + "nutriscore_computed": { + "type": "integer" + } + } + }, + "2023": { + "type": "object", + "properties": { + "category_available": { + "type": "integer" + }, + "data": { + "type": "object", + "properties": { + "energy": { + "type": "integer" + }, + "fiber": {}, + "fruits_vegetables_legumes": {}, + "is_beverage": { + "type": "integer" + }, + "is_cheese": { + "type": "integer" + }, + "is_fat_oil_nuts_seeds": { + "type": "integer" + }, + "is_red_meat_product": { + "type": "integer" + }, + "is_water": { + "type": "integer" + }, + "proteins": { + "type": "integer" + }, + "salt": {}, + "saturated_fat": { + "type": "integer" + }, + "saturated_fat_ratio": { + "type": "integer" + }, + "sugars": { + "type": "number" + } + } + }, + "grade": { + "type": "string" + }, + "nutrients_available": { + "type": "integer" + }, + "nutriscore_applicable": { + "type": "integer" + }, + "nutriscore_computed": { + "type": "integer" + } + } + } + } + }, + "nutriscore_2021_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "nutriscore_2023_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "nutriscore_grade": { + "type": "string" + }, + "nutriscore_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "nutriscore_version": { + "type": "string" + }, + "nutrition_data": { + "type": "string" + }, + "nutrition_data_per": { + "type": "string" + }, + "nutrition_data_prepared_per": { + "type": "string" + }, + "nutrition_grade_fr": { + "type": "string" + }, + "nutrition_grades": { + "type": "string" + }, + "nutrition_grades_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "nutrition_score_beverage": { + "type": "integer" + }, + "nutrition_score_warning_no_fiber": { + "type": "integer" + }, + "nutrition_score_warning_no_fruits_vegetables_nuts": { + "type": "integer" + }, + "packaging_materials_tags": { + "type": "array", + "items": {} + }, + "packaging_recycling_tags": { + "type": "array", + "items": {} + }, + "packagings": { + "type": "array", + "items": {} + }, + "packagings_materials": { + "type": "object" + }, + "pnns_groups_1": { + "type": "string" + }, + "pnns_groups_1_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "pnns_groups_2": { + "type": "string" + }, + "pnns_groups_2_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "popularity_key": { + "type": "integer" + }, + "popularity_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "product_name": { + "type": "string" + }, + "product_name_de": { + "type": "string" + }, + "product_quantity": { + "type": "number" + }, + "product_type": { + "type": "string" + }, + "quantity": { + "type": "string" + }, + "rev": { + "type": "integer" + }, + "scans_n": { + "type": "integer" + }, + "serving_quantity": { + "type": "number" + }, + "serving_quantity_unit": { + "type": "string" + }, + "serving_size": { + "type": "string" + }, + "states": { + "type": "string" + }, + "states_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "traces": { + "type": "string" + }, + "traces_from_ingredients": { + "type": "string" + }, + "traces_tags": { + "type": "array", + "items": {} + }, + "unique_scans_n": { + "type": "integer" + }, + "unknown_nutrients_tags": { + "type": "array", + "items": {} + }, + "weighers_tags": { + "type": "array", + "items": {} + } + } + } + }, + "securityDefinitions": { + "Bearer": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } +}` + +// SwaggerInfo holds exported Swagger Info so clients can modify it +var SwaggerInfo = &swag.Spec{ + Version: "1.0", + Host: "localhost:80", + BasePath: "/api/v1", + Schemes: []string{}, + Title: "Database API Wrapper", + Description: "API for accessing the SnackLog product database.", + InfoInstanceName: "swagger", + SwaggerTemplate: docTemplate, + LeftDelim: "{{", + RightDelim: "}}", +} + +func init() { + swag.Register(SwaggerInfo.InstanceName(), SwaggerInfo) +} diff --git a/docs/swagger.json b/docs/swagger.json new file mode 100644 index 0000000..6daa340 --- /dev/null +++ b/docs/swagger.json @@ -0,0 +1,1578 @@ +{ + "swagger": "2.0", + "info": { + "description": "API for accessing the SnackLog product database.", + "title": "Database API Wrapper", + "termsOfService": "http://swagger.io/terms/", + "contact": { + "name": "API Support", + "url": "http://www.swagger.io/support", + "email": "support@swagger.io" + }, + "license": { + "name": "Apache 2.0", + "url": "http://www.apache.org/licenses/LICENSE-2.0.html" + }, + "version": "1.0" + }, + "host": "localhost:80", + "basePath": "/api/v1", + "paths": { + "/products/search": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Search for products by name", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "products" + ], + "summary": "Search products", + "parameters": [ + { + "type": "string", + "description": "Search query (min 3 chars)", + "name": "q", + "in": "query", + "required": true + }, + { + "type": "integer", + "description": "Limit results (default 10, max 100)", + "name": "limit", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "type": "array", + "items": { + "$ref": "#/definitions/product.Product" + } + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + }, + "/products/{id}": { + "get": { + "security": [ + { + "Bearer": [] + } + ], + "description": "Get a single product by its ID", + "consumes": [ + "application/json" + ], + "produces": [ + "application/json" + ], + "tags": [ + "products" + ], + "summary": "Get product by ID", + "parameters": [ + { + "type": "string", + "description": "Product ID", + "name": "id", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/product.Product" + } + } + }, + "400": { + "description": "Bad Request", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "404": { + "description": "Not Found", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + }, + "500": { + "description": "Internal Server Error", + "schema": { + "type": "object", + "additionalProperties": { + "type": "string" + } + } + } + } + } + } + }, + "definitions": { + "product.Product": { + "type": "object", + "properties": { + "_id": { + "type": "string" + }, + "_keywords": { + "type": "array", + "items": { + "type": "string" + } + }, + "allergens": { + "type": "string" + }, + "allergens_from_ingredients": { + "type": "string" + }, + "allergens_from_user": { + "type": "string" + }, + "allergens_hierarchy": { + "type": "array", + "items": {} + }, + "allergens_tags": { + "type": "array", + "items": {} + }, + "brands": { + "type": "string" + }, + "brands_hierarchy": { + "type": "array", + "items": { + "type": "string" + } + }, + "brands_lc": { + "type": "string" + }, + "brands_old": { + "type": "string" + }, + "brands_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "categories_properties": { + "type": "object" + }, + "categories_properties_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "checkers_tags": { + "type": "array", + "items": {} + }, + "code": { + "type": "string" + }, + "codes_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "complete": { + "type": "integer" + }, + "completeness": { + "type": "number" + }, + "countries": { + "type": "string" + }, + "countries_hierarchy": { + "type": "array", + "items": { + "type": "string" + } + }, + "countries_lc": { + "type": "string" + }, + "countries_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "created_t": { + "type": "integer" + }, + "data_quality_info_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "data_quality_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "data_sources_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "ecoscore_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "entry_dates_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "environmental_score_data": { + "type": "object", + "properties": { + "adjustments": { + "type": "object", + "properties": { + "origins_of_ingredients": { + "type": "object", + "properties": { + "aggregated_origins": { + "type": "array", + "items": { + "type": "object", + "properties": { + "origin": { + "type": "string" + }, + "percent": { + "type": "integer" + } + } + } + }, + "epi_score": { + "type": "integer" + }, + "epi_value": { + "type": "integer" + }, + "origins_from_categories": { + "type": "array", + "items": { + "type": "string" + } + }, + "origins_from_origins_field": { + "type": "array", + "items": { + "type": "string" + } + }, + "transportation_scores": { + "type": "object", + "properties": { + "ad": { + "type": "number" + }, + "al": { + "type": "number" + }, + "at": { + "type": "number" + }, + "ax": { + "type": "number" + }, + "ba": { + "type": "number" + }, + "be": { + "type": "number" + }, + "bg": { + "type": "number" + }, + "ch": { + "type": "number" + }, + "cy": { + "type": "number" + }, + "cz": { + "type": "number" + }, + "de": { + "type": "number" + }, + "dk": { + "type": "number" + }, + "dz": { + "type": "number" + }, + "ee": { + "type": "number" + }, + "eg": { + "type": "number" + }, + "es": { + "type": "number" + }, + "fi": { + "type": "number" + }, + "fo": { + "type": "number" + }, + "fr": { + "type": "number" + }, + "gg": { + "type": "number" + }, + "gi": { + "type": "number" + }, + "gr": { + "type": "number" + }, + "hr": { + "type": "number" + }, + "hu": { + "type": "number" + }, + "ie": { + "type": "number" + }, + "il": { + "type": "number" + }, + "im": { + "type": "number" + }, + "is": { + "type": "number" + }, + "it": { + "type": "number" + }, + "je": { + "type": "number" + }, + "lb": { + "type": "number" + }, + "li": { + "type": "number" + }, + "lt": { + "type": "number" + }, + "lu": { + "type": "number" + }, + "lv": { + "type": "number" + }, + "ly": { + "type": "number" + }, + "ma": { + "type": "number" + }, + "mc": { + "type": "number" + }, + "md": { + "type": "number" + }, + "me": { + "type": "number" + }, + "mk": { + "type": "number" + }, + "mt": { + "type": "number" + }, + "nl": { + "type": "number" + }, + "no": { + "type": "number" + }, + "pl": { + "type": "number" + }, + "ps": { + "type": "number" + }, + "pt": { + "type": "number" + }, + "ro": { + "type": "number" + }, + "rs": { + "type": "number" + }, + "se": { + "type": "number" + }, + "si": { + "type": "number" + }, + "sj": { + "type": "number" + }, + "sk": { + "type": "number" + }, + "sm": { + "type": "number" + }, + "sy": { + "type": "number" + }, + "tn": { + "type": "number" + }, + "tr": { + "type": "number" + }, + "ua": { + "type": "number" + }, + "uk": { + "type": "number" + }, + "us": { + "type": "number" + }, + "va": { + "type": "number" + }, + "world": { + "type": "number" + }, + "xk": { + "type": "number" + } + } + }, + "transportation_values": { + "type": "object", + "properties": { + "ad": { + "type": "integer" + }, + "al": { + "type": "integer" + }, + "at": { + "type": "integer" + }, + "ax": { + "type": "integer" + }, + "ba": { + "type": "integer" + }, + "be": { + "type": "integer" + }, + "bg": { + "type": "integer" + }, + "ch": { + "type": "integer" + }, + "cy": { + "type": "integer" + }, + "cz": { + "type": "integer" + }, + "de": { + "type": "integer" + }, + "dk": { + "type": "integer" + }, + "dz": { + "type": "integer" + }, + "ee": { + "type": "integer" + }, + "eg": { + "type": "integer" + }, + "es": { + "type": "integer" + }, + "fi": { + "type": "integer" + }, + "fo": { + "type": "integer" + }, + "fr": { + "type": "integer" + }, + "gg": { + "type": "integer" + }, + "gi": { + "type": "integer" + }, + "gr": { + "type": "integer" + }, + "hr": { + "type": "integer" + }, + "hu": { + "type": "integer" + }, + "ie": { + "type": "integer" + }, + "il": { + "type": "integer" + }, + "im": { + "type": "integer" + }, + "is": { + "type": "integer" + }, + "it": { + "type": "integer" + }, + "je": { + "type": "integer" + }, + "lb": { + "type": "integer" + }, + "li": { + "type": "integer" + }, + "lt": { + "type": "integer" + }, + "lu": { + "type": "integer" + }, + "lv": { + "type": "integer" + }, + "ly": { + "type": "integer" + }, + "ma": { + "type": "integer" + }, + "mc": { + "type": "integer" + }, + "md": { + "type": "integer" + }, + "me": { + "type": "integer" + }, + "mk": { + "type": "integer" + }, + "mt": { + "type": "integer" + }, + "nl": { + "type": "integer" + }, + "no": { + "type": "integer" + }, + "pl": { + "type": "integer" + }, + "ps": { + "type": "integer" + }, + "pt": { + "type": "integer" + }, + "ro": { + "type": "integer" + }, + "rs": { + "type": "integer" + }, + "se": { + "type": "integer" + }, + "si": { + "type": "integer" + }, + "sj": { + "type": "integer" + }, + "sk": { + "type": "integer" + }, + "sm": { + "type": "integer" + }, + "sy": { + "type": "integer" + }, + "tn": { + "type": "integer" + }, + "tr": { + "type": "integer" + }, + "ua": { + "type": "integer" + }, + "uk": { + "type": "integer" + }, + "us": { + "type": "integer" + }, + "va": { + "type": "integer" + }, + "world": { + "type": "integer" + }, + "xk": { + "type": "integer" + } + } + }, + "values": { + "type": "object", + "properties": { + "ad": { + "type": "integer" + }, + "al": { + "type": "integer" + }, + "at": { + "type": "integer" + }, + "ax": { + "type": "integer" + }, + "ba": { + "type": "integer" + }, + "be": { + "type": "integer" + }, + "bg": { + "type": "integer" + }, + "ch": { + "type": "integer" + }, + "cy": { + "type": "integer" + }, + "cz": { + "type": "integer" + }, + "de": { + "type": "integer" + }, + "dk": { + "type": "integer" + }, + "dz": { + "type": "integer" + }, + "ee": { + "type": "integer" + }, + "eg": { + "type": "integer" + }, + "es": { + "type": "integer" + }, + "fi": { + "type": "integer" + }, + "fo": { + "type": "integer" + }, + "fr": { + "type": "integer" + }, + "gg": { + "type": "integer" + }, + "gi": { + "type": "integer" + }, + "gr": { + "type": "integer" + }, + "hr": { + "type": "integer" + }, + "hu": { + "type": "integer" + }, + "ie": { + "type": "integer" + }, + "il": { + "type": "integer" + }, + "im": { + "type": "integer" + }, + "is": { + "type": "integer" + }, + "it": { + "type": "integer" + }, + "je": { + "type": "integer" + }, + "lb": { + "type": "integer" + }, + "li": { + "type": "integer" + }, + "lt": { + "type": "integer" + }, + "lu": { + "type": "integer" + }, + "lv": { + "type": "integer" + }, + "ly": { + "type": "integer" + }, + "ma": { + "type": "integer" + }, + "mc": { + "type": "integer" + }, + "md": { + "type": "integer" + }, + "me": { + "type": "integer" + }, + "mk": { + "type": "integer" + }, + "mt": { + "type": "integer" + }, + "nl": { + "type": "integer" + }, + "no": { + "type": "integer" + }, + "pl": { + "type": "integer" + }, + "ps": { + "type": "integer" + }, + "pt": { + "type": "integer" + }, + "ro": { + "type": "integer" + }, + "rs": { + "type": "integer" + }, + "se": { + "type": "integer" + }, + "si": { + "type": "integer" + }, + "sj": { + "type": "integer" + }, + "sk": { + "type": "integer" + }, + "sm": { + "type": "integer" + }, + "sy": { + "type": "integer" + }, + "tn": { + "type": "integer" + }, + "tr": { + "type": "integer" + }, + "ua": { + "type": "integer" + }, + "uk": { + "type": "integer" + }, + "us": { + "type": "integer" + }, + "va": { + "type": "integer" + }, + "world": { + "type": "integer" + }, + "xk": { + "type": "integer" + } + } + }, + "warning": { + "type": "string" + } + } + }, + "packaging": { + "type": "object", + "properties": { + "value": { + "type": "integer" + }, + "warning": { + "type": "string" + } + } + }, + "production_system": { + "type": "object", + "properties": { + "labels": { + "type": "array", + "items": {} + }, + "value": { + "type": "integer" + }, + "warning": { + "type": "string" + } + } + }, + "threatened_species": { + "type": "object", + "properties": { + "warning": { + "type": "string" + } + } + } + } + }, + "agribalyse": { + "type": "object", + "properties": { + "warning": { + "type": "string" + } + } + }, + "grade": { + "type": "string" + }, + "missing": { + "type": "object", + "properties": { + "categories": { + "type": "integer" + }, + "ingredients": { + "type": "integer" + }, + "labels": { + "type": "integer" + }, + "origins": { + "type": "integer" + }, + "packagings": { + "type": "integer" + } + } + }, + "missing_agribalyse_match_warning": { + "type": "integer" + }, + "missing_key_data": { + "type": "integer" + }, + "status": { + "type": "string" + } + } + }, + "environmental_score_grade": { + "type": "string" + }, + "environmental_score_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "food_groups_tags": { + "type": "array", + "items": {} + }, + "id": { + "type": "string" + }, + "informers_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "lang": { + "type": "string" + }, + "languages_hierarchy": { + "type": "array", + "items": { + "type": "string" + } + }, + "languages_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "last_edit_dates_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "last_modified_t": { + "type": "integer" + }, + "last_updated_t": { + "type": "integer" + }, + "lc": { + "type": "string" + }, + "main_countries_tags": { + "type": "array", + "items": {} + }, + "max_imgid": { + "type": "string" + }, + "misc_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "no_nutrition_data": { + "type": "string" + }, + "nova_group_debug": { + "type": "string" + }, + "nova_groups_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "nutrient_levels": { + "type": "object" + }, + "nutriments": { + "type": "object", + "properties": { + "carbohydrates": { + "type": "number" + }, + "carbohydrates_100g": { + "type": "number" + }, + "carbohydrates_serving": { + "type": "number" + }, + "carbohydrates_unit": { + "type": "string" + }, + "carbohydrates_value": { + "type": "number" + }, + "energy": { + "type": "number" + }, + "energy-kcal": { + "type": "number" + }, + "energy-kcal_100g": { + "type": "number" + }, + "energy-kcal_serving": { + "type": "number" + }, + "energy-kcal_unit": { + "type": "string" + }, + "energy-kcal_value": { + "type": "number" + }, + "energy-kcal_value_computed": { + "type": "number" + }, + "energy_100g": { + "type": "number" + }, + "energy_serving": { + "type": "number" + }, + "energy_unit": { + "type": "string" + }, + "energy_value": { + "type": "number" + }, + "fat": { + "type": "number" + }, + "fat_100g": { + "type": "number" + }, + "fat_serving": { + "type": "number" + }, + "fat_unit": { + "type": "string" + }, + "fat_value": { + "type": "number" + }, + "fruits-vegetables-legumes-estimate-from-ingredients_100g": { + "type": "number" + }, + "fruits-vegetables-legumes-estimate-from-ingredients_serving": { + "type": "number" + }, + "fruits-vegetables-nuts-estimate-from-ingredients_100g": { + "type": "number" + }, + "fruits-vegetables-nuts-estimate-from-ingredients_serving": { + "type": "number" + }, + "monounsaturated-fat": { + "type": "number" + }, + "monounsaturated-fat_100g": { + "type": "number" + }, + "monounsaturated-fat_serving": { + "type": "number" + }, + "monounsaturated-fat_unit": { + "type": "string" + }, + "monounsaturated-fat_value": { + "type": "number" + }, + "nova-group": { + "type": "number" + }, + "nova-group_100g": { + "type": "number" + }, + "nova-group_serving": { + "type": "number" + }, + "nutrition-score-fr": { + "type": "number" + }, + "nutrition-score-fr_100g": { + "type": "number" + }, + "polyunsaturated-fat": { + "type": "number" + }, + "polyunsaturated-fat_100g": { + "type": "number" + }, + "polyunsaturated-fat_serving": { + "type": "number" + }, + "polyunsaturated-fat_unit": { + "type": "string" + }, + "polyunsaturated-fat_value": { + "type": "number" + }, + "proteins": { + "type": "number" + }, + "proteins_100g": { + "type": "number" + }, + "proteins_serving": { + "type": "number" + }, + "proteins_unit": { + "type": "string" + }, + "proteins_value": { + "type": "number" + }, + "salt": { + "type": "number" + }, + "salt_100g": { + "type": "number" + }, + "salt_serving": { + "type": "number" + }, + "salt_unit": { + "type": "string" + }, + "salt_value": { + "type": "number" + }, + "saturated-fat": { + "type": "number" + }, + "saturated-fat_100g": { + "type": "number" + }, + "saturated-fat_serving": { + "type": "number" + }, + "saturated-fat_unit": { + "type": "string" + }, + "saturated-fat_value": { + "type": "number" + }, + "sodium": { + "type": "number" + }, + "sodium_100g": { + "type": "number" + }, + "sodium_serving": { + "type": "number" + }, + "sodium_unit": { + "type": "string" + }, + "sodium_value": { + "type": "number" + }, + "trans-fat": { + "type": "number" + }, + "trans-fat_100g": { + "type": "number" + }, + "trans-fat_serving": { + "type": "number" + }, + "trans-fat_unit": { + "type": "string" + }, + "trans-fat_value": { + "type": "number" + } + } + }, + "nutriscore": { + "type": "object", + "properties": { + "2021": { + "type": "object", + "properties": { + "category_available": { + "type": "integer" + }, + "data": { + "type": "object", + "properties": { + "energy": { + "type": "integer" + }, + "fiber": { + "type": "integer" + }, + "fruits_vegetables_nuts_colza_walnut_olive_oils": { + "type": "integer" + }, + "is_beverage": { + "type": "integer" + }, + "is_cheese": { + "type": "integer" + }, + "is_fat": { + "type": "integer" + }, + "is_water": { + "type": "integer" + }, + "proteins": { + "type": "integer" + }, + "saturated_fat": { + "type": "integer" + }, + "saturated_fat_ratio": { + "type": "integer" + }, + "sodium": {}, + "sugars": { + "type": "number" + } + } + }, + "grade": { + "type": "string" + }, + "nutrients_available": { + "type": "integer" + }, + "nutriscore_applicable": { + "type": "integer" + }, + "nutriscore_computed": { + "type": "integer" + } + } + }, + "2023": { + "type": "object", + "properties": { + "category_available": { + "type": "integer" + }, + "data": { + "type": "object", + "properties": { + "energy": { + "type": "integer" + }, + "fiber": {}, + "fruits_vegetables_legumes": {}, + "is_beverage": { + "type": "integer" + }, + "is_cheese": { + "type": "integer" + }, + "is_fat_oil_nuts_seeds": { + "type": "integer" + }, + "is_red_meat_product": { + "type": "integer" + }, + "is_water": { + "type": "integer" + }, + "proteins": { + "type": "integer" + }, + "salt": {}, + "saturated_fat": { + "type": "integer" + }, + "saturated_fat_ratio": { + "type": "integer" + }, + "sugars": { + "type": "number" + } + } + }, + "grade": { + "type": "string" + }, + "nutrients_available": { + "type": "integer" + }, + "nutriscore_applicable": { + "type": "integer" + }, + "nutriscore_computed": { + "type": "integer" + } + } + } + } + }, + "nutriscore_2021_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "nutriscore_2023_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "nutriscore_grade": { + "type": "string" + }, + "nutriscore_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "nutriscore_version": { + "type": "string" + }, + "nutrition_data": { + "type": "string" + }, + "nutrition_data_per": { + "type": "string" + }, + "nutrition_data_prepared_per": { + "type": "string" + }, + "nutrition_grade_fr": { + "type": "string" + }, + "nutrition_grades": { + "type": "string" + }, + "nutrition_grades_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "nutrition_score_beverage": { + "type": "integer" + }, + "nutrition_score_warning_no_fiber": { + "type": "integer" + }, + "nutrition_score_warning_no_fruits_vegetables_nuts": { + "type": "integer" + }, + "packaging_materials_tags": { + "type": "array", + "items": {} + }, + "packaging_recycling_tags": { + "type": "array", + "items": {} + }, + "packagings": { + "type": "array", + "items": {} + }, + "packagings_materials": { + "type": "object" + }, + "pnns_groups_1": { + "type": "string" + }, + "pnns_groups_1_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "pnns_groups_2": { + "type": "string" + }, + "pnns_groups_2_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "popularity_key": { + "type": "integer" + }, + "popularity_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "product_name": { + "type": "string" + }, + "product_name_de": { + "type": "string" + }, + "product_quantity": { + "type": "number" + }, + "product_type": { + "type": "string" + }, + "quantity": { + "type": "string" + }, + "rev": { + "type": "integer" + }, + "scans_n": { + "type": "integer" + }, + "serving_quantity": { + "type": "number" + }, + "serving_quantity_unit": { + "type": "string" + }, + "serving_size": { + "type": "string" + }, + "states": { + "type": "string" + }, + "states_tags": { + "type": "array", + "items": { + "type": "string" + } + }, + "traces": { + "type": "string" + }, + "traces_from_ingredients": { + "type": "string" + }, + "traces_tags": { + "type": "array", + "items": {} + }, + "unique_scans_n": { + "type": "integer" + }, + "unknown_nutrients_tags": { + "type": "array", + "items": {} + }, + "weighers_tags": { + "type": "array", + "items": {} + } + } + } + }, + "securityDefinitions": { + "Bearer": { + "type": "apiKey", + "name": "Authorization", + "in": "header" + } + } +} \ No newline at end of file diff --git a/docs/swagger.yaml b/docs/swagger.yaml new file mode 100644 index 0000000..4e70cad --- /dev/null +++ b/docs/swagger.yaml @@ -0,0 +1,1049 @@ +basePath: /api/v1 +definitions: + product.Product: + properties: + _id: + type: string + _keywords: + items: + type: string + type: array + allergens: + type: string + allergens_from_ingredients: + type: string + allergens_from_user: + type: string + allergens_hierarchy: + items: {} + type: array + allergens_tags: + items: {} + type: array + brands: + type: string + brands_hierarchy: + items: + type: string + type: array + brands_lc: + type: string + brands_old: + type: string + brands_tags: + items: + type: string + type: array + categories_properties: + type: object + categories_properties_tags: + items: + type: string + type: array + checkers_tags: + items: {} + type: array + code: + type: string + codes_tags: + items: + type: string + type: array + complete: + type: integer + completeness: + type: number + countries: + type: string + countries_hierarchy: + items: + type: string + type: array + countries_lc: + type: string + countries_tags: + items: + type: string + type: array + created_t: + type: integer + data_quality_info_tags: + items: + type: string + type: array + data_quality_tags: + items: + type: string + type: array + data_sources_tags: + items: + type: string + type: array + ecoscore_tags: + items: + type: string + type: array + entry_dates_tags: + items: + type: string + type: array + environmental_score_data: + properties: + adjustments: + properties: + origins_of_ingredients: + properties: + aggregated_origins: + items: + properties: + origin: + type: string + percent: + type: integer + type: object + type: array + epi_score: + type: integer + epi_value: + type: integer + origins_from_categories: + items: + type: string + type: array + origins_from_origins_field: + items: + type: string + type: array + transportation_scores: + properties: + ad: + type: number + al: + type: number + at: + type: number + ax: + type: number + ba: + type: number + be: + type: number + bg: + type: number + ch: + type: number + cy: + type: number + cz: + type: number + de: + type: number + dk: + type: number + dz: + type: number + ee: + type: number + eg: + type: number + es: + type: number + fi: + type: number + fo: + type: number + fr: + type: number + gg: + type: number + gi: + type: number + gr: + type: number + hr: + type: number + hu: + type: number + ie: + type: number + il: + type: number + im: + type: number + is: + type: number + it: + type: number + je: + type: number + lb: + type: number + li: + type: number + lt: + type: number + lu: + type: number + lv: + type: number + ly: + type: number + ma: + type: number + mc: + type: number + md: + type: number + me: + type: number + mk: + type: number + mt: + type: number + nl: + type: number + "no": + type: number + pl: + type: number + ps: + type: number + pt: + type: number + ro: + type: number + rs: + type: number + se: + type: number + si: + type: number + sj: + type: number + sk: + type: number + sm: + type: number + sy: + type: number + tn: + type: number + tr: + type: number + ua: + type: number + uk: + type: number + us: + type: number + va: + type: number + world: + type: number + xk: + type: number + type: object + transportation_values: + properties: + ad: + type: integer + al: + type: integer + at: + type: integer + ax: + type: integer + ba: + type: integer + be: + type: integer + bg: + type: integer + ch: + type: integer + cy: + type: integer + cz: + type: integer + de: + type: integer + dk: + type: integer + dz: + type: integer + ee: + type: integer + eg: + type: integer + es: + type: integer + fi: + type: integer + fo: + type: integer + fr: + type: integer + gg: + type: integer + gi: + type: integer + gr: + type: integer + hr: + type: integer + hu: + type: integer + ie: + type: integer + il: + type: integer + im: + type: integer + is: + type: integer + it: + type: integer + je: + type: integer + lb: + type: integer + li: + type: integer + lt: + type: integer + lu: + type: integer + lv: + type: integer + ly: + type: integer + ma: + type: integer + mc: + type: integer + md: + type: integer + me: + type: integer + mk: + type: integer + mt: + type: integer + nl: + type: integer + "no": + type: integer + pl: + type: integer + ps: + type: integer + pt: + type: integer + ro: + type: integer + rs: + type: integer + se: + type: integer + si: + type: integer + sj: + type: integer + sk: + type: integer + sm: + type: integer + sy: + type: integer + tn: + type: integer + tr: + type: integer + ua: + type: integer + uk: + type: integer + us: + type: integer + va: + type: integer + world: + type: integer + xk: + type: integer + type: object + values: + properties: + ad: + type: integer + al: + type: integer + at: + type: integer + ax: + type: integer + ba: + type: integer + be: + type: integer + bg: + type: integer + ch: + type: integer + cy: + type: integer + cz: + type: integer + de: + type: integer + dk: + type: integer + dz: + type: integer + ee: + type: integer + eg: + type: integer + es: + type: integer + fi: + type: integer + fo: + type: integer + fr: + type: integer + gg: + type: integer + gi: + type: integer + gr: + type: integer + hr: + type: integer + hu: + type: integer + ie: + type: integer + il: + type: integer + im: + type: integer + is: + type: integer + it: + type: integer + je: + type: integer + lb: + type: integer + li: + type: integer + lt: + type: integer + lu: + type: integer + lv: + type: integer + ly: + type: integer + ma: + type: integer + mc: + type: integer + md: + type: integer + me: + type: integer + mk: + type: integer + mt: + type: integer + nl: + type: integer + "no": + type: integer + pl: + type: integer + ps: + type: integer + pt: + type: integer + ro: + type: integer + rs: + type: integer + se: + type: integer + si: + type: integer + sj: + type: integer + sk: + type: integer + sm: + type: integer + sy: + type: integer + tn: + type: integer + tr: + type: integer + ua: + type: integer + uk: + type: integer + us: + type: integer + va: + type: integer + world: + type: integer + xk: + type: integer + type: object + warning: + type: string + type: object + packaging: + properties: + value: + type: integer + warning: + type: string + type: object + production_system: + properties: + labels: + items: {} + type: array + value: + type: integer + warning: + type: string + type: object + threatened_species: + properties: + warning: + type: string + type: object + type: object + agribalyse: + properties: + warning: + type: string + type: object + grade: + type: string + missing: + properties: + categories: + type: integer + ingredients: + type: integer + labels: + type: integer + origins: + type: integer + packagings: + type: integer + type: object + missing_agribalyse_match_warning: + type: integer + missing_key_data: + type: integer + status: + type: string + type: object + environmental_score_grade: + type: string + environmental_score_tags: + items: + type: string + type: array + food_groups_tags: + items: {} + type: array + id: + type: string + informers_tags: + items: + type: string + type: array + lang: + type: string + languages_hierarchy: + items: + type: string + type: array + languages_tags: + items: + type: string + type: array + last_edit_dates_tags: + items: + type: string + type: array + last_modified_t: + type: integer + last_updated_t: + type: integer + lc: + type: string + main_countries_tags: + items: {} + type: array + max_imgid: + type: string + misc_tags: + items: + type: string + type: array + no_nutrition_data: + type: string + nova_group_debug: + type: string + nova_groups_tags: + items: + type: string + type: array + nutrient_levels: + type: object + nutriments: + properties: + carbohydrates: + type: number + carbohydrates_100g: + type: number + carbohydrates_serving: + type: number + carbohydrates_unit: + type: string + carbohydrates_value: + type: number + energy: + type: number + energy-kcal: + type: number + energy-kcal_100g: + type: number + energy-kcal_serving: + type: number + energy-kcal_unit: + type: string + energy-kcal_value: + type: number + energy-kcal_value_computed: + type: number + energy_100g: + type: number + energy_serving: + type: number + energy_unit: + type: string + energy_value: + type: number + fat: + type: number + fat_100g: + type: number + fat_serving: + type: number + fat_unit: + type: string + fat_value: + type: number + fruits-vegetables-legumes-estimate-from-ingredients_100g: + type: number + fruits-vegetables-legumes-estimate-from-ingredients_serving: + type: number + fruits-vegetables-nuts-estimate-from-ingredients_100g: + type: number + fruits-vegetables-nuts-estimate-from-ingredients_serving: + type: number + monounsaturated-fat: + type: number + monounsaturated-fat_100g: + type: number + monounsaturated-fat_serving: + type: number + monounsaturated-fat_unit: + type: string + monounsaturated-fat_value: + type: number + nova-group: + type: number + nova-group_100g: + type: number + nova-group_serving: + type: number + nutrition-score-fr: + type: number + nutrition-score-fr_100g: + type: number + polyunsaturated-fat: + type: number + polyunsaturated-fat_100g: + type: number + polyunsaturated-fat_serving: + type: number + polyunsaturated-fat_unit: + type: string + polyunsaturated-fat_value: + type: number + proteins: + type: number + proteins_100g: + type: number + proteins_serving: + type: number + proteins_unit: + type: string + proteins_value: + type: number + salt: + type: number + salt_100g: + type: number + salt_serving: + type: number + salt_unit: + type: string + salt_value: + type: number + saturated-fat: + type: number + saturated-fat_100g: + type: number + saturated-fat_serving: + type: number + saturated-fat_unit: + type: string + saturated-fat_value: + type: number + sodium: + type: number + sodium_100g: + type: number + sodium_serving: + type: number + sodium_unit: + type: string + sodium_value: + type: number + trans-fat: + type: number + trans-fat_100g: + type: number + trans-fat_serving: + type: number + trans-fat_unit: + type: string + trans-fat_value: + type: number + type: object + nutriscore: + properties: + "2021": + properties: + category_available: + type: integer + data: + properties: + energy: + type: integer + fiber: + type: integer + fruits_vegetables_nuts_colza_walnut_olive_oils: + type: integer + is_beverage: + type: integer + is_cheese: + type: integer + is_fat: + type: integer + is_water: + type: integer + proteins: + type: integer + saturated_fat: + type: integer + saturated_fat_ratio: + type: integer + sodium: {} + sugars: + type: number + type: object + grade: + type: string + nutrients_available: + type: integer + nutriscore_applicable: + type: integer + nutriscore_computed: + type: integer + type: object + "2023": + properties: + category_available: + type: integer + data: + properties: + energy: + type: integer + fiber: {} + fruits_vegetables_legumes: {} + is_beverage: + type: integer + is_cheese: + type: integer + is_fat_oil_nuts_seeds: + type: integer + is_red_meat_product: + type: integer + is_water: + type: integer + proteins: + type: integer + salt: {} + saturated_fat: + type: integer + saturated_fat_ratio: + type: integer + sugars: + type: number + type: object + grade: + type: string + nutrients_available: + type: integer + nutriscore_applicable: + type: integer + nutriscore_computed: + type: integer + type: object + type: object + nutriscore_2021_tags: + items: + type: string + type: array + nutriscore_2023_tags: + items: + type: string + type: array + nutriscore_grade: + type: string + nutriscore_tags: + items: + type: string + type: array + nutriscore_version: + type: string + nutrition_data: + type: string + nutrition_data_per: + type: string + nutrition_data_prepared_per: + type: string + nutrition_grade_fr: + type: string + nutrition_grades: + type: string + nutrition_grades_tags: + items: + type: string + type: array + nutrition_score_beverage: + type: integer + nutrition_score_warning_no_fiber: + type: integer + nutrition_score_warning_no_fruits_vegetables_nuts: + type: integer + packaging_materials_tags: + items: {} + type: array + packaging_recycling_tags: + items: {} + type: array + packagings: + items: {} + type: array + packagings_materials: + type: object + pnns_groups_1: + type: string + pnns_groups_1_tags: + items: + type: string + type: array + pnns_groups_2: + type: string + pnns_groups_2_tags: + items: + type: string + type: array + popularity_key: + type: integer + popularity_tags: + items: + type: string + type: array + product_name: + type: string + product_name_de: + type: string + product_quantity: + type: number + product_type: + type: string + quantity: + type: string + rev: + type: integer + scans_n: + type: integer + serving_quantity: + type: number + serving_quantity_unit: + type: string + serving_size: + type: string + states: + type: string + states_tags: + items: + type: string + type: array + traces: + type: string + traces_from_ingredients: + type: string + traces_tags: + items: {} + type: array + unique_scans_n: + type: integer + unknown_nutrients_tags: + items: {} + type: array + weighers_tags: + items: {} + type: array + type: object +host: localhost:80 +info: + contact: + email: support@swagger.io + name: API Support + url: http://www.swagger.io/support + description: API for accessing the SnackLog product database. + license: + name: Apache 2.0 + url: http://www.apache.org/licenses/LICENSE-2.0.html + termsOfService: http://swagger.io/terms/ + title: Database API Wrapper + version: "1.0" +paths: + /products/{id}: + get: + consumes: + - application/json + description: Get a single product by its ID + parameters: + - description: Product ID + in: path + name: id + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: + $ref: '#/definitions/product.Product' + type: object + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + "404": + description: Not Found + schema: + additionalProperties: + type: string + type: object + "500": + description: Internal Server Error + schema: + additionalProperties: + type: string + type: object + security: + - Bearer: [] + summary: Get product by ID + tags: + - products + /products/search: + get: + consumes: + - application/json + description: Search for products by name + parameters: + - description: Search query (min 3 chars) + in: query + name: q + required: true + type: string + - description: Limit results (default 10, max 100) + in: query + name: limit + type: integer + produces: + - application/json + responses: + "200": + description: OK + schema: + additionalProperties: + items: + $ref: '#/definitions/product.Product' + type: array + type: object + "400": + description: Bad Request + schema: + additionalProperties: + type: string + type: object + "401": + description: Unauthorized + schema: + additionalProperties: + type: string + type: object + "500": + description: Internal Server Error + schema: + additionalProperties: + type: string + type: object + security: + - Bearer: [] + summary: Search products + tags: + - products +securityDefinitions: + Bearer: + in: header + name: Authorization + type: apiKey +swagger: "2.0" diff --git a/flake.nix b/flake.nix index 1a3fbb4..930991c 100644 --- a/flake.nix +++ b/flake.nix @@ -29,6 +29,7 @@ gotools delve mongosh + go-swag go-license-collector.packages.${system}.go-license-collector ]; diff --git a/internal/handlers/product/get.go b/internal/handlers/product/get.go index ee78653..845f5ea 100644 --- a/internal/handlers/product/get.go +++ b/internal/handlers/product/get.go @@ -9,6 +9,20 @@ import ( "github.com/gin-gonic/gin" ) +// Get godoc +// @Summary Search products +// @Description Search for products by name +// @Tags products +// @Accept json +// @Produce json +// @Param q query string true "Search query (min 3 chars)" +// @Param limit query int false "Limit results (default 10, max 100)" +// @Success 200 {object} map[string][]product.Product +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Failure 500 {object} map[string]string +// @Security Bearer +// @Router /products/search [get] func (p *ProductController) Get(c *gin.Context) { query := c.Query("q") if query == "" || len(query) < 3 { diff --git a/internal/handlers/product/getId.go b/internal/handlers/product/getId.go index f8cdca3..dccf8d8 100644 --- a/internal/handlers/product/getId.go +++ b/internal/handlers/product/getId.go @@ -8,6 +8,20 @@ import ( "github.com/gin-gonic/gin" ) +// GetID godoc +// @Summary Get product by ID +// @Description Get a single product by its ID +// @Tags products +// @Accept json +// @Produce json +// @Param id path string true "Product ID" +// @Success 200 {object} map[string]product.Product +// @Failure 400 {object} map[string]string +// @Failure 401 {object} map[string]string +// @Failure 404 {object} map[string]string +// @Failure 500 {object} map[string]string +// @Security Bearer +// @Router /products/{id} [get] func (p *ProductController) GetID(c *gin.Context) { id := c.Param("id") if id == "" { diff --git a/main.go b/main.go index 36687ff..4890c9c 100644 --- a/main.go +++ b/main.go @@ -14,6 +14,15 @@ import ( "go.mongodb.org/mongo-driver/v2/mongo" ) +// @title Database API Wrapper +// @version 1.0 +// @description API for accessing the SnackLog product database. +// @BasePath /api/v1 + +// @securityDefinitions.apikey Bearer +// @in header +// @name Authorization + func main() { loadConfigs() db := connectDatabase()