Commit Graph

90 Commits (9f2cf47e921a0eebd45af184cb09ca21bcb52118)

Author SHA1 Message Date
Your Name a424493420 Replace Str::of() fluent chains with static Str::/native calls
Aligns with the app's dominant convention (171 static Str:: calls vs
24 Str::of() chains). Uses Str::afterLast() for the repeated
"segment after last slash" pattern, Str::matchAll() where a
Collection return is needed, and native explode()/substr() where a
plain array/string suffices.

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2 weeks ago
Your Name 26d3e8bb8e Self-heal stale storage_used on upload/delete hot path
Make increaseStorageUsed/decrementStorageUsed recalculate from source when
the cached counter is older than STALE_AFTER_HOURS (168h) or never
calculated, so an affected user is corrected the next time they upload or
delete without waiting for the nightly reconciler. Callers save/delete the
media row before calling these, so the from-source recalc already reflects
the change and the incremental delta is skipped on the recalc path.

- Add UserStorageService::STALE_AFTER_HOURS and isStale() helper (no extra
  query: reads the already-loaded model), with defensive Carbon parsing
- Cast users.storage_used_updated_at to datetime so freshness comparisons
  work on a Carbon instance
- Add tests for stale/fresh/never-calculated increase and decrement paths
2 weeks ago
Shlee c86a82b857
Merge pull request #7059 from pixelfed/chore/convert-string-refs-to-class
Laravel 13 Prep: Convert string class references to ::class
2 weeks ago
Your Name 042ab0a6e4 Convert optional() to nullsafe operator
Applies patch 2/21 from pixelfed-staging PR #9: replaces optional($x)->y
with $x?->y across 16 files. Pint-clean.
3 weeks ago
Your Name 6d8ad3885a Convert string class references to ::class
Applies the ::class conversion from pixelfed-staging PR #9 (patch 1/21),
formatted with Pint (short imported ::class form). Excludes the
ModelNamespaceMigrationTest namespace assertions, which intentionally
compare against literal namespace strings.
3 weeks ago
Your Name e4e12fad7c Extract duplicated blocked-id and duplicate-shortcode query patterns
Two query patterns were copy-pasted across several call sites:

- The 'users who blocked me, plus myself' list used to filter profile
  search (UserFilter::whereFilterableId($pid)->pluck('user_id')->push($pid))
  appeared in ComposeController (x2) and DirectMessageController. Extracted
  to UserFilterService::searchExcludedProfileIds(). Note this is the
  inverse of blocks() (who I blocked), so it is a distinct method.

- CustomEmoji duplicate detection (groupBy('shortcode')->havingRaw(
  'count(*) > 1')) appeared three times in AdminController. Extracted to a
  CustomEmoji::duplicateShortcodes() query scope.

Adds tests for both. No behaviour change.
3 weeks ago
Daniel Supernault 5468eaeb56
Update ASF 3 weeks ago
Your Name 40b323bca4 revert: remove emoji local-to-cloud storage changes
Back out all emoji cloud-storage work from staging so it can be reworked and
re-landed separately (the URL resolution flips to cloud on a global config
flag, which created a broken-URL window, and the migration approach needs
revisiting).

Reverts to pre-emoji state:
- CustomEmoji model URL/storage helpers (urlForPath, storageTarget, storeMedia,
  storeMediaFromFile, deleteMedia, url) and callers in ImportEmojis,
  CustomEmojiService, AdminController
- admin custom-emoji blade views back to local /storage URLs
- Remove admin:EmojiMoveStorageLocalToCloud command
- Remove the deploy migration and its scheduler entry

Media (and the already-reverted story) scheduler entries are untouched.
4 weeks ago
Your Name fa76e1014a feat: store custom emoji on cloud storage when enabled
Custom emoji were always written locally and served via hardcoded /storage
URLs, so they never used S3 even on cloud instances.

- CustomEmoji: centralize URL + storage on the active disk (cloud when
  pixelfed.cloud_storage is enabled, else local public/ disk) via
  urlForPath/url/storageTarget/storeMedia/storeMediaFromFile/deleteMedia
