diff --git a/database/models.py b/database/models.py index 747f378..536edec 100644 --- a/database/models.py +++ b/database/models.py @@ -39,12 +39,15 @@ class Presence(BaseModel): orm_mode = True -class ArtnoID(BaseModel): - hash: Optional[str] - path: Optional[str] - title: Optional[str] = None - link: Optional[str] = None - presences: Optional[List[Presence]] +class TagCategorynoID(BaseModel): + name: str + + class Config: + orm_mode = True + + +class TagCategory(TagCategorynoID): + category_id: int class Config: orm_mode = True diff --git a/main.py b/main.py index ebcbd72..3d9b4d3 100644 --- a/main.py +++ b/main.py @@ -4,7 +4,8 @@ import uvicorn from typing import List, Tuple from database.database import Database -from database.models import Art, ArtnoID, Presence, ArtistNoId +from database.database import DBPresence, DBArt2Presence +from database.models import Art, ArtnoID, Presence, ArtistNoId, TagnoID, TagCategory, TagCategorynoID app = FastAPI() db = Database() @@ -23,7 +24,7 @@ async def art(id: int = None, hash: str = None, tag_id: int = None): elif tag_id is not None: result = db.get_tag_art(tag_id) - if id is None and hash is None and tag_id is None: # TODO fix against listing enormous amounts of art (because all could be large) + if id is None and hash is None and tag_id is None: # TODO fix against listing enormous amounts of art (because "all" could be large) result = db.get_art_list() if result is not None: @@ -111,6 +112,17 @@ async def presence(name: str = None, domain: str = None, artist_id: int = None, #raise HTTPException(status_code=406, detail="You must query with at least one parameter!") if result is not None: + if isinstance(result, list): + for i in range(len(result)): + if isinstance(result[i], DBPresence): + result[i].name = result[i].name.strip() + result[i].domain = result[i].domain.strip() + elif isinstance(result[i], DBArt2Presence): + result[i].presence_name = result[i].presence_name.strip() + result[i].presence_domain = result[i].presence_domain.strip() + else: + result.name = result.name.strip() + result.domain = result.domain.strip() return result raise HTTPException(status_code=404, detail="Presence was not found!") @@ -199,6 +211,11 @@ async def topic(name: str = None, id: int = None, artist_id: int = None): result = db.get_artist_topics(artist_id) if result is not None: + if isinstance(result, list): + for i in range(len(result)): + result[i].name = result[i].name.strip() + else: + result.name = result.name.strip() return result raise HTTPException(status_code=404, detail="Topic was not found!") @@ -226,10 +243,20 @@ async def tag(id: int = None, name: str = None, fuzzy: bool = False, category: i result = db.get_category_tags(category) if result is not None: + if isinstance(result, list): + for i in range(len(result)): + result[i].name = result[i].name.strip() + else: + result.name = result.name.strip() return result raise HTTPException(status_code=404, detail="Tag was not found!") +@app.post("/artnet/metadata/tag") +async def tag(tag: TagnoID, id: int = None): + print(f"Received POST on /artnet/metadata/tag (id={id}) body: tag={tag}") + + @app.get("/artnet/metadata/category") async def category(name: str = None, id: int = None): name = unquote(name) if name is not None else None @@ -245,9 +272,36 @@ async def category(name: str = None, id: int = None): result = db.get_category_by_name(name) if result is not None: + result.name = result.name.strip() return result raise HTTPException(status_code=404, detail="Category not found!") +@app.post("/artnet/metadata/category") +async def category(category: TagCategorynoID, id: int = None): + print(f"Received GET on /artnet/metadata/category (id={id}, body: {category})") + if id is None: # create new name + try: + new_id = db.create_category_by_model(category).category_id + return {"id": new_id} + except ValueError as e: + raise HTTPException(status_code=422, detail=str(e)) + + else: + updated_category = TagCategory(category_id=id, name=category.name) + db.update_category_by_model(updated_category) + + return True + + +@app.delete("/artnet/metadata/category") +def category(id: int): + print(f"Received DELETE on /artnet/metadata/category (id={id})") + try: + db.delete_category_by_id(category_id=id) + except ValueError as e: + raise HTTPException(status_code=404, detail=str(e)) + + if __name__ == "__main__": uvicorn.run(app, host="127.0.0.1", port=8000) diff --git a/tests/createAPI/create_delete_tag_category.py b/tests/createAPI/create_delete_tag_category.py new file mode 100644 index 0000000..13f2f29 --- /dev/null +++ b/tests/createAPI/create_delete_tag_category.py @@ -0,0 +1,133 @@ +import requests +from urllib.parse import quote +import json +from typing import List, Tuple + +test_tag_category_entries = [{"name": "category_name1", "id": None}, + {"name": "category_name2", "id": None}, + {"name": "category_name3", "id": None}] + + +def list_tag_categories(url: str, port: int): + """ + Return a list of all tag categories + :param url: + :param port: + :return: + """ + r = requests.get(f"http://{url}:{port}/artnet/metadata/category") + if r.status_code != 200: + raise Exception("Failed querying for tag category!") + categories = json.loads(r.text) + return categories + + +def get_category_by_ID(url: str, port: int, category_id: id): + r = requests.get(f"http://{url}:{port}/artnet/metadata/category?id={category_id}") + if r.status_code != 200: + raise Exception("Failed querying for tag category!") + + return json.loads(r.text) + + +def create_tag_categories(url: str, port: int): + """ + Create many tag categories for testing purposes + :param url: + :param port: + :return: + """ + for i in range(len(test_tag_category_entries)): + r = create_tag_category(url, port, name=test_tag_category_entries[i]["name"]) + if r.status_code != 200: + print(f"Create Category Entry Test Nr.{i}: failed with {r.status_code} and reason {r.text}") + raise Exception("Create Category Entry Test: FAILED") + else: + test_tag_category_entries[i]["id"] = int(json.loads(r.text)["id"]) + + +def update_category_entries(url: str, port: int): + for i in range(len(test_tag_category_entries)): + update_tag_category(url, port, category_id=test_tag_category_entries[i]["id"], name=f"Category #{i}") + updated_category = get_category_by_ID(url, port, test_tag_category_entries[i]["id"]) + + if updated_category['name'] != f"Category #{i}": + raise Exception("Updating the category name failed!") + + +def delete_category_entries(url: str, port: int): + categories = list_tag_categories(url, port) + + for i in range(len(categories)): + if "category_id" in categories[i].keys(): + r = delete_tag_category(url, port, category_id=categories[i]["category_id"]) + else: + r = delete_tag_category_by_name(url, port, name=categories[i]["name"]) + + if r.status_code != 200: + raise Exception(f"Could not delete tag category! {r.status_code}, {r.text}") + + print("Deleted category entries: SUCCESS") + + +def create_tag_category(url: str, port: int, name: str): + r = requests.post(f"http://{url}:{port}/artnet/metadata/category", + json={"name": name}) + return r + + +def update_tag_category(url: str, port: int, name: str, category_id: int): + r = requests.post(f"http://{url}:{port}/artnet/metadata/category?id={quote(str(category_id))}", + json={"name": name}) + return r + + +def delete_tag_category(url: str, port: int, category_id: int): + r = requests.delete(f"http://{url}:{port}/artnet/metadata/category?id={quote(str(category_id))}") + return r + + +def delete_tag_category_by_name(url: str, port: int, name: str): + r1 = requests.get(f"http://{url}:{port}/artnet/metadata/category?name={quote(name.strip())}") + if r1.status_code != 200: + raise ValueError("Could not delete tag category because it could not be found!") + data = json.loads(str(r1.text)) + category_id = data['category_id'] + + r = delete_tag_category(url, port, category_id=category_id) + return r + + +def run_tag_category_test(url: str, port: int): + print() + print("----------------") + + categories = list_tag_categories(url, port) + print(f"Starting tag name test with {len(categories)} categories!") + print("Starting the category test ...") + if len(list_tag_categories(url, port)) > 0: + print("Deleting previous category entries of tests ...") + delete_category_entries(url, port) + + print(f"Creating {len(test_tag_category_entries)} category entries ...") + create_tag_categories(url, port) + create_tag_result = False if not len(list_tag_categories(url, port)) == len(test_tag_category_entries) else True + print(f"Found {len(list_tag_categories(url, port))} category entries!") + if not create_tag_result: + print(f"Failure! Unexpected number of category entries!") + + print("Updating category entries with new data ...") + update_category_entries(url, port) + update_category_result = True + print("TODO") + print(f"Found {len(list_tag_categories(url, port))} category entries!") + + print("Deleting all category entries ...") + delete_category_entries(url, port) + delete_category_result = False if not len(list_tag_categories(url, port)) == 0 else True + print(f"Found {len(list_tag_categories(url, port))} category entries!") + + print("Category test complete!") + + return create_tag_result, update_category_result, delete_category_result +