most plugins have same response schema

This commit is contained in:
Robert Resch 2022-03-06 22:20:42 +01:00
parent 3dd905d3d5
commit 1a1dc17648
17 changed files with 293 additions and 470 deletions

View file

@ -152,7 +152,10 @@ class MQTTHelperBot:
assert self._client is not None
try:
topic = f"iot/p2p/{cmdjson['cmdName']}/helperbot/bumper/helperbot/{cmdjson['toId']}/{cmdjson['toType']}/{cmdjson['toRes']}/q/{request_id}/{cmdjson['payloadType']}"
topic = (
f"iot/p2p/{cmdjson['cmdName']}/helperbot/bumper/helperbot/{cmdjson['toId']}/"
f"{cmdjson['toType']}/{cmdjson['toRes']}/q/{request_id}/{cmdjson['payloadType']}"
)
command_dto = CommandDto(cmdjson["payloadType"])
self._commands[request_id] = command_dto

View file

@ -0,0 +1,18 @@
import logging
import os
from aiohttp.web_exceptions import HTTPInternalServerError
from aiohttp.web_fileresponse import FileResponse
from aiohttp.web_request import Request
async def get_bot_image(_: Request) -> FileResponse:
"""Return image of bot."""
try:
return FileResponse(
os.path.join(os.path.dirname(__file__), "robotvac_image.jpg")
)
except Exception: # pylint: disable=broad-except
logging.error("Unexpected exception occurred", exc_info=True)
raise HTTPInternalServerError

View file

@ -5,11 +5,15 @@ from abc import abstractmethod
from glob import glob
from os.path import dirname, isfile, join
from types import ModuleType
from typing import Iterable
from typing import Any, Iterable
from aiohttp import web
from aiohttp.web_response import Response
from aiohttp.web_routedef import AbstractRouteDef
from bumper.models import RETURN_API_SUCCESS
from bumper.util import get_current_time_as_millis
class WebserverPlugin:
"""Abstract webserver plugin."""
@ -70,3 +74,15 @@ def add_plugins(app: web.Application) -> None:
continue
_add_routes(app, obj, plugin_module_name)
def get_success_response(data: Any) -> Response:
body = {
"code": RETURN_API_SUCCESS,
"data": data,
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)

View file

