
- Set up project structure with FastAPI - Implement user authentication system with JWT tokens - Create database models for users, notes, and collections - Set up SQLAlchemy ORM and Alembic migrations - Implement CRUD operations for notes and collections - Add filtering and sorting capabilities for notes - Implement health check endpoint - Update project documentation
142 lines
3.7 KiB
Python
142 lines
3.7 KiB
Python
from datetime import datetime
|
|
from typing import Any, Dict, List, Optional, Union
|
|
|
|
from sqlalchemy import asc, desc
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.models.note import Note
|
|
from app.schemas.note import NoteCreate, NoteUpdate
|
|
|
|
|
|
def get(db: Session, note_id: int) -> Optional[Note]:
|
|
return db.query(Note).filter(Note.id == note_id).first()
|
|
|
|
|
|
def get_multi_by_owner(
|
|
db: Session, owner_id: int, skip: int = 0, limit: int = 100
|
|
) -> List[Note]:
|
|
return (
|
|
db.query(Note)
|
|
.filter(Note.owner_id == owner_id)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
|
|
def get_multi_by_owner_sorted(
|
|
db: Session, owner_id: int, skip: int = 0, limit: int = 100, sort_by: str = "created_at", sort_order: str = "desc"
|
|
) -> List[Note]:
|
|
"""Get notes sorted by specified field."""
|
|
query = db.query(Note).filter(Note.owner_id == owner_id)
|
|
|
|
# Determine sort field
|
|
if sort_by == "title":
|
|
sort_field = Note.title
|
|
elif sort_by == "updated_at":
|
|
sort_field = Note.updated_at
|
|
else: # Default to created_at
|
|
sort_field = Note.created_at
|
|
|
|
# Apply sort order
|
|
if sort_order == "asc":
|
|
query = query.order_by(asc(sort_field))
|
|
else: # Default to desc
|
|
query = query.order_by(desc(sort_field))
|
|
|
|
return query.offset(skip).limit(limit).all()
|
|
|
|
|
|
def get_multi_by_collection(
|
|
db: Session, owner_id: int, collection_id: int, skip: int = 0, limit: int = 100
|
|
) -> List[Note]:
|
|
return (
|
|
db.query(Note)
|
|
.filter(Note.owner_id == owner_id, Note.collection_id == collection_id)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
|
|
def search_notes(
|
|
db: Session, owner_id: int, search_term: str, skip: int = 0, limit: int = 100
|
|
) -> List[Note]:
|
|
"""Search notes by title or content."""
|
|
search_pattern = f"%{search_term}%"
|
|
return (
|
|
db.query(Note)
|
|
.filter(
|
|
Note.owner_id == owner_id,
|
|
(Note.title.ilike(search_pattern) | Note.content.ilike(search_pattern))
|
|
)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
|
|
def get_archived_notes(
|
|
db: Session, owner_id: int, skip: int = 0, limit: int = 100
|
|
) -> List[Note]:
|
|
"""Get archived notes."""
|
|
return (
|
|
db.query(Note)
|
|
.filter(Note.owner_id == owner_id, Note.is_archived)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
|
|
def get_notes_created_between(
|
|
db: Session, owner_id: int, start_date: datetime, end_date: datetime, skip: int = 0, limit: int = 100
|
|
) -> List[Note]:
|
|
"""Get notes created between specified dates."""
|
|
return (
|
|
db.query(Note)
|
|
.filter(
|
|
Note.owner_id == owner_id,
|
|
Note.created_at >= start_date,
|
|
Note.created_at <= end_date
|
|
)
|
|
.offset(skip)
|
|
.limit(limit)
|
|
.all()
|
|
)
|
|
|
|
|
|
def create(db: Session, *, obj_in: NoteCreate, owner_id: int) -> Note:
|
|
db_obj = Note(
|
|
**obj_in.model_dump(),
|
|
owner_id=owner_id,
|
|
)
|
|
db.add(db_obj)
|
|
db.commit()
|
|
db.refresh(db_obj)
|
|
return db_obj
|
|
|
|
|
|
def update(
|
|
db: Session, *, db_obj: Note, obj_in: Union[NoteUpdate, Dict[str, Any]]
|
|
) -> Note:
|
|
if isinstance(obj_in, dict):
|
|
update_data = obj_in
|
|
else:
|
|
update_data = obj_in.model_dump(exclude_unset=True)
|
|
for field in update_data:
|
|
if field in update_data:
|
|
setattr(db_obj, field, update_data[field])
|
|
db.add(db_obj)
|
|
db.commit()
|
|
db.refresh(db_obj)
|
|
return db_obj
|
|
|
|
|
|
def remove(db: Session, *, note_id: int, owner_id: int) -> Optional[Note]:
|
|
obj = db.query(Note).filter(Note.id == note_id, Note.owner_id == owner_id).first()
|
|
if obj:
|
|
db.delete(obj)
|
|
db.commit()
|
|
return obj
|