notesapi-q3b8fl/app/crud/crud_note.py
Automated Action 741f301b11 Implement Notes API with FastAPI and SQLite
- 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
2025-05-31 14:54:14 +00:00

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