s3
This commit is contained in:
parent
6c2cc20405
commit
b539e36ab9
12 changed files with 1309 additions and 446 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -3,3 +3,4 @@
|
|||
Homestead.json
|
||||
Homestead.yaml
|
||||
.env
|
||||
storage/icon
|
||||
|
|
|
@ -1,12 +1,17 @@
|
|||
FROM php:7.3-apache
|
||||
|
||||
RUN apt-get update
|
||||
RUN apt-get install -y libpng-dev
|
||||
|
||||
RUN docker-php-ext-install mysqli
|
||||
RUN docker-php-ext-install pdo pdo_mysql
|
||||
RUN docker-php-ext-install gd
|
||||
|
||||
RUN a2enmod rewrite
|
||||
|
||||
ADD ./ /var/www
|
||||
|
||||
RUN chmod uog+rwx /var/www/storage/logs
|
||||
RUN chmod uog+rwx /var/www/storage
|
||||
|
||||
WORKDIR /var/www
|
||||
WORKDIR /var/www
|
||||
|
|
|
@ -12,8 +12,10 @@ use App\Http\Resources\API\AppForOwner;
|
|||
use App\Http\Resources\API\AppUser;
|
||||
use App\Models\Setting;
|
||||
use App\Models\User;
|
||||
use Aws\S3\S3Client;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
use Laravel\Lumen\Routing\Controller as BaseController;
|
||||
use TaGeSo\APIResponse\Response;
|
||||
|
||||
|
@ -160,6 +162,53 @@ class AppController extends BaseController
|
|||
return $response->withData(AppUser::collection($access));
|
||||
}
|
||||
|
||||
public function changeImage(Request $request, Response $response, $id) {
|
||||
if(!Auth::check()) {
|
||||
throw new NotLoggedInException();
|
||||
}
|
||||
|
||||
$newTmp = tempnam("", "icon_upload");
|
||||
$request->file("img")->move("/tmp", $newTmp);
|
||||
$info = getimagesize($newTmp);
|
||||
Log::debug("Image sitze", $info);
|
||||
Log::debug("File size ".filesize($newTmp));
|
||||
if($info["0"] != $info["1"]) {
|
||||
throw new HTTPException(400, "Image must be a squader.");
|
||||
}
|
||||
|
||||
if($info[0] > 1000) {
|
||||
throw new HTTPException(400, "Image is to big, max 1000 px.");
|
||||
}
|
||||
if($info[0] < 50) {
|
||||
throw new HTTPException(400, "Image is to small, min 50 px.");
|
||||
}
|
||||
|
||||
$app = \App\Models\App::query()->where("id", "=", $id)->firstOrFail();
|
||||
|
||||
if($app->user_id != Auth::user()->id) {
|
||||
throw new NoPermissionException(403, "Not your app (".$app->user_id."/".Auth::user()->id.")");
|
||||
}
|
||||
|
||||
$image = imagecreatefrompng($newTmp);
|
||||
imagepng($image, $newTmp."2", 2);
|
||||
|
||||
Log::debug("New File size ".filesize($newTmp."2"));
|
||||
|
||||
$s3 = app(S3Client::class);
|
||||
|
||||
$result = $s3->putObject([
|
||||
"Bucket" => getenv("S3_Bucket"),
|
||||
"Key" => "icons/icon_".$app->id.".png",
|
||||
"SourceFile" => $newTmp,
|
||||
'ACL' => 'public-read'
|
||||
]);
|
||||
|
||||
$app->iconURL = $result['ObjectURL'];
|
||||
$app->saveOrFail();
|
||||
|
||||
return $response->withData(["url" => $result['ObjectURL']]);
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@ use App\Http\Controllers\Controller;
|
|||
use App\Http\Resources\oAuth\AccessToken;
|
||||
use App\Models\App;
|
||||
use App\Models\User;
|
||||
use Aws\S3\S3Client;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
|
||||
|
@ -101,21 +102,44 @@ class AppController extends Controller
|
|||
echo "Its not your app. <a href='/gui/apps/".$id."'>Zurück</a>";exit();
|
||||
}
|
||||
|
||||
$app->icon = file_get_contents($newTmp);
|
||||
$s3 = app(S3Client::class);
|
||||
|
||||
$result = $s3->putObject([
|
||||
"Bucket" => getenv("S3_Bucket"),
|
||||
"Key" => "icons/icon_".$app->id.".png",
|
||||
"SourceFile" => $newTmp,
|
||||
'ACL' => 'public-read'
|
||||
]);
|
||||
|
||||
$app->iconURL = $result['ObjectURL'];
|
||||
$app->saveOrFail();
|
||||
|
||||
return redirect('/gui/apps/'.$id);
|
||||
}
|
||||
|
||||
public function getAppIcon($id) {
|
||||
$app = App::query()->where("id", "=", $id)->firstOrFail();
|
||||
|
||||
if(empty($app->icon)) {
|
||||
$app->icon = file_get_contents(resource_path("images/app.png"));
|
||||
if(!is_dir(storage_path("icon"))) {
|
||||
mkdir(storage_path("icon"));
|
||||
}
|
||||
|
||||
$r = getimagesizefromstring($app->icon);
|
||||
$cacheFile = storage_path("icon/".$app->id.".png");
|
||||
|
||||
return response($app->icon)
|
||||
if(file_exists($cacheFile)) {
|
||||
$icon = file_get_contents($cacheFile);
|
||||
} else {
|
||||
if(!empty($app->iconURL)) {
|
||||
$icon = file_get_contents($app->iconURL);
|
||||
file_put_contents($cacheFile, $icon);
|
||||
} else {
|
||||
$icon = file_get_contents(resource_path("images/app.png"));
|
||||
}
|
||||
}
|
||||
|
||||
$r = getimagesizefromstring($icon);
|
||||
|
||||
return response($icon)
|
||||
->header('Content-Type',$r["mime"]);
|
||||
}
|
||||
|
||||
|
|
|
@ -35,4 +35,4 @@ class CorsMiddleware
|
|||
|
||||
return $response;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -20,6 +20,7 @@ class App extends JsonResource
|
|||
'description' => $this->description,
|
||||
'directUrl' => $this->direct_url,
|
||||
'url' => $this->url,
|
||||
'iconURL' => $this->iconURL,
|
||||
'properties' => [
|
||||
'testingWarning' => (bool)$this->testing_warning,
|
||||
#'autoAccept' => (bool)$this->auto_accept,
|
||||
|
@ -41,4 +42,4 @@ class App extends JsonResource
|
|||
]
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,6 +24,7 @@ class AppForOwner extends JsonResource
|
|||
'directUrl' => $this->direct_url,
|
||||
'apiKey' => $this->apiKey,
|
||||
'apiSecret' => $this->apiSecret,
|
||||
'iconURL' => $this->iconURL,
|
||||
'properties' => [
|
||||
'testingWarning' => (bool)$this->testing_warning,
|
||||
'autoAccept' => (bool)$this->auto_accept,
|
||||
|
@ -46,4 +47,4 @@ class AppForOwner extends JsonResource
|
|||
|
||||
];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace App\Providers;
|
||||
|
||||
use Aws\S3\S3Client;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Support\ServiceProvider;
|
||||
|
||||
|
@ -19,6 +20,16 @@ class AppServiceProvider extends ServiceProvider
|
|||
*/
|
||||
public function register()
|
||||
{
|
||||
//
|
||||
$this->app->singleton(S3Client::class, function() {
|
||||
$s3 = new S3Client([
|
||||
'region' => 'eu-west-1',
|
||||
'version' => 'latest',
|
||||
'credentials' => [
|
||||
'key' => getenv("S3_ACCESS_KEY"),
|
||||
'secret' => getenv("S3_SECRET")
|
||||
]
|
||||
]);
|
||||
return $s3;
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,7 +10,8 @@
|
|||
"vlucas/phpdotenv": "^3.3",
|
||||
"phpmailer/phpmailer": "~6.0",
|
||||
"tageso/api-response": "*",
|
||||
"google/recaptcha": "^1.2"
|
||||
"google/recaptcha": "^1.2",
|
||||
"aws/aws-sdk-php":"^3."
|
||||
},
|
||||
"require-dev": {
|
||||
"fzaninotto/faker": "^1.4",
|
||||
|
|
1601
composer.lock
generated
1601
composer.lock
generated
File diff suppressed because it is too large
Load diff
36
database/migrations/2019_09_24_132403_app_icon_url.php
Normal file
36
database/migrations/2019_09_24_132403_app_icon_url.php
Normal file
|
@ -0,0 +1,36 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class AppIconUrl extends Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function up()
|
||||
{
|
||||
Schema::table('apps', function (Blueprint $table) {
|
||||
$table->removeColumn("icon");
|
||||
$table->string("iconURL", 500)->nullable()->comment("Public link to icon");
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migrations.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function down()
|
||||
{
|
||||
Schema::table('apps', function (Blueprint $table) {
|
||||
$table->binary("icon")->nullable()->default(null)->comment("200x200 Image as Icon");
|
||||
$table->removeColumn("iconURL");
|
||||
});
|
||||
|
||||
//
|
||||
}
|
||||
}
|
|
@ -57,6 +57,7 @@ $router->group(['prefix' => 'api'], function () use ($router) {
|
|||
$router->get("/access", ["uses" => "API\oAuthController@getAccess"]);
|
||||
$router->post("/access/allow", ["uses" => "API\oAuthController@allowAccess"]);
|
||||
$router->get("/user", ["uses" => "API\AppController@getUsers"]);
|
||||
$router->post("/changeImage", ["uses" => "API\AppController@changeImage"]);
|
||||
});
|
||||
});
|
||||
$router->group(['prefix' => 'account'], function () use ($router) {
|
||||
|
@ -123,4 +124,4 @@ $router->group(['prefix' => 'gui', 'middleware' => 'gui'], function () use ($rou
|
|||
|
||||
$router->get('/access', ['uses' => 'GUI\AccessController@listAccess']);
|
||||
$router->get('/access/rm', ['uses' => 'GUI\AccessController@removeAccess']);
|
||||
});
|
||||
});
|
||||
|
|
Reference in a new issue