Coverage for webapp/search/views.py: 96%
51 statements
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-27 22:07 +0000
« prev ^ index » next coverage.py v7.9.1, created at 2025-06-27 22:07 +0000
1from flask import (
2 Blueprint,
3 jsonify,
4 request,
5 render_template,
6)
7from webapp.config import SEARCH_FIELDS
8from webapp.search.logic import (
9 search_docs,
10 search_topics,
11 search_charms,
12 search_bundles,
13)
14from webapp.observability.utils import trace_function
15from webapp.store_api import publisher_gateway
18search = Blueprint(
19 "search", __name__, template_folder="/templates", static_folder="/static"
20)
23@trace_function
24@search.route("/all-search")
25def all_search():
26 return render_template("all-search.html")
29@trace_function
30@search.route("/all-search.json")
31def all_search_json():
32 params = request.args
33 term = params.get("q")
34 limit = int(params.get("limit", 5))
36 if not term:
37 return {"error": "No search term provided"}
39 result = {
40 "charms": search_charms(term)[:limit],
41 "bundles": search_bundles(term)[:limit],
42 "docs": search_docs(term)[:limit],
43 "topics": search_topics(term, 1, False)[:limit],
44 }
45 return jsonify(result)
48@trace_function
49@search.route("/all-charms")
50@search.route("/all-bundles")
51def all_charms() -> dict:
52 query = request.args.get("q", "")
53 page = int(request.args.get("page", 1))
54 limit = int(request.args.get("limit", 50))
55 packages = publisher_gateway.find(query, fields=SEARCH_FIELDS)
56 package_type = request.path[1:-1].split("-")[1]
57 result = [
58 package
59 for package in packages["results"]
60 if package["type"] == package_type
61 ]
62 start = (page - 1) * limit
63 end = start + limit
64 return {f"{package_type}s": result[start:end]}
67@trace_function
68@search.route("/all-docs")
69def all_docs():
70 search_term = request.args.get("q")
71 limit = int(request.args.get("limit", 50))
73 docs = search_docs(search_term)[:limit]
75 return jsonify({"docs": docs})
78@trace_function
79@search.route("/all-topics")
80def all_topics():
81 search_term = request.args.get("q")
82 page = int(request.args.get("page", 1))
83 limit = int(request.args.get("limit", 50))
85 all_topics = search_topics(search_term, page, True)[:limit]
87 total_pages = -(len(all_topics) // -limit)
88 start = (page - 1) * limit
89 end = start + limit
91 return jsonify(
92 {"topics": all_topics[start:end], "total_pages": total_pages}
93 )