<?php
declare(strict_types=1);
namespace App\Repositories;
use App\Models\Story;
use App\Models\Tag;
use MotorORM\Collection;
use MotorORM\CollectionPaginate;
class StoryRepository implements RepositoryInterface
{
/**
* Get by id
*
* @param int $id
*
* @return Story|null
*/
public function getById(int $id): ?Story
{
return Story::query()->find($id);
}
/**
* Get by slug
*
* @param string $slug
*
* @return Story|null
*/
public function getBySlug(string $slug): ?Story
{
$data = explode('-', $slug);
return Story::query()->find(end($data));
}
/**
* Get stories
*
* @param int $perPage
*
* @return CollectionPaginate<Story>
*/
public function getStories(int $perPage): CollectionPaginate
{
return Story::query()
->when(! isAdmin(), function (Story $query) {
$query->active()
->where('created_at', '<', time());
})
->orderByDesc('locked')
->orderByDesc('created_at')
->with(['user', 'poll', 'comments', 'favorite', 'favorites'])
->paginate($perPage);
}
/**
* Get user stories
*
* @param int $userId
* @param int $perPage
*
* @return CollectionPaginate
*/
public function getStoriesByUserId(int $userId, int $perPage): CollectionPaginate
{
return Story::query()
->when(! isAdmin(), function (Story $query) {
$query->where('created_at', '<', time());
})
->where('user_id', $userId)
->orderByDesc('locked')
->orderByDesc('created_at')
->with(['user', 'poll', 'comments', 'favorite', 'favorites'])
->paginate($perPage);
}
/**
* Get stories by tag
*
* @param string $tag
* @param int $perPage
*
* @return CollectionPaginate<Story>
*/
public function getStoriesByTag(string $tag, int $perPage): CollectionPaginate
{
$tags = Tag::query()
->where('tag', 'like', $tag)
->get()
->pluck('story_id');
return Story::query()
->active()
->where('created_at', '<', time())
->whereIn('id', $tags)
->orderByDesc('created_at')
->paginate($perPage);
}
/**
* Get stories by search
*
* @param string $search
* @param int $perPage
*
* @return CollectionPaginate<Story>
*/
public function getStoriesBySearch(string $search, int $perPage): CollectionPaginate
{
return Story::query()
->active()
->where('created_at', '<', time())
->where('text', 'like', $search)
->orderByDesc('created_at')
->paginate($perPage)
->appends(['search' => $search]);
}
/**
* Get active stories
*
* @return Collection<Story>
*/
public function getActiveStories(): Collection
{
return Story::query()
->active()
->where('created_at', '<', time())
->get();
}
/**
* Get count stories
*
* @return int
*/
public function getCount(): int
{
return Story::query()
->active()
->where('created_at', '<', time())
->count();
}
}