Commit Graph

292 Commits

Author SHA1 Message Date
ext.jeremy.guillot@maxicoffee.domains
2ffe559832 fix: MangaDex title fallback + image CDN URL
All checks were successful
Deploy / deploy (push) Successful in 2m31s
- Title: cascade en → fr → ja-ro → ko-ro → zh-ro → first available to avoid silently dropping mangas without English title (e.g. One Piece stored as ja-ro)
- Image: use uploads.mangadex.org CDN with .512.jpg thumbnail suffix instead of mangadex.org/covers which fails in prod
2026-03-13 18:08:35 +01:00
ext.jeremy.guillot@maxicoffee.domains
5eb650df6f style: simplify settings page — replace cards with border-top sections
All checks were successful
Deploy / deploy (push) Successful in 2m46s
2026-03-13 17:47:47 +01:00
b60a68cbd7 Merge pull request 'feat: dark mode complet + préférences utilisateur' (#7) from feature/dark-mode-user-preferences into main
All checks were successful
Deploy / deploy (push) Successful in 2m45s
Reviewed-on: #7
2026-03-12 20:45:18 +01:00
ext.jeremy.guillot@maxicoffee.domains
ec1ef8fe68 feat: dark mode complet + préférences utilisateur
- Ajout du store userPreferencesStore (thème, vue, tri, pagination, lecteur)
- Page UserPreferencesPage pour configurer toutes les préférences
- Câblage des prefs dans HomePage (viewMode, sortBy, itemsPerPage), readerStore (fallback prefs), ChapterReader (autoHide, autoFullscreen, sync), useNotifications (toastDuration)
- Thème sombre (dark: Tailwind) sur tous les composants Vue : Layout, Pagination, NotificationToast, MangaCard, MangaVolume, MangaDetails, AddManga, HomePage, ActivityPage, JobItem, MangaDeleteModal, MangaEditModal, MangaPreferredSourcesModal, ManageChaptersModal, MangaChapterList, MangaChapter, ConversionPage, FileUploadArea, ConversionProgress, NewImportPage, FileImportCard, MangaMatchCard, StatusBadge, ImportResults
- i18n partiellement initialisé

Jeremy Guillot
2026-03-12 20:38:29 +01:00
48d819ba72 Merge pull request 'feature/notification-system' (#6) from feature/notification-system into main
All checks were successful
Deploy / deploy (push) Successful in 2m34s
Reviewed-on: #6
2026-03-12 18:56:30 +01:00
156d2eea37 Merge branch 'main' into feature/notification-system 2026-03-12 18:56:20 +01:00
ext.jeremy.guillot@maxicoffee.domains
e5c319db79 fix: amélioration du système de notifications
- Correction de l'affichage du texte dans le toast (suppression de w-0/truncate)
- Déplacement des toasts en bas à gauche avec animation slide depuis la gauche
- Inversion de l'ordre des éléments : bouton fermeture > texte > icône > bande couleur
- Fix timing : ChapterScrapingStarted synchrone pour notif "démarrage" avant le scraping
- Ajout make notify-test pour tester les 4 types de notifications

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 18:55:15 +01:00
ext.jeremy.guillot@maxicoffee.domains
41ca08f20e feat: notification system via Mercure for scraping events
- NotificationInterface: add sendInfo() and sendWarning() levels
- SymfonyNotification: implement new levels (publishes to 'notifications' topic)
- ChapterScrapingStarted: carry mangaTitle + chapterNumber, now dispatched
- ScrapeChapterHandler: dispatch ChapterScrapingStarted before scraping loop
- ScrapingEventSubscriber: wire NotificationInterface for started/scraped/failed events
- useMercureNotifications: new global Vue composable subscribing to 'notifications' topic
- App.vue: mount useMercureNotifications() at app root
- SendTestNotificationCommand: `app:notify:test --type --message` for dev/prod testing

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-12 00:57:21 +01:00
13653b4ced Merge pull request 'feat: activity page' (#5) from feature/activity-ddd-port into main
All checks were successful
Deploy / deploy (push) Successful in 2m48s
Reviewed-on: #5
2026-03-11 22:25:01 +01:00
e9b56b80e6 Merge branch 'main' into feature/activity-ddd-port 2026-03-11 22:24:46 +01:00
ext.jeremy.guillot@maxicoffee.domains
95f224d69a feat: enrich activity job display with manga/chapter context
- Add mangaTitle to ScrapingJob context at creation time
- Fix job.js constructor to map failureReason, attempts, maxAttempts, context from API
- JobItem: show readable type label, manga name, chapter number, source and attempts counter

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 22:23:09 +01:00
ext.jeremy.guillot@maxicoffee.domains
ff8b945014 fix: test deploy
All checks were successful
Deploy / deploy (push) Successful in 2m48s
2026-03-11 22:00:43 +01:00
ext.jeremy.guillot@maxicoffee.domains
2a8b6bc397 feat: deploy optimisation
All checks were successful
Deploy / deploy (push) Successful in 3m23s
2026-03-11 21:56:23 +01:00
ext.jeremy.guillot@maxicoffee.domains
eb25d2c34e fix: run cache:clear after docker restart, not before
All checks were successful
Deploy / deploy (push) Successful in 3m47s
Docker resolves bind mounts at container start time, not dynamically when
the Deployer symlink changes. Running cache:clear before restart means
docker exec sees the old release code, causing errors on changed config.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 21:38:40 +01:00
ext.jeremy.guillot@maxicoffee.domains
c981ce27c5 test
Some checks failed
Deploy / deploy (push) Failing after 2m58s
2026-03-11 21:32:39 +01:00
ext.jeremy.guillot@maxicoffee.domains
6f3efab0fc chore: trigger deploy
Some checks failed
Deploy / deploy (push) Failing after 3m2s
2026-03-11 21:25:30 +01:00
ext.jeremy.guillot@maxicoffee.domains
ed86c9074d fix: remove unsupported priority key from YAML route definition
Some checks failed
Deploy / deploy (push) Failing after 3m17s
Symfony's YAML route loader does not support the priority key (only PHP config does).
Relying on vue_app being defined first in routes.yaml to ensure it is matched
before legacy controller routes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 21:13:37 +01:00
ext.jeremy.guillot@maxicoffee.domains
1becbe9254 fix: ensure vue_app catch-all is matched before legacy controllers
Some checks failed
Deploy / deploy (push) Has been cancelled
Move vue_app before controllers in routes.yaml AND keep priority:1.
Using both guarantees Symfony matches the Vue SPA catch-all first
regardless of how the router compiles equal-priority routes.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 21:11:56 +01:00
ext.jeremy.guillot@maxicoffee.domains
aea4e57b9e fix: Vue SPA catch-all takes priority over legacy Twig routes
All checks were successful
Deploy / deploy (push) Successful in 4m45s
Without priority:1, Symfony matched legacy controllers (e.g. app_activity at /activity)
before the vue_app catch-all on hard reload. Now vue_app matches first for all paths
except /api/* and /legacy* which still route to Symfony controllers.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 20:59:11 +01:00
ext.jeremy.guillot@maxicoffee.domains
19395b4869 feat: activity page 2026-03-11 20:54:55 +01:00
ext.jeremy.guillot@maxicoffee.domains
f418b36167 fix: clear Symfony cache before container restart on deploy
All checks were successful
Deploy / deploy (push) Successful in 3m21s
The var/ directory is a persistent Docker volume. Without explicit cache:clear,
docker restart keeps serving old cached routes (e.g. / → MangaController).
New code is already visible via bind mount before restart, so docker exec works.

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 20:17:43 +01:00
ext.jeremy.guillot@maxicoffee.domains
c085c3453a feat: Vue SPA as default interface at root URL
All checks were successful
Deploy / deploy (push) Successful in 3m32s
- Route `/` now serves the Vue SPA directly (catch-all `/{req}`)
- Legacy Twig interface moved to `/legacy`
- Vue Router base changed from `/vue/` to `/`

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-11 20:06:02 +01:00
ext.jeremy.guillot@maxicoffee.domains
d299e0b9ae fix: deploy
All checks were successful
Deploy / deploy (push) Successful in 3m34s
2026-03-11 19:27:10 +01:00
ext.jeremy.guillot@maxicoffee.domains
e78a6230b5 fix: deploy
All checks were successful
Deploy / deploy (push) Successful in 3m37s
2026-03-11 19:22:56 +01:00
ext.jeremy.guillot@maxicoffee.domains
9d61e4231a fix: deploy
All checks were successful
Deploy / deploy (push) Successful in 3m15s
2026-03-11 19:16:57 +01:00
ext.jeremy.guillot@maxicoffee.domains
027f795bc0 fix: test deploy
All checks were successful
Deploy / deploy (push) Successful in 3m34s
2026-03-11 19:06:41 +01:00
ext.jeremy.guillot@maxicoffee.domains
19f1633c7a fix: deploy
All checks were successful
Deploy / deploy (push) Successful in 3m58s
2026-03-10 23:28:57 +01:00
ext.jeremy.guillot@maxicoffee.domains
751fb1e74b fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 1m52s
2026-03-10 23:25:03 +01:00
ext.jeremy.guillot@maxicoffee.domains
c60301d1ca fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 1m10s
2026-03-10 23:16:32 +01:00
ext.jeremy.guillot@maxicoffee.domains
944994b7d7 fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 56s
2026-03-10 23:14:16 +01:00
ext.jeremy.guillot@maxicoffee.domains
08e005a0d3 fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 2m19s
2026-03-10 23:10:15 +01:00
ext.jeremy.guillot@maxicoffee.domains
566b62450e fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 3m11s
2026-03-10 23:05:11 +01:00
ext.jeremy.guillot@maxicoffee.domains
16f87d5f06 fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 3m10s
2026-03-10 22:59:39 +01:00
ext.jeremy.guillot@maxicoffee.domains
78971a7e2b fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 38s
2026-03-10 22:56:15 +01:00
ext.jeremy.guillot@maxicoffee.domains
b1feb6a83f fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 42s
2026-03-10 22:50:45 +01:00
ext.jeremy.guillot@maxicoffee.domains
8b41626894 fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 11s
2026-03-10 22:47:23 +01:00
ext.jeremy.guillot@maxicoffee.domains
4e7a277d49 fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 19s
2026-03-10 22:43:40 +01:00
ext.jeremy.guillot@maxicoffee.domains
01428cbdeb fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 33s
2026-03-10 22:41:38 +01:00
ext.jeremy.guillot@maxicoffee.domains
5f5271e1b5 fix: deploy
Some checks failed
Deploy / deploy (push) Failing after 11s
2026-03-10 22:38:09 +01:00
ext.jeremy.guillot@maxicoffee.domains
939f6da0c4 fix: test deploy
Some checks failed
Deploy / deploy (push) Failing after 16s
2026-03-10 22:33:26 +01:00
ext.jeremy.guillot@maxicoffee.domains
0756460fbc fix: git token
Some checks failed
Deploy / deploy (push) Failing after 12s
2026-03-10 22:08:35 +01:00
ext.jeremy.guillot@maxicoffee.domains
3941cb4b8f feat: deployer
Some checks failed
Deploy / deploy (push) Failing after 21s
2026-03-10 21:48:18 +01:00
ext.jeremy.guillot@maxicoffee.domains
3507349167 fix: symfony css selector in prod
All checks were successful
Build and Deploy / deploy (push) Successful in 1m25s
2026-03-09 23:10:32 +01:00
487f400418 Merge pull request 'refactor(reader): serve pages as static files instead of base64' (#4) from feat/reader-static-images into main
All checks were successful
Build and Deploy / deploy (push) Successful in 1m23s
Reviewed-on: #4
2026-03-09 22:07:34 +01:00
ext.jeremy.guillot@maxicoffee.domains
322c396165 refactor(reader): serve pages as static files instead of base64
Replace the per-page API call (base64 payload) with static image URLs
served directly by Caddy from public/images/pages/{chapterId}/.

- LocalImageStorage now stores to public/images/ (was MANGA_DATA_PATH)
- LegacyChapterRepository returns /images/pages/{id}/{file} URLs,
  uses getimagesize() instead of loading file content into memory
- Delete GetChapterPage query/handler/response, ChapterPageResource,
  ChapterPageProvider, PageContent model
- Remove getPageContent() from ChapterRepositoryInterface
- Frontend: loadChapter() fetches chapter + all pages in parallel,
  ReaderPage uses URL instead of base64 data URI, InfiniteReader drops
  lazy-load observer side effect, readerStore drops loadedPages/preload
- GetChapterPagesTest: extract fixture images from CBZ at runtime,
  ignore tests/Fixtures/pages/ in .gitignore

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 22:05:45 +01:00
6875ad4222 Merge pull request 'refactor(scraping): DDD refactoring — stockage images individuelles' (#3) from feat/scraping-ddd-image-storage into main
All checks were successful
Build and Deploy / deploy (push) Successful in 1m42s
Reviewed-on: #3
2026-03-09 20:53:15 +01:00
ext.jeremy.guillot@maxicoffee.domains
c311cfe80c refactor(scraping): DDD refactoring — stockage images individuelles
Le domaine Scraping ne génère plus d'archives CBZ ni ne modifie les
entités du domaine Manga directement. Il scrape, stocke les images
individuellement, et émet un événement partagé.

- Suppression : CbzGeneratorInterface, CbzGenerator, CbzGenerationRequest,
  CbzPath, CbzGenerationException
- Suppression : save() de ChapterRepositoryInterface (Scraping)
- Suppression : cbzPath du modèle Chapter (Scraping)
- Ajout : ImageStorageInterface + LocalImageStorage
  (stockage dans {MANGA_DATA_PATH}/pages/{chapterId}/)
- ScrapeChapterHandler utilise ImageStorage au lieu du générateur CBZ

- ChapterScraped déplacé dans Domain/Shared/Domain/Event/
  avec jobId, chapterId, pagesDirectory, pageCount
- Routing Messenger ajouté

- Ajout : ChapterScrapedEventListener + ChapterScrapedMessageHandler
  pour mettre à jour Chapter.pagesDirectory via le Repository Manga

- LegacyChapterRepository en dual-mode :
  pagesDirectory en priorité, fallback cbzPath (backward compat)
- Requêtes prev/next : filtrent pagesDirectory IS NOT NULL OR cbzPath IS NOT NULL
- ChapterContext expose pagesDirectory

- phparkitect.php : App\Domain\Shared\Domain\Event autorisé dans
  les couches Application (correction violations pré-existantes
  ChapterImported/VolumeImported + nouvelle ChapterScraped)

- 218/218 tests passent (+3 nouveaux)
- InMemoryImageStorage créé pour les tests unitaires

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 20:52:16 +01:00
ext.jeremy.guillot@maxicoffee.domains
d444f86315 Merge branch 'main' of ssh://git.homelab.nestor-server.fr:2222/colgora/Mangarr
All checks were successful
Build and Deploy / deploy (push) Successful in 1m46s
# Conflicts:
#	src/Domain/Manga/Application/CommandHandler/DeleteChapterHandler.php
#	src/Domain/Manga/Application/CommandHandler/EditMultipleChaptersHandler.php
#	src/Domain/Manga/Application/EventListener/ChapterImportedEventListener.php
#	src/Domain/Manga/Application/EventListener/VolumeImportedEventListener.php
#	src/Domain/Manga/Application/Response/ChapterResponse.php
#	src/Domain/Manga/Infrastructure/ApiPlatform/State/Provider/DeleteCbzProvider.php
#	src/Domain/Manga/Infrastructure/ApiPlatform/State/Provider/DeleteChapterProvider.php
#	src/Domain/Manga/Infrastructure/Persistence/Repository/LegacyChapterRepository.php
2026-03-09 20:47:43 +01:00
ext.jeremy.guillot@maxicoffee.domains
7506a7a3c1 style: apply php-cs-fixer formatting (PSR-12)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
2026-03-09 20:46:59 +01:00
4cd277aec7 Merge pull request 'fix(migration): DROP INDEX IF EXISTS pour messenger_messages' (#2) from feat/chapter-entity-image-storage into main
All checks were successful
Build and Deploy / deploy (push) Successful in 1m36s
Reviewed-on: #2
2026-03-09 19:36:19 +01:00