{"openapi":"3.0.3","info":{"title":"Aquarium Finisterrae API","description":"RESTful API for managing the Aquarium Finisterrae content: rooms, habitats, species, tanks, pages, media, and users.","version":"1.0.0","contact":{"name":"Aquarium Finisterrae Dev Team"}},"servers":[{"url":"/api/v1","description":"API v1"}],"tags":[{"name":"Roles","description":"User role management"},{"name":"Users","description":"User account management"},{"name":"Media","description":"Media file management"},{"name":"Rooms","description":"Aquarium rooms"},{"name":"Habitats","description":"Natural habitats"},{"name":"Species","description":"Aquatic and terrestrial species"},{"name":"Tanks","description":"Exhibition tanks"},{"name":"Pages","description":"CMS pages"},{"name":"Tank Species","description":"Tank-species assignments"},{"name":"Species Habitats","description":"Species-habitat associations"},{"name":"Media Entities","description":"Media-entity polymorphic associations"}],"paths":{"/roles":{"get":{"tags":["Roles"],"summary":"List all roles","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20}},{"name":"sortBy","in":"query","schema":{"type":"string"}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query"}],"responses":{"200":{"description":"Paginated list of roles"}}},"post":{"tags":["Roles"],"summary":"Create a new Role","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":30}},"required":["name"]}}}},"responses":{"201":{"description":"Role created successfully"},"400":{"description":"Validation error"},"409":{"description":"Duplicate entry"}}}},"/roles/{id}":{"get":{"tags":["Roles"],"summary":"Get a Role by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Role details"},"404":{"description":"Not found"}}},"patch":{"tags":["Roles"],"summary":"Update a Role","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"name":{"type":"string","maxLength":30}}}}}},"responses":{"200":{"description":"Role updated"},"400":{"description":"Validation error"},"404":{"description":"Not found"}}},"delete":{"tags":["Roles"],"summary":"Delete a Role","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Role deleted"},"404":{"description":"Not found"}}}},"/users":{"get":{"tags":["Users"],"summary":"List all users","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20}},{"name":"sortBy","in":"query","schema":{"type":"string"}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query"}],"responses":{"200":{"description":"Paginated list of users"}}},"post":{"tags":["Users"],"summary":"Create a new User","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"roleId":{"type":"integer"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"passwordHash":{"type":"string"},"active":{"type":"boolean"}},"required":["roleId","name","email","passwordHash"]}}}},"responses":{"201":{"description":"User created successfully"},"400":{"description":"Validation error"},"409":{"description":"Duplicate entry"}}}},"/users/{id}":{"get":{"tags":["Users"],"summary":"Get a User by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"User details"},"404":{"description":"Not found"}}},"patch":{"tags":["Users"],"summary":"Update a User","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"roleId":{"type":"integer"},"name":{"type":"string"},"email":{"type":"string","format":"email"},"passwordHash":{"type":"string"},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"User updated"},"400":{"description":"Validation error"},"404":{"description":"Not found"}}},"delete":{"tags":["Users"],"summary":"Delete a User","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"User deleted"},"404":{"description":"Not found"}}}},"/media":{"get":{"tags":["Media"],"summary":"List all media","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20}},{"name":"sortBy","in":"query","schema":{"type":"string"}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query"}],"responses":{"200":{"description":"Paginated list of media"}}},"post":{"tags":["Media"],"summary":"Create a new Media","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mediaType":{"type":"string","enum":["image","video","document","audio"]},"filePath":{"type":"string"},"fileName":{"type":"string"},"mimeType":{"type":"string"},"fileSize":{"type":"integer"},"altText":{"type":"object","additionalProperties":{"type":"string"}},"credit":{"type":"string"},"uploadedBy":{"type":"integer"}},"required":["mediaType","filePath","fileName","mimeType","fileSize"]}}}},"responses":{"201":{"description":"Media created successfully"},"400":{"description":"Validation error"},"409":{"description":"Duplicate entry"}}}},"/media/{id}":{"get":{"tags":["Media"],"summary":"Get a Media by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Media details"},"404":{"description":"Not found"}}},"patch":{"tags":["Media"],"summary":"Update a Media","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mediaType":{"type":"string","enum":["image","video","document","audio"]},"filePath":{"type":"string"},"fileName":{"type":"string"},"mimeType":{"type":"string"},"fileSize":{"type":"integer"},"altText":{"type":"object","additionalProperties":{"type":"string"}},"credit":{"type":"string"},"uploadedBy":{"type":"integer"}}}}}},"responses":{"200":{"description":"Media updated"},"400":{"description":"Validation error"},"404":{"description":"Not found"}}},"delete":{"tags":["Media"],"summary":"Delete a Media","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Media deleted"},"404":{"description":"Not found"}}}},"/rooms":{"get":{"tags":["Rooms"],"summary":"List all rooms","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20}},{"name":"sortBy","in":"query","schema":{"type":"string"}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query"}],"responses":{"200":{"description":"Paginated list of rooms"}}},"post":{"tags":["Rooms"],"summary":"Create a new Room","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"object","additionalProperties":{"type":"string"}},"description":{"type":"object","additionalProperties":{"type":"string"}},"accessibilityInfo":{"type":"object","additionalProperties":{"type":"string"}},"coverImageId":{"type":"integer"},"floorPlanId":{"type":"integer"},"sortOrder":{"type":"integer"},"active":{"type":"boolean"}},"required":["slug","name"]}}}},"responses":{"201":{"description":"Room created successfully"},"400":{"description":"Validation error"},"409":{"description":"Duplicate entry"}}}},"/rooms/{id}":{"get":{"tags":["Rooms"],"summary":"Get a Room by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Room details"},"404":{"description":"Not found"}}},"patch":{"tags":["Rooms"],"summary":"Update a Room","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"object","additionalProperties":{"type":"string"}},"description":{"type":"object","additionalProperties":{"type":"string"}},"accessibilityInfo":{"type":"object","additionalProperties":{"type":"string"}},"coverImageId":{"type":"integer"},"floorPlanId":{"type":"integer"},"sortOrder":{"type":"integer"},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Room updated"},"400":{"description":"Validation error"},"404":{"description":"Not found"}}},"delete":{"tags":["Rooms"],"summary":"Delete a Room","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Room deleted"},"404":{"description":"Not found"}}}},"/habitats":{"get":{"tags":["Habitats"],"summary":"List all habitats","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20}},{"name":"sortBy","in":"query","schema":{"type":"string"}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query"}],"responses":{"200":{"description":"Paginated list of habitats"}}},"post":{"tags":["Habitats"],"summary":"Create a new Habitat","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"object","additionalProperties":{"type":"string"}},"description":{"type":"object","additionalProperties":{"type":"string"}},"funFacts":{"type":"object","additionalProperties":{"type":"string"}},"coverImageId":{"type":"integer"},"sortOrder":{"type":"integer"},"active":{"type":"boolean"}},"required":["slug","name"]}}}},"responses":{"201":{"description":"Habitat created successfully"},"400":{"description":"Validation error"},"409":{"description":"Duplicate entry"}}}},"/habitats/{id}":{"get":{"tags":["Habitats"],"summary":"Get a Habitat by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Habitat details"},"404":{"description":"Not found"}}},"patch":{"tags":["Habitats"],"summary":"Update a Habitat","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"name":{"type":"object","additionalProperties":{"type":"string"}},"description":{"type":"object","additionalProperties":{"type":"string"}},"funFacts":{"type":"object","additionalProperties":{"type":"string"}},"coverImageId":{"type":"integer"},"sortOrder":{"type":"integer"},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Habitat updated"},"400":{"description":"Validation error"},"404":{"description":"Not found"}}},"delete":{"tags":["Habitats"],"summary":"Delete a Habitat","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Habitat deleted"},"404":{"description":"Not found"}}}},"/species":{"get":{"tags":["Species"],"summary":"List all species","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20}},{"name":"sortBy","in":"query","schema":{"type":"string"}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query"}],"responses":{"200":{"description":"Paginated list of species"}}},"post":{"tags":["Species"],"summary":"Create a new Species","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"scientificName":{"type":"string"},"family":{"type":"string"},"genus":{"type":"string"},"conservationStatus":{"type":"string","enum":["LC","NT","VU","EN","CR","EW","EX","DD","NE"]},"commonName":{"type":"object","additionalProperties":{"type":"string"}},"description":{"type":"object","additionalProperties":{"type":"string"}},"diet":{"type":"object","additionalProperties":{"type":"string"}},"funFacts":{"type":"object","additionalProperties":{"type":"string"}},"habitatInfo":{"type":"object","additionalProperties":{"type":"string"}},"distributionMapId":{"type":"integer"},"coverImageId":{"type":"integer"},"active":{"type":"boolean"}},"required":["slug","scientificName","commonName"]}}}},"responses":{"201":{"description":"Species created successfully"},"400":{"description":"Validation error"},"409":{"description":"Duplicate entry"}}}},"/species/{id}":{"get":{"tags":["Species"],"summary":"Get a Species by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Species details"},"404":{"description":"Not found"}}},"patch":{"tags":["Species"],"summary":"Update a Species","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"scientificName":{"type":"string"},"family":{"type":"string"},"genus":{"type":"string"},"conservationStatus":{"type":"string","enum":["LC","NT","VU","EN","CR","EW","EX","DD","NE"]},"commonName":{"type":"object","additionalProperties":{"type":"string"}},"description":{"type":"object","additionalProperties":{"type":"string"}},"diet":{"type":"object","additionalProperties":{"type":"string"}},"funFacts":{"type":"object","additionalProperties":{"type":"string"}},"habitatInfo":{"type":"object","additionalProperties":{"type":"string"}},"distributionMapId":{"type":"integer"},"coverImageId":{"type":"integer"},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Species updated"},"400":{"description":"Validation error"},"404":{"description":"Not found"}}},"delete":{"tags":["Species"],"summary":"Delete a Species","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Species deleted"},"404":{"description":"Not found"}}}},"/tanks":{"get":{"tags":["Tanks"],"summary":"List all tanks","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20}},{"name":"sortBy","in":"query","schema":{"type":"string"}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query"}],"responses":{"200":{"description":"Paginated list of tanks"}}},"post":{"tags":["Tanks"],"summary":"Create a new Tank","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"roomId":{"type":"integer"},"habitatId":{"type":"integer"},"slug":{"type":"string"},"internalCode":{"type":"string"},"name":{"type":"object","additionalProperties":{"type":"string"}},"description":{"type":"object","additionalProperties":{"type":"string"}},"coverImageId":{"type":"integer"},"capacityLiters":{"type":"number"},"sortOrder":{"type":"integer"},"active":{"type":"boolean"}},"required":["slug","name"]}}}},"responses":{"201":{"description":"Tank created successfully"},"400":{"description":"Validation error"},"409":{"description":"Duplicate entry"}}}},"/tanks/{id}":{"get":{"tags":["Tanks"],"summary":"Get a Tank by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Tank details"},"404":{"description":"Not found"}}},"patch":{"tags":["Tanks"],"summary":"Update a Tank","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"roomId":{"type":"integer"},"habitatId":{"type":"integer"},"slug":{"type":"string"},"internalCode":{"type":"string"},"name":{"type":"object","additionalProperties":{"type":"string"}},"description":{"type":"object","additionalProperties":{"type":"string"}},"coverImageId":{"type":"integer"},"capacityLiters":{"type":"number"},"sortOrder":{"type":"integer"},"active":{"type":"boolean"}}}}}},"responses":{"200":{"description":"Tank updated"},"400":{"description":"Validation error"},"404":{"description":"Not found"}}},"delete":{"tags":["Tanks"],"summary":"Delete a Tank","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Tank deleted"},"404":{"description":"Not found"}}}},"/pages":{"get":{"tags":["Pages"],"summary":"List all pages","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20}},{"name":"sortBy","in":"query","schema":{"type":"string"}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query"}],"responses":{"200":{"description":"Paginated list of pages"}}},"post":{"tags":["Pages"],"summary":"Create a new Page","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"parentPageId":{"type":"integer"},"template":{"type":"string"},"title":{"type":"object","additionalProperties":{"type":"string"}},"body":{"type":"object","additionalProperties":{"type":"string"}},"metaTitle":{"type":"object","additionalProperties":{"type":"string"}},"metaDescription":{"type":"object","additionalProperties":{"type":"string"}},"coverImageId":{"type":"integer"},"status":{"type":"string","enum":["draft","published","archived"]},"visibility":{"type":"string","enum":["public","private","internal"]},"showInNav":{"type":"boolean"},"sortOrder":{"type":"integer"}},"required":["slug","title"]}}}},"responses":{"201":{"description":"Page created successfully"},"400":{"description":"Validation error"},"409":{"description":"Duplicate entry"}}}},"/pages/{id}":{"get":{"tags":["Pages"],"summary":"Get a Page by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Page details"},"404":{"description":"Not found"}}},"patch":{"tags":["Pages"],"summary":"Update a Page","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"slug":{"type":"string"},"parentPageId":{"type":"integer"},"template":{"type":"string"},"title":{"type":"object","additionalProperties":{"type":"string"}},"body":{"type":"object","additionalProperties":{"type":"string"}},"metaTitle":{"type":"object","additionalProperties":{"type":"string"}},"metaDescription":{"type":"object","additionalProperties":{"type":"string"}},"coverImageId":{"type":"integer"},"status":{"type":"string","enum":["draft","published","archived"]},"visibility":{"type":"string","enum":["public","private","internal"]},"showInNav":{"type":"boolean"},"sortOrder":{"type":"integer"}}}}}},"responses":{"200":{"description":"Page updated"},"400":{"description":"Validation error"},"404":{"description":"Not found"}}},"delete":{"tags":["Pages"],"summary":"Delete a Page","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"Page deleted"},"404":{"description":"Not found"}}}},"/tank-species":{"get":{"tags":["Tank Species"],"summary":"List all tank-species","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20}},{"name":"sortBy","in":"query","schema":{"type":"string"}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query"}],"responses":{"200":{"description":"Paginated list of tank-species"}}},"post":{"tags":["Tank Species"],"summary":"Create a new TankSpecies","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tankId":{"type":"integer"},"speciesId":{"type":"integer"},"specimenCount":{"type":"integer"},"featured":{"type":"boolean"},"sortOrder":{"type":"integer"}},"required":["tankId","speciesId"]}}}},"responses":{"201":{"description":"TankSpecies created successfully"},"400":{"description":"Validation error"},"409":{"description":"Duplicate entry"}}}},"/tank-species/{id}":{"get":{"tags":["Tank Species"],"summary":"Get a TankSpecies by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"TankSpecies details"},"404":{"description":"Not found"}}},"patch":{"tags":["Tank Species"],"summary":"Update a TankSpecies","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"tankId":{"type":"integer"},"speciesId":{"type":"integer"},"specimenCount":{"type":"integer"},"featured":{"type":"boolean"},"sortOrder":{"type":"integer"}}}}}},"responses":{"200":{"description":"TankSpecies updated"},"400":{"description":"Validation error"},"404":{"description":"Not found"}}},"delete":{"tags":["Tank Species"],"summary":"Delete a TankSpecies","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"TankSpecies deleted"},"404":{"description":"Not found"}}}},"/species-habitats":{"get":{"tags":["Species Habitats"],"summary":"List all species-habitats","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20}},{"name":"sortBy","in":"query","schema":{"type":"string"}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query"}],"responses":{"200":{"description":"Paginated list of species-habitats"}}},"post":{"tags":["Species Habitats"],"summary":"Create a new SpeciesHabitat","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"speciesId":{"type":"integer"},"habitatId":{"type":"integer"}},"required":["speciesId","habitatId"]}}}},"responses":{"201":{"description":"SpeciesHabitat created successfully"},"400":{"description":"Validation error"},"409":{"description":"Duplicate entry"}}}},"/species-habitats/{id}":{"get":{"tags":["Species Habitats"],"summary":"Get a SpeciesHabitat by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"SpeciesHabitat details"},"404":{"description":"Not found"}}},"patch":{"tags":["Species Habitats"],"summary":"Update a SpeciesHabitat","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"speciesId":{"type":"integer"},"habitatId":{"type":"integer"}}}}}},"responses":{"200":{"description":"SpeciesHabitat updated"},"400":{"description":"Validation error"},"404":{"description":"Not found"}}},"delete":{"tags":["Species Habitats"],"summary":"Delete a SpeciesHabitat","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"SpeciesHabitat deleted"},"404":{"description":"Not found"}}}},"/media-entities":{"get":{"tags":["Media Entities"],"summary":"List all media-entities","parameters":[{"name":"page","in":"query","schema":{"type":"integer","default":1}},{"name":"pageSize","in":"query","schema":{"type":"integer","default":20}},{"name":"sortBy","in":"query","schema":{"type":"string"}},{"name":"sortOrder","in":"query","schema":{"type":"string","enum":["asc","desc"]}},{"name":"q","in":"query","schema":{"type":"string"},"description":"Search query"}],"responses":{"200":{"description":"Paginated list of media-entities"}}},"post":{"tags":["Media Entities"],"summary":"Create a new MediaEntity","requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mediaId":{"type":"integer"},"entityType":{"type":"string"},"entityId":{"type":"integer"},"isCover":{"type":"boolean"},"sortOrder":{"type":"integer"}},"required":["mediaId","entityType","entityId"]}}}},"responses":{"201":{"description":"MediaEntity created successfully"},"400":{"description":"Validation error"},"409":{"description":"Duplicate entry"}}}},"/media-entities/{id}":{"get":{"tags":["Media Entities"],"summary":"Get a MediaEntity by ID","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"MediaEntity details"},"404":{"description":"Not found"}}},"patch":{"tags":["Media Entities"],"summary":"Update a MediaEntity","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"requestBody":{"required":true,"content":{"application/json":{"schema":{"type":"object","properties":{"mediaId":{"type":"integer"},"entityType":{"type":"string"},"entityId":{"type":"integer"},"isCover":{"type":"boolean"},"sortOrder":{"type":"integer"}}}}}},"responses":{"200":{"description":"MediaEntity updated"},"400":{"description":"Validation error"},"404":{"description":"Not found"}}},"delete":{"tags":["Media Entities"],"summary":"Delete a MediaEntity","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer"}}],"responses":{"200":{"description":"MediaEntity deleted"},"404":{"description":"Not found"}}}}},"components":{"schemas":{"PaginationMeta":{"type":"object","properties":{"page":{"type":"integer"},"pageSize":{"type":"integer"},"total":{"type":"integer"},"totalPages":{"type":"integer"}}},"ErrorResponse":{"type":"object","properties":{"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"details":{"type":"object"}}}}},"MultilingualField":{"type":"object","description":"Object with language codes as keys and translated strings as values","additionalProperties":{"type":"string"},"example":{"es":"Texto en español","en":"Text in English","gl":"Texto en galego"}}}}}