mirror of https://github.com/pixelfed/pixelfed.git
98 lines
2.3 KiB
PHP
98 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Services;
|
|
|
|
use App\Models\Poll;
|
|
use App\Models\PollVote;
|
|
use App\Status;
|
|
use Illuminate\Support\Facades\Cache;
|
|
|
|
class PollService
|
|
{
|
|
const CACHE_KEY = 'pf:services:poll:status_id:';
|
|
|
|
public static function get($id, $profileId = false)
|
|
{
|
|
$key = self::CACHE_KEY . $id;
|
|
|
|
$res = Cache::remember($key, 1800, function() use($id) {
|
|
$poll = Poll::whereStatusId($id)->firstOrFail();
|
|
return [
|
|
'id' => (string) $poll->id,
|
|
'expires_at' => str_replace('+00:00', 'Z', $poll->expires_at->format(DATE_RFC3339_EXTENDED)),
|
|
'expired' => null,
|
|
'multiple' => $poll->multiple,
|
|
'votes_count' => $poll->votes_count,
|
|
'voters_count' => null,
|
|
'voted' => false,
|
|
'own_votes' => [],
|
|
'options' => collect($poll->poll_options)->map(function($option, $key) use($poll) {
|
|
$tally = $poll->cached_tallies && isset($poll->cached_tallies[$key]) ? $poll->cached_tallies[$key] : 0;
|
|
return [
|
|
'title' => $option,
|
|
'votes_count' => $tally
|
|
];
|
|
})->toArray(),
|
|
'emojis' => []
|
|
];
|
|
});
|
|
|
|
if($profileId) {
|
|
$res['voted'] = self::voted($id, $profileId);
|
|
$res['own_votes'] = self::ownVotes($id, $profileId);
|
|
}
|
|
|
|
return $res;
|
|
}
|
|
|
|
public static function getById($id, $pid)
|
|
{
|
|
$poll = Poll::findOrFail($id);
|
|
return self::get($poll->status_id, $pid);
|
|
}
|
|
|
|
public static function del($id)
|
|
{
|
|
Cache::forget(self::CACHE_KEY . $id);
|
|
}
|
|
|
|
public static function voted($id, $profileId = false)
|
|
{
|
|
return !$profileId ? false : PollVote::whereStatusId($id)
|
|
->whereProfileId($profileId)
|
|
->exists();
|
|
}
|
|
|
|
public static function votedStory($id, $profileId = false)
|
|
{
|
|
return !$profileId ? false : PollVote::whereStoryId($id)
|
|
->whereProfileId($profileId)
|
|
->exists();
|
|
}
|
|
|
|
public static function storyResults($sid)
|
|
{
|
|
$key = self::CACHE_KEY . 'story_poll_results:' . $sid;
|
|
return Cache::remember($key, 60, function() use($sid) {
|
|
return Poll::whereStoryId($sid)
|
|
->firstOrFail()
|
|
->cached_tallies;
|
|
});
|
|
}
|
|
|
|
public static function storyChoice($id, $profileId = false)
|
|
{
|
|
return !$profileId ? false : PollVote::whereStoryId($id)
|
|
->whereProfileId($profileId)
|
|
->pluck('choice')
|
|
->first();
|
|
}
|
|
|
|
public static function ownVotes($id, $profileId = false)
|
|
{
|
|
return !$profileId ? [] : PollVote::whereStatusId($id)
|
|
->whereProfileId($profileId)
|
|
->pluck('choice') ?? [];
|
|
}
|
|
}
|