1
0
Fork 0
mirror of https://github.com/YunoHost-Apps/pixelfed_ynh.git synced 2024-09-03 20:06:04 +02:00

Update CollectionController, fixes #3289

This commit is contained in:
Daniel Supernault 2022-03-08 20:57:18 -07:00
parent aba0c97cee
commit c7e1e473ca
No known key found for this signature in database
GPG key ID: 0DEF1C662C9033F7

View file

@ -17,6 +17,8 @@ use App\Transformer\Api\{
}; };
use League\Fractal\Serializer\ArraySerializer; use League\Fractal\Serializer\ArraySerializer;
use League\Fractal\Pagination\IlluminatePaginatorAdapter; use League\Fractal\Pagination\IlluminatePaginatorAdapter;
use App\Services\CollectionService;
use App\Services\FollowerService;
use App\Services\StatusService; use App\Services\StatusService;
class CollectionController extends Controller class CollectionController extends Controller
@ -30,16 +32,23 @@ class CollectionController extends Controller
'profile_id' => $profile->id, 'profile_id' => $profile->id,
'published_at' => null 'published_at' => null
]); ]);
$collection->visibility = 'draft';
$collection->save();
return view('collection.create', compact('collection')); return view('collection.create', compact('collection'));
} }
public function show(Request $request, int $id) public function show(Request $request, int $id)
{ {
$user = $request->user(); $user = $request->user();
$collection = Collection::findOrFail($id); $collection = CollectionService::getCollection($id);
if($collection->published_at == null || $collection->visibility != 'public') { abort_if(!$collection, 404);
if(!$user || $user->profile_id != $collection->profile_id) { if($collection['published_at'] == null || $collection['visibility'] != 'public') {
abort_unless($user && $user->is_admin, 404); abort_if(!$user, 404);
if($user->profile_id != $collection['pid']) {
if(!$user->is_admin) {
abort_if($collection['visibility'] != 'private', 404);
abort_if(!FollowerService::follows($user->profile_id, $collection['pid']), 404);
}
} }
} }
return view('collection.show', compact('collection')); return view('collection.show', compact('collection'));
@ -57,7 +66,7 @@ class CollectionController extends Controller
$this->validate($request, [ $this->validate($request, [
'title' => 'nullable', 'title' => 'nullable',
'description' => 'nullable', 'description' => 'nullable',
'visibility' => 'nullable|string|in:public,private' 'visibility' => 'nullable|string|in:public,private,draft'
]); ]);
$profile = Auth::user()->profile; $profile = Auth::user()->profile;
@ -67,7 +76,7 @@ class CollectionController extends Controller
$collection->visibility = e($request->input('visibility')); $collection->visibility = e($request->input('visibility'));
$collection->save(); $collection->save();
return 200; return CollectionService::setCollection($collection->id, $collection);
} }
public function publish(Request $request, int $id) public function publish(Request $request, int $id)
@ -76,7 +85,7 @@ class CollectionController extends Controller
$this->validate($request, [ $this->validate($request, [
'title' => 'nullable', 'title' => 'nullable',
'description' => 'nullable', 'description' => 'nullable',
'visibility' => 'required|alpha|in:public,private' 'visibility' => 'required|alpha|in:public,private,draft'
]); ]);
$profile = Auth::user()->profile; $profile = Auth::user()->profile;
$collection = Collection::whereProfileId($profile->id)->findOrFail($id); $collection = Collection::whereProfileId($profile->id)->findOrFail($id);
@ -88,8 +97,7 @@ class CollectionController extends Controller
$collection->visibility = e($request->input('visibility')); $collection->visibility = e($request->input('visibility'));
$collection->published_at = now(); $collection->published_at = now();
$collection->save(); $collection->save();
return CollectionService::setCollection($collection->id, $collection);
return $collection->url();
} }
public function delete(Request $request, int $id) public function delete(Request $request, int $id)
@ -105,6 +113,8 @@ class CollectionController extends Controller
return 200; return 200;
} }
CollectionService::deleteCollection($id);
return redirect('/'); return redirect('/');
} }
@ -139,82 +149,98 @@ class CollectionController extends Controller
'order' => $count, 'order' => $count,
]); ]);
return 200; CollectionService::addItem(
$collection->id,
$status->id,
$count
);
return StatusService::get($status->id);
} }
public function get(Request $request, $id) public function getCollection(Request $request, $id)
{ {
$user = $request->user(); $user = $request->user();
$collection = Collection::findOrFail($id); $collection = CollectionService::getCollection($id);
if($collection->published_at == null || $collection->visibility != 'public') { if($collection['published_at'] == null || $collection['visibility'] != 'public') {
if(!$user || $user->profile_id != $collection->profile_id) { abort_unless($user, 404);
abort_unless($user && $user->is_admin, 404); if($user->profile_id != $collection['pid']) {
if(!$user->is_admin) {
abort_if($collection['visibility'] != 'private', 404);
abort_if(!FollowerService::follows($user->profile_id, $collection['pid']), 404);
}
} }
} }
return [ return $collection;
'id' => (string) $collection->id,
'visibility' => $collection->visibility,
'title' => $collection->title,
'description' => $collection->description,
'thumb' => $collection->posts()->first()->thumb(),
'url' => $collection->url(),
'post_count' => $collection->posts()->count(),
'published_at' => $collection->published_at
];
} }
public function getItems(Request $request, int $id) public function getItems(Request $request, int $id)
{ {
$collection = Collection::findOrFail($id); $user = $request->user();
if($collection->visibility !== 'public') { $collection = CollectionService::getCollection($id);
abort_if(!Auth::check() || Auth::user()->profile_id != $collection->profile_id, 404); if($collection['published_at'] == null || $collection['visibility'] != 'public') {
abort_unless($user, 404);
if($user->profile_id != $collection['pid']) {
if(!$user->is_admin) {
abort_if($collection['visibility'] != 'private', 404);
abort_if(!FollowerService::follows($user->profile_id, $collection['pid']), 404);
} }
}
}
$page = $request->input('page') ?? 1;
$start = $page == 1 ? 0 : ($page * 10 - 10);
$end = $start + 10;
$items = CollectionService::getItems($id, $start, $end);
$res = CollectionItem::whereCollectionId($id) return collect($items)
->pluck('object_id')
->map(function($id) { ->map(function($id) {
return StatusService::get($id); return StatusService::get($id);
}) })
->filter(function($post) { ->filter(function($item) {
return $post && isset($post['account']); return $item && isset($item['account'], $item['media_attachments']);
}) })
->values(); ->values();
return response()->json($res);
} }
public function getUserCollections(Request $request, int $id) public function getUserCollections(Request $request, int $id)
{ {
$user = $request->user(); $user = $request->user();
$pid = $user ? $user->profile_id : null; $pid = $user ? $user->profile_id : null;
$follows = false;
$visibility = ['public'];
$profile = Profile::whereNull('status') $profile = Profile::whereNull('status')
->whereNull('domain') ->whereNull('domain')
->findOrFail($id); ->findOrFail($id);
if($profile->is_private) { if($pid) {
abort_if(!$pid, 404); $follows = FollowerService::follows($pid, $profile->id);
abort_if(!$profile->id != $pid, 404);
} }
$visibility = $pid == $profile->id ? ['public', 'private'] : ['public']; if($profile->is_private) {
abort_if(!$pid, 404);
if(!$user->is_admin) {
abort_if($profile->id != $pid && $follows == false, 404);
}
}
$owner = $pid ? $pid == $profile->id : false;
if($follows) {
$visibility = ['public', 'private'];
}
if($pid && $pid == $profile->id) {
$visibility = ['public', 'private', 'draft'];
}
return Collection::whereProfileId($profile->id) return Collection::whereProfileId($profile->id)
->whereIn('visibility', $visibility) ->whereIn('visibility', $visibility)
->orderByDesc('id') ->orderByDesc('id')
->paginate(9) ->paginate(9)
->map(function($collection) { ->map(function($collection) {
return [ return CollectionService::getCollection($collection->id);
'id' => (string) $collection->id,
'visibility' => $collection->visibility,
'title' => $collection->title,
'description' => $collection->description,
'thumb' => $collection->posts()->first()->thumb(),
'url' => $collection->url(),
'post_count' => $collection->posts()->count(),
'published_at' => $collection->published_at
];
}); });
} }
@ -240,6 +266,11 @@ class CollectionController extends Controller
->whereIn('type', ['photo', 'photo:album', 'video']) ->whereIn('type', ['photo', 'photo:album', 'video'])
->findOrFail($postId); ->findOrFail($postId);
CollectionService::removeItem(
$collection->id,
$status->id
);
$item = CollectionItem::whereCollectionId($collection->id) $item = CollectionItem::whereCollectionId($collection->id)
->whereObjectType('App\Status') ->whereObjectType('App\Status')
->whereObjectId($status->id) ->whereObjectId($status->id)