# Copyright (C) 2021- Swedish Meteorological and Hydrological Institute (SMHI)
#
# This file is part of baltrad-exchange.
#
# baltrad-exchange is free software: you can redistribute it and/or modify
# it under the terms of the GNU Lesser General Public License as published by
# the Free Software Foundation, either version 3 of the License, or
# (at your option) any later version.
#
# baltrad-exchange is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
# See the GNU Lesser General Public License for more details.
#
# You should have received a copy of the GNU Lesser General Public License
# along with baltrad-exchange. If not, see <http://www.gnu.org/licenses/>.
###############################################################################
## Routes the JSON REST request to the correct handler
## @file
## @author Anders Henja, SMHI
## @date 2021-08-18
import uuid
from werkzeug.routing import BaseConverter, Map, Rule, Submount
from werkzeug.utils import import_string
import datetime
[docs]
class UuidConverter(BaseConverter):
def __init__(self, url_map):
super(UuidConverter, self).__init__(url_map)
self.url_map = url_map
self.regex = "[0-9a-fA-F]{8,8}-([0-9a-fA-F]{4,4}-){3,3}[0-9a-fA-F]{12,12}"
[docs]
def to_python(self, value):
return uuid.UUID(value)
[docs]
def from_python(self, value):
return value.get_hex()
[docs]
class DatetimeConverter(BaseConverter):
def __init__(self, url_map):
super(DatetimeConverter, self).__init__(url_map)
self.url_map = url_map
self.regex = "[0-9]{14,14}"
[docs]
def to_python(self, value):
a = value
return datetime.datetime(int(a[:4]),int(a[4:6]),int(a[6:8]),int(a[8:10]),int(a[10:12]),int(a[12:]))
[docs]
def from_python(self, value):
return value.strftime("%Y%m%d%H%M%S")
URL_MAP = Map(
rules=[
Submount("/file", [
Rule("/", methods=["POST"],
endpoint="handler.post_file"
),
]),
Submount("/statistics", [
Rule("/", methods=["GET"],
endpoint="handler.get_statistics"
),
Rule("/ids", methods=["GET"],
endpoint="handler.list_statistic_ids"
),
]),
Submount("/serverinfo", [
Rule("/uptime", methods=["GET"],
endpoint="handler.get_server_uptime"
),
Rule("/nodename", methods=["GET"],
endpoint="handler.get_server_nodename"
),
Rule("/publickey", methods=["GET"],
endpoint="handler.get_server_publickey"
),
]),
Submount("/filearrival", [
Rule("/", methods=["GET"],
endpoint="handler.file_arrival"
),
]),
Submount("/supervise", [
Rule("/", methods=["GET"],
endpoint="handler.supervise"
),
]),
Submount("/json_message", [
Rule("/", methods=["POST"],
endpoint="handler.post_json_message"
),
]),
Submount("/BaltradDex", [ # For backward compatibility
Rule("/post_file.htm", methods=["POST"],
endpoint="handler.post_dex_file"
),
]),
],
converters={
"uuid": UuidConverter,
"datetime":DatetimeConverter
}
)
# URL_MAP = Map(
# rules=[
# Submount("/file", [
# Rule("/", methods=["POST"],
# endpoint="handler.add_file"
# ),
# Rule("/", methods=["DELETE"],
# endpoint="handler.remove_all_files"
# ),
# Rule("/metadata", methods=["POST"],
# endpoint="handler.query_file_metadata"
# ),
# Rule("/count/<int:limit>/<int:nritems>",
# methods=["DELETE"],
# endpoint="handler.remove_files_by_count"
# ),
# Rule("/age/<datetime:dt>/<int:nritems>",
# methods=["DELETE"],
# endpoint="handler.remove_files_by_age"
# ),
# Rule("/count", methods=["GET"],
# endpoint="handler.file_count"
# ),
# Rule("/<uuid:uuid>", methods=["GET"],
# endpoint="handler.get_file"
# ),
# Rule("/<uuid:uuid>", methods=["DELETE"],
# endpoint="handler.remove_file"
# ),
# Rule("/<uuid:uuid>/metadata", methods=["GET"],
# endpoint="handler.get_file_metadata"
# ),
# ]),
# Submount("/query", [
# Rule("/file", methods=["POST"],
# endpoint="handler.query_file"
# ),
# Rule("/attribute", methods=["POST"],
# endpoint="handler.query_attribute"
# ),
# ]),
# Submount("/source", [
# Rule("/", methods=["GET"],
# endpoint="handler.get_sources"
# ),
# Rule("/by_name/<string:name>", methods=["GET"],
# endpoint="handler.get_source"
# ),
# Rule("/", methods=["POST"],
# endpoint="handler.add_source"
# ),
# Rule("/", methods=["PUT"],
# endpoint="handler.update_source"
# ),
# Rule("/<string:name>", methods=["DELETE"],
# endpoint="handler.remove_source"
# ),
# Rule("/parents", methods=["GET"],
# endpoint="handler.get_parent_sources"
# ),
# Rule("/with_parent/<string:parent>", methods=["GET"],
# endpoint="handler.get_sources_with_parent"
# )
# ]),
# Submount("/filter", [
# Rule("/", methods=["GET"],
# endpoint="handler.get_filters"
# ),
# Rule("/", methods=["POST"],
# endpoint="handler.add_filter"
# ),
# Rule("/<string:name>", methods=["GET"],
# endpoint="handler.get_filter"
# ),
# Rule("/<string:name>", methods=["PUT"],
# endpoint="handler.update_filter"
# ),
# Rule("/<string:name>", methods=["DELETE"],
# endpoint="handler.remove_filter"
# ),
# ])
# ],
# converters={
# "uuid": UuidConverter,
# "datetime":DatetimeConverter
# }
# )
[docs]
def get_handler(handler_str):
return import_string("bexchange.web." + handler_str)