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

.
refactor(profile): migrate email confirmation page to new architecture
Move the confirm_new_email action from the legacy includes/ dispatcher to a
dedicated controller and use case under the new module architecture.

- Add ConfirmNewEmailController and ConfirmNewEmailUseCase
- Add confirmNewEmail() to ProfileUserRepository(Interface)
- Register public route GET /profile/confirm-email/{id:number}/{code}
(profile.confirm-email), outside the auth group: the link is opened from
an email and the confirmation code is the access boundary
- Simplify confirm_new_email.phtml to a bool $confirmed flag
- Update the confirmation link generated in includes/edit.php
- Remove legacy includes/confirm_new_email.php and drop it from $mods
.
refactor(profile): migrate guestbook page to new architecture
Migrate the legacy profile guestbook to GuestbookController served at
/profile/{id}/guestbook (GET and POST for reply/edit/delete forms).

- Wrap the legacy Johncms\Comments component via output buffering, the
same pattern as downloads FileCommentsController
- Use a clean path script without sub_id_name (Comments::buildUrl adds the
separator); owner can delete and reply
- GetGuestbookContextUseCase loads the profile with the visibility guard
- MarkGuestbookReadUseCase resets comm_old when the owner views their own
guestbook outside of a mod action; add ProfileUserRepository::markGuestbookSeen
- Update act=guestbook links in account/view templates and the
notifications use case to /profile/{id}/guestbook
- Remove legacy includes/guestbook.php and drop 'guestbook' from index.php
.
refactor(profile): migrate account page to new architecture
Migrate the legacy office personal account page to AccountController served
at /profile/account (owner-only, no id — always the current user).

- GetAccountUseCase aggregates account counters into AccountDTO
- AlbumPhotoRepositoryInterface + EloquentAlbumPhotoRepository count the
user's album photos (album module has no models yet, so Capsule::table)
- Reuse mail MailMessageRepositoryInterface and ContactRepositoryInterface
for mailbox and contact counters
- Rename office.phtml to account.phtml and drive it from the DTO
- Update every act=office link across mail, login, admin, themes and the
legacy profile settings templates to /profile/account
- Remove legacy includes/office.php and drop 'office' from index.php
.
refactor(profile): migrate activity page to new architecture
Add ActivityController with messages/topics/comments sub-modes served at
/profile/{id}/activity, /activity/topics and /activity/comments.

- GetActivityUseCase loads the profile, selects the data source by
ActivityType and maps rows for templates
- ProfileActivityRepositoryInterface + EloquentProfileActivityRepository
paginate forum messages, forum topics and guestbook entries using
eager-loaded forum models (topic.section.parentSection)
- ForumActivityPreviewService builds short plain-text post previews
- ActivityDTO and ActivityType enum
- Reuse ForumTopicPathService and GuestbookEntry::post_text
- Update view/statistics links, remove legacy includes/activity.php and
drop 'activity' from the index.php dispatcher
.
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.