Skip to content

Commit 1a2079d

Browse files
committed
working api and models
1 parent e115c2d commit 1a2079d

8 files changed

+51
-40
lines changed

__pycache__/crud.cpython-311.pyc

0 Bytes
Binary file not shown.

__pycache__/main.cpython-311.pyc

152 Bytes
Binary file not shown.

__pycache__/models.cpython-311.pyc

168 Bytes
Binary file not shown.

__pycache__/schemas.cpython-311.pyc

241 Bytes
Binary file not shown.

main.py

+32-24
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
2+
13
from fastapi import FastAPI, Depends, HTTPException
24
from sqlalchemy.orm import Session
35
from database import engine, Base, get_db
@@ -8,41 +10,48 @@
810
from celery_config import celery_app
911
from tasks import send_scheduled_email
1012
from datetime import datetime, timedelta
11-
from datetime import datetime
1213
import pytz
1314

1415
app = FastAPI()
1516

1617
Base.metadata.create_all(bind=engine)
1718

18-
# @app.post("/schedule-email/", response_model=EmailSchedule)
19-
# def schedule_email(email_schedule: EmailScheduleCreate, db: Session = Depends(get_db)):
20-
# db_email_schedule = crud.create_email_schedule(db, email_schedule)
21-
# delay = (email_schedule.schedule_time - datetime.utcnow()).total_seconds()
22-
# celery_app.send_task("tasks.send_scheduled_email", args=[db_email_schedule.id], countdown=delay)
23-
# return db_email_schedule
2419

25-
@app.post("/schedule-email/")
26-
def schedule_email(email_schedule: EmailSchedule):
27-
# Assign a unique id to the email schedule
28-
email_schedule.id = len(scheduled_emails) + 1
2920

30-
schedule_time = email_schedule.schedule_time.astimezone(pytz.UTC)
31-
current_time = datetime.utcnow().replace(tzinfo=pytz.UTC)
21+
from fastapi import FastAPI, Depends, HTTPException
22+
from sqlalchemy.orm import Session
23+
from database import engine, Base, get_db
24+
from schemas import EmailScheduleCreate, EmailSchedule, DeleteResponse
25+
from models import EmailSchedule as EmailScheduleModel
26+
import crud
27+
from celery import Celery
28+
from celery_config import celery_app
29+
from tasks import send_scheduled_email
30+
from datetime import datetime, timedelta
31+
import pytz
32+
33+
app = FastAPI()
34+
35+
Base.metadata.create_all(bind=engine)
36+
37+
@app.post("/schedule-email/", response_model=EmailSchedule)
38+
def schedule_email(email_schedule: EmailScheduleCreate, db: Session = Depends(get_db)):
39+
schedule_time = email_schedule.schedule_time.replace(tzinfo=pytz.UTC)
40+
current_time = datetime.now(pytz.UTC)
3241
delay = (schedule_time - current_time).total_seconds()
3342

34-
task_id = None
3543
if delay > 0:
44+
db_email_schedule = crud.create_email_schedule(db, email_schedule)
45+
3646
if email_schedule.recurring:
37-
task_id = schedule_recurring_email.apply_async((email_schedule.dict(),), eta=schedule_time)
47+
# Handle recurring emails (you'll need to implement this)
48+
pass
3849
else:
39-
task_id = send_email.apply_async((email_schedule.dict(),), countdown=delay)
50+
send_scheduled_email.apply_async((db_email_schedule.id,), countdown=delay)
4051

41-
if task_id:
42-
scheduled_emails[email_schedule.id] = email_schedule.dict()
43-
scheduled_emails[email_schedule.id]["task_id"] = task_id.id
44-
45-
return email_schedule.dict()
52+
return db_email_schedule
53+
else:
54+
raise HTTPException(status_code=400, detail="Schedule time must be in the future")
4655

4756
@app.get("/scheduled-emails/", response_model=list[EmailSchedule])
4857
def read_email_schedules(skip: int = 0, limit: int = 100, db: Session = Depends(get_db)):
@@ -56,10 +65,9 @@ def read_email_schedule(id: int, db: Session = Depends(get_db)):
5665
raise HTTPException(status_code=404, detail="Email schedule not found")
5766
return db_email_schedule
5867

59-
@app.delete("/scheduled-emails/{id}", response_model=EmailSchedule)
68+
@app.delete("/scheduled-emails/{id}", response_model=DeleteResponse)
6069
def delete_email_schedule(id: int, db: Session = Depends(get_db)):
6170
success = crud.delete_email_schedule(db, id)
6271
if not success:
6372
raise HTTPException(status_code=404, detail="Email schedule not found")
64-
return {"detail": "Email schedule deleted successfully"}
65-
73+
return DeleteResponse(detail="Email schedule deleted successfully")

models.py

+13-13
Original file line numberDiff line numberDiff line change
@@ -1,15 +1,15 @@
1-
from pydantic import BaseModel, Field
2-
from typing import Optional
3-
from datetime import datetime
1+
from sqlalchemy import Column, Integer, String, DateTime, Boolean
2+
from database import Base
43

5-
class EmailSchedule(BaseModel):
6-
recipient: str
7-
subject: str
8-
body: str
9-
schedule_time: datetime
10-
recurring: bool
11-
recurrence_type: Optional[str] = None
12-
recurrence_value: Optional[str] = None
13-
id: Optional[int] = None
14-
is_sent: Optional[bool] = False
4+
class EmailSchedule(Base):
5+
__tablename__ = "email_schedules"
156

7+
id = Column(Integer, primary_key=True, index=True)
8+
recipient = Column(String, index=True)
9+
subject = Column(String)
10+
body = Column(String)
11+
schedule_time = Column(DateTime)
12+
recurring = Column(Boolean)
13+
recurrence_type = Column(String, nullable=True)
14+
recurrence_value = Column(String, nullable=True)
15+
is_sent = Column(Boolean, default=False)

schemas.py

+6-3
Original file line numberDiff line numberDiff line change
@@ -7,13 +7,16 @@ class EmailScheduleCreate(BaseModel):
77
subject: str
88
body: str
99
schedule_time: datetime
10-
recurring: Optional[bool] = False
10+
recurring: bool
1111
recurrence_type: Optional[str] = None
1212
recurrence_value: Optional[str] = None
1313

1414
class EmailSchedule(EmailScheduleCreate):
1515
id: int
16-
is_sent: bool
16+
is_sent: bool = False
1717

1818
class Config:
19-
orm_mode = True
19+
from_attributes = True # This replaces orm_mode=True
20+
21+
class DeleteResponse(BaseModel):
22+
detail: str

test.db

0 Bytes
Binary file not shown.

0 commit comments

Comments
 (0)