- Route emoji writes/deletes and URL generation (scan, CustomEmojiService::all)
  through those helpers in ImportEmojis, CustomEmojiService::import and
  AdminController
- Add admin:EmojiMoveStorageLocalToCloud to migrate existing local emoji to
  cloud: copy, verify by size, delete local, bust caches
- Schedule it daily when cloud storage is enabled
4 weeks ago
Your Name 878775cab9 chore: resolve psalm issues in admin commands and auth
- Add return type hints (void) and final class markers
- Guard null returns from newestBackup() and putFileAs() in BackupToCloud
- Type ask() default values as strings
- Fix uses_left fallback condition for null/zero max_uses
- Annotate AdminInvite::whereInviteCode and cast Str::uuid() to string
- Ignore local redis-data and mysql-9-data dev directories
4 weeks ago
Shlee 1ba3f8c9cf
Merge pull request #6928 from pixelfed/feature/user-status-command
Require --scope (local/remote/both) for admin:fixProfileCounts --all
4 weeks ago
Your Name bcd5a5bd7b Require --scope (local/remote/both) for admin:fixProfileCounts --all
Bulk --all reconciliation previously scanned both local and remote profiles
implicitly. Now --all requires an explicit --scope of local, remote, or
both. --active stays local-only and rejects a non-local --scope. Adds the
BelongsTo return type to Profile::user() so the whereHas('user') scope
filter passes Larastan, and adds tests for scope requirement/validation and
local/remote filtering.
4 weeks ago
Your Name f0e951dcce fix: stop caching raw Eloquent models to prevent incomplete-object 500s
Caching an Eloquent model in a Cache::remember closure could deserialize
into a __PHP_Incomplete_Class on read, throwing 'attempt to access a
property on an incomplete object' and returning a 500. This surfaced on
guest profile pages (ProfileController::buildProfile reading
$user->user->settings) and affected several other latent call sites.

Changes:
- ProfileController: cache a plain settings array instead of the
  UserSetting model; fall back to defaults when the settings row is missing
- StoryService::getById: fetch a live model instead of caching it
- InstanceService::getByDomain, CustomEmoji::scan: cache arrays
- Site/MobileController: cache Page data as an array via a shared
  ManagesCachedPages trait; update blade views to array access
- Add public-route smoke/regression tests covering the cache-read path
4 weeks ago
Your Name e7b70c6084 refactor: extract duplicate patterns into shared methods
1. Add FractalService with static item() and collection() helpers
   replacing 22 call sites that repeated the 4-line Fractal Manager
   + ArraySerializer boilerplate.

2. Add AccountInterstitial::createFromStatus() factory method
   consolidating 4 identical 15-line blocks that create interstitials
   with status metadata.

3. Add NotificationService::createNotification() to handle the
   repeated pattern of creating, caching, and registering a
   notification in the recipient's feed.

4. Add NotificationService::firstOrCreateNotification() for
   idempotent notifications (share/boost, mention) that should
   only notify once per actor+action+item combination.
4 weeks ago
Your Name c0cde2f682 refactor: move 52 legacy models from App\ to App\Models\
Move all Eloquent models from the app/ root directory to app/Models/
for consistency with modern Laravel conventions. The project already had
54 models in App\Models; this migrates the remaining 52 legacy models.

Changes:
- Move 52 model files from app/ to app/Models/
- Update namespace declarations in each model
- Update all ~1000 import references across the codebase
- Add Relation::morphMap() in AppServiceProvider for backward
  compatibility with existing polymorphic database records
- Add missing HasSnowflakePrimary imports for models that relied
  on same-namespace resolution
4 weeks ago
Daniel Supernault 33dce75f2c
Pint app/ 4 weeks ago
Your Name 570a30d037 refactor: replace $fillable with $guarded = [] across all models
Aligns all models with the project convention (see .ai/rules/models.md).
Model::shouldBeStrict() in non-production will catch any issues early.
4 weeks ago
Your Name c891f34df6 polish 4 weeks ago
Your Name f2159197e8 fix: add return type declarations to Eloquent relation methods
Larastan 3.x requires explicit return types on relation methods to
verify relation existence when using with(), has(), etc. This adds
the appropriate return type declarations to all relation methods
flagged by the larastan.relationExistence rule.

