You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
3.3 KiB

from fastapi import FastAPI, APIRouter, Request
from fastapi.middleware.cors import CORSMiddleware
from fastapi.responses import ORJSONResponse, HTMLResponse
from sqlmodel import create_engine, Field, SQLModel, UUID, DateTime, func, Column, text, bindparam
from sqlalchemy.dialects.mssql import UNIQUEIDENTIFIER, DATETIME
from sqlalchemy import insert
from dotenv import load_dotenv
from typing import Optional, Sequence
from datetime import datetime
from uuid import UUID
import os
load_dotenv()
DB_URL = os.getenv("DB_URL")
SERVER_ROOT = os.getenv("SERVER_ROOT")
PREFIX = os.getenv("PREFIX")
db_engine = create_engine(DB_URL)
class Agreement(SQLModel,table=True):
id: Optional[int] = Field(default=None, primary_key=True)
id_account: UUID = Field(sa_column=Column(UNIQUEIDENTIFIER))
id_personal_account: Optional[int]
date_registration:datetime = Field(sa_column=Column(DATETIME))
FIO: Optional[str]
phone: Optional[str]
email: Optional[str]
agreement:Optional[bool] = True
agreement_date: Optional[datetime] = Field(sa_column=Column(DATETIME))
class AgreementCreate(SQLModel):
id_account: UUID
id_personal_account: Optional[int]
date_registration:datetime
FIO: Optional[str]
phone: Optional[str]
email: Optional[str]
agreement:Optional[bool] = True
agreement_date: Optional[datetime]
SQLModel.metadata.create_all(db_engine, checkfirst=True)
app = FastAPI(openapi_url = SERVER_ROOT +"/openapi.json", docs_url=SERVER_ROOT+"/docs", default_response_class=ORJSONResponse)
app.add_middleware(
CORSMiddleware,
allow_origins=["*"],
allow_credentials=True,
allow_methods=["*"],
allow_headers=["*"],
)
router = APIRouter(
prefix=PREFIX
)
@app.get("/", response_class= HTMLResponse)
async def hello(request: Request):
return """
<html>
<head>
<title>Привет</title>
</head>
<body>
<h1>Это API, а не сайт!</h1>
</body>
</html>
"""
@router.get('/')
async def get_ageement(id_account: Optional[UUID] = None) -> Sequence[Agreement]:
with db_engine.begin() as con:
query = text("SELECT * FROM agreement WHERE id_account=:id_account").params({"id_account":id_account})
return con.execute(query).fetchall()
@router.delete("/")
async def delete_pk(acc_list: Sequence[UUID]):
with db_engine.begin() as con:
stmt = text("DELETE agreement WHERE id_account IN :acc_list")
params = {"acc_list":acc_list}
stmt = stmt.bindparams(bindparam('acc_list', expanding=True))
con.execute(stmt, params)
return {"msg":"has deleted"}
@router.post("/")
async def add_agreement(agrees: Sequence[AgreementCreate]):
with db_engine.begin() as con:
dict_list=[]
acc_list = []
for agree in agrees:
agree_dict = agree.model_dump()
dict_list.append(agree_dict)
acc_id = agree_dict.get("id_account")
if acc_id not in acc_list:
acc_list.append(acc_id)
await delete_pk(acc_list)
stmt = insert(Agreement).values(dict_list)
con.execute(stmt)
con.commit()
return {"msg": "added succesfully"}
app.include_router(router)
if __name__ == "__main__":
import uvicorn
uvicorn.run(
app,
host=os.getenv("HOST"),
port=int(os.getenv("PORT"))
)