You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
pixelfed/app/Http/Controllers/Groups/GroupsTopicController.php

130 lines
4.4 KiB
PHTML

<?php
namespace App\Http\Controllers\Groups;
use App\Http\Controllers\Controller;
use App\Models\Group;
use App\Models\GroupHashtag;
use App\Models\GroupPost;
9 months ago
use App\Models\GroupPostHashtag;
use App\Services\Groups\GroupPostService;
use App\Services\Groups\GroupsLikeService;
use Illuminate\Contracts\View\View;
use Illuminate\Http\JsonResponse;
9 months ago
use Illuminate\Http\Request;
class GroupsTopicController extends Controller
{
public function __construct()
{
$this->middleware('auth');
}
public function groupTopics(Request $request): JsonResponse
{
$this->validate($request, [
'gid' => 'required',
]);
9 months ago
abort_if(! $request->user(), 404);
$pid = $request->user()->profile_id;
$gid = $request->input('gid');
$group = Group::findOrFail($gid);
9 months ago
abort_if(! $group->isMember($pid), 403, 'Not a member of group.');
$posts = GroupPostHashtag::join('group_hashtags', 'group_hashtags.id', '=', 'group_post_hashtags.hashtag_id')
->selectRaw('group_hashtags.*, group_post_hashtags.*, count(group_post_hashtags.hashtag_id) as ht_count')
->where('group_post_hashtags.group_id', $gid)
->orderByDesc('ht_count')
->limit(10)
->pluck('group_post_hashtags.hashtag_id', 'ht_count')
9 months ago
->map(function ($id, $key) use ($gid) {
$tag = GroupHashtag::find($id);
9 months ago
return [
'hid' => $id,
'name' => $tag->name,
'url' => url("/groups/{$gid}/topics/{$tag->slug}"),
9 months ago
'count' => $key,
];
})->values();
9 months ago
return response()->json($posts, 200, [], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
}
public function groupTopicTag(Request $request)
{
$this->validate($request, [
'gid' => 'required',
9 months ago
'name' => 'required',
]);
9 months ago
abort_if(! $request->user(), 404);
$pid = $request->user()->profile_id;
$gid = $request->input('gid');
$limit = $request->input('limit', 3);
$group = Group::findOrFail($gid);
9 months ago
abort_if(! $group->isMember($pid), 403, 'Not a member of group.');
$name = $request->input('name');
$hashtag = GroupHashtag::whereName($name)->first();
9 months ago
if (! $hashtag) {
return [];
}
// $posts = GroupPost::whereGroupId($gid)
// ->select('status_hashtags.*', 'group_posts.*')
// ->where('status_hashtags.hashtag_id', $hashtag->id)
// ->join('status_hashtags', 'group_posts.status_id', '=', 'status_hashtags.status_id')
// ->orderByDesc('group_posts.status_id')
// ->simplePaginate($limit)
// ->map(function($gp) use($pid) {
// $status = StatusService::get($gp['status_id'], false);
// if(!$status) {
// return false;
// }
// $status['favourited'] = (bool) LikeService::liked($pid, $gp['status_id']);
// $status['favourites_count'] = LikeService::count($gp['status_id']);
// $status['pf_type'] = $gp['type'];
// $status['visibility'] = 'public';
// $status['url'] = $gp->url();
// return $status;
// });
$posts = GroupPostHashtag::whereGroupId($gid)
->whereHashtagId($hashtag->id)
->orderByDesc('id')
->simplePaginate($limit)
->map(function (array $gp) use ($pid) {
$status = GroupPostService::get($gp['group_id'], $gp['status_id']);
9 months ago
if (! $status) {
return false;
}
$status['favourited'] = (bool) GroupsLikeService::liked($pid, $gp['status_id']);
$status['favourites_count'] = GroupsLikeService::count($gp['status_id']);
$status['visibility'] = 'public';
9 months ago
return $status;
});
9 months ago
return response()->json($posts, 200, [], JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES);
}
public function showTopicFeed(Request $request, $gid, $tag): View
{
9 months ago
abort_if(! $request->user(), 404);
$pid = $request->user()->profile_id;
$group = Group::findOrFail($gid);
$gid = $group->id;
9 months ago
abort_if(! $group->isMember($pid), 403, 'Not a member of group.');
6 days ago
return view('groups.topic-feed', ['gid' => $gid, 'tag' => $tag]);
}
}