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

.
refactor(profile): migrate IP history page to new architecture
- New /profile/{id}/ip-history route (profile.ip-history) with IpHistoryController + GetIpHistoryUseCase + IpHistoryDTO
- Add IpHistoryRepository with Laravel pagination
- Access guard (admin or owner) in the use case via ProfileAccessForbiddenException (HTTP 403)
- Meaningful breadcrumbs: profile owner -> IP History
- Update ip_history_url link in profile view
- Remove legacy includes/ip.php and ip from dispatcher
.
refactor(profile): migrate profile view page to new architecture
- New /profile/{id} route (profile.view) with ProfileController + GetProfileViewUseCase + ProfileViewDTO
- Add KarmaRepository; reuse mail ContactRepository for contact/ignore state
- Move karma, ban, buttons, notifications logic into the use case
- Change core profile_url accessor to /profile/{id}
- Update all profile-view links across admin, album, downloads, forum, library, mail, system
- Absolutize profile action links to the legacy /profile/?act= catch-all
- Remove legacy includes/index.php, templates/index.phtml, is_contact() and index from dispatcher
.
docs(refactoring): clarify on-demand directories and find/get naming
- Create src/ subdirectories on demand; only the three top-level folders upfront
- Add find* vs get* repository method naming convention (?Entity -> find*)
.
refactor(profile): scaffold src/ and migrate statistics page
- Add PSR-4 autoload (Johncms\Modules\Profile\) and config/services.php
- Move Installer to src/Install/ with new namespace
- New /profile/{id}/statistics route (profile.statistics) behind AuthorizedUserMiddleware
- StatisticsController + GetProfileStatisticsUseCase + ProfileUserRepository + ProfileNotFoundException
- Add statistics.phtml template; fix double-escaping of title and breadcrumbs
- Remove legacy includes/stat.php, templates/stat.phtml and stat from index.php dispatcher
- Update statistics links in office.phtml and index.phtml
.
refactor(mail): unify navigation, breadcrumbs and section tabs
- redirect /mail to /mail/incoming, move contacts to /mail/contacts
- use a single breadcrumb root (My Account > Mail) across all pages
- show interlocutor name in conversation breadcrumbs and title
- add shared section tabs (mail::nav) styled like the online module
- fix stale mail links in profile, office and notifications
.
fix(mail): avoid ONLY_FULL_GROUP_BY error in conversation queries
Drop the users join from the grouped conversation queries and select only the counterpart id and last message time. User models are loaded separately afterwards, so joining users only to select u.* broke ONLY_FULL_GROUP_BY on MariaDB.
.
fix(mail): use Capsule instead of unbound DB facade in conversation queries
.
refactor(profile): move office mailbox counters to mail repositories
Replace raw SQL counter queries in the office page with dedicated count methods on MailMessage and Contact repositories (countInbox, countNewInbox, countOutbox, countNewOutbox, countAttachedFiles, countBlocked).
.
fix(profile): update office page mail links to current routes
.
fix(mail): correct blocklist flow and message counter
- align block/unblock route params with controller signatures (userId)
- use is_online property and tools->displayDate in blocklist template
- update legacy /mail/?act=ignor links to /mail/blocklist, /mail/block, /mail/unblock
- toggle profile block/unblock button by actual block state, not can_write
- drop duplicate JS confirm on contact delete
- fix message count query grouping so soft-deleted messages are excluded