kanban-app/backend/app/routes/kanban/labels.py

80 lines
2.3 KiB
Python
Raw Normal View History

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/<int:board_id>/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/<int:board_id>/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/<int:card_id>/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/<int:card_id>/labels/<int:label_id>", 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