154 lines
4.7 KiB
Python
154 lines
4.7 KiB
Python
from time import time
|
||
|
||
from fastapi import APIRouter
|
||
from starlette.requests import Request
|
||
|
||
from app import mongo
|
||
from app.utils.response_util import response
|
||
|
||
router = APIRouter()
|
||
|
||
|
||
@router.post("/get-all", tags=[""])
|
||
async def get_all_transactions(params: dict, page: int = 1, items_per_page: int = 10):
|
||
start_time = time()
|
||
|
||
is_income = params.get("isIncome")
|
||
query = {"isIncome": is_income} if is_income is not None else {}
|
||
|
||
total = await mongo.transactions_collection.count_documents(query)
|
||
transactions = await mongo.transactions_collection.find(
|
||
query, {"_id": False}
|
||
).sort("id", mongo.desc).skip((page - 1) * items_per_page).limit(items_per_page).to_list(length=None)
|
||
|
||
for transaction in transactions:
|
||
user = await mongo.users_collection.find_one({"id": transaction["createdByUser"]["id"]}, {"_id": False})
|
||
if user:
|
||
transaction["createdByUser"] = user
|
||
|
||
tag_ids = [tag["id"] for tag in transaction["tags"]]
|
||
transaction["tags"] = await mongo.transaction_tags_collection.find({"id": {"$in": tag_ids}}, {"_id": False}).to_list(length=None)
|
||
|
||
return response({
|
||
"transactions": transactions,
|
||
"total": total,
|
||
}, start_time=start_time)
|
||
|
||
|
||
@router.post("/update", tags=[""])
|
||
async def update_transaction(params: dict, request: Request):
|
||
start_time = time()
|
||
data = params["transaction"]
|
||
user_id = request.state.user["id"]
|
||
|
||
tags = []
|
||
for tag_name in data.get("tags", []):
|
||
tag = await mongo.transaction_tags_collection.find_one({"name": tag_name}, {"_id": False})
|
||
if not tag:
|
||
tag_id = await mongo.get_next_id(mongo.transaction_tags_collection)
|
||
tag = {
|
||
"id": tag_id,
|
||
"name": tag_name,
|
||
"isIncome": data.get("isIncome", False)
|
||
}
|
||
|
||
await mongo.transaction_tags_collection.insert_one(tag)
|
||
|
||
tags.append({"id": tag["id"]})
|
||
|
||
data["tags"] = tags
|
||
|
||
if "id" in data:
|
||
existing = await mongo.transactions_collection.find_one({"id": data["id"]})
|
||
if not existing:
|
||
return response({"message": "Транзакция не найдена", "ok": False}, start_time=start_time)
|
||
|
||
await mongo.transactions_collection.update_one({"id": data["id"]}, {"$set": data})
|
||
message = "Транзакция обновлена"
|
||
else:
|
||
data["id"] = await mongo.get_next_id(mongo.transactions_collection)
|
||
data["createdByUser"] = {"id": user_id}
|
||
await mongo.transactions_collection.insert_one(data)
|
||
message = "Транзакция создана"
|
||
|
||
return response({
|
||
"message": message,
|
||
"ok": True
|
||
}, start_time=start_time)
|
||
|
||
|
||
@router.delete("/delete/{transaction_id}", tags=[""])
|
||
async def delete_transaction(transaction_id: int):
|
||
start_time = time()
|
||
|
||
await mongo.transactions_collection.delete_one({"id": transaction_id})
|
||
return response({
|
||
"message": "Транзакция удалена",
|
||
"ok": True
|
||
}, start_time=start_time)
|
||
|
||
|
||
@router.get("/get-all-tags", tags=[""])
|
||
async def get_all_transaction_tags():
|
||
start_time = time()
|
||
|
||
tags = await mongo.transaction_tags_collection.find(
|
||
{}, {"_id": False}
|
||
).sort("id", mongo.asc).to_list(length=None)
|
||
|
||
return response({
|
||
"tags": tags
|
||
}, start_time=start_time)
|
||
|
||
|
||
@router.get("/get-tags/{is_income}", tags=[""])
|
||
async def get_transaction_tags(is_income: bool):
|
||
start_time = time()
|
||
|
||
tags = await mongo.transaction_tags_collection.find(
|
||
{"isIncome": is_income}, {"_id": False}
|
||
).sort("id", mongo.asc).to_list(length=None)
|
||
|
||
return response({"tags": tags}, start_time=start_time)
|
||
|
||
|
||
@router.post("/create-tag", tags=[""])
|
||
async def create_transaction_tag(params: dict):
|
||
start_time = time()
|
||
data = params["tag"]
|
||
|
||
data["id"] = await mongo.get_next_id(mongo.transaction_tags_collection)
|
||
await mongo.transaction_tags_collection.insert_one(data)
|
||
|
||
return response({
|
||
"message": "Тег транзакции создан",
|
||
"ok": True
|
||
}, start_time=start_time)
|
||
|
||
|
||
@router.post("/update-tag", tags=[""])
|
||
async def update_transaction_tag(params: dict):
|
||
start_time = time()
|
||
data = params["tag"]
|
||
|
||
await mongo.transaction_tags_collection.update_one(
|
||
{"id": data["id"]},
|
||
{"$set": data}
|
||
)
|
||
|
||
return response({
|
||
"message": "Тег транзакции обновлен",
|
||
"ok": True
|
||
}, start_time=start_time)
|
||
|
||
|
||
@router.delete("/delete-tag/{tag_id}", tags=[""])
|
||
async def delete_transaction_tag(tag_id: int):
|
||
start_time = time()
|
||
|
||
await mongo.transaction_tags_collection.delete_one({"id": tag_id})
|
||
return response({
|
||
"message": "Тег транзакции удалён",
|
||
"ok": True
|
||
}, start_time=start_time)
|