Models fixed:
- Profile (avatar, statuses)
- User (profile)
- Status (profile, media, hashtags)
- DirectMessage (status, author, recipient)
- Report (reporter, status, reportedUser)
- Like (actor, status)
- Media (status)
- Notification (item)
- HashtagFollow (hashtag)
- OauthClient (user)
- Story (profile)
- StatusHashtag (status, hashtag, profile, media)
- AccountInterstitial (user)
- Hashtag (posts)
- CustomFilter (keywords)
- CustomFilterKeyword (customFilter)
- AdminShadowFilter (profile)
- ImportPost (status)
4 weeks ago
Your Name 7c964f3b4f fix: replace backslash-prefixed facade calls with imported references
Replace \Cache::, \Log::, \DB:: calls with their imported facade
equivalents. The backslash-prefix relies on global aliases which
PHPStan cannot resolve, causing class.notFound errors.
4 weeks ago
Your Name e7ba43e2e1 fix: add missing use imports to resolve phpstan class.notFound errors
Add missing imports for Log, Cache, DB, FollowerService, StatusService,
LikeService, ReblogService, UserFilterService, AdminProfile, OauthClient,
and fix StatusTimelineTransformer reference (class didn't exist, replaced
with StatusTransformer).
4 weeks ago
Your Name c807a8524c refactor: replace short facade aliases with fully-qualified imports
Convert all 273 short facade alias imports (e.g. 'use Cache;') to their
fully-qualified class names (e.g. 'use Illuminate\Support\Facades\Cache;')
across 193 files.

This resolves 643 PHPStan 'class.notFound' errors caused by the static
analyzer being unable to resolve global aliases, and aligns with modern
Laravel conventions. It also unblocks removing the aliases array from
config/app.php in a future change.