@ -1,15 +1,14 @@
"""Pim plugin module."""
import json
import logging
import os
from typing import Iterable
from aiohttp import web
from aiohttp.web_routedef import AbstractRouteDef
from bumper import bumper_dir
from bumper.models import RETURN_API_SUCCESS, EcoVacsHomeProducts
from ...images import get_bot_image
from .. import WebserverPlugin
@ -28,7 +27,7 @@ class PimPlugin(WebserverPlugin):
web.route(
"*",
"/pim/file/get/{id}",
self.handle_pimFile,
get_bot_image,
),
web.route(
"*",
@ -63,19 +62,6 @@ class PimPlugin(WebserverPlugin):
except Exception as e:
logging.exception(f"{e}")
async def handle_pimFile(self, request):
try:
fileID = request.match_info.get("id", "")
return web.FileResponse(
os.path.join(
bumper_dir, "bumper", "web", "images", "robotvac_image.jpg"
)
)
except Exception as e:
logging.exception(f"{e}")
async def handle_getConfignetAll(self, request):
try:
body = confignetAllResponse

View file

@ -1,20 +1,14 @@
"""Global plugin module."""
import logging
import os
from typing import Iterable
from aiohttp import web
from aiohttp.web_exceptions import HTTPInternalServerError
from aiohttp.web_request import Request
from aiohttp.web_response import StreamResponse
from aiohttp.web_routedef import AbstractRouteDef
from bumper import bumper_dir
from bumper.web.images import get_bot_image
from .. import WebserverPlugin
# pylint: disable=no-self-use
class GlobalPlugin(WebserverPlugin):
"""Global plugin."""
@ -24,19 +18,7 @@ class GlobalPlugin(WebserverPlugin):
return [
web.route(
"*",
"/global/{year}/{month}/{day}/{fileid}",
self._handle_upload_global_file,
"/global/{year}/{month}/{day}/{id}",
get_bot_image,
),
]
async def _handle_upload_global_file(self, _: Request) -> StreamResponse:
try:
return web.FileResponse(
os.path.join(
bumper_dir, "bumper", "web", "images", "robotvac_image.jpg"
)
)
except Exception: # pylint: disable=broad-except
logging.error("Unexpected exception occurred", exc_info=True)
raise HTTPInternalServerError

View file

@ -1 +1,3 @@
"""Private plugins module."""
BASE_URL = "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/"

View file

@ -1,14 +1,13 @@
"""Ad plugin module."""
import logging
from typing import Iterable
from aiohttp import web
from aiohttp.web_request import Request
from aiohttp.web_response import Response
from aiohttp.web_routedef import AbstractRouteDef
from bumper.models import RETURN_API_SUCCESS
from bumper.util import get_current_time_as_millis
from ... import WebserverPlugin
from ... import WebserverPlugin, get_success_response
from . import BASE_URL
class AdPlugin(WebserverPlugin):
@ -20,42 +19,16 @@ class AdPlugin(WebserverPlugin):
return [
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/ad/getAdByPositionType",
self.handle_getAdByPositionType,
f"{BASE_URL}ad/getAdByPositionType",
_handle,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/ad/getBootScreen",
self.handle_getBootScreen,
f"{BASE_URL}ad/getBootScreen",
_handle,
),
]
async def handle_getAdByPositionType(self, request): # EcoVacs Home
try:
body = {
"code": RETURN_API_SUCCESS,
"data": None,
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
except Exception as e:
logging.exception(f"{e}")
async def handle_getBootScreen(self, request): # EcoVacs Home
try:
body = {
"code": RETURN_API_SUCCESS,
"data": None,
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
except Exception as e:
logging.exception(f"{e}")
async def _handle(_: Request) -> Response:
return get_success_response(None)

View file

@ -1,15 +1,16 @@
"""Campaign plugin module."""
import logging
from datetime import datetime, timedelta
from typing import Iterable
from aiohttp import web
from aiohttp.web_request import Request
from aiohttp.web_response import Response
from aiohttp.web_routedef import AbstractRouteDef
from bumper.models import RETURN_API_SUCCESS
from bumper.util import convert_to_millis, get_current_time_as_millis
from ... import WebserverPlugin
from ... import WebserverPlugin, get_success_response
from . import BASE_URL
class CampaignPlugin(WebserverPlugin):
@ -21,33 +22,21 @@ class CampaignPlugin(WebserverPlugin):
return [
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/campaign/homePageAlert",
self.handle_homePageAlert,
name="v1_campaign_homePageAlert",
f"{BASE_URL}campaign/homePageAlert",
_handle_home_page_alert,
),
]
async def handle_homePageAlert(self, request):
try:
nextAlert = convert_to_millis(
(datetime.now() + timedelta(hours=12)).timestamp()
)
body = {
"code": RETURN_API_SUCCESS,
"data": {
"clickSchemeUrl": None,
"clickWebUrl": None,
"hasCampaign": "N",
"imageUrl": None,
"nextAlertTime": nextAlert,
"serverTime": get_current_time_as_millis(),
},
"msg": "操作成功",
"time": get_current_time_as_millis(),
}
return web.json_response(body)
except Exception as e:
logging.exception(f"{e}")
async def _handle_home_page_alert(_: Request) -> Response:
nextAlert = convert_to_millis((datetime.now() + timedelta(hours=12)).timestamp())
return get_success_response(
{
"clickSchemeUrl": None,
"clickWebUrl": None,
"hasCampaign": "N",
"imageUrl": None,
"nextAlertTime": nextAlert,
"serverTime": get_current_time_as_millis(),
}
)

View file

@ -10,10 +10,10 @@ from aiohttp.web_request import Request
from aiohttp.web_response import Response
from aiohttp.web_routedef import AbstractRouteDef
from bumper.models import RETURN_API_SUCCESS
from bumper.util import get_current_time_as_millis
from ... import WebserverPlugin
from ... import WebserverPlugin, get_success_response
from . import BASE_URL
class CommonPlugin(WebserverPlugin):
@ -22,55 +22,53 @@ class CommonPlugin(WebserverPlugin):
@property
def routes(self) -> Iterable[AbstractRouteDef]:
"""Plugin routes."""
base_url = "/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/common/"
return [
web.route(
"*",
f"{base_url}checkAPPVersion",
f"{BASE_URL}common/checkAPPVersion",
_handle_check_app_version,
),
web.route(
"*",
f"{base_url}checkVersion",
f"{BASE_URL}common/checkVersion",
_handle_check_version,
),
web.route(
"*",
f"{base_url}uploadDeviceInfo",
f"{BASE_URL}common/uploadDeviceInfo",
_handle_upload_device_info,
),
web.route(
"*",
f"{base_url}getSystemReminder",
f"{BASE_URL}common/getSystemReminder",
_handle_get_system_reminder,
),
web.route(
"*",
f"{base_url}getConfig",
f"{BASE_URL}common/getConfig",
_handle_get_config,
),
web.route(
"*",
f"{base_url}getAreas",
f"{BASE_URL}common/getAreas",
_handle_get_areas,
),
web.route(
"*",
f"{base_url}getAgreementURLBatch",
f"{BASE_URL}common/getAgreementURLBatch",
_handle_get_agreement_url_batch,
),
web.route(
"*",
f"{base_url}getTimestamp",
f"{BASE_URL}common/getTimestamp",
_handle_get_timestamp,
),
]
async def _handle_check_version(_: Request) -> Response:
body = {
"code": RETURN_API_SUCCESS,
"data": {
return get_success_response(
{
"c": None,
"img": None,
"r": 0,
@ -78,18 +76,13 @@ async def _handle_check_version(_: Request) -> Response:
"u": None,
"ut": 0,
"v": None,
},
"msg": "操作成功",
"time": get_current_time_as_millis(),
}
return web.json_response(body)
}
)
async def _handle_check_app_version(_: Request) -> Response:
body = {
"code": RETURN_API_SUCCESS,
"data": {
return get_success_response(
{
"c": None,
"downPageUrl": None,
"img": None,
@ -99,44 +92,25 @@ async def _handle_check_app_version(_: Request) -> Response:
"u": None,
"ut": 0,
"v": None,
},
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
}
)
async def _handle_upload_device_info(_: Request) -> Response:
body = {
"code": RETURN_API_SUCCESS,
"data": None,
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
return get_success_response(None)
async def _handle_get_system_reminder(_: Request) -> Response:
body = {
"code": RETURN_API_SUCCESS,
"data": {
return get_success_response(
{
"iosGradeTime": {"iodGradeFlag": "N"},
"openNotification": {
"openNotificationContent": None,
"openNotificationFlag": "N",
"openNotificationTitle": None,
},
},
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
}
)
async def _handle_get_config(request: Request) -> Response:
@ -145,15 +119,7 @@ async def _handle_get_config(request: Request) -> Response:
for key in request.query["keys"].split(","):
data.append({"key": key, "value": "Y"})
body = {
"code": RETURN_API_SUCCESS,
"data": data,
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
return get_success_response(data)
except Exception: # pylint: disable=broad-except
logging.error("Unexpected exception occurred", exc_info=True)
@ -162,16 +128,11 @@ async def _handle_get_config(request: Request) -> Response:
async def _handle_get_areas(_: Request) -> Response:
try:
with open(os.path.join(os.path.dirname(__file__), "area.json")) as file:
body = {
"code": RETURN_API_SUCCESS,
"data": json.load(file),
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
with open(
os.path.join(os.path.dirname(__file__), "common_area.json"),
encoding="utf-8",
) as file:
return get_success_response(json.load(file))
except Exception: # pylint: disable=broad-except
logging.error("Unexpected exception occurred", exc_info=True)
@ -179,9 +140,8 @@ async def _handle_get_areas(_: Request) -> Response:
async def _handle_get_agreement_url_batch(_: Request) -> Response:
body = {
"code": RETURN_API_SUCCESS,
"data": [
return get_success_response(
[
{
"acceptTime": None,
"force": None,
@ -198,23 +158,9 @@ async def _handle_get_agreement_url_batch(_: Request) -> Response:
"url": "https://gl-eu-wap.ecovacs.com/content/agreement?id=20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac&language=EN",
"version": "1.03",
},
],
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
]
)
async def _handle_get_timestamp(_: Request) -> Response:
time = get_current_time_as_millis()
body = {
"code": RETURN_API_SUCCESS,
"data": {"timestamp": time},
"msg": "操作成功",
"success": True,
"time": time,
}
return web.json_response(body)
return get_success_response({"timestamp": get_current_time_as_millis()})

View file

@ -1,13 +1,12 @@
import logging
from typing import Iterable
from aiohttp import web
from aiohttp.web_request import Request
from aiohttp.web_response import Response
from aiohttp.web_routedef import AbstractRouteDef
from bumper.models import RETURN_API_SUCCESS
from bumper.util import get_current_time_as_millis
from ... import WebserverPlugin
from ... import WebserverPlugin, get_success_response
from . import BASE_URL
class MessagePlugin(WebserverPlugin):
@ -19,42 +18,20 @@ class MessagePlugin(WebserverPlugin):
return [
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/message/hasUnreadMsg",
self.handle_hasUnreadMessage,
f"{BASE_URL}message/hasUnreadMsg",
_handle_has_unread_message,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/message/getMsgList",
self.handle_getMsgList,
f"{BASE_URL}message/getMsgList",
_handle_get_msg_list,
),
]
async def handle_hasUnreadMessage(self, request): # EcoVacs Home
try:
body = {
"code": RETURN_API_SUCCESS,
"data": "N",
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
async def _handle_has_unread_message(_: Request) -> Response:
return get_success_response("N")
except Exception as e:
logging.exception(f"{e}")
async def handle_getMsgList(self, request): # EcoVacs Home
try:
body = {
"code": RETURN_API_SUCCESS,
"data": {"hasNextPage": 0, "items": []},
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
except Exception as e:
logging.exception(f"{e}")
async def _handle_get_msg_list(_: Request) -> Response:
return get_success_response({"hasNextPage": 0, "items": []})

View file

@ -1,14 +1,13 @@
"""Shop plugin module."""
import logging
from typing import Iterable
from aiohttp import web
from aiohttp.web_request import Request
from aiohttp.web_response import Response
from aiohttp.web_routedef import AbstractRouteDef
from bumper.models import RETURN_API_SUCCESS
from bumper.util import get_current_time_as_millis
from ... import WebserverPlugin
from ... import WebserverPlugin, get_success_response
from . import BASE_URL
class ShopPlugin(WebserverPlugin):
@ -20,27 +19,18 @@ class ShopPlugin(WebserverPlugin):
return [
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/shop/getCnWapShopConfig",
self.handle_getCnWapShopConfig,
f"{BASE_URL}shop/getCnWapShopConfig",
_handle_get_cn_wap_shop_config,
),
]
async def handle_getCnWapShopConfig(self, request): # EcoVacs Home
try:
body = {
"code": RETURN_API_SUCCESS,
"data": {
"myShopShowFlag": "N",
"myShopUrl": "",
"shopIndexShowFlag": "N",
"shopIndexUrl": "",
},
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
except Exception as e:
logging.exception(f"{e}")
async def _handle_get_cn_wap_shop_config(_: Request) -> Response:
return get_success_response(
{
"myShopShowFlag": "N",
"myShopUrl": "",
"shopIndexShowFlag": "N",
"shopIndexUrl": "",
}
)

View file

@ -1,14 +1,15 @@
import logging
"""User plugin module."""
from typing import Iterable
from aiohttp import web
from aiohttp.web_request import Request
from aiohttp.web_response import Response
from aiohttp.web_routedef import AbstractRouteDef
from bumper.models import RETURN_API_SUCCESS
from bumper.util import get_current_time_as_millis
from bumper.web import auth_util
from ... import WebserverPlugin
from ... import WebserverPlugin, get_success_response
from . import BASE_URL
class UserPlugin(WebserverPlugin):
@ -20,199 +21,148 @@ class UserPlugin(WebserverPlugin):
return [
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/login",
f"{BASE_URL}user/login",
auth_util.login,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/checkLogin",
f"{BASE_URL}user/checkLogin",
auth_util.login,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/getAuthCode",
f"{BASE_URL}user/getAuthCode",
auth_util.get_authcode,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/logout",
f"{BASE_URL}user/logout",
auth_util.logout,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/checkAgreement",
self.handle_checkAgreement,
f"{BASE_URL}user/checkAgreement",
_handle_check_agreement,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/checkAgreementBatch",
self.handle_checkAgreement,
f"{BASE_URL}user/checkAgreementBatch",
_handle_check_agreement,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/getUserAccountInfo",
f"{BASE_URL}user/getUserAccountInfo",
auth_util.get_user_account_info,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/getUserMenuInfo",
self.handle_getUserMenuInfo,
f"{BASE_URL}user/getUserMenuInfo",
_handle_get_user_menu_info,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/changeArea",
self.handle_changeArea,
f"{BASE_URL}user/changeArea",
_handle_change_area,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/queryChangeArea",
self.handle_changeArea,
f"{BASE_URL}user/queryChangeArea",
_handle_change_area,
),
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/acceptAgreementBatch",
self.handle_acceptAgreementBatch,
f"{BASE_URL}user/acceptAgreementBatch",
_handle_accept_agreement_batch,
),
# Direct register from app:
# /{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/user/directRegister
# Register by email
# /registerByEmail
]
async def handle_checkAgreement(self, request):
try:
apptype = request.match_info.get("apptype", "")
if "global_" in apptype:
body = {
"code": RETURN_API_SUCCESS,
"data": [
{
"force": "N",
"id": "20180804040641_7d746faf18b8cb22a50d145598fe4c90",
"type": "USER",
"url": "https://bumper.ecovacs.com/content/agreement?id=20180804040641_7d746faf18b8cb22a50d145598fe4c90&language=EN", # "https://gl-us-wap.ecovacs.com/content/agreement?id=20180804040641_7d746faf18b8cb22a50d145598fe4c90&language=EN
"version": "1.01",
},
{
"force": "N",
"id": "20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac",
"type": "PRIVACY",
"url": "https://bumper.ecovacs.com/content/agreement?id=20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac&language=EN", # "https://gl-us-wap.ecovacs.com/content/agreement?id=20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac&language=EN"
"version": "1.01",
},
],
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
else:
body = {
"code": RETURN_API_SUCCESS,
"data": [],
"msg": "操作成功",
"time": get_current_time_as_millis(),
}
return web.json_response(body)
async def _handle_check_agreement(request: Request) -> Response:
apptype = request.match_info.get("apptype", "")
data = []
if "global_" in apptype:
data = [
{
"force": "N",
"id": "20180804040641_7d746faf18b8cb22a50d145598fe4c90",
"type": "USER",
"url": "https://bumper.ecovacs.com/content/agreement?id=20180804040641_7d746faf18b8cb22a50d145598fe4c90&language=EN", # "https://gl-us-wap.ecovacs.com/content/agreement?id=20180804040641_7d746faf18b8cb22a50d145598fe4c90&language=EN
"version": "1.01",
},
{
"force": "N",
"id": "20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac",
"type": "PRIVACY",
"url": "https://bumper.ecovacs.com/content/agreement?id=20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac&language=EN", # "https://gl-us-wap.ecovacs.com/content/agreement?id=20180804040245_4e7c56dfb7ebd3b81b1f2747d0859fac&language=EN"
"version": "1.01",
},
]
except Exception as e:
logging.exception(f"{e}")
return get_success_response(data)
async def handle_getUserMenuInfo(self, request):
try:
apptype = request.match_info.get("apptype", "")
body = {
"code": "0000",
"data": [
async def _handle_get_user_menu_info(_: Request) -> Response:
return get_success_response(
[
{
"menuItems": [
{
"menuItems": [
{
"clickAction": 1,
"clickUri": "https://ecovacs.zendesk.com/hc/en-us",
"menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/2019121603180741b73907046e742b80e8fe4a90fe2498.png",
"menuId": "20191216031849_4d744630f7ad2f5208a4b8051be61d10",
"menuName": "Help & Feedback",
"paramsJson": "",
}
],
"menuPositionKey": "A_FIRST",
},
{
"menuItems": [
{
"clickAction": 3,
"clickUri": "robotShare",
"menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/2019121603284185e632ec6c5da10bd82119d7047a1f9e.png",
"menuId": "20191216032853_5fac4cc9cbd0e166dfa951485d1d8cc4",
"menuName": "Share Robot",
"paramsJson": "",
}
],
"menuPositionKey": "B_SECOND",
},
{
"menuItems": [
{
"clickAction": 3,
"clickUri": "config",
"menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/201912160325324068da4e4a09b8c3973db162e84784d5.png",
"menuId": "20191216032545_ebea0fbb4cb02d9c2fec5bdf3371bc2d",
"menuName": "Settings",
"paramsJson": "",
}
],
"menuPositionKey": "C_THIRD",
},
{
"menuItems": [
{
"clickAction": 1,
"clickUri": "https://bumper.ecovacs.com/",
"menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/201912160325324068da4e4a09b8c3973db162e84784d5.png",
"menuId": "20191216032545_ebea0fbb4cb02d9c2fec5bdf3371bc2c",
"menuName": "Bumper Status",
"paramsJson": "",
}
],
"menuPositionKey": "D_FOURTH",
},
"clickAction": 1,
"clickUri": "https://ecovacs.zendesk.com/hc/en-us",
"menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/2019121603180741b73907046e742b80e8fe4a90fe2498.png",
"menuId": "20191216031849_4d744630f7ad2f5208a4b8051be61d10",
"menuName": "Help & Feedback",
"paramsJson": "",
}
],
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
"menuPositionKey": "A_FIRST",
},
{
"menuItems": [
{
"clickAction": 3,
"clickUri": "robotShare",
"menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/2019121603284185e632ec6c5da10bd82119d7047a1f9e.png",
"menuId": "20191216032853_5fac4cc9cbd0e166dfa951485d1d8cc4",
"menuName": "Share Robot",
"paramsJson": "",
}
],
"menuPositionKey": "B_SECOND",
},
{
"menuItems": [
{
"clickAction": 3,
"clickUri": "config",
"menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/201912160325324068da4e4a09b8c3973db162e84784d5.png",
"menuId": "20191216032545_ebea0fbb4cb02d9c2fec5bdf3371bc2d",
"menuName": "Settings",
"paramsJson": "",
}
],
"menuPositionKey": "C_THIRD",
},
{
"menuItems": [
{
"clickAction": 1,
"clickUri": "https://bumper.ecovacs.com/",
"menuIconUrl": "https://gl-us-pub.ecovacs.com/upload/global/2019/12/16/201912160325324068da4e4a09b8c3973db162e84784d5.png",
"menuId": "20191216032545_ebea0fbb4cb02d9c2fec5bdf3371bc2c",
"menuName": "Bumper Status",
"paramsJson": "",
}
],
"menuPositionKey": "D_FOURTH",
},
]
)
return web.json_response(body)
except Exception as e:
logging.exception(f"{e}")
async def _handle_change_area(_: Request) -> Response:
return get_success_response({"isNeedReLogin": "N"})
async def handle_changeArea(self, request):
try:
body = {
"code": RETURN_API_SUCCESS,
"data": {"isNeedReLogin": "N"},
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
except Exception as e:
logging.exception(f"{e}")
async def handle_acceptAgreementBatch(self, request):
try:
body = {
"code": RETURN_API_SUCCESS,
"data": None,
"msg": "操作成功",
"success": True,
"time": get_current_time_as_millis(),
}
return web.json_response(body)
except Exception as e:
logging.exception(f"{e}")
async def _handle_accept_agreement_batch(_: Request) -> Response:
return get_success_response(None)

View file

@ -0,0 +1,51 @@
"""User setting plugin module."""
from typing import Iterable
from aiohttp import web
from aiohttp.web_request import Request
from aiohttp.web_response import Response
from aiohttp.web_routedef import AbstractRouteDef
from ... import WebserverPlugin, get_success_response
from . import BASE_URL
class UserSettingPlugin(WebserverPlugin):
"""User setting plugin."""
@property
def routes(self) -> Iterable[AbstractRouteDef]:
"""Plugin routes."""
return [
web.route(
"*",
f"{BASE_URL}userSetting/getSuggestionSetting",
_handle_get_suggestion_setting,
),
]
async def _handle_get_suggestion_setting(_: Request) -> Response:
return get_success_response(
{
"acceptSuggestion": "Y",
"itemList": [
{
"name": "Aktionen/Angebote/Ereignisse",
"settingKey": "MARKETING",
"val": "Y",
},
{
"name": "Benutzerbefragung",
"settingKey": "QUESTIONNAIRE",
"val": "Y",
},
{
"name": "Produkt-Upgrade/Hilfe für Benutzer",
"settingKey": "INTRODUCTION",
"val": "Y",
},
],
}
)

View file

@ -1,61 +0,0 @@
"""user setting plugin module."""
import logging
from typing import Iterable
from aiohttp import web
from aiohttp.web_routedef import AbstractRouteDef
from bumper.models import RETURN_API_SUCCESS
from bumper.util import get_current_time_as_millis
from ... import WebserverPlugin
class UserSettingPlugin(WebserverPlugin):
"""User setting plugin."""
@property
def routes(self) -> Iterable[AbstractRouteDef]:
"""Plugin routes."""
return [
web.route(
"*",
"/{country}/{language}/{devid}/{apptype}/{appversion}/{devtype}/{aid}/userSetting/getSuggestionSetting",
self.handle_getSuggestionSetting,
),
]
async def handle_getSuggestionSetting(self, request):
try:
body = {
"code": RETURN_API_SUCCESS,
"data": {
"acceptSuggestion": "Y",
"itemList": [
{
"name": "Aktionen/Angebote/Ereignisse",
"settingKey": "MARKETING",
"val": "Y",
},
{
"name": "Benutzerbefragung",
"settingKey": "QUESTIONNAIRE",
"val": "Y",
},
{
"name": "Produkt-Upgrade/Hilfe für Benutzer",
"settingKey": "INTRODUCTION",
"val": "Y",
},
],
},
"msg": "操作成功",
"time": get_current_time_as_millis(),
}
return web.json_response(body)
except Exception as e:
logging.exception(f"{e}")

View file

@ -21,7 +21,7 @@ services:
volumes:
- /etc/timezone:/etc/timezone:ro
- /etc/localtime:/etc/localtime:ro
- ./nginx/:/etc/nginx:ro # See config file below
- ./nginx/:/etc/nginx:ro # See config file below
bumper:
image: bmartin5692/bumper
@ -33,7 +33,7 @@ services:
PUID: 1000
PGID: 1000
TZ: Europe/Rome
BUMPER_ANNOUNCE_IP: XXX # Insert your IP
BUMPER_ANNOUNCE_IP: XXX # Insert your IP
BUMPER_LISTEN: 0.0.0.0
# BUMPER_DEBUG: "true"
LOG_TO_STDOUT: "true"

View file

@ -496,7 +496,8 @@ async def test_getProductIotMap(webserver_client):
jsonresp = json.loads(text)
assert jsonresp["code"] == RETURN_API_SUCCESS
# Test getPimFile
async def test_pim_file(webserver_client):
resp = await webserver_client.get("/api/pim/file/get/123")
assert resp.status == 200