"""Routes for tune_by_instrument entries and their notes.""" from flask import Blueprint, jsonify, request from app.extensions import db from app.models import Tune, Instrument, TuneByInstrument, TuneByInstrumentNote from app.auth import require_api_key instruments_bp = Blueprint("instruments", __name__) # --------------------------------------------------------------------------- # Instruments lookup (public) # --------------------------------------------------------------------------- @instruments_bp.get("/instruments") def list_instruments(): return jsonify([i.to_dict() for i in db.session.query(Instrument).order_by(Instrument.name).all()]) # --------------------------------------------------------------------------- # Instruments lookup (create / update / delete) # --------------------------------------------------------------------------- @instruments_bp.post("/instruments") @require_api_key def create_instrument(): data = request.get_json(force=True) instrument = Instrument(name=data["name"]) db.session.add(instrument) db.session.commit() return jsonify(instrument.to_dict()), 201 @instruments_bp.patch("/instruments/") @require_api_key def update_instrument(instrument_id): instrument = db.get_or_404(Instrument, instrument_id) data = request.get_json(force=True) if "name" in data: instrument.name = data["name"] db.session.commit() return jsonify(instrument.to_dict()) @instruments_bp.delete("/instruments/") @require_api_key def delete_instrument(instrument_id): instrument = db.get_or_404(Instrument, instrument_id) db.session.delete(instrument) db.session.commit() return jsonify({"deleted": instrument_id}) # --------------------------------------------------------------------------- # List all tune_by_instrument entries for a tune # --------------------------------------------------------------------------- @instruments_bp.get("/tunes//instruments") def list_tune_instruments(tune_id): db.get_or_404(Tune, tune_id) entries = db.session.query(TuneByInstrument).filter_by(tune_id=tune_id).all() return jsonify([e.to_dict() for e in entries]) # --------------------------------------------------------------------------- # Create a tune_by_instrument entry # --------------------------------------------------------------------------- @instruments_bp.post("/tunes//instruments") @require_api_key def create_tune_instrument(tune_id): db.get_or_404(Tune, tune_id) data = request.get_json(force=True) # Validate instrument exists instrument_id = data.get("instrument_id") db.get_or_404(Instrument, instrument_id) entry = TuneByInstrument( tune_id=tune_id, instrument_id=instrument_id, learned_from_id=data.get("learned_from_id"), tuning_id=data.get("tuning_id"), term_id=data.get("term_id"), date_learned=data.get("date_learned"), status=data.get("status"), difficulty=data.get("difficulty"), ) db.session.add(entry) db.session.commit() return jsonify(entry.to_dict()), 201 # --------------------------------------------------------------------------- # Update a tune_by_instrument entry # --------------------------------------------------------------------------- @instruments_bp.patch("/tunes//instruments/") @require_api_key def update_tune_instrument(tune_id, entry_id): entry = db.get_or_404(TuneByInstrument, entry_id) data = request.get_json(force=True) fields = ("instrument_id", "learned_from_id", "tuning_id", "term_id", "date_learned", "status", "difficulty") for field in fields: if field in data: setattr(entry, field, data[field]) db.session.commit() return jsonify(entry.to_dict()) # --------------------------------------------------------------------------- # Delete a tune_by_instrument entry # --------------------------------------------------------------------------- @instruments_bp.delete("/tunes//instruments/") @require_api_key def delete_tune_instrument(tune_id, entry_id): entry = db.get_or_404(TuneByInstrument, entry_id) db.session.delete(entry) db.session.commit() return jsonify({"deleted": entry_id}) # --------------------------------------------------------------------------- # Notes on a tune_by_instrument entry # --------------------------------------------------------------------------- @instruments_bp.get("/tunes//instruments//notes") def list_instrument_notes(tune_id, entry_id): db.get_or_404(TuneByInstrument, entry_id) notes = db.session.query(TuneByInstrumentNote).filter_by(tune_by_instrument_id=entry_id).all() return jsonify([n.to_dict() for n in notes]) @instruments_bp.post("/tunes//instruments//notes") @require_api_key def add_instrument_note(tune_id, entry_id): db.get_or_404(TuneByInstrument, entry_id) data = request.get_json(force=True) note = TuneByInstrumentNote(tune_by_instrument_id=entry_id, note=data.get("note")) db.session.add(note) db.session.commit() return jsonify(note.to_dict()), 201 @instruments_bp.patch("/tunes//instruments//notes/") @require_api_key def update_instrument_note(tune_id, entry_id, note_id): note = db.get_or_404(TuneByInstrumentNote, note_id) data = request.get_json(force=True) if "note" in data: note.note = data["note"] db.session.commit() return jsonify(note.to_dict()) @instruments_bp.delete("/tunes//instruments//notes/") @require_api_key def delete_instrument_note(tune_id, entry_id, note_id): note = db.get_or_404(TuneByInstrumentNote, note_id) db.session.delete(note) db.session.commit() return jsonify({"deleted": note_id})