Skip to content

Commit

Permalink
feat: use env variables in prod
Browse files Browse the repository at this point in the history
  • Loading branch information
sanjibansg committed Jul 12, 2023
1 parent 260bfe3 commit 8339c00
Show file tree
Hide file tree
Showing 3 changed files with 37 additions and 29 deletions.
6 changes: 6 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,13 @@ cd substrait-fiddle/
```
Fiddle requires the [FastAPI back-end](https://github.com/voltrondata/substrait-fiddle/api) for APIs. Prior installation and operation of the service is required.
### API Service
To run it in PROD, use the complete URL, and set the environment variable. This step can be ignored in local development,
where the default user and port is used.

```
// for PROD
export PROD_MONGO_URL=url
cd api/
pip install -r requirements.txt
uvicorn app:app --reload --port 9090
Expand Down
25 changes: 17 additions & 8 deletions api/app.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@
from fastapi.openapi.utils import get_openapi
from fastapi_health import health

from motor.motor_asyncio import AsyncIOMotorCollection

import substrait_validator as sv

from backend.duckdb import (
Expand All @@ -11,14 +13,18 @@
ParseFromDuckDB,
)

from shareable import MongoDBConnection, PlanData, get_mongo_conn
from shareable import MongoDBConnection, PlanData

from loguru import logger

app = FastAPI()
duckConn = None


async def get_mongo_conn():
return app.state.mongo_pool.initialize()


@app.get("/")
def ping():
return {"api_service": "up and running"}
Expand All @@ -28,6 +34,7 @@ def ping():
async def Initialize():
global duckConn
duckConn = ConnectDuckDB()
app.state.mongo_pool = MongoDBConnection()


@app.get("/health/duckdb/")
Expand All @@ -36,8 +43,8 @@ def CheckBackendConn(conn):


@app.get("/health/mongodb/")
def CheckMongoConn(db: MongoDBConnection = Depends(get_mongo_conn)):
db.check()
def CheckMongoConn():
app.state.mongo_pool.check()


app.add_api_route("/health", health([CheckBackendConn]))
Expand Down Expand Up @@ -87,14 +94,16 @@ async def ParseToSubstrait(data: dict):


@app.post("/save/")
async def SavePlan(data: PlanData, db: MongoDBConnection = Depends(get_mongo_conn)):
response = await db.add_record(data)
async def SavePlan(
data: PlanData, db_conn: AsyncIOMotorCollection = Depends(get_mongo_conn)
):
response = await app.state.mongo_pool.add_record(db_conn, data)
return response


@app.post("/fetch/", status_code=status.HTTP_200_OK)
async def FetchPlan(id: str, db: MongoDBConnection = Depends(get_mongo_conn)):
response = await db.get_record(id)
@app.post("/fetch/")
async def FetchPlan(id: str, db_conn: AsyncIOMotorCollection = Depends(get_mongo_conn)):
response = await app.state.mongo_pool.get_record(db_conn, id)
if response is None:
raise HTTPException(status_code=404, detail="Plan not found")
return {
Expand Down
35 changes: 14 additions & 21 deletions api/shareable.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import os
from bson.objectid import ObjectId
from pydantic import BaseModel
from motor.motor_asyncio import AsyncIOMotorClient
Expand All @@ -10,25 +11,30 @@ class PlanData(BaseModel):

class MongoDBConnection:
def __init__(self):
self.client = AsyncIOMotorClient("mongodb://localhost:27017")
self.database = self.client["plans"]
self.collection = self.database["links"]
url = os.environ.get("PROD_MONGO_URL", "mongodb://localhost:27017")
self.client = AsyncIOMotorClient(url)

async def get_record(self, id):
record = await self.collection.find_one({"_id": ObjectId(id)})
def initialize(self):
database = self.client["plans"]
collection = database["links"]
return collection

async def get_record(self, collection, id):
record = await collection.find_one({"_id": ObjectId(id)})
return record

async def add_record(self, data):
async def add_record(self, collection, data):
data = {
"json_data": data.json_string,
"validator_overrides": data.validator_overrides,
}
result = await self.collection.insert_one(data)
result = await collection.insert_one(data)
return str(result.inserted_id)

async def check(self):
try:
client = AsyncIOMotorClient("mongodb://localhost:27017")
url = os.environ.get("PROD_MONGO_URL", "mongodb://localhost:27017")
client = AsyncIOMotorClient(url)
except Exception as e:
return False, str(e)

Expand All @@ -41,16 +47,3 @@ async def check(self):
False,
"Links collection doesn't exist in Plan database.",
)

async def close(self):
self.collection = None
self.database = None
self.client.close()


async def get_mongo_conn():
mongo_conn = MongoDBConnection()
try:
yield mongo_conn
finally:
await mongo_conn.close()

0 comments on commit 8339c00

Please sign in to comment.