All 107 tests pass.
4 weeks ago
Your Name 98267eb26f refactor: replace deprecated str_random() with Str::random()
str_random() is a deprecated helper from laravel/helpers that was
missed in the initial helpers removal. Replace all 18 call sites
with the modern Str::random() equivalent.
4 weeks ago
Shift 19880c2ffb
Convert string references to `::class`
PHP 5.5.9 adds the new static `class` property which provides the fully qualified class name. This is preferred over using strings for class names since the `class` property references are checked by PHP.
4 weeks ago
dansup c6b32882e0
Merge pull request #6483 from pixelfed/q2
Refactor: Updated Laravel casts to modern format
6 months ago
Daniel Supernault ef803ae9b6
Fix oauth/token 6 months ago
Your Name 2f06f30508 fix 7 months ago
Daniel Supernault 53742fa699
Lint 9 months ago
dansup 9d4fe07c29
Merge pull request #6333 from shleeable/clean2
Larastan: Add @property - Mergable
10 months ago
Your Name 4b14819923 Larastan: Add @property 10 months ago
Your Name 45a9a3b472 RemoveUnreachableStatementRector 11 months ago
dansup 225e835015
Staging (#6264)
* StatusPipeline defensive checks

* HomeFeedPipeline defensive checks

* DeletePipeline defensive checks

* InboxPipeline defensive checks

* MediaPipeline defensive checks

* PushNotificationPipeline defensive checks

* LikePipeline defensive checks

* FollowPipeline defensive checks

* ImageOptimizePipeline defensive checks

* Misc pipelines defensive checks

* Update CommentPipeline.php

* Update FollowPushNotifyPipeline.php

* Update LikePushNotifyPipeline.php

* Update FollowPushNotifyPipeline.php

* Update MentionPushNotifyPipeline.php

* Update MoveSendUndoFollowPipeline.php

* Update RemoteFollowPipeline.php

* Update FollowPushNotifyPipeline.php

* Update LikePushNotifyPipeline.php

* Update MentionPushNotifyPipeline.php

* Update Site/Config.php - config_cache only has 1 arg. No fallback.

* Update Bouncer.php - Called 'count' on Laravel collection, but could have been retrieved as a query.            🪪  larastan.noUnnecessaryCollectionCall

* Update Status.php - Missing use App\Models\Conversation;

* Larastan: Update UndoSharePipeline.php (Undefined variable: $status)

* Update ResilientMediaStorageService.php

* Update ImageS3UploadPipeline.php

* Larastan: Update Profile.php missing "use App\Avatar;"

* Larastan: Update MediaStorageService.php

* Larastan: Update MediaPathService.php

* Update MediaPathService.php

* Update MediaStorageService.php

* Update ImageS3UploadPipeline.php

* Larastan: Update AddUserDomainBlock.php

```
 ------ ------------------------------------------------------------- 
  Line   Console/Commands/AddUserDomainBlock.php                      
 ------ ------------------------------------------------------------- 
  37     Variable $domain in empty() always exists and is not falsy.  
         🪪  empty.variable                                           
 ------ ------------------------------------------------------------- 
```

* Larastan: Update CatchUnoptimizedMedia.php

```
 ------ ------------------------------------------------------------------------------------------------- 
  Line   Console/Commands/CatchUnoptimizedMedia.php                                                       
 ------ ------------------------------------------------------------------------------------------------- 
  31     Constructor of class App\Console\Commands\CatchUnoptimizedMedia has an unused parameter $media.  
         🪪  constructor.unusedParameter                                                                  
 ------ ------------------------------------------------------------------------------------------------- 
```

* Update DeleteUserDomainBlock.php

* Update StatusHashtag.php

* Update FixLikes.php

* Update User.php

* Update Installer.php

* Update SeedFollows.php

* Update DiscoverCategory.php

* Update FollowRequest.php

* Update Follower.php

* Update AccountController.php

* Update CustomFilterKeyword.php

* Update FederationController.php

* Update Inbox.php

* Update HttpSignature.php

---------

Co-authored-by: Your Name <you@example.com>
Co-authored-by: Shlee <github@shl.ee>
11 months ago
Shlee cc9bab1171
Update CustomFilterKeyword.php 11 months ago
Ross Bearman db03733415 Add admin invite interface and email support
This commit does two things:

* Add invite email support to AdminInviteCommand
  - Moves `invite_code` generation to AdminInvite model `creating` event
* Add admin invite management section under admin users dashboard
  - Adds `Admin/AdminUserInviteController` and associated `home` and
    `create` Blade templates.
  - Adds "Invites" button to admin user dashboard
1 year ago
Gavin Mogan 441c8e0d4c Generic OIDC Support
* Everything should be configurable by env variables
* Basic request tests
1 year ago
Daniel Supernault 77044ba193
Update CustomFilter model, add custom limits for max_content_scan_limit, max_filters_per_user, max_keywords_per_filter, max_keyword_length, max_pattern_length, max_reported_matches, max_create_per_hour, max_updates_per_hour so admins have more control over this feature 1 year ago
Daniel Supernault 578718c606
Update CustomFilterKeyword model, add setKeywordAttribute method 1 year ago
Daniel Supernault b86102823b
Update CustomFilter model and CustomFilterController 1 year ago
Daniel Supernault 3ff54b9ea6
Updaet CustomFilter model 1 year ago
Daniel Supernault 437d742ac4
Add custom filters
Add custom filters, compatible with Mastodon `/api/v2/filters`

Todo:
- [ ] fix routes
- [ ] finish other context filtering
1 year ago
Daniel Supernault 604746bd5e
Add AppRegister 2 years ago
Daniel Supernault bcf99d637f
Add ModeratedProfile model 2 years ago
Daniel Supernault 3d6b9badf4
Add groups models, controllers and services 2 years ago
Daniel Supernault 481314cd23
Update custom emoji, add config_cache support 3 years ago
Daniel Supernault 3f0539978e
Update ProfileMigration model, add target relation 3 years ago
Daniel Supernault f8145a78cf
Add Profile Migrations 3 years ago
Daniel Supernault 071163b47b
Add Curated Onboarding Templates 3 years ago
Daniel Supernault 2b5d723582
Update Curated Onboarding dashboard, improve application filtering and make it easier to distinguish response state 3 years ago
Daniel Supernault 8dac2caf1d
Add Curated Onboarding 3 years ago
Daniel Supernault 67c650b195
Add forgot email feature 3 years ago