Files
Assemblr-Backend/routes/sipro.py
2023-12-11 01:50:49 +04:00

116 lines
3.6 KiB
Python

from enum import StrEnum
from flask import Blueprint, request, jsonify
from sqlalchemy import func
import auxiliary
import database
import database.enums
sipro_blueprint = Blueprint('sipro', __name__)
class ExpandParam(StrEnum):
USER = 'user'
@sipro_blueprint.before_request
def auth():
API_KEY = '5D809ED08080B5F204443B31374BD6A5'
if request.headers.get('Authorization') != API_KEY:
return {'error': 'Unauthorized'}, 401
@sipro_blueprint.post('/assemblyInfo')
def assembly_info():
params: dict = request.json
expand_param = params.get('expand')
order_ids = params.get('orderIds')
expand_list = expand_param if expand_param else []
datetime_format = 'YYYY.MM.DD, HH24:MI'
entity_list = [
database.Assembly.id.label('id'),
database.Assembly.order_id.label('order_id'),
func.to_char(database.Assembly.created_at, datetime_format).label('created_at'),
func.to_char(database.Assembly.ended_at, datetime_format).label('ended_at'),
database.Assembly.is_active.label('is_active'),
database.Assembly.state.label('state')
]
query = database.Assembly.query
for expand in expand_list:
match expand:
case ExpandParam.USER:
query = query.join(database.User)
entity_list.extend([
database.User.id.label('user.id'),
database.User.login.label('user.login'),
])
if order_ids:
query = query.filter(database.Assembly.order_id.in_(order_ids))
query = query.with_entities(*entity_list)
result = query.all()
json_result = [auxiliary.to_nested_dict(row) for row in result]
return json_result
@sipro_blueprint.post('/tableAssemblyStats')
def table_assembly_stats():
filters = request.json
date_from = filters.get('from')
date_to = filters.get('to')
dated_query = (
database.Assembly.query
.join(database.User)
.filter(
database.Assembly.state == database.enums.AssemblyState.CONFIRMED,
database.Assembly.ended_at >= date_from,
database.Assembly.ended_at <= date_to,
database.User.is_admin == False
)
.group_by(database.User.login, database.Assembly.user_id)
.with_entities(
database.User.login.label('user_login'),
func.count(database.Assembly.user_id).label('assembled'),
func.string_agg(func.cast(database.Assembly.order_id, database.db.String), ',').label('order_ids')
)
)
json_result = []
for row in dated_query.all():
json_result.append({
'user_login': row.user_login,
'assembled': row.assembled,
'order_ids': row.order_ids
})
return jsonify(json_result)
@sipro_blueprint.get('/dailyAssemblyData')
def daily_assembly_stats():
query = (
database.Assembly.query
.join(database.User)
.filter(
database.Assembly.state == database.enums.AssemblyState.CONFIRMED,
database.Assembly.ended_at >= func.current_date()
)
.group_by(database.User.login, database.Assembly.user_id)
.with_entities(
database.User.login.label('user_login'),
func.count(database.Assembly.user_id).label('assembled'),
func.string_agg(func.cast(database.Assembly.order_id, database.db.String), ',').label('order_ids')
)
)
json_result = []
for row in query.all():
json_result.append({
'user_login': row.user_login,
'assembled': row.assembled,
'order_ids': row.order_ids
})
return json_result