Coverage for webapp/endpoints/views.py: 96%

53 statements  

« prev     ^ index     » next       coverage.py v7.15.4, created at 2026-08-20 22:09 +0000

1# Packages 

2import flask 

3from flask import make_response 

4from canonicalwebteam.exceptions import ( 

5 StoreApiResponseErrorList, 

6) 

7from canonicalwebteam.store_api.dashboard import Dashboard 

8from canonicalwebteam.store_api.publishergw import PublisherGW 

9from flask.json import jsonify 

10 

11# Local 

12from webapp.decorators import login_required, exchange_required 

13from webapp.helpers import api_publisher_session, api_session, get_brand_id 

14 

15dashboard = Dashboard(api_session) 

16publisher_gateway = PublisherGW("snap", api_publisher_session) 

17 

18endpoints = flask.Blueprint( 

19 "endpoints", 

20 __name__, 

21) 

22 

23 

24@endpoints.route("/api/stores") 

25@login_required 

26@exchange_required 

27def get_stores(): 

28 """ 

29 In this view we get all the stores the user has access to or we show a 403 

30 """ 

31 stores = dashboard.get_stores(flask.session) 

32 

33 res = {"success": True, "data": stores} 

34 

35 return jsonify(res) 

36 

37 

38@endpoints.route("/api/whoami") 

39@login_required 

40@exchange_required 

41def get_macaroon_info(): 

42 macaroon_info = publisher_gateway.macaroon_info( 

43 flask.session["developer_token"] 

44 ) 

45 

46 res = {"success": True, "data": macaroon_info} 

47 

48 return jsonify(res) 

49 

50 

51@endpoints.route("/api/store/<store_id>") 

52@login_required 

53@exchange_required 

54def get_settings(store_id): 

55 store = dashboard.get_store(flask.session, store_id) 

56 store["links"] = [] 

57 

58 if any(role["role"] == "admin" for role in store["roles"]): 

59 store["links"].append( 

60 {"name": "Members", "path": f'/admin/{store["id"]}/members'} 

61 ) 

62 store["links"].append( 

63 {"name": "Settings", "path": f'/admin/${store["id"]}/settings'} 

64 ) 

65 

66 res = {"success": True, "data": store} 

67 

68 return jsonify(res) 

69 

70 

71@endpoints.route("/api/store/<store_id>/brand") 

72@login_required 

73@exchange_required 

74def get_brand_store(store_id: str): 

75 brand_id = get_brand_id(flask.session, store_id) 

76 res = {} 

77 try: 

78 brand = publisher_gateway.get_brand(flask.session, brand_id) 

79 

80 res["data"] = brand 

81 res["success"] = True 

82 

83 except StoreApiResponseErrorList as error_list: 

84 res["success"] = False 

85 res["message"] = " ".join( 

86 [ 

87 f"{error.get('message', 'An error occurred')}" 

88 for error in error_list.errors 

89 ] 

90 ) 

91 res["data"] = [] 

92 

93 response = make_response(res) 

94 response.cache_control.max_age = 3600 

95 

96 return response