Compare commits

...

5 Commits
v2.1.1 ... v2.1

9 changed files with 181 additions and 57 deletions

View File

@ -70,17 +70,20 @@ class DbHelper
->leftJoin('permissions AS group_permissions', 'group_permissions.id', '=', 'album_group_permissions.permission_id') ->leftJoin('permissions AS group_permissions', 'group_permissions.id', '=', 'album_group_permissions.permission_id')
->leftJoin('permissions AS user_permissions', 'user_permissions.id', '=', 'album_user_permissions.permission_id') ->leftJoin('permissions AS user_permissions', 'user_permissions.id', '=', 'album_user_permissions.permission_id')
->leftJoin('user_groups', 'user_groups.group_id', '=', 'album_group_permissions.group_id') ->leftJoin('user_groups', 'user_groups.group_id', '=', 'album_group_permissions.group_id')
->where('albums.user_id', $user->id) ->where(function($query) use ($user, $permission)
->orWhere([ {
['group_permissions.section', 'album'], $query->where('albums.user_id', $user->id)
['group_permissions.description', $permission], ->orWhere([
['user_groups.user_id', $user->id] ['group_permissions.section', 'album'],
]) ['group_permissions.description', $permission],
->orWhere([ ['user_groups.user_id', $user->id]
['user_permissions.section', 'album'], ])
['user_permissions.description', $permission], ->orWhere([
['album_user_permissions.user_id', $user->id] ['user_permissions.section', 'album'],
]); ['user_permissions.description', $permission],
['album_user_permissions.user_id', $user->id]
]);
});
} }
$parentAlbumID = intval($parentAlbumID); $parentAlbumID = intval($parentAlbumID);

View File

