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

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 

16 

17 

18search = Blueprint( 

19 "search", __name__, template_folder="/templates", static_folder="/static" 

20) 

21 

22 

23@trace_function 

24@search.route("/all-search") 

25def all_search(): 

26 return render_template("all-search.html") 

27 

28 

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)) 

35 

36 if not term: 

37 return {"error": "No search term provided"} 

38 

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) 

46 

47 

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]} 

65 

66 

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)) 

72 

73 docs = search_docs(search_term)[:limit] 

74 

75 return jsonify({"docs": docs}) 

76 

77 

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)) 

84 

85 all_topics = search_topics(search_term, page, True)[:limit] 

86 

87 total_pages = -(len(all_topics) // -limit) 

88 start = (page - 1) * limit 

89 end = start + limit 

90 

91 return jsonify( 

92 {"topics": all_topics[start:end], "total_pages": total_pages} 

93 )