Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions api/__init__.py
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ def create_app():

# Now add routes
from api.resources.gene_information import gene_information
from api.resources.gaia import gaia
from api.resources.rnaseq_gene_expression import rnaseq_gene_expression
from api.resources.microarray_gene_expression import microarray_gene_expression
from api.resources.proxy import bar_proxy
Expand All @@ -66,6 +67,7 @@ def create_app():
from api.resources.llama3 import llama3

bar_api.add_namespace(gene_information)
bar_api.add_namespace(gaia)
bar_api.add_namespace(rnaseq_gene_expression)
bar_api.add_namespace(microarray_gene_expression)
bar_api.add_namespace(bar_proxy)
Expand Down
10 changes: 10 additions & 0 deletions api/models/gaia.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
from api import db
from sqlalchemy.dialects.mysql import json


class Aliases(db.Model):
__bind_key__ = "gaia"
__tablename__ = "aliases"

id: db.Mapped[int] = db.mapped_column(db.Integer, nullable=False, primary_key=True)
data: db.Mapped[json] = db.mapped_column(db.JSON, nullable=True, primary_key=False)
40 changes: 40 additions & 0 deletions api/resources/gaia.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
from flask_restx import Namespace, Resource
from markupsafe import escape
from api import db
from api.utils.bar_utils import BARUtils
from api.models.gaia import Aliases
from sqlalchemy import func
import json

gaia = Namespace("Gaia", description="Gaia", path="/gaia")


@gaia.route("/aliases/<string:identifier>")
class GaiaAliases(Resource):
@gaia.param("identifier", _in="path", default="ABI3")
def get(self, identifier=""):

# Escape input
identifier = escape(identifier)

# Is it valid
if BARUtils.is_alphanumeric(identifier):
# Convert to json
identifier_json = json.dumps([identifier])

# Get data
# Note: SQLAlchmemy or_ did not work here. Query had AND for some reason.
query = db.select(Aliases).filter(
(func.json_contains(func.lower(Aliases.data), func.lower(identifier_json), "$.aliases"))
| (func.json_extract(func.lower(Aliases.data), "$.geneid") == func.lower(identifier))
| (func.json_extract(func.lower(Aliases.data), "$.locus") == func.lower(identifier)),
)
row = db.session.execute(query).scalars().first()

if row:
return BARUtils.success_exit(row.data)
else:
return BARUtils.error_exit("Nothing found"), 404

else:
return BARUtils.error_exit("Invalid identifier"), 400
11 changes: 11 additions & 0 deletions api/utils/bar_utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,17 @@ def is_integer(data):
else:
return False

@staticmethod
def is_alphanumeric(data):
"""Check if the input is alphanumeric.
:param data
:return: True if alphanumeric
"""
if re.search(r"^[a-z0-9]{1,50}$", data, re.I):
return True
else:
return False

@staticmethod
def format_poplar(poplar_gene):
"""Format Poplar gene ID to be Potri.016G107900, i.e. capitalized P and G
Expand Down
Loading