Lot 4/4 de l'A28 (god files) : l'ancien app/routers/board.py (2 101 lignes, 53 routes) devient le package `app/routers/board/` : - 12 modules de routes : pages 271 L (7 r.), page_api 229 (5), board_views 223 (8), page_ops 176 (3), sharing 175 (10), synced 144 (8), page_media 122 (4), import_ 85 (2), wiki 76 (2), library 66 (1), embed 64 (2), sync 51 (1) - _common.py (878 L) : 23 helpers dont 4 async + les 4 constantes (STATUS_COLORS, STATUS_LABELS, AI_KEYWORD_COLORS, _REPO_REF_RE) - __init__.py : __all__ complet — importateurs inchangés (api.py ×4 top-level, webhooks top-level, dashboard ×5 lazy, tests ×4) Preuve contractuelle : docs/openapi-v2.json régénéré = IDENTIQUE byte-à-byte (509 chemins, ordre préservé). Pièges rattrapés : - constantes d'état oubliées dans _common à la 1ʳᵉ passe (F821 + ImportError au chargement) → ré-insérées avec les valeurs exactes - docstring du header copié → F404 → slice [1:21] - helpers `async def` non détectés par `def ` seul A28 TERMINÉ en 4 lots : api_v2 (7.29.0), dashboard (7.30.0), collections (7.31.0), board (7.32.0) — 0 changement d'URL sur les 4. suite **1091/1091** · ruff OK · OpenAPI 509 identique · docs à jour
109 lines
2.4 KiB
Python
109 lines
2.4 KiB
Python
"""FlowDeck — Board : Kanban Notion-style + multi-vues.
|
|
|
|
Découpe A28 : l'ancien `board.py` (2 101 lignes, 53 routes) est
|
|
devenu ce package — un module par concern, helpers/constantes dans
|
|
`_common`. Ré-exportés (importateurs inchangés) : api.py
|
|
(STATUS_COLORS, STATUS_LABELS, _issue_column, _map_issue_to_card),
|
|
webhooks (_issue_column), dashboard (_sidebar_data,
|
|
_load_workspace_pages, _load_shared_sidebar_pages, _file_icon),
|
|
tests (_build_page_tree, _REPO_REF_RE, _unfurl_repo).
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter
|
|
|
|
from . import ( # ordre = ordre d'enregistrement d'origine
|
|
board_views,
|
|
embed,
|
|
import_,
|
|
library,
|
|
page_api,
|
|
page_media,
|
|
page_ops,
|
|
pages,
|
|
sharing,
|
|
sync,
|
|
synced,
|
|
wiki,
|
|
)
|
|
from ._common import ( # noqa: F401 — ré-exports
|
|
_REPO_REF_RE,
|
|
AI_KEYWORD_COLORS,
|
|
STATUS_COLORS,
|
|
STATUS_LABELS,
|
|
_apply_filters,
|
|
_apply_sorts,
|
|
_block_texts,
|
|
_build_page_tree,
|
|
_create_page_from_markdown,
|
|
_ensure_block_ids,
|
|
_ensure_page_editable,
|
|
_extract_ai_keywords,
|
|
_file_icon,
|
|
_get_project_properties,
|
|
_issue_column,
|
|
_load_children,
|
|
_load_shared_sidebar_pages,
|
|
_load_workspace_pages,
|
|
_local_workspaces_for_user,
|
|
_map_issue_to_card,
|
|
_record_version,
|
|
_sidebar_data,
|
|
_store_uploaded_file,
|
|
_unfurl_repo,
|
|
_upload_root,
|
|
_ws_id_for,
|
|
asyncio_get_labels,
|
|
)
|
|
|
|
logger = logging.getLogger(__name__)
|
|
router = APIRouter()
|
|
for _mod in (
|
|
wiki,
|
|
page_api,
|
|
library,
|
|
sharing,
|
|
synced,
|
|
board_views,
|
|
pages,
|
|
page_media,
|
|
import_,
|
|
embed,
|
|
page_ops,
|
|
sync,
|
|
):
|
|
router.include_router(_mod.router)
|
|
|
|
__all__ = [
|
|
"router",
|
|
"AI_KEYWORD_COLORS",
|
|
"STATUS_COLORS",
|
|
"STATUS_LABELS",
|
|
"_REPO_REF_RE",
|
|
"_apply_filters",
|
|
"_apply_sorts",
|
|
"_block_texts",
|
|
"_build_page_tree",
|
|
"_create_page_from_markdown",
|
|
"_ensure_block_ids",
|
|
"_ensure_page_editable",
|
|
"_extract_ai_keywords",
|
|
"_file_icon",
|
|
"_get_project_properties",
|
|
"_issue_column",
|
|
"_load_children",
|
|
"_load_shared_sidebar_pages",
|
|
"_load_workspace_pages",
|
|
"_local_workspaces_for_user",
|
|
"_map_issue_to_card",
|
|
"_record_version",
|
|
"_sidebar_data",
|
|
"_store_uploaded_file",
|
|
"_unfurl_repo",
|
|
"_upload_root",
|
|
"_ws_id_for",
|
|
"asyncio_get_labels",
|
|
]
|