diff --git a/app/Avatar.php b/app/Avatar.php index b7251076..76ca442b 100644 --- a/app/Avatar.php +++ b/app/Avatar.php @@ -15,4 +15,9 @@ class Avatar extends Model * @var array */ protected $dates = ['deleted_at']; + + public function profile() + { + return $this->belongsTo(Profile::class); + } } diff --git a/app/Console/Commands/FixDuplicateProfiles.php b/app/Console/Commands/FixDuplicateProfiles.php new file mode 100644 index 00000000..a9cab3ec --- /dev/null +++ b/app/Console/Commands/FixDuplicateProfiles.php @@ -0,0 +1,75 @@ +whereNotNull('user_id')->groupBy('user_id')->orderBy('user_id', 'desc')->get()->where('count', '>', 1); + $count = $profiles->count(); + if($count == 0) { + $this->info("No duplicate profiles found!"); + return; + } + $this->info("Found {$count} accounts with duplicate profiles..."); + $bar = $this->output->createProgressBar($count); + $bar->start(); + + foreach ($profiles as $profile) { + $dup = Profile::whereUserId($profile->user_id)->get(); + + if( + $dup->first()->username === $dup->last()->username && + $dup->last()->statuses()->count() == 0 && + $dup->last()->followers()->count() == 0 && + $dup->last()->likes()->count() == 0 && + $dup->last()->media()->count() == 0 + ) { + $dup->last()->avatar->forceDelete(); + $dup->last()->forceDelete(); + } + $bar->advance(); + } + $bar->finish(); + } +} diff --git a/app/Http/Controllers/AdminController.php b/app/Http/Controllers/AdminController.php index e2adf6bb..fa413998 100644 --- a/app/Http/Controllers/AdminController.php +++ b/app/Http/Controllers/AdminController.php @@ -26,6 +26,7 @@ use App\Http\Controllers\Admin\{ AdminSettingsController }; use App\Util\Lexer\PrettyNumber; +use Illuminate\Validation\Rule; class AdminController extends Controller { @@ -181,10 +182,47 @@ class AdminController extends Controller public function profiles(Request $request) { - $profiles = Profile::orderBy('id','desc')->paginate(10); + $this->validate($request, [ + 'search' => 'nullable|string|max:250', + 'filter' => [ + 'nullable', + 'string', + Rule::in(['id','username','statuses_count','followers_count','likes_count']) + ], + 'order' => [ + 'nullable', + 'string', + Rule::in(['asc','desc']) + ], + 'layout' => [ + 'nullable', + 'string', + Rule::in(['card','list']) + ], + 'limit' => 'nullable|integer|min:1|max:50' + ]); + $search = $request->input('search'); + $filter = $request->input('filter'); + $order = $request->input('order') ?? 'desc'; + $limit = $request->input('limit') ?? 12; + if($search) { + $profiles = Profile::where('username','like', "%$search%")->orderBy('id','desc')->paginate($limit); + } else if($filter && $order) { + $profiles = Profile::withCount(['likes','statuses','followers'])->orderBy($filter, $order)->paginate($limit); + } else { + $profiles = Profile::orderBy('id','desc')->paginate($limit); + } + return view('admin.profiles.home', compact('profiles')); } + public function profileShow(Request $request, $id) + { + $profile = Profile::findOrFail($id); + $user = $profile->user; + return view('admin.profiles.edit', compact('profile', 'user')); + } + public function appsHome(Request $request) { $filter = $request->input('filter'); diff --git a/app/Observers/AvatarObserver.php b/app/Observers/AvatarObserver.php new file mode 100644 index 00000000..cdc2faa1 --- /dev/null +++ b/app/Observers/AvatarObserver.php @@ -0,0 +1,75 @@ +media_path); + @unlink($path); + } + + /** + * Handle the avatar "restored" event. + * + * @param \App\Avatar $avatar + * @return void + */ + public function restored(Avatar $avatar) + { + // + } + + /** + * Handle the avatar "force deleted" event. + * + * @param \App\Avatar $avatar + * @return void + */ + public function forceDeleted(Avatar $avatar) + { + // + } +} diff --git a/app/Observer/UserObserver.php b/app/Observers/UserObserver.php similarity index 100% rename from app/Observer/UserObserver.php rename to app/Observers/UserObserver.php diff --git a/app/Providers/AppServiceProvider.php b/app/Providers/AppServiceProvider.php index dca968bb..fe6d8f99 100644 --- a/app/Providers/AppServiceProvider.php +++ b/app/Providers/AppServiceProvider.php @@ -2,10 +2,12 @@ namespace App\Providers; -use App\Observers\UserObserver; -use App\User; -use Auth; -use Horizon; +use App\Observers\{ + AvatarObserver, + UserObserver +}; +use App\{Avatar,User}; +use Auth, Horizon, URL; use Illuminate\Support\Facades\Blade; use Illuminate\Support\Facades\Schema; use Illuminate\Support\ServiceProvider; @@ -21,6 +23,7 @@ class AppServiceProvider extends ServiceProvider { Schema::defaultStringLength(191); + Avatar::observe(AvatarObserver::class); User::observe(UserObserver::class); Horizon::auth(function ($request) { @@ -43,17 +46,8 @@ class AppServiceProvider extends ServiceProvider }); Blade::directive('prettySize', function ($expression) { - $size = intval($expression); - $precision = 0; - $short = true; - $units = $short ? - ['B', 'k', 'M', 'G', 'T', 'P', 'E', 'Z', 'Y'] : - ['B', 'kB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB']; - for ($i = 0; ($size / 1024) > 0.9; $i++, $size /= 1024) { - } - $res = round($size, $precision).$units[$i]; - - return ""; + $size = \App\Util\Lexer\PrettyNumber::size($expression); + return ""; }); Blade::directive('maxFileSize', function () { diff --git a/resources/lang/en/passwords.php b/resources/lang/en/passwords.php index ffa19ba4..8975d113 100644 --- a/resources/lang/en/passwords.php +++ b/resources/lang/en/passwords.php @@ -15,8 +15,8 @@ return [ 'password' => 'Passwords must be at least six characters and match the confirmation.', 'reset' => 'Your password has been reset!', - 'sent' => 'We have e-mailed your password reset link!', + 'sent' => 'If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes. Please check your spam folder if you didn\'t receive this email.', 'token' => 'This password reset token is invalid.', - 'user' => "We can't find a user with that e-mail address.", + 'user' => 'If your email address exists in our database, you will receive a password recovery link at your email address in a few minutes. Please check your spam folder if you didn\'t receive this email.', ]; diff --git a/resources/views/admin/profiles/edit.blade.php b/resources/views/admin/profiles/edit.blade.php new file mode 100644 index 00000000..7d96dfe9 --- /dev/null +++ b/resources/views/admin/profiles/edit.blade.php @@ -0,0 +1,234 @@ +@extends('admin.partial.template-full') + +@section('section') +
+user id | +{{$user->id}} | +
---|---|
profile id | +{{$profile->id}} | +
username | ++ {{$profile->username}} + @if($user && $user->is_admin == true) + Admin + @endif + | +
display name | +{{$profile->name}} | +
joined | +{{$profile->created_at->format('M j Y')}} | +
+ {{$user->email}} + @if($user->email_verified_at) + Verified + @else + Unverified + @endif + | +
+ {{$profile->username}} +
++ {{$profile->emailUrl()}} +
++ Member Since: {{$profile->created_at->format('M Y')}} +
+{{$profile->statusCount()}}
+Posts
+{{$profile->followingCount()}}
+Following
+{{$profile->followerCount()}}
+Followers
+{{$profile->bookmarks()->count()}}
+Bookmarks
+{{$profile->likes()->count()}}
+Likes
+{{$profile->reports()->count()}}
+Reports Made
+{{PrettyNumber::size($profile->media()->sum('size'))}}
+Storage Used
+- CW - Remote Media - Images - Videos - Stories - Banned - Reported - Unlisted -
+
+
+
+
+ |
- ID - | -- Username + + ID + @if(request()->filter && request()->filter == 'id' && request()->order == 'asc') + + @else + + @endif + | - Statuses + + Username + @if(request()->filter && request()->filter == 'username' && request()->order == 'asc') + + @else + + @endif + | -- Storage + | + + Followers + @if(request()->filter && request()->filter == 'followers_count' && request()->order == 'asc') + + @else + + @endif + | -+ | + + Likes + @if(request()->filter && request()->filter == 'likes_count' && request()->order == 'asc') + + @else + + @endif + + | ++ + Statuses + @if(request()->filter && request()->filter == 'statuses_count' && request()->order == 'asc') + + @else + + @endif + + | ++ + Storage + + | +Actions |
---|---|---|---|---|---|---|---|---|---|---|
- {{$profile->id}} + |
+
+
+
+
|
+ + {{$profile->id}} + | ++ {{$profile->username}} + | ++ {{$profile->followers()->count()}} + | ++ {{$profile->likes()->count()}} + | ++ {{$profile->statuses()->count()}} + | +
+ {{$profile->media()->sum('size')}} bytes
+
+ |
+ + Edit + |