from __future__ import annotations from flask import Blueprint, abort, redirect, render_template, request, url_for from app.services.notes_fs import create_note, list_notes, load_note_by_id, update_note_body bp = Blueprint("notes", __name__, url_prefix="/notes") @bp.get("/") def notes_index(): notes = list_notes() return render_template("notes/list.html", notes=notes) @bp.get("/new") def notes_new(): return render_template("notes/new.html") @bp.post("/") def notes_create(): title = (request.form.get("title") or "").strip() body = (request.form.get("body") or "").strip() tags_raw = (request.form.get("tags") or "").strip() tags = [t.strip() for t in tags_raw.split(",") if t.strip()] if tags_raw else [] if not title: return render_template("notes/new.html", error="Title is required", title=title, body=body, tags_raw=tags_raw), 400 note = create_note(title=title, body=body, tags=tags) return redirect(url_for("notes.notes_view", note_id=note.id)) @bp.get("/") def notes_view(note_id: str): note = load_note_by_id(note_id) if not note: abort(404) # M2 will render Markdown; for now show raw body and metadata return render_template("notes/view.html", note=note) @bp.post("//body") def notes_update_body(note_id: str): new_body = request.form.get("body") or "" note = update_note_body(note_id, new_body) if not note: abort(404) return redirect(url_for("notes.notes_view", note_id=note.id))