diff --git a/app/routes/clothing.py b/app/routes/clothing.py index 24e6b88..5b8c9ba 100644 --- a/app/routes/clothing.py +++ b/app/routes/clothing.py @@ -8,7 +8,7 @@ @clothing.route("/", methods=["GET"]) -@limiter.limit("5 per minute") +@limiter.limit("60 per minute") @authorize_request def get_clothing_piece(clothing_id: str): clothing = clothing_manager.get_clothing_by_id(g.user_id, clothing_id) @@ -16,7 +16,7 @@ def get_clothing_piece(clothing_id: str): @clothing.route("/", methods=["DELETE"]) -@limiter.limit("5 per minute") +@limiter.limit("60 per minute") @authorize_request def delete_clothing_piece(clothing_id: str): clothing_manager.soft_delete_clothing_by_id(g.user_id, clothing_id) @@ -25,7 +25,7 @@ def delete_clothing_piece(clothing_id: str): @clothing.route("/", methods=["PATCH"]) -@limiter.limit("5 per minute") +@limiter.limit("60 per minute") @authorize_request def patch_clothing_piece(clothing_id: str): request.headers["Authorization"] diff --git a/app/routes/images.py b/app/routes/images.py index 92c0ce6..edb3ef2 100644 --- a/app/routes/images.py +++ b/app/routes/images.py @@ -24,7 +24,7 @@ def _build_temp_url(image_id: str) -> str: @images.route("/preview", methods=["POST"]) -@limiter.limit("1 per minute") +@limiter.limit("20 per minute") @authorize_request def generate_image(): if "file" not in request.files: @@ -63,7 +63,7 @@ def generate_image(): @images.route("/preview/", methods=["GET"]) -@limiter.limit("30 per minute") +@limiter.limit("120 per minute") @authorize_request def get_preview_status(job_id: str): try: diff --git a/app/routes/outfits.py b/app/routes/outfits.py index 8e6fe7d..b716810 100644 --- a/app/routes/outfits.py +++ b/app/routes/outfits.py @@ -15,7 +15,7 @@ @outfits.route("/", methods=["GET"]) -@limiter.limit("5 per minute") +@limiter.limit("60 per minute") @authorize_request def get_outfit(outfit_id: str): outfit = outfit_manager.get_outfit_by_id(g.user_id, outfit_id) @@ -24,7 +24,7 @@ def get_outfit(outfit_id: str): @outfits.route("/", methods=["DELETE"]) -@limiter.limit("5 per minute") +@limiter.limit("60 per minute") @authorize_request def delete_outfit(outfit_id: str): outfit_manager.soft_delete_outfit_by_id(g.user_id, outfit_id) @@ -33,7 +33,7 @@ def delete_outfit(outfit_id: str): @outfits.route("/", methods=["PATCH"]) -@limiter.limit("3 per minute") +@limiter.limit("60 per minute") @authorize_request def patch_outfit(outfit_id: str): data: dict = request.get_json() @@ -63,7 +63,7 @@ def patch_outfit(outfit_id: str): @outfits.route("//wears", methods=["POST"]) -@limiter.limit("10 per minute") +@limiter.limit("60 per minute") @authorize_request def log_outfit_wear(outfit_id: str) -> ResponseReturnValue: data: dict = request.get_json(silent=True) or {} @@ -84,7 +84,7 @@ def log_outfit_wear(outfit_id: str) -> ResponseReturnValue: @outfits.route("//wears", methods=["GET"]) -@limiter.limit("10 per minute") +@limiter.limit("60 per minute") @authorize_request def get_outfit_wears(outfit_id: str) -> ResponseReturnValue: limit = request.args.get("limit", 50, type=int) @@ -101,7 +101,7 @@ def get_outfit_wears(outfit_id: str) -> ResponseReturnValue: @outfits.route("/wears/", methods=["GET"]) -@limiter.limit("10 per minute") +@limiter.limit("60 per minute") @authorize_request def get_outfit_wear(wear_id: str) -> ResponseReturnValue: wear = wear_manager.get_wear_by_id(g.user_id, wear_id) @@ -110,7 +110,7 @@ def get_outfit_wear(wear_id: str) -> ResponseReturnValue: @outfits.route("/wears/", methods=["PATCH"]) -@limiter.limit("10 per minute") +@limiter.limit("60 per minute") @authorize_request def patch_outfit_wear(wear_id: str) -> ResponseReturnValue: data: dict = request.get_json(silent=True) or {} @@ -121,7 +121,7 @@ def patch_outfit_wear(wear_id: str) -> ResponseReturnValue: @outfits.route("/wears/", methods=["DELETE"]) -@limiter.limit("10 per minute") +@limiter.limit("60 per minute") @authorize_request def delete_outfit_wear(wear_id: str) -> ResponseReturnValue: wear_manager.delete_wear(g.user_id, wear_id) @@ -130,7 +130,7 @@ def delete_outfit_wear(wear_id: str) -> ResponseReturnValue: @outfits.route("/recommend", methods=["POST"]) -@limiter.limit("10 per minute") +@limiter.limit("60 per minute") @authorize_request def recommend_outfits() -> ResponseReturnValue: data: dict = request.get_json(silent=True) or {} @@ -150,7 +150,7 @@ def recommend_outfits() -> ResponseReturnValue: @outfits.route("/generate", methods=["POST"]) -@limiter.limit("10 per minute") +@limiter.limit("60 per minute") @authorize_request def generate_outfits() -> ResponseReturnValue: data: dict = request.get_json(silent=True) or {} diff --git a/app/routes/static.py b/app/routes/static.py index b10a3b4..8bdfd81 100644 --- a/app/routes/static.py +++ b/app/routes/static.py @@ -9,7 +9,7 @@ @static.route("/clothing_images/.webp", methods=["GET"]) @static.route("/clothing_images/", methods=["GET"]) -@limiter.limit("10 per minute") +@limiter.limit("300 per minute") def getClothingImage(clothing_id): try: return send_from_directory("app/static/clothing_images", f"{clothing_id}.webp") @@ -19,7 +19,7 @@ def getClothingImage(clothing_id): @static.route("/temp/", methods=["GET"]) -@limiter.limit("2 per minute") +@limiter.limit("120 per minute") def getTempImage(filename): if not filename: return jsonify({"error": "Filename is required"}), 400 @@ -36,7 +36,7 @@ def getTempImage(filename): @static.route("/outfit_images/", methods=["GET"]) -@limiter.limit("10 per minute") +@limiter.limit("300 per minute") def get_outfit_image(filename): filename = ( filename.strip() + ".webp" if not filename.endswith(".webp") else filename diff --git a/app/routes/taxonomy.py b/app/routes/taxonomy.py index 14ba5bd..2df7c75 100644 --- a/app/routes/taxonomy.py +++ b/app/routes/taxonomy.py @@ -33,7 +33,7 @@ def _build_taxonomy() -> dict[str, list[str]]: @taxonomy.route("", methods=["GET"]) @taxonomy.route("/", methods=["GET"]) -@limiter.limit("30 per minute") +@limiter.limit("120 per minute") def get_taxonomy(): response = jsonify(_TAXONOMY) response.set_etag(_TAXONOMY_ETAG) diff --git a/app/routes/users.py b/app/routes/users.py index 8ae5e77..50aff46 100644 --- a/app/routes/users.py +++ b/app/routes/users.py @@ -53,7 +53,7 @@ def upgrade_guest() -> ResponseReturnValue: @users.route("/me/clothing/sync", methods=["GET"]) -@limiter.limit("5 per minute") +@limiter.limit("30 per minute") @authorize_request def sync_my_clothes(): updated_since_param = request.args.get("updated_since") @@ -82,7 +82,7 @@ def sync_my_clothes(): @users.route("/me/outfits/sync", methods=["GET"]) -@limiter.limit("5 per minute") +@limiter.limit("30 per minute") @authorize_request def sync_my_outfits(): updated_since_param = request.args.get("updated_since") @@ -111,7 +111,7 @@ def sync_my_outfits(): @users.route("/me/outfit-wears/sync", methods=["GET"]) -@limiter.limit("5 per minute") +@limiter.limit("30 per minute") @authorize_request def sync_my_outfit_wears(): updated_since_param = request.args.get("updated_since") @@ -140,7 +140,7 @@ def sync_my_outfit_wears(): @users.route("/me/outfit-wears/stats", methods=["GET"]) -@limiter.limit("10 per minute") +@limiter.limit("60 per minute") @authorize_request def get_my_outfit_wear_stats() -> ResponseReturnValue: stats = wear_manager.get_stats( @@ -154,7 +154,7 @@ def get_my_outfit_wear_stats() -> ResponseReturnValue: @users.route("/me/outfit-wears", methods=["GET"]) -@limiter.limit("10 per minute") +@limiter.limit("60 per minute") @authorize_request def get_my_outfit_wears() -> ResponseReturnValue: limit = request.args.get("limit", 50, type=int) @@ -176,7 +176,7 @@ def get_my_outfit_wears() -> ResponseReturnValue: @users.route("/me/clothing/wear-stats", methods=["GET"]) -@limiter.limit("10 per minute") +@limiter.limit("60 per minute") @authorize_request def get_my_clothing_wear_stats() -> ResponseReturnValue: limit = request.args.get("limit", 50, type=int) @@ -200,7 +200,7 @@ def get_my_clothing_wear_stats() -> ResponseReturnValue: @users.route("//outfits", methods=["GET"]) -@limiter.limit("5 per minute") +@limiter.limit("60 per minute") @authorize_request def get_outfit_list(user_id: str): limit = request.args.get("limit", 50, type=int) @@ -217,7 +217,7 @@ def get_outfit_list(user_id: str): @users.route("/me/outfits", methods=["GET"]) -@limiter.limit("5 per minute") +@limiter.limit("60 per minute") @authorize_request def get_outfit_list_private(): limit = request.args.get("limit", 50, type=int) @@ -234,7 +234,7 @@ def get_outfit_list_private(): @users.route("/me/outfits", methods=["POST"]) -@limiter.limit("5 per minute") +@limiter.limit("60 per minute") @authorize_request def create_outfit(): data = request.get_json() @@ -256,7 +256,7 @@ def create_outfit(): @users.route("//clothing", methods=["GET"]) -@limiter.limit("5 per minute") +@limiter.limit("60 per minute") @authorize_request def get_clothing_list(user_id: str): limit = request.args.get("limit", 50, type=int) @@ -285,7 +285,7 @@ def get_clothing_list(user_id: str): @users.route("/me/clothing", methods=["GET"]) -@limiter.limit("5 per minute") +@limiter.limit("60 per minute") @authorize_request def get_clothing_list_private() -> ResponseReturnValue: limit = request.args.get("limit", 50, type=int) @@ -318,7 +318,7 @@ def get_clothing_list_private() -> ResponseReturnValue: @users.route("/me/clothing", methods=["POST"]) -@limiter.limit("5 per minute") +@limiter.limit("60 per minute") @authorize_request def create_clothing_piece(): data = request.get_json() @@ -432,7 +432,7 @@ def delete_account(): @users.route("/me", methods=["GET"]) @authorize_request -@limiter.limit("3 per minute") +@limiter.limit("60 per minute") def get_current_user(): user = user_manager.get_private_user_profile_by_id(g.user_id) return jsonify({"user": user.model_dump(mode="json")}), 200