webworld888/migrations/MediaLibraryMigration.php
2021-10-26 19:14:12 +09:00

298 lines
8.5 KiB
PHP

<?php
/**
* MediaLibraryMigration.php
*
* PHP version 7
*
* @category MediaLibrary
* @package Xpressengine\MediaLibrary
* @author XE Developers <developers@xpressengine.com>
* @copyright 2020 Copyright (C) XEHub. <https://xehub.io>
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPL-2.1
* @link https://xpressengine.io
*/
namespace Xpressengine\Migrations;
use Illuminate\Database\Schema\Blueprint;
use XeStorage;
use Xpressengine\MediaLibrary\Models\MediaLibraryFile;
use Xpressengine\MediaLibrary\Models\MediaLibraryFolder;
use Xpressengine\Support\Migration;
use Schema;
/**
* MediaLibraryMigration.php
*
* PHP version 7
*
* @category MediaLibrary
* @package Xpressengine\MediaLibrary
* @author XE Developers <developers@xpressengine.com>
* @copyright 2020 Copyright (C) XEHub. <https://xehub.io>
* @license http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html LGPL-2.1
* @link https://xpressengine.io
*/
class MediaLibraryMigration extends Migration
{
private $fileTableName = 'media_library_files';
private $folderTableName = 'media_library_folders';
private $closureTableName = 'media_library_folder_closure';
/**
* 서비스에 필요한 자체 환경(타 서비스와 연관이 없는 환경)을 구축한다.
* 서비스의 db table 생성과 같은 migration 코드를 작성한다.
*
* @return mixed
*/
public function install()
{
$this->createTables();
}
/**
* 서비스에 필요한 환경(타 서비스와 연관된 환경)을 구축한다.
* db seeding과 같은 코드를 작성한다.
* @return void
*/
public function installed()
{
$this->storeConfig();
}
/**
* 서비스가 구동된 이후에 실행되므로 다양한 서비스를 사용하여 코드를 작성할 수 있다.
*
* @return void
*/
public function init()
{
if ($this->checkExistRootFolder() == false) {
$this->storeRootFolder();
}
}
/**
* 서비스가 구동되는데에 직접적인 연관은 없으나, XE 설치후 기본적인 메뉴구성이나 컨텐츠를 구성하는 코드를 작성한다.
*
* @return void
*/
public function initialized()
{
}
/**
* 서비스가 업데이트되었을 경우, update()메소드를 실행해야 하는지의 여부를 체크한다.
* update()메소드를 실행해야 한다면 false를 반환한다.
*
* @param string $installedVersion current version
*
* @return bool
*/
public function checkUpdated($installedVersion = null)
{
if ($this->checkExistConfig() === false) {
return false;
}
if ($this->checkExistTables() === false) {
return false;
}
if ($this->checkExistRootFolder() === false) {
return false;
}
if ($this->checkExistOriginFileIdColumn() === false) {
return false;
}
if ($this->checkAllFileHasUseCount() === false) {
return false;
}
return true;
}
/**
* 미디어라이브러리를 통해서 업로드 된 모든 file이 use_count를 가지고 있는지 확인
*
* @return bool
*/
private function checkAllFileHasUseCount()
{
if (MediaLibraryFile::whereHas('file', function ($query) {
$query->where('use_count', 0);
})->exists() === true) {
return false;
}
if (MediaLibraryFile::whereHas('originFile', function ($query) {
$query->where('use_count', 0);
})->exists() === true) {
return false;
}
return true;
}
/**
* 미디어라이브러리 파일이 가지고 있는 모든 file의 use_count를 업데이트
*
* @return void
*/
private function updateFileUseCount()
{
$fileUpdateMediaLibraryFiles = MediaLibraryFile::whereHas('file', function ($query) {
$query->where('use_count', 0);
})->get();
foreach ($fileUpdateMediaLibraryFiles as $mediaLibraryFile) {
XeStorage::bind($mediaLibraryFile->id, $mediaLibraryFile->file);
}
$originFileUpdateMediaLibraryFiles = MediaLibraryFile::whereHas('originFile', function ($query) {
$query->where('use_count', 0);
})->get();
foreach ($originFileUpdateMediaLibraryFiles as $mediaLibraryFile) {
XeStorage::bind($mediaLibraryFile->id, $mediaLibraryFile->originFile);
}
}
/**
* update 코드를 실행한다.
*
* @param string $installedVersion current version
*
* @return void
*/
public function update($installedVersion = null)
{
if ($this->checkExistConfig() === false) {
$this->storeConfig();
}
if ($this->checkExistTables() === false) {
$this->createTables();
}
if ($this->checkExistRootFolder() === false) {
$this->storeRootFolder();
}
if ($this->checkExistOriginFileIdColumn() === false) {
$this->createOriginFileIdColumn();
}
if ($this->checkAllFileHasUseCount() === false) {
$this->updateFileUseCount();
}
}
private function checkExistTables()
{
return Schema::hasTable($this->fileTableName) &&
Schema::hasTable($this->folderTableName) &&
Schema::hasTable($this->closureTableName);
}
private function createTables()
{
if (Schema::hasTable($this->fileTableName) == false) {
Schema::create($this->fileTableName, function (Blueprint $table) {
$table->string('id', 36);
$table->string('file_id', 36);
$table->string('folder_id', 36);
$table->string('user_id', 36)->nullable();
$table->string('title')->nullable();
$table->string('ext')->nullable();
$table->string('caption')->nullable();
$table->string('alt_text')->nullable();
$table->text('description')->nullable();
$table->timestamps();
$table->primary('id');
$table->index('folder_id');
});
}
if (Schema::hasTable($this->folderTableName) == false) {
Schema::create($this->folderTableName, function (Blueprint $table) {
$table->string('id', 36);
$table->string('parent_id', 36);
$table->string('disk');
$table->string('name');
$table->integer('ordering');
$table->timestamps();
$table->index('id');
});
}
if (Schema::hasTable($this->closureTableName) == false) {
Schema::create($this->closureTableName, function (Blueprint $table) {
$table->increments('id');
$table->string('ancestor', 36);
$table->string('descendant', 36);
$table->integer('depth');
$table->index('ancestor');
$table->index('descendant');
});
}
}
private function checkExistOriginFileIdColumn()
{
return Schema::hasColumn($this->fileTableName, 'origin_file_id');
}
private function createOriginFileIdColumn()
{
Schema::table($this->fileTableName, function (Blueprint $table) {
$table->string('origin_file_id', 36)->nullable()->after('file_id');
});
}
private function checkExistConfig()
{
return \DB::table('config')->where('name', 'media_library')->exists();
}
private function storeConfig()
{
\DB::table('config')->insert([
'name' => 'media_library',
'vars' => '{"container":{}, "file":{"dimensions":{"MAX":{"width":4000, "height":4000}}}}'
]);
}
private function checkExistRootFolder()
{
return \DB::table($this->folderTableName)->where('name', '/')->exists();
}
private function storeRootFolder()
{
//TODO root 폴더 정보 config에 등록
$rootFolderAttributes = [
'parent_id' => '',
'disk' => 'media',
'name' => '/',
'ordering' => 0
];
$rootFolderModel = new MediaLibraryFolder();
$rootFolderModel->fill($rootFolderAttributes);
$rootFolderModel->save();
$rootFolderModel->ancestors()->attach($rootFolderModel->getKey(), [$rootFolderModel->getDepthName() => 0]);
}
}