-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.py
More file actions
93 lines (70 loc) · 3.2 KB
/
Copy pathmain.py
File metadata and controls
93 lines (70 loc) · 3.2 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
from fastapi import FastAPI, HTTPException, Depends
from sqlalchemy import Column, Integer, String, create_engine, or_
from sqlalchemy.orm import declarative_base, sessionmaker, Session
# --- Tietokanta ---
# SQLite käytössä:
DATABASE_URL = "sqlite:///./phonebook.db"
# PostgreSQL käytössä:
#DATABASE_URL = "postgresql+psycopg2://postgres:Simppa7777!@localhost:5432/phonebookdb"
#SQLite
engine = create_engine(DATABASE_URL, connect_args={"check_same_thread": False})
#PostgreSQL
#engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)
Base = declarative_base()
# --- Modelit ---
class Phonebook(Base):
__tablename__ = "phonebook"
id = Column(Integer, primary_key=True, index=True)
firstname = Column(String, index=True)
lastname = Column(String, index=True)
number = Column(String, index=True)
# --- FastAPI ---
app = FastAPI()
# Luodaan taulut, jos eivät ole olemassa
Base.metadata.create_all(bind=engine)
# --- DB sessionin riippuvuus ---
def get_db():
db = SessionLocal()
try:
yield db
finally:
db.close()
# --- API reitit ---
@app.post("/phonebook/", response_model=str)
def create_entry(firstname: str, lastname: str, number: str, db: Session = Depends(get_db)):
entry = Phonebook(firstname=firstname, lastname=lastname, number=number)
db.add(entry)
db.commit()
db.refresh(entry)
return "Added new contact " + entry.firstname + " " + entry.lastname
@app.get("/phonebook/", response_model=list[dict])
def get_entries(db: Session = Depends(get_db)):
entries = db.query(Phonebook).all()
return [{"id": e.id, "firstname": e.firstname, "lastname": e.lastname, "number": e.number} for e in entries]
@app.get("/phonebook/{entry_id}", response_model=dict)
def get_entry(entry_id: int, db: Session = Depends(get_db)):
entry = db.query(Phonebook).filter(Phonebook.id == entry_id).first()
if not entry:
raise HTTPException(status_code=404, detail="Entry not found")
return {"id": entry.id, "firstname": entry.firstname, "lastname": entry.lastname, "number": entry.number}
# HAKU SUKUNIMELLÄ
@app.get("/phonebook/search/{search_term}", response_model=list[dict])
def get_entries_by_lastname(search_term: str, db: Session = Depends(get_db)):
#Hakee sukunimellä jos täydellinen täsmääminen
#entries = db.query(Phonebook).filter(Phonebook.lastname == search_term).all()
#Hakee suku tai etunimen osalla ja on riippumaton kirjasinten koosta
entries = db.query(Phonebook).filter(or_(
Phonebook.lastname.ilike(f"%{search_term}%") ,
Phonebook.firstname.ilike(f"%{search_term}%"))).all()
if not entries:
raise HTTPException(status_code=404, detail="Entry not found")
return [{"id": e.id, "firstname": e.firstname, "lastname": e.lastname, "number": e.number} for e in entries]
@app.delete("/phonebook/{entry_id}", response_model=dict)
def delete_entry(entry_id: int, db: Session = Depends(get_db)):
entry = db.query(Phonebook).filter(Phonebook.id == entry_id).first()
if not entry:
raise HTTPException(status_code=404, detail="Entry not found")
db.delete(entry)
db.commit()
return {"message": f"Entry with id {entry_id} deleted"}