@ -15,6 +15,7 @@ use App\Http\Requests\SaveSettingsRequest;
use App\Label; use App\Label;
use App\Mail\TestMailConfig; use App\Mail\TestMailConfig;
use App\Photo; use App\Photo;
use App\Services\GiteaService;
use App\Services\GithubService; use App\Services\GithubService;
use App\Services\PhotoService; use App\Services\PhotoService;
use App\Storage; use App\Storage;
@ -46,18 +47,18 @@ class DefaultController extends Controller
{ {
try try
{ {
$githubService = new GithubService(); $giteaService = new GiteaService();
$releaseInfo = $githubService->checkForLatestRelease(); $releaseInfo = $giteaService->checkForLatestRelease();
// Convert the publish date so we can re-format it with the user's settings // Convert the publish date so we can re-format it with the user's settings
$publishDate = \DateTime::createFromFormat('Y-m-d\TH:i:s\Z', $releaseInfo->published_at); $publishDate = \DateTime::createFromFormat('Y-m-d\TH:i:sP', $releaseInfo->published_at);
// HTML-ify the body text // HTML-ify the body text
$body = nl2br($releaseInfo->body); $body = nl2br($releaseInfo->body);
$body = preg_replace('/\*\*(.+)\*\*/', '<b>$1</b>', $body); $body = preg_replace('/\*\*(.+)\*\*/', '<b>$1</b>', $body);
// Remove the "v" from the release name // Remove the "v" from the release name
$version = substr($releaseInfo->name, 1); $version = substr($releaseInfo->tag_name, 1);
// Determine if we can upgrade // Determine if we can upgrade
$canUpgrade = version_compare($version, config('app.version')) > 0; $canUpgrade = version_compare($version, config('app.version')) > 0;

View File

@ -71,14 +71,14 @@ class AlbumController extends Controller
else if ($requestedView != 'slideshow') else if ($requestedView != 'slideshow')
{ {
$photos = $album->photos() $photos = $album->photos()
->orderBy(DB::raw('COALESCE(taken_at, created_at)')) ->orderBy(DB::raw('COALESCE(taken_at, created_at), name, id'))
->paginate(UserConfig::get('items_per_page')); ->paginate(UserConfig::get('items_per_page'));
} }
else else
{ {
// The slideshow view needs access to all photos, not paged // The slideshow view needs access to all photos, not paged
$photos = $album->photos() $photos = $album->photos()
->orderBy(DB::raw('COALESCE(taken_at, created_at)')) ->orderBy(DB::raw('COALESCE(taken_at, created_at), name, id'))
->get(); ->get();
} }

View File

@ -105,14 +105,40 @@ class PhotoController extends Controller
// Load the Next/Previous buttons // Load the Next/Previous buttons
$thisPhotoDate = is_null($photo->taken_at) ? $photo->created_at : $photo->taken_at; $thisPhotoDate = is_null($photo->taken_at) ? $photo->created_at : $photo->taken_at;
$previousPhoto = $album->photos() // I don't like the idea of using a totally raw SQL query, but it's the only sure-fire way to number the rows
->where(DB::raw('COALESCE(taken_at, created_at)'), '<', $thisPhotoDate) // so we can get the previous/next photos accurately - and we don't have to load all data for the photo objects
->orderBy(DB::raw('COALESCE(taken_at, created_at)'), 'desc') $previousPhoto = null;
->first(); $nextPhoto = null;
$nextPhoto = $album->photos()
->where(DB::raw('COALESCE(taken_at, created_at)'), '>', $thisPhotoDate) $allAlbumPhotos = DB::select(
->orderBy(DB::raw('COALESCE(taken_at, created_at)')) DB::raw(
->first(); 'SELECT p.id, (@row_number:=@row_number + 1) AS row_number
FROM photos p, (SELECT @row_number:=0) AS t
WHERE p.album_id = :album_id
ORDER BY COALESCE(p.taken_at, p.created_at), p.name, p.id;'
),
[
'album_id' => $album->id
]
);
for ($i = 0; $i < count($allAlbumPhotos); $i++)
{
if ($allAlbumPhotos[$i]->id === $photo->id)
{
if ($i > 0)
{
$previousPhoto = Photo::where('id', $allAlbumPhotos[$i - 1]->id)->first();
}
if ($i + 1 < count($allAlbumPhotos))
{
$nextPhoto = Photo::where('id', $allAlbumPhotos[$i + 1]->id)->first();
}
break;
}
}
// Record the visit to the photo // Record the visit to the photo
if (UserConfig::get('enable_visitor_hits')) if (UserConfig::get('enable_visitor_hits'))

View File

@ -0,0 +1,112 @@
<?php
namespace App\Services;
class GiteaService
{
private $cacheFile = null;
private $config = [];
public function __construct()
{
$this->config = config('services.gitea');
$this->cacheFile = storage_path('app/gitea_cache.txt');
}
public function checkForLatestRelease()
{
$cacheData = null;
if ($this->doesCacheExist())
{
// Get the etag from the cache
$cacheData = $this->getCacheData();
}
else
{
// Lookup and store the version information
$statusCode = -1;
$result = $this->getLatestReleaseFromGitea($statusCode);
if ($statusCode == 200)
{
$releases = json_decode($result[1]);
$latestRelease = null;
foreach ($releases as $release)
{
if (is_null($latestRelease) || version_compare($release->tag_name, $latestRelease->tag_name) > 0)
{
$latestRelease = $release;
}
}
$cacheData = $this->setCacheData($latestRelease);
}
}
// GitHub compatibility
$cacheData->html_url = sprintf($this->config['releases_url'], $this->config['repo_owner'], $this->config['repo_name']);
return $cacheData;
}
private function doesCacheExist()
{
$exists = file_exists($this->cacheFile);
if ($exists)
{
// Check modified time on the file
$stat = stat($this->cacheFile);
$diff = time() - $stat['mtime'];
if ($diff > $this->config['cache_time_seconds'])
{
$exists = false;
}
}
return $exists;
}
private function getCacheData()
{
return json_decode(file_get_contents($this->cacheFile));
}
private function getLatestReleaseFromGitea(&$statusCode)
{
$httpHeaders = [
sprintf('User-Agent: aheathershaw/blue-twilight (v%s)', config('app.version'))
];
if (isset($this->config['api_key']) && !empty($this->config['api_key']))
{
$httpHeaders[] = sprintf('Authorization: %s', $this->config['api_key']);
}
$apiUrl = sprintf('%s/repos/%s/%s/releases', $this->config['api_url'], $this->config['repo_owner'], $this->config['repo_name']);
$ch = curl_init($apiUrl);
curl_setopt($ch, CURLOPT_HTTPHEADER, $httpHeaders);
curl_setopt($ch, CURLOPT_HEADER, true);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
if ($result === false)
{
throw new \Exception(sprintf('Error from Gitea: %s', curl_error($ch)));
}
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
return explode("\r\n\r\n", $result, 2);
}
private function setCacheData($data)
{
file_put_contents($this->cacheFile, json_encode(get_object_vars($data)));
return $data;
}
}

View File

@ -2,7 +2,7 @@
return [ return [
// Version number of Blue Twilight // Version number of Blue Twilight
'version' => '2.1.1', 'version' => '2.1.2',
/* /*
|-------------------------------------------------------------------------- |--------------------------------------------------------------------------

View File

@ -14,33 +14,15 @@ return [
| |
*/ */
'github' => [ 'gitea' => [
'latest_release_url' => 'https://api.github.com/repos/andysh-uk/blue-twilight/releases/latest' 'api_url' => 'https://apps.andysh.uk/api/v1',
'cache_time_seconds' => 3600,
'releases_url' => 'https://apps.andysh.uk/%s/%s/releases',
'repo_name' => 'blue-twilight',
'repo_owner' => 'aheathershaw'
], ],
'recaptcha' => [ 'recaptcha' => [
'verify_url' => 'https://www.google.com/recaptcha/api/siteverify' 'verify_url' => 'https://www.google.com/recaptcha/api/siteverify'
] ]
/*'mailgun' => [
'domain' => env('MAILGUN_DOMAIN'),
'secret' => env('MAILGUN_SECRET'),
],
'ses' => [
'key' => env('SES_KEY'),
'secret' => env('SES_SECRET'),
'region' => 'us-east-1',
],
'sparkpost' => [
'secret' => env('SPARKPOST_SECRET'),
],
'stripe' => [
'model' => App\User::class,
'key' => env('STRIPE_KEY'),
'secret' => env('STRIPE_SECRET'),
],*/
]; ];

View File

@ -7,12 +7,12 @@ return [
'about' => [ 'about' => [
'current_version' => 'You are running version', 'current_version' => 'You are running version',
'date_published_label' => 'Release date:', 'date_published_label' => 'Release date:',
'github_link' => 'Github Project Website', 'intro' => 'Blue Twilight is an <a href="https://andysh.uk/software/" target="_blank">App by Andy</a>.',
'intro' => 'Blue Twilight is an <a href="https://www.andyheathershaw.uk/software/" target="_blank">App by Andy</a>.', 'intro_2' => 'It is made with <i class="fa fa-heart text-red"></i> in the UK by software developer <a href="https://andysh.uk" target="_blank">Andy Heathershaw</a>.',
'intro_2' => 'It is made with <i class="fa fa-heart text-red"></i> in the UK by software developer <a href="https://www.andyheathershaw.uk" target="_blank">Andy Heathershaw</a>.', 'latest_version_loading' => 'Checking for the latest release...',
'latest_version_loading' => 'Checking for the latest release on Github...',
'licence_header' => 'Licence', 'licence_header' => 'Licence',
'links_header' => 'Useful Links', 'links_header' => 'Useful Links',
'project_website_link' => 'Project Website',
'title' => 'About Blue Twilight', 'title' => 'About Blue Twilight',
'up_to_date' => 'Good job - your installation of Blue Twilight is up-to-date!', 'up_to_date' => 'Good job - your installation of Blue Twilight is up-to-date!',
'update_available' => 'An update is available to Blue Twilight.', 'update_available' => 'An update is available to Blue Twilight.',

View File

@ -27,9 +27,9 @@
<li class="nav-item dropdown"> <li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">@lang('admin.about.links_header')</a> <a class="nav-link dropdown-toggle" data-toggle="dropdown" href="#" role="button" aria-haspopup="true" aria-expanded="false">@lang('admin.about.links_header')</a>
<div class="dropdown-menu"> <div class="dropdown-menu">
<a class="dropdown-item" href="https://showmy.photos" target="_blank">@lang('admin.about.website_link')</a> <a class="dropdown-item" href="https://andysh.uk/software/blue-twilight-php-photo-gallery/" target="_blank">@lang('admin.about.website_link')</a>
<a class="dropdown-item" href="https://www.andyheathershaw.uk/software/blue-twilight-php-photo-gallery/manual/" target="_blank">@lang('admin.about.user_guide_link')</a> <a class="dropdown-item" href="https://andysh.uk/software/blue-twilight-php-photo-gallery/manual/" target="_blank">@lang('admin.about.user_guide_link')</a>
<a class="dropdown-item" href="https://github.com/pandy06269/blue-twilight" target="_blank">@lang('admin.about.github_link')</a> <a class="dropdown-item" href="https://apps.andysh.uk/aheathershaw/blue-twilight" target="_blank">@lang('admin.about.project_website_link')</a>
</div> </div>
</li> </li>
</ul> </ul>