|
|
|
<?php
|
|
|
|
|
|
|
|
const VALI_NAME = 'string|regex:/^[a-z0-9_.-]+$/i|max:255';
|
|
|
|
const VALI_PASSWORD = 'string|min:6|max:1024';
|
|
|
|
const VALI_EMAIL = 'string|email|max:255';
|
|
|
|
const VALI_TEXT = 'string|max:4095';
|
|
|
|
const VALI_LINE = 'string|max:255';
|
|
|
|
|
|
|
|
const FEATURE_FORKS = false;
|
|
|
|
const FEATURE_FAVES = false;
|
|
|
|
const FEATURE_TABLE_COMMENTS = false;
|
|
|
|
const FEATURE_PROPOSALS = false;
|
|
|
|
|
|
|
|
// global helpers
|
|
|
|
function authed() {
|
|
|
|
return ! \Auth::guest();
|
|
|
|
}
|
|
|
|
|
|
|
|
function guest() {
|
|
|
|
return \Auth::guest();
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @return \App\Models\User|null
|
|
|
|
*/
|
|
|
|
function user() {
|
|
|
|
return \Auth::user();
|
|
|
|
}
|
|
|
|
|
|
|
|
function ellipsis($s, $len) {
|
|
|
|
return \MightyPork\Utils\Str::ellipsis($s, $len);
|
|
|
|
}
|
|
|
|
|
|
|
|
function faker() {
|
|
|
|
static $fac = null;
|
|
|
|
if ($fac !== null) return $fac;
|
|
|
|
return $fac = Faker\Factory::create();
|
|
|
|
}
|
|
|
|
|
|
|
|
function dark_mode($ifDark=true, $ifLight=false) {
|
|
|
|
return isset($_COOKIE["dark_mode"]) ? $ifDark : $ifLight;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Recursively expand validation rules
|
|
|
|
*
|
|
|
|
* @param $arr
|
|
|
|
* @return array
|
|
|
|
*/
|
|
|
|
function vali($arr) {
|
|
|
|
$result = [];
|
|
|
|
foreach ($arr as $key => $rules) {
|
|
|
|
// top level
|
|
|
|
if (is_array($rules)) {
|
|
|
|
$ar = [];
|
|
|
|
foreach ($rules as $rule) {
|
|
|
|
if (is_string($rule) && strpos($rule, '|') !== false) {
|
|
|
|
foreach (explode('|', $rule) as $rr) {
|
|
|
|
$ar[] = $rr;
|
|
|
|
}
|
|
|
|
} else if (is_array($rule)) {
|
|
|
|
// nested array, assume no further recursion
|
|
|
|
foreach ($rule as $rr) {
|
|
|
|
$ar[] = $rr;
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
// Rule
|
|
|
|
$ar[] = $rule;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
$result[$key] = $ar;
|
|
|
|
} else {
|
|
|
|
// string or Rule
|
|
|
|
$result[$key] = $rules;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return $result;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
* like old(), but decodes stringified json
|
|
|
|
*
|
|
|
|
* @param string $name
|
|
|
|
* @param object|array $default
|
|
|
|
* @return object|array
|
|
|
|
*/
|
|
|
|
function old_json($name, $default) {
|
|
|
|
$old = old($name, null);
|
|
|
|
if (is_string($old)) return json_decode($old);
|
|
|
|
return $default;
|
|
|
|
}
|
|
|
|
|
|
|
|
// Safe JSON funcs
|
|
|
|
function toJSON($object, $emptyObj=false) {
|
|
|
|
if ($emptyObj) {
|
|
|
|
if ((empty($object) || ($object instanceof \Illuminate\Support\Collection && $object->count()==0))) {
|
|
|
|
return '{}';
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!$object instanceof JsonSerializable && $object instanceof \Illuminate\Contracts\Support\Arrayable) {
|
|
|
|
$object = $object->toArray();
|
|
|
|
}
|
|
|
|
|
|
|
|
return \GuzzleHttp\json_encode($object, JSON_UNESCAPED_SLASHES + JSON_UNESCAPED_UNICODE);
|
|
|
|
}
|
|
|
|
|
|
|
|
function fromJSON($object, $assoc=false) {
|
|
|
|
return \GuzzleHttp\json_decode($object, $assoc);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* @param \Illuminate\Support\Collection|array $items
|
|
|
|
* @param int $per_page
|
|
|
|
* @param null|\Closure $mapFn
|
|
|
|
* @return \Illuminate\Pagination\LengthAwarePaginator
|
|
|
|
*/
|
|
|
|
function collection_paginate($items, $per_page, $mapFn = null)
|
|
|
|
{
|
|
|
|
if (!$items instanceof \Illuminate\Support\Collection) {
|
|
|
|
$items = collect($items);
|
|
|
|
}
|
|
|
|
|
|
|
|
$page = Request::get('page', 1);
|
|
|
|
|
|
|
|
$pageItems = $items->forPage($page, $per_page)->values();
|
|
|
|
|
|
|
|
return new Illuminate\Pagination\LengthAwarePaginator(
|
|
|
|
$mapFn ? $pageItems->map($mapFn) : $pageItems,
|
|
|
|
$items->count(),
|
|
|
|
$per_page,
|
|
|
|
Illuminate\Pagination\Paginator::resolveCurrentPage(),
|
|
|
|
['path' => Illuminate\Pagination\Paginator::resolveCurrentPath()]
|
|
|
|
);
|
|
|
|
}
|