parent
6faea9e894
commit
6dfe86843b
@ -0,0 +1,15 @@
|
|||||||
|
FROM python:3.9-slim
|
||||||
|
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
RUN apt-get update && apt-get install -y --no-install-recommends \
|
||||||
|
gcc \
|
||||||
|
libpq-dev \
|
||||||
|
&& rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
COPY requirements.api.txt .
|
||||||
|
RUN pip install --no-cache-dir -r requirements.api.txt
|
||||||
|
|
||||||
|
COPY src/api /app/api
|
||||||
|
|
||||||
|
CMD ["uvicorn", "api.main:app", "--host", "0.0.0.0", "--port", "8000"]
|
@ -0,0 +1,16 @@
|
|||||||
|
.PHONY: up init-db down restart
|
||||||
|
|
||||||
|
up:
|
||||||
|
docker-compose up -d
|
||||||
|
|
||||||
|
init-db:
|
||||||
|
docker exec -it $$(docker ps -qf "name=api") python -c "\
|
||||||
|
from api.database import Base, engine; \
|
||||||
|
from api.models import Message; \
|
||||||
|
Base.metadata.create_all(bind=engine)\
|
||||||
|
"
|
||||||
|
|
||||||
|
down:
|
||||||
|
docker-compose down
|
||||||
|
|
||||||
|
restart: down up init-db
|
@ -0,0 +1,4 @@
|
|||||||
|
fastapi
|
||||||
|
uvicorn
|
||||||
|
psycopg2-binary
|
||||||
|
sqlalchemy
|
@ -0,0 +1,17 @@
|
|||||||
|
from sqlalchemy import create_engine
|
||||||
|
from sqlalchemy.ext.declarative import declarative_base
|
||||||
|
from sqlalchemy.orm import sessionmaker
|
||||||
|
import os
|
||||||
|
|
||||||
|
DATABASE_URL = os.getenv("DATABASE_URL")
|
||||||
|
|
||||||
|
engine = create_engine(DATABASE_URL)
|
||||||
|
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
|
||||||
|
Base = declarative_base()
|
||||||
|
|
||||||
|
def get_db():
|
||||||
|
db = SessionLocal()
|
||||||
|
try:
|
||||||
|
yield db
|
||||||
|
finally:
|
||||||
|
db.close()
|
@ -0,0 +1,22 @@
|
|||||||
|
from fastapi import FastAPI, Depends
|
||||||
|
from sqlalchemy.orm import Session
|
||||||
|
from api.database import get_db
|
||||||
|
from api.models import Message
|
||||||
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
|
|
||||||
|
app = FastAPI()
|
||||||
|
|
||||||
|
app.add_middleware(
|
||||||
|
CORSMiddleware,
|
||||||
|
allow_origins=["*"],
|
||||||
|
allow_methods=["*"],
|
||||||
|
allow_headers=["*"],
|
||||||
|
)
|
||||||
|
|
||||||
|
@app.get("/messages")
|
||||||
|
def get_messages(order_by: str = "id", take: int = 10, skip: int = 0, db: Session = Depends(get_db)):
|
||||||
|
order_by_field = getattr(Message, order_by, None)
|
||||||
|
if order_by_field is None:
|
||||||
|
return {"error": f"Invalid order_by field: {order_by}"}
|
||||||
|
messages = db.query(Message).order_by(order_by_field).offset(skip).limit(take).all()
|
||||||
|
return messages
|
@ -0,0 +1,12 @@
|
|||||||
|
from sqlalchemy import Column, Integer, BigInteger, Text, TIMESTAMP
|
||||||
|
from api.database import Base
|
||||||
|
|
||||||
|
class Message(Base):
|
||||||
|
__tablename__ = "messages"
|
||||||
|
|
||||||
|
id = Column(Integer, primary_key=True, index=True)
|
||||||
|
user_id = Column(BigInteger)
|
||||||
|
peer_id = Column(BigInteger)
|
||||||
|
message_id = Column(BigInteger)
|
||||||
|
text = Column(Text)
|
||||||
|
timestamp = Column(TIMESTAMP)
|
Loading…
Reference in new issue