db refactoring, one and many
This commit is contained in:
parent
32a66dc189
commit
daca7eca9b
21
account.py
21
account.py
@ -1,17 +1,8 @@
|
|||||||
from db import execDatabaseOperation
|
from db import dbGetMany, dbGetOne
|
||||||
from loguru import logger
|
|
||||||
import json
|
|
||||||
|
|
||||||
|
|
||||||
def _opGetAccounts(cursor, params):
|
|
||||||
accounts = []
|
|
||||||
cursor.execute('SELECT id, description FROM account_t')
|
|
||||||
for accountObj in cursor:
|
|
||||||
logger.debug("add account {} -> {}".format(accountObj[0], accountObj[1]))
|
|
||||||
accounts.append({"id": accountObj[0], "description": accountObj[1]})
|
|
||||||
return accounts
|
|
||||||
|
|
||||||
|
|
||||||
def getAccounts(user, token_info):
|
def getAccounts(user, token_info):
|
||||||
logger.info("getAccounts, token: {}".format(json.dumps(token_info)))
|
return dbGetMany(user, token_info, {"statement": "SELECT id, description FROM account_t", "params": ()})
|
||||||
return execDatabaseOperation(_opGetAccounts, ())
|
|
||||||
|
def getAccount(user, token_info, accountId=None):
|
||||||
|
return dbGetOne(user, token_info, {"statement": "select id, description from account_t where id = %s", "params": (accountId, )})
|
||||||
|
|
||||||
|
57
db.py
57
db.py
@ -1,7 +1,10 @@
|
|||||||
import psycopg2
|
import psycopg2
|
||||||
|
import psycopg2.extras
|
||||||
from loguru import logger
|
from loguru import logger
|
||||||
import os
|
import os
|
||||||
import configparser
|
import configparser
|
||||||
|
import json
|
||||||
|
import werkzeug
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@ -22,7 +25,11 @@ except KeyError:
|
|||||||
DB_HOST = config["database"]["host"]
|
DB_HOST = config["database"]["host"]
|
||||||
DB_NAME = config["database"]["name"]
|
DB_NAME = config["database"]["name"]
|
||||||
|
|
||||||
logger.info(f"db config: {DB_USER}, {DB_NAME}, {DB_HOST}, {DB_PASS}")
|
|
||||||
|
|
||||||
|
class NoDataFoundException(Exception): pass
|
||||||
|
|
||||||
|
class TooMuchDataFoundException(Exception): pass
|
||||||
|
|
||||||
|
|
||||||
def databaseOperation(cursor, params):
|
def databaseOperation(cursor, params):
|
||||||
@ -38,10 +45,11 @@ def execDatabaseOperation(func, params):
|
|||||||
cur = None
|
cur = None
|
||||||
try:
|
try:
|
||||||
conn = psycopg2.connect(user = DB_USER, password = DB_PASS,
|
conn = psycopg2.connect(user = DB_USER, password = DB_PASS,
|
||||||
host = DB_HOST, database = DB_NAME)
|
host = DB_HOST, database = DB_NAME,
|
||||||
|
sslmode = 'require')
|
||||||
conn.autocommit = False
|
conn.autocommit = False
|
||||||
|
|
||||||
with conn.cursor() as cur:
|
with conn.cursor(cursor_factory = psycopg2.extras.RealDictCursor) as cur:
|
||||||
return func(cur, params)
|
return func(cur, params)
|
||||||
except psycopg2.Error as err:
|
except psycopg2.Error as err:
|
||||||
raise Exception("Error when connecting to database: {}".format(err))
|
raise Exception("Error when connecting to database: {}".format(err))
|
||||||
@ -50,3 +58,46 @@ def execDatabaseOperation(func, params):
|
|||||||
conn.close()
|
conn.close()
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def _opGetMany(cursor, params):
|
||||||
|
items = []
|
||||||
|
cursor.execute(params["statement"])
|
||||||
|
for itemObj in cursor:
|
||||||
|
logger.debug("item received {}".format(str(itemObj)))
|
||||||
|
items.append(itemObj)
|
||||||
|
return items
|
||||||
|
|
||||||
|
def dbGetMany(user, token_info, params):
|
||||||
|
logger.info("params: {}, token: {}".format(params, json.dumps(token_info)))
|
||||||
|
try:
|
||||||
|
return execDatabaseOperation(_opGetMany, params)
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Exception: {e}")
|
||||||
|
raise werkzeug.exceptions.InternalServerError
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
def _opGetOne(cursor, params):
|
||||||
|
cursor.execute(params["statement"], params["params"])
|
||||||
|
itemObj = cursor.fetchone()
|
||||||
|
logger.debug(f"item received: {itemObj}")
|
||||||
|
if not itemObj:
|
||||||
|
raise NoDataFoundException
|
||||||
|
dummyObj = cursor.fetchone()
|
||||||
|
if dummyObj:
|
||||||
|
raise TooMuchDataFoundException
|
||||||
|
return itemObj
|
||||||
|
|
||||||
|
def dbGetOne(user, token_info, params):
|
||||||
|
logger.info("params: {}, token: {}".format(params, json.dumps(token_info)))
|
||||||
|
try:
|
||||||
|
return execDatabaseOperation(_opGetOne, params)
|
||||||
|
except NoDataFoundException:
|
||||||
|
logger.error("no data found")
|
||||||
|
raise werkzeug.exceptions.NotFound
|
||||||
|
except TooMuchDataFoundException:
|
||||||
|
logger.error("too much data found")
|
||||||
|
raise werkzeug.exceptions.InternalServerError
|
||||||
|
except Exception as e:
|
||||||
|
logger.error(f"Exception: {e}")
|
||||||
|
raise werkzeug.exceptions.InternalServerError
|
||||||
|
22
openapi.yaml
22
openapi.yaml
@ -42,6 +42,28 @@ paths:
|
|||||||
$ref: '#/components/schemas/Account'
|
$ref: '#/components/schemas/Account'
|
||||||
security:
|
security:
|
||||||
- jwt: ['secret']
|
- jwt: ['secret']
|
||||||
|
/v1/accounts/{accountId}:
|
||||||
|
get:
|
||||||
|
tags: [ "Account" ]
|
||||||
|
summary: Return the normalized account with given id
|
||||||
|
operationId: account.getAccount
|
||||||
|
parameters:
|
||||||
|
- name: accountId
|
||||||
|
in: path
|
||||||
|
required: true
|
||||||
|
schema:
|
||||||
|
type: integer
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: accounts response
|
||||||
|
content:
|
||||||
|
'application/json':
|
||||||
|
schema:
|
||||||
|
type: array
|
||||||
|
items:
|
||||||
|
$ref: '#/components/schemas/Account'
|
||||||
|
security:
|
||||||
|
- jwt: ['secret']
|
||||||
|
|
||||||
components:
|
components:
|
||||||
securitySchemes:
|
securitySchemes:
|
||||||
|
Loading…
x
Reference in New Issue
Block a user