Skip to content
Snippets Groups Projects
Commit 88c86eb3 authored by Hunter Wittenborn's avatar Hunter Wittenborn
Browse files

Began work on 'search' type for RPC

parent fd9b07c4
No related branches found
No related tags found
No related merge requests found
Pipeline #11278 passed
......@@ -50,7 +50,8 @@ async def rpc(request: Request,
v: Optional[int] = Query(None),
type: Optional[str] = Query(None),
arg: Optional[str] = Query(None),
args: Optional[List[str]] = Query(None, alias="arg[]")):
args: Optional[List[str]] = Query(None, alias="arg[]"),
by: Optional[str] = Query(None)):
# Defaults for returned data
returned_data = {}
......@@ -96,6 +97,7 @@ async def rpc(request: Request,
returned_data = RPC(v=v,
type=type,
argument_list=argument_list,
returned_data=returned_data)
returned_data=returned_data,
search_by=by)
return returned_data
......@@ -21,6 +21,16 @@ DEP_TYPES = {
OPTDEPENDS_ID: "OptDepends"
}
# Add reversed keys for DEP_TYPES so we can find a dependency type from a type's
# name.
DEP_NAMES = {}
DEP_TYPE_VALUES = list(DEP_TYPES.values())
for i in DEP_TYPES.values():
lowercase_value = i.lower()
current_value_position = DEP_TYPE_VALUES.index(i)
DEP_NAMES[lowercase_value] = list(DEP_TYPES.keys())[current_value_position]
# Define relationship types.
REL_TYPES = {
CONFLICTS_ID: "Conflicts",
......@@ -28,6 +38,15 @@ REL_TYPES = {
REPLACES_ID: "Replaces"
}
# Define search 'by' field types.
SEARCH_BY_TYPES = ["name",
"name-desc",
"maintainer",
"depends",
"makedepends",
"optdepends",
"checkdepends"]
# Define functions for request types.
def add_deps(current_array, db_dep):
......@@ -82,7 +101,7 @@ def add_rels(current_array, db_rel):
return current_array
def run_info(returned_data, package_name, snapshot_uri):
def run_info(returned_data, package_name, snapshot_uri, search_by):
# Get package name.
db_package = db.query(Package).filter(Package.Name == package_name)
......@@ -153,6 +172,27 @@ def run_info(returned_data, package_name, snapshot_uri):
return returned_data
# Define search functions for searching the db for data.
def run_search(returned_data, package_name, snapshot_uri, search_by):
run_info_list = []
if search_by in DEP_NAMES.keys():
dependency_id = DEP_NAMES[search_by]
db_dependency_packages = (db.query(PackageDependency)
.filter(PackageDependency.DepName == package_name)
.filter(PackageDependency.DepTypeID == dependency_id)
.all())
for i in db_dependency_packages:
upstream_package_name = db.query(PackageBase).filter(PackageBase.ID == i.PackageID).first().Name
run_info_list += [upstream_package_name]
for i in run_info_list:
returned_data = run_info(returned_data, i, snapshot_uri, search_by)
return returned_data
def RPC(**function_args):
# Get arguments.
#
......@@ -161,6 +201,7 @@ def RPC(**function_args):
type = function_args.get("type")
args = function_args.get("argument_list")
returned_data = function_args.get("returned_data")
search_by = function_args.get("search_by")
# Get Snapshot URI
snapshot_uri = config.get("options", "snapshot_uri")
......@@ -168,7 +209,8 @@ def RPC(**function_args):
# Set request type to run.
type_actions = {
"info": run_info,
"multiinfo": run_info
"multiinfo": run_info,
"search": run_search
}
# This if statement should always be executed, as we checked if the
......@@ -176,6 +218,15 @@ def RPC(**function_args):
if type in type_actions:
run_request = type_actions.get(type)
# Validate 'by' query is valid when doing a search.
if type == "search":
if search_by is None:
search_by = "name-desc"
elif search_by not in SEARCH_BY_TYPES:
returned_data["type"] = "error"
returned_data["error"] = "Incorrect by field specified"
return returned_data
# If type is 'info', overwrite type to 'multiinfo' to match the
# behavior of the PHP implementation.
if type == "info":
......@@ -187,7 +238,11 @@ def RPC(**function_args):
args = set(args)
for i in args:
returned_data = run_request(returned_data, i, snapshot_uri)
returned_data = run_request(returned_data, i, snapshot_uri, search_by)
# Return the error message if one was made.
if returned_data.get("type") == "error":
break
elif type is None:
returned_data["type"] = "error"
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment