Files
CRM-OLD-API/app/api/v1/transaction.py
2025-07-24 20:13:47 +03:00

154 lines
4.7 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)