Skip to content

Commit

Permalink
add raw file data, add navigation to diff responses
Browse files Browse the repository at this point in the history
  • Loading branch information
lunakv committed Jun 20, 2022
1 parent b5dda1f commit 23ca48a
Show file tree
Hide file tree
Showing 7 changed files with 102 additions and 14 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
__pycache__/
app/resources/generated
app/static/raw_docs
.env
.idea/
venv/
6 changes: 5 additions & 1 deletion app/main.py
Original file line number Diff line number Diff line change
@@ -1,11 +1,12 @@
import logging

from fastapi import FastAPI
from fastapi.staticfiles import StaticFiles
from fastapi.middleware.cors import CORSMiddleware

from .resources import seeder
from .utils.scheduler import Scheduler
from .routers import admin, glossary, link, rule, diff
from .routers import admin, glossary, link, rule, diff, rawfile, metadata

logging.basicConfig(
format='%(asctime)s:%(levelname)s:%(name)s:%(message)s',
Expand All @@ -24,10 +25,13 @@
async def seed():
await seeder.seed()

app.mount('/static', StaticFiles(directory="app/static"), name="static")
app.include_router(admin.router, prefix='/admin')
app.include_router(glossary.router, prefix='/glossary')
app.include_router(link.router, prefix='/link')
app.include_router(diff.router, prefix='/diff')
app.include_router(rawfile.router, prefix='/file')
app.include_router(metadata.router, prefix='/metadata')
app.include_router(rule.router)

Scheduler().start()
Expand Down
Empty file.
17 changes: 15 additions & 2 deletions app/routers/diff.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import json
from typing import Union
from fastapi.responses import RedirectResponse

from ..utils import db

Expand All @@ -18,7 +18,20 @@ async def cr_diff(old: str, new: str):
if diff is None:
return ErrorResponse("No diff between these set codes found.", 404, {old: old, new: new})

return StatusResponse({'diff': diff})
nav = {'next': await db.fetch_diff_codes(new, None), 'prev': await db.fetch_diff_codes(None, old)}
diff['nav'] = nav
# for some reason date objects aren't getting serialized? not sure what's up with that
diff['creation_day'] = diff['creation_day'].isoformat()
del diff['id']
return StatusResponse(diff)


@router.get('/cr/latest')
async def latest_cr_diff():
codes = await db.fetch_latest_diff_code()
if codes is None:
return ErrorResponse("No diff found", 404)
return RedirectResponse(f'{codes["old"]}-{codes["new"]}')


@router.get('/debug')
Expand Down
16 changes: 16 additions & 0 deletions app/routers/metadata.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
from fastapi import APIRouter
from ..utils import db
from ..utils.responses import ErrorResponse, StatusResponse

router = APIRouter()


@router.get('/cr')
async def cr_metadata():
meta = await db.fetch_cr_metadata()
if not meta:
meta = []

for row in meta:
row['creation_day'] = row['creation_day'].isoformat()
return StatusResponse({'data': meta})
18 changes: 18 additions & 0 deletions app/routers/rawfile.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
from fastapi import APIRouter, Request
from starlette.responses import RedirectResponse

from ..utils import db
from ..utils.responses import ErrorResponse

router = APIRouter()


@router.get('/cr/{set_code}')
async def raw_cr_by_set_code(set_code: str, request: Request):
file_name = await db.fetch_file_name(set_code)
if not file_name:
return ErrorResponse('CR document not available for this set', 404, {'set': set_code})

path = request.url_for('static', path='/raw_docs/cr/'+file_name)
return RedirectResponse(path, status_code=308)

58 changes: 47 additions & 11 deletions app/utils/db.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,12 @@
import datetime
import os
from typing import Union

import anyio

import psycopg
from psycopg import sql
from psycopg.rows import dict_row
from psycopg.types.json import Jsonb

_constr = f'postgres://{os.environ["DB_USER"]}:{os.environ["DB_PASS"]}@{os.environ["DB_HOST"]}/{os.environ["DB_DATABASE"]}'
Expand All @@ -15,7 +18,7 @@ async def _query(query, params, exec_callback):
else:
queryList = [query]

async with await psycopg.AsyncConnection.connect(_constr) as aconn:
async with await psycopg.AsyncConnection.connect(_constr, row_factory=dict_row) as aconn:
async with aconn.cursor() as acur:
for elem in queryList:
await acur.execute(elem, params)
Expand All @@ -36,11 +39,11 @@ async def _fetch_all(query, params):


async def fetch_rule(number):
query = sql.SQL("SELECT data -> {} FROM cr ORDER BY creation_day DESC LIMIT 1").format(sql.Literal(number))
query = sql.SQL("SELECT data -> {} AS rule FROM cr ORDER BY creation_day DESC LIMIT 1").format(sql.Literal(number))

res = await _fetch_one(query, None)
if res:
return res[0]
return res.rule


async def save_rules(rule_dict):
Expand All @@ -51,22 +54,22 @@ async def save_rules(rule_dict):

async def fetch_all_rules():
query = 'SELECT data FROM cr ORDER BY creation_day DESC LIMIT 1' # TODO filter out pending rules?
res = (await _fetch_one(query, None))[0]
return res
res = await _fetch_one(query, None)
return res.data


async def get_redirect(resource: str):
query = 'SELECT link FROM redirects WHERE resource = %s'
res = await _fetch_one(query, (resource,))
if res:
return res[0]
return res.link


async def get_pending(resource: str):
query = 'SELECT link FROM redirects_pending WHERE resource = %s'
res = await _fetch_one(query, (resource,))
if res:
return res[0]
return res.link


async def update_from_pending(resource: str):
Expand All @@ -90,15 +93,48 @@ async def set_pending(resource: str, link: str):


async def fetch_diff(old_set_code: str, new_set_code: str):
query = 'SELECT changes FROM cr_diffs ' \
query = 'SELECT * FROM cr_diffs ' \
'WHERE source_code = %s AND dest_code = %s'
result = await _fetch_one(query, (old_set_code, new_set_code))
if result:
return result[0]
return result


async def fetch_latest_diff_code():
query = 'SELECT source_code AS old, dest_code AS new FROM cr_diffs ' \
'ORDER BY creation_day DESC ' \
'LIMIT 1'
result = await _fetch_one(query, ())
return result


async def fetch_diff_codes(old_code: Union[str, None], new_code: Union[str, None]):
if old_code is None and new_code is None:
return None
query = 'SELECT source_code AS old, dest_code AS new FROM cr_diffs'
if old_code is None:
query += ' WHERE dest_code = %s'
params = (new_code,)
else:
query += ' WHERE source_code = %s'
params = (old_code,)
result = await _fetch_one(query, params)
return result


async def fetch_file_name(set_code: str):
query = 'SELECT file_name FROM cr WHERE set_code = %s'
res = await _fetch_one(query, (set_code,))
if res:
return res['file_name']


async def fetch_cr_metadata():
query = 'SELECT creation_day, set_code, set_name, file_name FROM cr ORDER BY creation_day DESC'
return await _fetch_all(query, None)


async def upload_diff(diff_json: list):
query = 'INSERT INTO cr_diffs (creation_day, source_set, source_code, dest_set, dest_code, changes) ' \
'VALUES (%s, %s, %s, %s, %s, %s)' # TODO actual metadata
values = (datetime.date.today(), 'Streets of New Capenna', 'SNC', 'Baldur\'s Gate', 'CLB', Jsonb(diff_json))
await _execute(query, values)
await _execute(query, values)

0 comments on commit 23ca48a

Please sign in to comment.