from flask import request from flask_jwt_extended import jwt_required from flask_pydantic import validate from app import db from app.decorators import load_board_owned, load_card_owned from app.models import CardLabel, Label from app.schemas import LabelCreateRequest from . import kanban_bp @kanban_bp.route("/boards//labels", methods=["GET"]) @jwt_required() @load_board_owned def get_labels(board_id, board): """Get all labels for a board""" labels = board.labels.all() return [label.to_dict() for label in labels], 200 @kanban_bp.route("/boards//labels", methods=["POST"]) @jwt_required() @load_board_owned @validate(body=LabelCreateRequest) def create_label(board_id, board, body: LabelCreateRequest): """Create a new label in a board""" label = Label( name=body.name, color=body.color, board_id=board_id, ) db.session.add(label) db.session.commit() return label.to_dict(), 201 @kanban_bp.route("/cards//labels", methods=["POST"]) @jwt_required() @load_card_owned def add_label_to_card(card_id, card): """Add a label to a card""" data = request.json label_id = data.get("label_id") if not label_id: return {"error": "Label ID is required"}, 400 label = db.session.get(Label, label_id) if not label or label.board_id != card.board_id: return {"error": "Label not found or doesn't belong to this board"}, 404 # Check if already labeled existing = CardLabel.query.filter_by(card_id=card_id, label_id=label_id).first() if existing: return {"error": "Label already added to card"}, 400 card_label = CardLabel(card_id=card_id, label_id=label_id) db.session.add(card_label) db.session.commit() return card_label.to_dict(), 201 @kanban_bp.route("/cards//labels/", methods=["DELETE"]) @jwt_required() @load_card_owned def remove_label_from_card(card_id, card, label_id): """Remove a label from a card""" card_label = CardLabel.query.filter_by(card_id=card_id, label_id=label_id).first() if not card_label: return {"error": "Label not found on card"}, 404 db.session.delete(card_label) db.session.commit() return {"message": "Label removed from card"}, 200