1
0
mirror of https://github.com/Kovah/LinkAce.git synced 2025-01-17 21:28:30 +01:00
LinkAce/app/Helper/functions.php

222 lines
5.0 KiB
PHP

<?php
use App\Helper\Sharing;
use App\Helper\WaybackMachine;
use App\Models\Link;
use App\Models\Setting;
use Carbon\Carbon;
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\Cache;
use Illuminate\Support\Facades\Log;
/**
* Check if the setup was completed.
*
* @return bool
*/
function setupCompleted()
{
try {
return systemsettings('system_setup_completed');
} catch (PDOException $e) {
Log::error($e->getMessage());
return false;
}
}
/**
* Shorthand for the current user settings
*
* @param string $key
* @return mixed
*/
function usersettings(string $key = '')
{
if (!auth()->user()) {
return null;
}
if (!empty($key)) {
return auth()->user()->settings()->get($key);
}
return auth()->user()->settings();
}
/**
* Retrieve system settings
*
* @param string $key
* @return null|Collection|string
*/
function systemsettings(string $key = '')
{
$settings = Cache::rememberForever('systemsettings', function () {
return Setting::systemOnly()->get()->pluck('value', 'key');
});
if ($key === '') {
return $settings;
}
return $settings[$key] ?? null;
}
/**
* Output a correctly formatted date with the correct timezone
*
* @param Carbon $date
* @param bool $use_relational
* @return string
*/
function formatDateTime(Carbon $date, bool $use_relational = false): string
{
$timezone = config('app.timezone');
if ($use_relational) {
return $date->setTimezone($timezone)->diffForHumans();
}
$format = config('linkace.default.date_format');
$format .= ' ' . config('linkace.default.time_format');
$user_date_format = usersettings('date_format');
$user_time_format = usersettings('time_format');
if ($user_date_format && $user_time_format) {
$format = $user_date_format . ' ' . $user_time_format;
}
return $date->setTimezone($timezone)->format($format);
}
/**
* Get the correct pagination limit
*
* @return mixed
*/
function getPaginationLimit()
{
if (request()->has('per_page') && (int)request()->get('per_page') >= 0) {
return (int)request()->get('per_page') > 0 ? (int)request()->get('per_page') : 999999999;
}
$default = config('linkace.default.pagination');
if (request()->is('guest/*')) {
return systemsettings('guest_listitem_count') ?: $default;
}
return usersettings('listitem_count') ?: $default;
}
/**
* Generate all share links for a link, but for enabled services only
*
* @param Link $link
* @return string
*/
function getShareLinks(Link $link): string
{
$cacheKey = 'sharelinks_link_' . $link->id . (auth()->guest() ? '_guest' : '');
$cacheDuration = config('linkace.default.cache_duration');
return Cache::remember($cacheKey, $cacheDuration, function () use ($link) {
$services = config('sharing.services');
$links = '';
foreach ($services as $service => $details) {
if (request()->is('guest/*')) {
if (systemsettings('guest_share_' . $service)) {
$links .= Sharing::getShareLink($service, $link);
}
} elseif (usersettings('share_' . $service)) {
$links .= Sharing::getShareLink($service, $link);
}
}
return $links;
});
}
/*
* Build sorting links for a table column
*/
function tableSorter(string $label, string $route, string $type, string $orderBy, string $orderDir): string
{
$orderUrl = $route . '?orderBy=' . $type . '&orderDir=';
$orderIcon = 'icon.sort';
if ($type === $orderBy) {
if ($orderDir === 'asc') {
$orderUrl .= 'desc';
$orderIcon = 'icon.sort-up';
} else {
$orderUrl .= 'asc';
$orderIcon = 'icon.sort-down';
}
} else {
$orderUrl .= 'asc';
}
return view('partials.table-sorter', [
'label' => $label,
'url' => $orderUrl,
'icon' => $orderIcon,
]);
}
/**
* Get the Wayback Machine link for an URL
*
* @param string|Link $link
* @return null|string
*/
function waybackLink($link): ?string
{
$link = $link->url ?? $link;
return WaybackMachine::getArchiveLink($link);
}
/**
* Return proper link attributes based on the links_new_tab user setting
*
* @return string
*/
function linkTarget(): string
{
$newTab = 'target="_blank" rel="noopener noreferrer"';
if (request()->is('guest/*')) {
return systemsettings('guest_links_new_tab') ? $newTab : '';
}
return usersettings('links_new_tab') ? $newTab : '';
}
/**
* Properly escape symbols used in search queries.
*
* @param string $query
* @return string
*/
function escapeSearchQuery(string $query): string
{
return str_replace(
['\\', '%', '_', '*'],
['\\\\', '\\%', '\\_', '\\*'],
$query
);
}
/**
* Get a list of all routes that are accessible by guests.
*
* @return string[]
*/
function guestRoutes(): array
{
return ['guest/*', 'login', 'forgot-password', 'reset-password/*', 'two-factor-challenge', 'email/verify'];
}