История коммитов

.
feat(mail): migrate message sending and conversation clearing
- Add POST /mail/write/{id} sending (SendMessageUseCase, SendMessageCommand): validation, antiflood, set_mail access, ignore checks, file upload, contact creation, duplicate guard
- Add GET/POST /mail/clear/{id} (ClearConversationController, ClearConversationUseCase) with per-message soft/hard delete
- Extend MailFileService with file name parsing, extension allowlist and uploaded file storage
- Add repository methods getLastMessageBetween, updateContactTime; drop unused clearConversation
- Remove legacy /mail dispatcher route and includes/write.php
- Drop legacy compose-by-nick and base64 mini-upload paths
.
fix(mail): point model relations to Eloquent User
MailMessage and Contact relations referenced Johncms\System\Users\User (the current-user service, not an Eloquent model), causing 'Call to undefined method getConnectionName()' on eager loading. Point them to Johncms\Users\User.
.
chore: ignore upload/downloads/screen uploads
.
refactor(mail): migrate files and conversation pages to layered architecture
- Add GET /mail/files page (FilesController, GetAttachedFilesUseCase, File DTOs); drop legacy includes/files.php and the ?act=files flow
- Add GET /mail/write/{id} conversation view (WriteController::conversation, GetConversationUseCase, message DTOs)
- Fix getConversation query semantics (delete/sys/spam filters, OR grouping) and eager-load recipient; add markAsReadByIds for marking received messages read
- Add MailFileService::formatSize
- Inject Tools/Bbcode via constructor instead of di('tools')/di('bbcode') in conversation use cases (fixes ServiceNotFoundException)
- Point conversation/contact/unblock links to clean URLs (profile, blocklist, legacy blocklist include)
.
refactor(mail): add file download route, fix routing, remove legacy redirect resolver
- Add DownloadFileController and DownloadFileUseCase for GET /mail/load/{id}
- Add incrementDownloadCount to MailMessageRepositoryInterface and EloquentMailMessageRepository
- Fix route definitions: remove trailing slashes so rtrim() in index.php matches correctly
- Set legacy /mail route to priority -1 so new ContactController takes precedence on GET
- Remove MailLegacyRedirectResolver (unused in a non-public module)
- Update stale URLs: ../profile/?act=office -> /profile/?act=office, ?act=write&id=X -> /mail/write/X, ?act=load&id=X -> /mail/load/X
.
refactor(notifications): migrate to layered architecture
- Add controllers: IndexController, SettingsController, ClearController
- Add use cases: GetNotificationListUseCase, SaveSettingsUseCase, ClearNotificationsUseCase
- Add NotificationRepositoryInterface and EloquentNotificationRepository
- Add AuthorizedUserMiddleware; replace legacy user check in routes
- Replace legacy catch-all route with clean URLs: /notifications/, /notifications/settings/, /notifications/clear/
- Migrate Installer to src/Install/ with updated namespace
- Add config/services.php with DI wiring and Counters class alias
- Update templates: remove layout args, add output escaping
- Fix guestbook_comment → guestbook_comments counter key bug
- Remove legacy index.php and includes/
.
chore(downloads): update changelog
.
feat(downloads): implement slug-based URLs
- Slug paths for categories: /downloads/{slug}/ and /downloads/{parent}/{child}/
- Slug paths for files: /downloads/{cat-path}/{slug}-{id}/
- 301 redirects from legacy ?id= query URLs to slug URLs
- New services: DownloadCategoryPathService, DownloadFilePathService, DownloadSlugService, DownloadLegacyRedirectResolver
- New controllers: DownloadPathController (catch-all router), DownloadCategoryController
- Installer updated: slug column + unique(refid, slug) constraint on both tables
- Data converter: install/downloads_slug_converter.php for existing installations
- All admin controllers and templates updated to use slug URLs (no old ?id= or /files/{id}/ links remain)
.
chore(library): update changelog and clean up installer
.
feat(library): implement slug-based URLs
- Add slug columns to library_cats (unique parent+slug) and library_texts
- Add LibraryCategoryPathService and LibraryArticlePathService for path resolution
- Add LibrarySlugService for unique slug generation
- Add LibraryPathController as catch-all dispatcher (mirrors ForumPathController)
- Replace /library/section/{id} and /library/article/{id} routes with /library/{path}
- Update all controllers, templates, and LegacyRedirectHandler to use slug URLs
- Add install/library_slug_converter.php to regenerate slugs from names