diff --git a/.idea/kuvia.iml b/.idea/kuvia.iml
index 81ecb19..74689e6 100644
--- a/.idea/kuvia.iml
+++ b/.idea/kuvia.iml
@@ -13,6 +13,9 @@
+
+
+
diff --git a/.idea/php.xml b/.idea/php.xml
index ebd36e7..771c9f1 100644
--- a/.idea/php.xml
+++ b/.idea/php.xml
@@ -115,6 +115,9 @@
+
+
+
diff --git a/app/Console/Commands/EXIFRead.php b/app/Console/Commands/EXIFRead.php
index 02d4cb0..174bc8b 100644
--- a/app/Console/Commands/EXIFRead.php
+++ b/app/Console/Commands/EXIFRead.php
@@ -41,6 +41,7 @@ class EXIFRead extends Command
{
$images = Image::query()
->where("exifRead", "=", 0)
+ ->where("typ", "=", "gallery")
->limit(10)
->get();
foreach ($images as $image) {
diff --git a/app/Http/Controllers/GalleryController.php b/app/Http/Controllers/GalleryController.php
index a868716..d23c2ba 100644
--- a/app/Http/Controllers/GalleryController.php
+++ b/app/Http/Controllers/GalleryController.php
@@ -194,6 +194,7 @@ class GalleryController extends BaseController
$image->filename = $validated["files"][0]->getClientOriginalName();
$image->gallery = $gallery->id;
$image->size = $validated["files"][0]->getSize();
+ $image->typ = "gallery";
$image->saveOrFail();
if(is_null($gallery->main_image)) {
diff --git a/app/Http/Controllers/PublicController.php b/app/Http/Controllers/PublicController.php
index 8a96fa1..eb92e0a 100644
--- a/app/Http/Controllers/PublicController.php
+++ b/app/Http/Controllers/PublicController.php
@@ -110,7 +110,7 @@ class PublicController extends BaseController
}
- private function addAccessLog(int $tenant, int $gallery, int $image, string $typ, int $size) {
+ private function addAccessLog(int $tenant, int $gallery, int $image, string $typ, int $size, $type = "general") {
$access = new Access();
$access->year = date("Y");
$access->month = date("m");
diff --git a/app/Http/Controllers/TenantController.php b/app/Http/Controllers/TenantController.php
index d21760c..2880f33 100644
--- a/app/Http/Controllers/TenantController.php
+++ b/app/Http/Controllers/TenantController.php
@@ -2,6 +2,7 @@
namespace App\Http\Controllers;
+use App\Models\Image;
use App\Models\Tenant;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
use Illuminate\Foundation\Bus\DispatchesJobs;
@@ -52,4 +53,30 @@ class TenantController extends BaseController
private function switchTenantById($id) {
session(["current_tenant_id" => $id]);
}
+
+ public function watermarkView() {
+ return view("tenant.watermark");
+ }
+
+ public function watermarkSave(Request $request) {
+ $validated = $request->validate([
+ 'files.0' => 'required|image'
+ ]);
+ $path = $validated["files"][0]->store("watermark/".session("current_tenant_id"));
+
+ $image = new Image();
+ $image->path = $path;
+ $image->driver = env('FILESYSTEM_DRIVER', 'local');
+ $image->filename = $validated["files"][0]->getClientOriginalName();
+ $image->gallery = null;
+ $image->size = $validated["files"][0]->getSize();
+ $image->typ = "watermark";
+ $image->saveOrFail();
+
+ $tenant = Tenant::query()->where("id", "=", session("current_tenant_id"))->firstOrFail();
+ $tenant->watermark = $image->id;
+ $tenant->saveOrFail();
+
+ return "OK";
+ }
}
diff --git a/app/Jobs/ResizeImage.php b/app/Jobs/ResizeImage.php
index b2156e9..3368a48 100644
--- a/app/Jobs/ResizeImage.php
+++ b/app/Jobs/ResizeImage.php
@@ -51,17 +51,7 @@ class ResizeImage implements ShouldQueue
$cacheName = "cache/".$tenant->url."_".$gallery->url."_".$image->id;
//Check if orginal size is cached on the current system
- if (Storage::disk('cache')->exists($cacheName."_orginal")) {
- $file = Storage::disk("cache")->get($cacheName."_orginal");
- } else {
- $this->addAccessLog($tenant->id, $gallery->id, $image->id, "Access", $image->size);
- $file = Storage::disk($image->driver)->get($image->path);
- if(env("CACHE_ORGINAL"))
- {
- Storage::disk("cache")->put($cacheName."_orginal", $file);
- }
- }
-
+ $file = $this->getImage($tenant, $gallery, $image, $cacheName);
$manager = new ImageManager(array('driver' => 'imagick'));
$img = $manager->make($file);
@@ -81,8 +71,13 @@ class ResizeImage implements ShouldQueue
$img->resize($newWidth, $newHeight);
//$img->blur(50);
- if($this->size > 500) {
- $watermark = $manager->make(storage_path("logo-sample.png"));
+ if($this->size > 500 && !is_null($gallery->watermark)) {
+
+ $cacheNameWatermark = "";
+ $waterMarkImage = Image::query()->where("id", "=", $tenant->watermark);
+ $watermarkSource = $this->getImage($tenant, $gallery, $waterMarkImage, $cacheNameWatermark);
+
+ $watermark = $manager->make($watermarkSource);
if($watermark->getWidth() > $img->getWidth()) {
$newWidth = $img->getWidth() / 1.2;
$newHeight = $watermark->getHeight() * ($newWidth / $watermark->getWidth());
@@ -96,6 +91,8 @@ class ResizeImage implements ShouldQueue
$watermark->opacity(40);
$img->insert($watermark, 'center');
+ /*
+ * Reddit like balken unten
$img->resizeCanvas(0, 28, 'top', true, "#000000");
$img->text('www.kuvia.cloud/'.$tenant->url, $img->getWidth() - 10, $img->getHeight() - 25, function($font) {
$font->file(storage_path("OpenSans-Light.ttf"));
@@ -105,6 +102,7 @@ class ResizeImage implements ShouldQueue
$font->valign('top');
//$font->angle(45);
});
+ */
}
@@ -117,6 +115,19 @@ class ResizeImage implements ShouldQueue
//Storage::disk("cache")->put($cacheName."_".$this->size, $image->getImageAsString(IMAGETYPE_JPEG, 100));
}
+ private function getImage($tenant, $gallery, $image, $cacheName) {
+ if (Storage::disk('cache')->exists($cacheName."_orginal")) {
+ $file = Storage::disk("cache")->get($cacheName."_orginal");
+ } else {
+ $this->addAccessLog($tenant->id, $gallery->id, $image->id, "Access", $image->size);
+ $file = Storage::disk($image->driver)->get($image->path);
+ if (env("CACHE_ORGINAL")) {
+ Storage::disk("cache")->put($cacheName . "_orginal", $file);
+ }
+ }
+ return $file;
+ }
+
private function addAccessLog(int $tenant, int $gallery, int $image, string $typ, int $size) {
diff --git a/composer.json b/composer.json
index 32a815c..1cd7903 100644
--- a/composer.json
+++ b/composer.json
@@ -10,6 +10,7 @@
"require": {
"php": "^7.3|^8.0",
"almasaeed2010/adminlte": "^3.0",
+ "doctrine/dbal": "^3.0",
"erusev/parsedown": "^1.7",
"fideloper/proxy": "^4.4",
"fruitcake/laravel-cors": "^2.0",
diff --git a/composer.lock b/composer.lock
index 233a5f8..7a08742 100644
--- a/composer.lock
+++ b/composer.lock
@@ -4,7 +4,7 @@
"Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
"This file is @generated automatically"
],
- "content-hash": "fd0ab766a01c2bf348b0108782d792d7",
+ "content-hash": "aad8aae4d553fd85e9d879debb23bada",
"packages": [
{
"name": "almasaeed2010/adminlte",
@@ -251,6 +251,79 @@
],
"time": "2020-08-18T23:57:15+00:00"
},
+ {
+ "name": "composer/package-versions-deprecated",
+ "version": "1.11.99.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/composer/package-versions-deprecated.git",
+ "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/composer/package-versions-deprecated/zipball/7413f0b55a051e89485c5cb9f765fe24bb02a7b6",
+ "reference": "7413f0b55a051e89485c5cb9f765fe24bb02a7b6",
+ "shasum": ""
+ },
+ "require": {
+ "composer-plugin-api": "^1.1.0 || ^2.0",
+ "php": "^7 || ^8"
+ },
+ "replace": {
+ "ocramius/package-versions": "1.11.99"
+ },
+ "require-dev": {
+ "composer/composer": "^1.9.3 || ^2.0@dev",
+ "ext-zip": "^1.13",
+ "phpunit/phpunit": "^6.5 || ^7"
+ },
+ "type": "composer-plugin",
+ "extra": {
+ "class": "PackageVersions\\Installer",
+ "branch-alias": {
+ "dev-master": "1.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "PackageVersions\\": "src/PackageVersions"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ },
+ {
+ "name": "Jordi Boggiano",
+ "email": "j.boggiano@seld.be"
+ }
+ ],
+ "description": "Composer plugin that provides efficient querying for installed package versions (no runtime IO)",
+ "support": {
+ "issues": "https://github.com/composer/package-versions-deprecated/issues",
+ "source": "https://github.com/composer/package-versions-deprecated/tree/1.11.99.1"
+ },
+ "funding": [
+ {
+ "url": "https://packagist.com",
+ "type": "custom"
+ },
+ {
+ "url": "https://github.com/composer",
+ "type": "github"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/composer/composer",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-11T10:22:58+00:00"
+ },
{
"name": "dnoegel/php-xdg-base-dir",
"version": "v0.1.1",
@@ -288,6 +361,311 @@
},
"time": "2019-12-04T15:06:13+00:00"
},
+ {
+ "name": "doctrine/cache",
+ "version": "1.10.2",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/cache.git",
+ "reference": "13e3381b25847283a91948d04640543941309727"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/cache/zipball/13e3381b25847283a91948d04640543941309727",
+ "reference": "13e3381b25847283a91948d04640543941309727",
+ "shasum": ""
+ },
+ "require": {
+ "php": "~7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/common": ">2.2,<2.4"
+ },
+ "require-dev": {
+ "alcaeus/mongo-php-adapter": "^1.1",
+ "doctrine/coding-standard": "^6.0",
+ "mongodb/mongodb": "^1.1",
+ "phpunit/phpunit": "^7.0",
+ "predis/predis": "~1.0"
+ },
+ "suggest": {
+ "alcaeus/mongo-php-adapter": "Required to use legacy MongoDB driver"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.9.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\Cache\\": "lib/Doctrine/Common/Cache"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ }
+ ],
+ "description": "PHP Doctrine Cache library is a popular cache implementation that supports many different drivers such as redis, memcache, apc, mongodb and others.",
+ "homepage": "https://www.doctrine-project.org/projects/cache.html",
+ "keywords": [
+ "abstraction",
+ "apcu",
+ "cache",
+ "caching",
+ "couchdb",
+ "memcached",
+ "php",
+ "redis",
+ "xcache"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/cache/issues",
+ "source": "https://github.com/doctrine/cache/tree/1.10.x"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fcache",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-07-07T18:54:01+00:00"
+ },
+ {
+ "name": "doctrine/dbal",
+ "version": "3.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/dbal.git",
+ "reference": "ee6d1260d5cc20ec506455a585945d7bdb98662c"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/dbal/zipball/ee6d1260d5cc20ec506455a585945d7bdb98662c",
+ "reference": "ee6d1260d5cc20ec506455a585945d7bdb98662c",
+ "shasum": ""
+ },
+ "require": {
+ "composer/package-versions-deprecated": "^1.11.99",
+ "doctrine/cache": "^1.0",
+ "doctrine/event-manager": "^1.0",
+ "php": "^7.3 || ^8.0"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^8.1",
+ "jetbrains/phpstorm-stubs": "^2019.1",
+ "phpstan/phpstan": "^0.12.40",
+ "phpstan/phpstan-strict-rules": "^0.12.2",
+ "phpunit/phpunit": "^9.4",
+ "psalm/plugin-phpunit": "^0.10.0",
+ "symfony/console": "^2.0.5|^3.0|^4.0|^5.0",
+ "vimeo/psalm": "^3.17.2"
+ },
+ "suggest": {
+ "symfony/console": "For helpful console commands such as SQL execution and import of files."
+ },
+ "bin": [
+ "bin/doctrine-dbal"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "4.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\DBAL\\": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ }
+ ],
+ "description": "Powerful PHP database abstraction layer (DBAL) with many features for database schema introspection and management.",
+ "homepage": "https://www.doctrine-project.org/projects/dbal.html",
+ "keywords": [
+ "abstraction",
+ "database",
+ "db2",
+ "dbal",
+ "mariadb",
+ "mssql",
+ "mysql",
+ "oci8",
+ "oracle",
+ "pdo",
+ "pgsql",
+ "postgresql",
+ "queryobject",
+ "sasql",
+ "sql",
+ "sqlite",
+ "sqlserver",
+ "sqlsrv"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/dbal/issues",
+ "source": "https://github.com/doctrine/dbal/tree/3.0.0"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fdbal",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-11-15T18:20:41+00:00"
+ },
+ {
+ "name": "doctrine/event-manager",
+ "version": "1.1.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/event-manager.git",
+ "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f"
+ },
+ "dist": {
+ "type": "zip",
+ "url": "https://api.github.com/repos/doctrine/event-manager/zipball/41370af6a30faa9dc0368c4a6814d596e81aba7f",
+ "reference": "41370af6a30faa9dc0368c4a6814d596e81aba7f",
+ "shasum": ""
+ },
+ "require": {
+ "php": "^7.1 || ^8.0"
+ },
+ "conflict": {
+ "doctrine/common": "<2.9@dev"
+ },
+ "require-dev": {
+ "doctrine/coding-standard": "^6.0",
+ "phpunit/phpunit": "^7.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Common\\": "lib/Doctrine/Common"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Guilherme Blanco",
+ "email": "guilhermeblanco@gmail.com"
+ },
+ {
+ "name": "Roman Borschel",
+ "email": "roman@code-factory.org"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "kontakt@beberlei.de"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "jonwage@gmail.com"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "schmittjoh@gmail.com"
+ },
+ {
+ "name": "Marco Pivetta",
+ "email": "ocramius@gmail.com"
+ }
+ ],
+ "description": "The Doctrine Event Manager is a simple PHP event system that was built to be used with the various Doctrine projects.",
+ "homepage": "https://www.doctrine-project.org/projects/event-manager.html",
+ "keywords": [
+ "event",
+ "event dispatcher",
+ "event manager",
+ "event system",
+ "events"
+ ],
+ "support": {
+ "issues": "https://github.com/doctrine/event-manager/issues",
+ "source": "https://github.com/doctrine/event-manager/tree/1.1.x"
+ },
+ "funding": [
+ {
+ "url": "https://www.doctrine-project.org/sponsorship.html",
+ "type": "custom"
+ },
+ {
+ "url": "https://www.patreon.com/phpdoctrine",
+ "type": "patreon"
+ },
+ {
+ "url": "https://tidelift.com/funding/github/packagist/doctrine%2Fevent-manager",
+ "type": "tidelift"
+ }
+ ],
+ "time": "2020-05-29T18:28:51+00:00"
+ },
{
"name": "doctrine/inflector",
"version": "2.0.3",
diff --git a/database/migrations/2021_01_20_192143_image_watermark.php b/database/migrations/2021_01_20_192143_image_watermark.php
new file mode 100644
index 0000000..82d4e00
--- /dev/null
+++ b/database/migrations/2021_01_20_192143_image_watermark.php
@@ -0,0 +1,35 @@
+unsignedBigInteger("gallery")->nullable()->change();
+ $table->enum("typ", ["gallery", "watermark"])->default("gallery");
+ });
+
+ Schema::table("tenants", function (Blueprint $table) {
+ $table->unsignedBigInteger("watermark")->nullable()->default(null);
+ });
+ }
+
+ /**
+ * Reverse the migrations.
+ *
+ * @return void
+ */
+ public function down()
+ {
+ //
+ }
+}
diff --git a/resources/views/tenant/watermark.blade.php b/resources/views/tenant/watermark.blade.php
new file mode 100644
index 0000000..3c303d9
--- /dev/null
+++ b/resources/views/tenant/watermark.blade.php
@@ -0,0 +1,21 @@
+@extends('layout/template')
+
+@section('content')
+ Watermark
+ @if ($errors->any())
+
+
+ @foreach ($errors->all() as $error)
+ - {{ $error }}
+ @endforeach
+
+
+ @endif
+
+
+@endsection
+
diff --git a/routes/web.php b/routes/web.php
index e82d7ae..c795751 100644
--- a/routes/web.php
+++ b/routes/web.php
@@ -45,6 +45,8 @@ Route::middleware([\App\Http\Middleware\TenanMiddleware::class])->group(function
Route::get("/g/{url}/setDefault", [\App\Http\Controllers\GalleryController::class, 'setDefault']);
Route::get("/g/{url}/delete", [\App\Http\Controllers\GalleryController::class, 'deleteImage']);
Route::post("/g/{url}/save", [\App\Http\Controllers\GalleryController::class, 'saveImage']);
+ Route::get("/s/watermark", [\App\Http\Controllers\TenantController::class, 'watermarkView']);
+ Route::post("/s/watermark", [\App\Http\Controllers\TenantController::class, 'watermarkSave']);
});
Route::get("/{name}", [\App\Http\Controllers\PublicController::class, 'listGalleriesView'])->middleware([\App\Http\Middleware\TenanMiddleware::class]);