diff --git a/CHANGELOG.md b/CHANGELOG.md index c725163..c51e70a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -6,7 +6,7 @@ Format basé sur [Keep a Changelog](https://keepachangelog.com/fr/1.1.0/), et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). > **En cours de développement** : les changements à venir sont listés dans la section -> [Unreleased](#unreleased). La dernière version livrée est **2.27.6**. +> [Unreleased](#unreleased). La dernière version livrée est **2.27.7**. --- @@ -14,6 +14,10 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). --- +## [2.27.7] — 2026-09-26 + +--- + ## [2.27.6] — 2026-09-26 --- @@ -34,6 +38,14 @@ et [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ### Modifié +- **#85 (T6a) — extraction lecture fichiers hors du monolithe `backend/main.py`.** + `/api/browse/{vault}`, `/api/file/{vault}/raw|download|backlinks` et + `GET /api/file/{vault}` (vue rendue tous formats) sont servis par le + nouveau `backend/routers/files_read.py` ; modèles dans `schemas.py`, + `_content_disposition`/`_media_max_inline_bytes` dans + `backend/routers/helpers.py` (partagés avec les tranches suivantes). + Correctif au passage : décorateur orphelin `/s/{token}` resté en T3 et + double-enregistrement de `/api/conflicts` supprimés. - **#85 (T5) — extraction du domaine `search` hors du monolithe `backend/main.py`.** Les 11 routes (`/api/search`, `/advanced`, `/replace`, `/tags`, `/tree-search`, `/vault/{vault}/paths`, `/suggest`, `/tags/suggest`, diff --git a/README.fr.md b/README.fr.md index 11f8310..43d073f 100644 --- a/README.fr.md +++ b/README.fr.md @@ -4,7 +4,7 @@ **Porte d'entrée web ultra-léger pour vos vaults Obsidian** — Accédez, naviguez et recherchez dans toutes vos notes Obsidian depuis n'importe quel appareil via une interface web moderne et responsive. -[![Version](https://img.shields.io/badge/Version-2.27.6-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.27.7-blue.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://www.python.org/) @@ -976,8 +976,8 @@ Ce projet est sous licence **MIT** — voir le fichier [LICENSE](LICENSE) pour l ## 📝 Changelog -Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.27.6). +Consultez le [CHANGELOG.md](./CHANGELOG.md) pour l'historique complet de toutes les versions (v1.0.0 → v2.27.7). --- -*Projet : ObsiGate | Version : 2.27.6 | Dernière mise à jour : Septembre 2026* +*Projet : ObsiGate | Version : 2.27.7 | Dernière mise à jour : Septembre 2026* diff --git a/README.md b/README.md index e2c3b36..4ee85e8 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ **Ultra-light web gateway for your Obsidian vaults** — Access, browse, and search all your Obsidian notes from any device via a modern, responsive web interface. -[![Version](https://img.shields.io/badge/Version-2.27.6-blue.svg)]() +[![Version](https://img.shields.io/badge/Version-2.27.7-blue.svg)]() [![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT) [![Docker](https://img.shields.io/badge/Docker-Ready-blue.svg)](https://www.docker.com/) [![Python](https://img.shields.io/badge/Python-3.11+-green.svg)](https://www.python.org/) @@ -1151,8 +1151,8 @@ This project is licensed under the **MIT License** - see the [LICENSE](LICENSE) ## 📝 Changelog -See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.27.6). +See [CHANGELOG.md](./CHANGELOG.md) for the complete version history (v1.0.0 → v2.27.7). --- -*Project: ObsiGate | Version: 2.27.6 | Last updated: September 2026* +*Project: ObsiGate | Version: 2.27.7 | Last updated: September 2026* diff --git a/VERSION b/VERSION index 9b38703..28e21cc 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -2.27.6 +2.27.7 diff --git a/backend/main.py b/backend/main.py index 7c366ba..699720d 100644 --- a/backend/main.py +++ b/backend/main.py @@ -11,7 +11,6 @@ import urllib.request from contextlib import asynccontextmanager from pathlib import Path from typing import Any -from urllib.parse import quote import frontmatter import mistune @@ -33,11 +32,9 @@ from backend.history import ( ) from backend.image_processor import preprocess_images from backend.indexer import ( - _extract_tags, add_vault_to_index, build_index, find_file_in_index, - get_backlinks, get_conflicts, get_vault_data, handle_file_move, @@ -64,7 +61,6 @@ from backend.schemas import ( AppConfigResponse, AttachmentRescanResponse, AttachmentStatsResponse, - BacklinksResponse, BookmarksResponse, BookmarkToggleResponse, ConflictResolveResponse, @@ -87,7 +83,6 @@ from backend.search import ( from backend.semantic_search import init_semantic_index from backend.services.backups import get_backup_dir as service_get_backup_dir from backend.services.errors import ServiceError -from backend.services.files import read_raw_file from backend.services.mutations import ( batch_upload_files as service_batch_upload_files, ) @@ -121,7 +116,6 @@ from backend.services.mutations import ( from backend.services.recent import humanize_mtime, list_recent from backend.services.sanitizer import sanitize_html from backend.services.vaults import ( - browse_directory, list_accessible_vaults, list_all_files, ) @@ -149,64 +143,6 @@ class VaultInfo(BaseModel): type: str = Field(default="VAULT", description="Type of the vault mapping (VAULT or DIR)") -class BrowseItem(BaseModel): - """A single entry (file or directory) returned by the browse endpoint.""" - name: str = Field(description="File or directory name") - path: str = Field(description="Relative path within vault") - type: str = Field(description="'file' or 'directory'") - children_count: int | None = Field(default=None, description="Number of children (directories only)") - size: int | None = Field(default=None, description="File size in bytes") - extension: str | None = Field(default=None, description="File extension") - - -class BrowseResponse(BaseModel): - """Paginated directory listing for a vault.""" - vault: str - path: str - items: list[BrowseItem] - - -class FileContentResponse(BaseModel): - """Rendered file content with metadata.""" - vault: str = Field(description="Vault name") - path: str = Field(description="Relative file path within the vault") - title: str = Field(description="File title (from frontmatter or filename)") - tags: list[str] = Field(description="Extracted tags from frontmatter and inline #tags") - frontmatter: dict[str, Any] = Field(description="YAML frontmatter as key-value dict") - html: str = Field(description="Rendered HTML content") - raw_length: int = Field(description="Length of raw file content in characters") - extension: str = Field(description="File extension (e.g. .md, .txt)") - is_markdown: bool = Field(description="Whether the file is markdown") - unsupported: bool | None = Field(default=False, description="True for binary/unsupported files") - size_bytes: int | None = Field(default=None, description="File size in bytes (for unsupported files)") - is_pdf: bool | None = Field(default=None, description="True for PDF files") - is_image: bool | None = Field(default=None, description="True for image files") - is_audio: bool | None = Field(default=None, description="True for audio files (HTML5