Files
sprinkle-organisations/src/Sprunje/OrganisationSprunje.php

203 lines
4.8 KiB
PHP

<?php
/*
* AVSDev UF Organisations (https://avsdev.uk)
*
* @link https://git.avsdev.uk/avsdev/sprinkle-organisations
* @license https://git.avsdev.uk/avsdev/sprinkle-organisations/blob/master/LICENSE.md (LGPL-3.0 License)
*/
namespace UserFrosting\Sprinkle\Organisations\Sprunje;
use UserFrosting\Sprinkle\Core\Sprunje\Sprunje;
use UserFrosting\Sprinkle\Core\Facades\Translator;
/**
* OrganisationSprunje.
*
* Implements Sprunje for the organisations API.
*
* @author Craig Williams (https://avsdev.uk)
*/
class OrganisationSprunje extends Sprunje
{
protected $name = 'organisations';
protected $listable = [
'status',
];
protected $sortable = [
'name',
'description',
'member_count',
'admin_count',
'status',
'created_at',
];
protected $filterable = [
'name',
'description',
'member_count',
'admin_count',
'status',
'info',
'created_at',
];
protected $excludeForAll = [
'info',
];
/**
* {@inheritdoc}
*/
protected function baseQuery()
{
return $this->classMapper->createInstance('organisation')->newQuery()->joinMemberCounts();
}
/**
* Filter by status (approved, pending).
*
* @param Builder $query
* @param mixed $value
*
* @return self
*/
protected function filterStatus($query, $value)
{
// Split value on separator for OR queries
$values = explode($this->orSeparator, $value);
$query->where(function ($query) use ($values) {
foreach ($values as $value) {
if ($value == 'approved') {
$query->orWhere('flag_approved', 1);
} elseif ($value == 'pending') {
$query->orWhere('flag_approved', 0);
}
}
});
return $this;
}
/**
* Filter by name (case insensitive).
*
* @param Builder $query
* @param mixed $value
*
* @return self
*/
protected function filterName($query, $value)
{
// Split value on separator for OR queries
$values = explode($this->orSeparator, $value);
$query->where(function ($query) use ($values) {
foreach ($values as $value) {
$query->orWhereRaw('LOWER(name) LIKE ?', [ '%' . strtolower($value) . '%' ]);
}
});
return $this;
}
/**
* Filter by description (case insensitive).
*
* @param Builder $query
* @param mixed $value
*
* @return self
*/
protected function filterDescription($query, $value)
{
// Split value on separator for OR queries
$values = explode($this->orSeparator, $value);
$query->where(function ($query) use ($values) {
foreach ($values as $value) {
$query->orWhereRaw('LOWER(description) LIKE ?', [ '%' . strtolower($value) . '%' ]);
}
});
return $this;
}
/**
* Filter by description (case insensitive).
*
* @param Builder $query
* @param mixed $value
*
* @return self
*/
protected function filterInfo($query, $value)
{
// Split value on separator for OR queries
$values = explode($this->orSeparator, $value);
$query->where(function ($query) use ($values) {
foreach ($values as $value) {
$query->orWhereRaw(
'LOWER(name) LIKE ?', [ '%' . strtolower($value) . '%' ]
)->orWhereRaw(
'LOWER(description) LIKE ?', [ '%' . strtolower($value) . '%' ]
);
}
});
return $this;
}
/**
* Return a list of possible user statuses.
*
* @return array
*/
protected function listStatus()
{
return [
[
'value' => 'approved',
'text' => Translator::translate('APPROVED'),
],
[
'value' => 'pending',
'text' => Translator::translate('PENDING'),
],
];
}
/**
* Sort approved, pending
*
* @param Builder $query
* @param string $direction
*
* @return self
*/
protected function sortStatus($query, $direction)
{
$query->orderBy('flag_approved', ($direction === 'desc' ? 'asc' : 'desc'));
return $this;
}
/**
* Sort based on created date.
*
* @param Builder $query
* @param string $direction
*
* @return self
*/
protected function sortCreatedAt($query, $direction)
{
$query->orderBy('organisations.created_at', $direction)
->orderby('organisations.id', $direction);
return $this;
}
}