use App\Models\EpisodeCrew;
use App\Models\User;
use Carbon\Carbon;
+use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
$episodes = Episode::with(['channels', 'event', 'players', 'players.user'])
->select('episodes.*')
->join('events', 'episodes.event_id', '=', 'events.id')
- ->where('episodes.confirmed', '=', true)
->where('events.visible', '=', true)
->orderBy('episodes.start', $reverse ? 'DESC' : 'ASC')
->limit(1000);
if (isset($validatedData['before'])) {
$episodes = $episodes->where('episodes.start', '<=', $validatedData['before']);
}
+ $privIDs = $this->getUserPrivilegedEvents($request);
+ if (!empty($privIDs)) {
+ $episodes->where(function (Builder $query) use ($privIDs) {
+ $query->where('episodes.confirmed', '=', true);
+ $query->orWhereIn('episodes.event_id', $privIDs);
+ });
+ } else {
+ $episodes->where('episodes.confirmed', '=', true);
+ }
if (!empty($validatedData['event'])) {
if (isset($validatedData['eventInvert']) && $validatedData['eventInvert']) {
- $episodes = $episodes->whereNotIn('episodes.event_id', $validatedData['event']);
+ $episodes->whereNotIn('episodes.event_id', $validatedData['event']);
+ $episodes->where('events.visible', '=', true);
} else {
$episodes = $episodes->whereIn('episodes.event_id', $validatedData['event']);
}
+ } else {
+ $episodes->where('events.visible', '=', true);
}
if (!empty($validatedData['game'])) {
if (isset($validatedData['gameInvert']) && $validatedData['gameInvert']) {
return $episode->toJson();
}
+ private function getUserPrivilegedEvents(Request $request): array {
+ if (!$request->user()) {
+ return [];
+ }
+ return $request->user()->event_crews()
+ ->where('role', '=', 'admin')
+ ->pluck('event_id')
+ ->toArray();
+ }
+
private function validateEpisode(Request $request) {
return $request->validate([
'comment' => 'string',
if (isActive(episode)) {
classNames.push('is-active');
}
+ if (!episode.confirmed) {
+ classNames.push('is-unconfirmed');
+ }
const style = React.useMemo(() => {
if (episode.event && episode.event.corner) {
<div className="episode-titlebar">
{episode.title || episode.event ?
<h3 className="episode-title fs-5 fs-md-4">
- {episode.title || episode.event.title}
+ {!episode.confirmed ?
+ <span>{`${t('episodes.unconfirmed')} `}</span>
+ : null}
+ <span>{episode.title || episode.event.title}</span>
</h3>
: null}
{episode.comment ?
channels: PropTypes.arrayOf(PropTypes.shape({
})),
comment: PropTypes.string,
+ confirmed: PropTypes.bool,
crew: PropTypes.arrayOf(PropTypes.shape({
})),
event: PropTypes.shape({