async def _handle_item_request(self, web_request: WebRequest) -> Dict[str, Any]: action = web_request.get_action() namespace = web_request.get_str("namespace") if namespace in self.forbidden_namespaces: raise self.server.error( f"Read/Write access to namespace '{namespace}'" " is forbidden", 403) key: Any valid_types: Tuple[type, ...] if action != "GET": if namespace in self.protected_namespaces: raise self.server.error( f"Write access to namespace '{namespace}'" " is forbidden", 403) key = web_request.get("key") valid_types = (list, str) else: key = web_request.get("key", None) valid_types = (list, str, type(None)) if not isinstance(key, valid_types): raise self.server.error( "Value for argument 'key' is an invalid type: " f"{type(key).__name__}") if action == "GET": val = await self.get_item(namespace, key) elif action == "POST": val = web_request.get("value") await self.insert_item(namespace, key, val) elif action == "DELETE": val = await self.delete_item(namespace, key, drop_empty_db=True) return {'namespace': namespace, 'key': key, 'value': val}
async def _handle_job_request(self, web_request: WebRequest ) -> Dict[str, Any]: action = web_request.get_action() if action == "GET": job_id = web_request.get_str("uid") if job_id not in self.cached_job_ids: raise self.server.error(f"Invalid job uid: {job_id}", 404) job = self.history_ns[job_id] return {"job": self._prep_requested_job(job, job_id)} if action == "DELETE": all = web_request.get_boolean("all", False) if all: deljobs = self.cached_job_ids self.history_ns.clear() self.cached_job_ids = [] self.next_job_id = 0 return {'deleted_jobs': deljobs} job_id = web_request.get_str("uid") if job_id not in self.cached_job_ids: raise self.server.error(f"Invalid job uid: {job_id}", 404) self.delete_job(job_id) return {'deleted_jobs': [job_id]} raise self.server.error("Invalid Request Method")
async def _handle_apikey_request(self, web_request: WebRequest) -> str: action = web_request.get_action() if action.upper() == 'POST': self.api_key = uuid.uuid4().hex self.users[API_USER]['api_key'] = self.api_key self._sync_user(API_USER) return self.api_key
async def _handle_job_request(self, web_request: WebRequest) -> Dict[str, Any]: action = web_request.get_action() if action == "POST": files: Union[List[str], str] = web_request.get('filenames') if isinstance(files, str): files = [f.strip() for f in files.split(',') if f.strip()] # Validate that all files exist before queueing await self.queue_job(files) elif action == "DELETE": if web_request.get_boolean("all", False): await self.delete_job([], all=True) else: job_ids: Union[List[str], str] = web_request.get('job_ids') if isinstance(job_ids, str): job_ids = [ f.strip() for f in job_ids.split(',') if f.strip() ] await self.delete_job(job_ids) else: raise self.server.error(f"Invalid action: {action}") return { 'queued_jobs': self._job_map_to_list(), 'queue_state': self.queue_state }
async def _handle_webcam_request( self, web_request: WebRequest) -> Dict[str, Any]: action = web_request.get_action() name = web_request.get_str("name") webcam_data: Dict[str, Any] = {} if action == "GET": if name not in self.webcams: raise self.server.error(f"Webcam {name} not found", 404) webcam_data = self.webcams[name].as_dict() elif action == "POST": if (name in self.webcams and self.webcams[name].source == "config"): raise self.server.error( f"Cannot overwrite webcam '{name}' sourced from " "Moonraker configuration") webcam = WebCam.from_web_request(self.server, web_request) self.webcams[name] = webcam webcam_data = webcam.as_dict() await self._save_cam(webcam) elif action == "DELETE": if name not in self.webcams: raise self.server.error(f"Webcam {name} not found", 404) elif self.webcams[name].source == "config": raise self.server.error( f"Cannot delete webcam '{name}' sourced from " "Moonraker configuration") webcam = self.webcams.pop(name) webcam_data = webcam.as_dict() await self._delete_cam(webcam) if action != "GET": self.server.send_event("webcam:webcams_changed", {"webcams": self._list_webcams()}) return {"webcam": webcam_data}
async def _handle_single_power_request( self, web_request: WebRequest) -> Dict[str, Any]: dev_name: str = web_request.get_str('device') req_action = web_request.get_action() if dev_name not in self.devices: raise self.server.error(f"No valid device named {dev_name}") dev = self.devices[dev_name] if req_action == 'GET': action = "status" elif req_action == "POST": action = web_request.get_str('action').lower() if action not in ["on", "off", "toggle"]: raise self.server.error(f"Invalid requested action '{action}'") result = await self._process_request(dev, action) return {dev_name: result}
async def _handle_feed_request( self, web_request: WebRequest ) -> Dict[str, Any]: action = web_request.get_action() name: str = web_request.get("name") name = name.lower() changed: bool = False db: MoonrakerDatabase = self.server.lookup_component("database") result = "skipped" if action == "POST": if name not in self.subscriptions: feed = RssFeed(name, self.entry_mgr, self.dev_mode) self.subscriptions[name] = feed await feed.initialize() changed = await feed.update_entries() self.stored_feeds.append(name) db.insert_item( "moonraker", "announcements.stored_feeds", self.stored_feeds ) result = "added" elif action == "DELETE": if name not in self.stored_feeds: raise self.server.error(f"Feed '{name}' not stored") if name in self.configured_feeds: raise self.server.error( f"Feed '{name}' exists in the configuration, cannot remove" ) self.stored_feeds.remove(name) db.insert_item( "moonraker", "announcements.stored_feeds", self.stored_feeds ) if name in self.subscriptions: del self.subscriptions[name] changed = await self.entry_mgr.prune_by_feed(name) logging.info(f"Removed Announcement Feed: {name}") result = "removed" else: raise self.server.error(f"Feed does not exist: {name}") if changed: entries = await self.entry_mgr.list_entries() self.eventloop.delay_callback( .05, self.server.send_event, "announcements:entries_updated", {"entries": entries} ) return { "feed": name, "action": result }
async def _handle_single_wled_request( self: WLED, web_request: WebRequest) -> Dict[str, Any]: strip_name: str = web_request.get_str('strip') preset: int = web_request.get_int('preset', -1) req_action = web_request.get_action() if strip_name not in self.strips: raise self.server.error(f"No valid strip named {strip_name}") strip = self.strips[strip_name] if req_action == 'GET': return {strip_name: strip.get_strip_info()} elif req_action == "POST": action = web_request.get_str('action').lower() if action not in ["on", "off", "toggle"]: raise self.server.error(f"Invalid requested action '{action}'") result = await self._process_request(strip, action, preset) return {strip_name: result}
async def _handle_user_request(self, web_request: WebRequest) -> Dict[str, Any]: action = web_request.get_action() if action == "GET": user = web_request.get_current_user() if user is None: return { 'username': None, 'created_on': None, } else: return { 'username': user['username'], 'created_on': user.get('created_on') } elif action == "POST": # Create User return self._login_jwt_user(web_request, create=True) elif action == "DELETE": # Delete User return self._delete_jwt_user(web_request) raise self.server.error("Invalid Request Method")