first commit
This commit is contained in:
@@ -0,0 +1,64 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file classes/migration/install/JournalsMigration.php
|
||||
*
|
||||
* Copyright (c) 2014-2022 Simon Fraser University
|
||||
* Copyright (c) 2000-2022 John Willinsky
|
||||
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
||||
*
|
||||
* @class JournalsMigration
|
||||
*
|
||||
* @brief Describe database table structures.
|
||||
*/
|
||||
|
||||
namespace APP\migration\install;
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class JournalsMigration extends \PKP\migration\Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
// Journals and basic journal settings.
|
||||
Schema::create('journals', function (Blueprint $table) {
|
||||
$table->comment('A list of all journals in the installation of OJS.');
|
||||
$table->bigInteger('journal_id')->autoIncrement();
|
||||
$table->string('path', 32);
|
||||
$table->float('seq', 8, 2)->default(0)->comment('Used to order lists of journals');
|
||||
$table->string('primary_locale', 14);
|
||||
$table->smallInteger('enabled')->default(1)->comment('Controls whether or not the journal is considered "live" and will appear on the website. (Note that disabled journals may still be accessible, but only if the user knows the URL.)');
|
||||
$table->unique(['path'], 'journals_path');
|
||||
$table->bigInteger('current_issue_id')->nullable()->default(null);
|
||||
});
|
||||
|
||||
// Journal settings.
|
||||
Schema::create('journal_settings', function (Blueprint $table) {
|
||||
$table->comment('More data about journals, including localized properties like policies.');
|
||||
$table->bigIncrements('journal_setting_id');
|
||||
|
||||
$table->bigInteger('journal_id');
|
||||
$table->foreign('journal_id', 'journal_settings_journal_id')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['journal_id'], 'journal_settings_journal_id');
|
||||
|
||||
$table->string('locale', 14)->default('');
|
||||
$table->string('setting_name', 255);
|
||||
$table->mediumText('setting_value')->nullable();
|
||||
|
||||
$table->unique(['journal_id', 'locale', 'setting_name'], 'journal_settings_unique');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migration.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::drop('journal_settings');
|
||||
Schema::drop('journals');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,422 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file classes/migration/install/MetricsMigration.php
|
||||
*
|
||||
* Copyright (c) 2022 Simon Fraser University
|
||||
* Copyright (c) 2022 John Willinsky
|
||||
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
||||
*
|
||||
* @class MetricsMigration
|
||||
*
|
||||
* @brief Describe database table structures.
|
||||
*/
|
||||
|
||||
namespace APP\migration\install;
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema as Schema;
|
||||
|
||||
class MetricsMigration extends \PKP\migration\Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
Schema::create('metrics_context', function (Blueprint $table) {
|
||||
$table->comment('Daily statistics for views of the homepage.');
|
||||
$table->bigIncrements('metrics_context_id');
|
||||
|
||||
$table->string('load_id', 50);
|
||||
$table->index(['load_id'], 'metrics_context_load_id');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'metrics_context_context_id');
|
||||
|
||||
$table->date('date');
|
||||
$table->integer('metric');
|
||||
});
|
||||
|
||||
Schema::create('metrics_submission', function (Blueprint $table) {
|
||||
$table->comment('Daily statistics for views and downloads of published submissions and galleys.');
|
||||
$table->bigIncrements('metrics_submission_id');
|
||||
$table->string('load_id', 50);
|
||||
$table->index(['load_id'], 'ms_load_id');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'metrics_submission_context_id');
|
||||
|
||||
$table->bigInteger('submission_id');
|
||||
$table->foreign('submission_id')->references('submission_id')->on('submissions')->onDelete('cascade');
|
||||
$table->index(['submission_id'], 'metrics_submission_submission_id');
|
||||
|
||||
$table->bigInteger('representation_id')->nullable();
|
||||
$table->foreign('representation_id')->references('galley_id')->on('publication_galleys')->onDelete('cascade');
|
||||
$table->index(['representation_id'], 'metrics_submission_representation_id');
|
||||
|
||||
$table->bigInteger('submission_file_id')->unsigned()->nullable();
|
||||
$table->foreign('submission_file_id')->references('submission_file_id')->on('submission_files')->onDelete('cascade');
|
||||
$table->index(['submission_file_id'], 'metrics_submission_submission_file_id');
|
||||
|
||||
$table->bigInteger('file_type')->nullable();
|
||||
$table->bigInteger('assoc_type');
|
||||
$table->date('date');
|
||||
$table->integer('metric');
|
||||
|
||||
$table->index(['context_id', 'submission_id', 'assoc_type', 'file_type'], 'ms_context_id_submission_id_assoc_type_file_type');
|
||||
});
|
||||
|
||||
Schema::create('metrics_issue', function (Blueprint $table) {
|
||||
$table->comment('Daily statistics for views and downloads of published issues.');
|
||||
$table->bigIncrements('metrics_issue_id');
|
||||
|
||||
$table->string('load_id', 50);
|
||||
$table->index(['load_id'], 'metrics_issue_load_id');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'metrics_issue_context_id');
|
||||
|
||||
$table->bigInteger('issue_id');
|
||||
$table->foreign('issue_id')->references('issue_id')->on('issues')->onDelete('cascade');
|
||||
$table->index(['issue_id'], 'metrics_issue_issue_id');
|
||||
|
||||
$table->bigInteger('issue_galley_id')->nullable();
|
||||
$table->foreign('issue_galley_id')->references('galley_id')->on('issue_galleys')->onDelete('cascade');
|
||||
$table->index(['issue_galley_id'], 'metrics_issue_issue_galley_id');
|
||||
|
||||
$table->date('date');
|
||||
$table->integer('metric');
|
||||
|
||||
$table->index(['context_id', 'issue_id'], 'metrics_issue_context_id_issue_id');
|
||||
});
|
||||
|
||||
Schema::create('metrics_counter_submission_daily', function (Blueprint $table) {
|
||||
$table->comment('Daily statistics matching the COUNTER R5 protocol for views and downloads of published submissions and galleys.');
|
||||
$table->bigIncrements('metrics_counter_submission_daily_id');
|
||||
|
||||
$table->string('load_id', 50);
|
||||
$table->index(['load_id'], 'msd_load_id');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id', 'msd_context_id_foreign')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'metrics_counter_submission_daily_context_id');
|
||||
|
||||
$table->bigInteger('submission_id');
|
||||
$table->foreign('submission_id', 'msd_submission_id_foreign')->references('submission_id')->on('submissions')->onDelete('cascade');
|
||||
$table->index(['submission_id'], 'metrics_counter_submission_daily_submission_id');
|
||||
|
||||
$table->date('date');
|
||||
$table->integer('metric_investigations');
|
||||
$table->integer('metric_investigations_unique');
|
||||
$table->integer('metric_requests');
|
||||
$table->integer('metric_requests_unique');
|
||||
|
||||
$table->index(['context_id', 'submission_id'], 'msd_context_id_submission_id');
|
||||
$table->unique(['load_id', 'context_id', 'submission_id', 'date'], 'msd_uc_load_id_context_id_submission_id_date');
|
||||
});
|
||||
|
||||
Schema::create('metrics_counter_submission_monthly', function (Blueprint $table) {
|
||||
$table->comment('Monthly statistics matching the COUNTER R5 protocol for views and downloads of published submissions and galleys.');
|
||||
$table->bigIncrements('metrics_counter_submission_monthly_id');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id', 'msm_context_id_foreign')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'metrics_counter_submission_monthly_context_id');
|
||||
|
||||
$table->bigInteger('submission_id');
|
||||
$table->foreign('submission_id', 'msm_submission_id_foreign')->references('submission_id')->on('submissions')->onDelete('cascade');
|
||||
$table->index(['submission_id'], 'metrics_counter_submission_monthly_submission_id');
|
||||
|
||||
$table->integer('month');
|
||||
$table->integer('metric_investigations');
|
||||
$table->integer('metric_investigations_unique');
|
||||
$table->integer('metric_requests');
|
||||
$table->integer('metric_requests_unique');
|
||||
|
||||
$table->index(['context_id', 'submission_id'], 'msm_context_id_submission_id');
|
||||
$table->unique(['context_id', 'submission_id', 'month'], 'msm_uc_context_id_submission_id_month');
|
||||
});
|
||||
|
||||
Schema::create('metrics_counter_submission_institution_daily', function (Blueprint $table) {
|
||||
$table->comment('Daily statistics matching the COUNTER R5 protocol for views and downloads from institutions.');
|
||||
$table->bigIncrements('metrics_counter_submission_institution_daily_id');
|
||||
$table->string('load_id', 50);
|
||||
$table->index(['load_id'], 'msid_load_id');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id', 'msid_context_id_foreign')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'metrics_counter_submission_institution_daily_context_id');
|
||||
|
||||
$table->bigInteger('submission_id');
|
||||
$table->foreign('submission_id', 'msid_submission_id_foreign')->references('submission_id')->on('submissions')->onDelete('cascade');
|
||||
$table->index(['submission_id'], 'metrics_counter_submission_institution_daily_submission_id');
|
||||
|
||||
$table->bigInteger('institution_id');
|
||||
$table->foreign('institution_id', 'msid_institution_id_foreign')->references('institution_id')->on('institutions')->onDelete('cascade');
|
||||
$table->index(['institution_id'], 'metrics_counter_submission_institution_daily_institution_id');
|
||||
|
||||
$table->date('date');
|
||||
$table->integer('metric_investigations');
|
||||
$table->integer('metric_investigations_unique');
|
||||
$table->integer('metric_requests');
|
||||
$table->integer('metric_requests_unique');
|
||||
|
||||
$table->index(['context_id', 'submission_id'], 'msid_context_id_submission_id');
|
||||
$table->unique(['load_id', 'context_id', 'submission_id', 'institution_id', 'date'], 'msid_uc_load_id_context_id_submission_id_institution_id_date');
|
||||
});
|
||||
|
||||
Schema::create('metrics_counter_submission_institution_monthly', function (Blueprint $table) {
|
||||
$table->comment('Monthly statistics matching the COUNTER R5 protocol for views and downloads from institutions.');
|
||||
$table->bigIncrements('metrics_counter_submission_institution_monthly_id');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id', 'msim_context_id_foreign')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'metrics_counter_submission_institution_monthly_context_id');
|
||||
|
||||
$table->bigInteger('submission_id');
|
||||
$table->foreign('submission_id', 'msim_submission_id_foreign')->references('submission_id')->on('submissions')->onDelete('cascade');
|
||||
$table->index(['submission_id'], 'metrics_counter_submission_institution_monthly_submission_id');
|
||||
|
||||
$table->bigInteger('institution_id');
|
||||
$table->foreign('institution_id', 'msim_institution_id_foreign')->references('institution_id')->on('institutions')->onDelete('cascade');
|
||||
$table->index(['institution_id'], 'metrics_counter_submission_institution_monthly_institution_id');
|
||||
|
||||
$table->integer('month');
|
||||
$table->integer('metric_investigations');
|
||||
$table->integer('metric_investigations_unique');
|
||||
$table->integer('metric_requests');
|
||||
$table->integer('metric_requests_unique');
|
||||
|
||||
$table->index(['context_id', 'submission_id'], 'msim_context_id_submission_id');
|
||||
$table->unique(['context_id', 'submission_id', 'institution_id', 'month'], 'msim_uc_context_id_submission_id_institution_id_month');
|
||||
});
|
||||
|
||||
Schema::create('metrics_submission_geo_daily', function (Blueprint $table) {
|
||||
$table->comment('Daily statistics by country, region and city for views and downloads of published submissions and galleys.');
|
||||
$table->bigIncrements('metrics_submission_geo_daily_id');
|
||||
|
||||
$table->string('load_id', 50);
|
||||
$table->index(['load_id'], 'msgd_load_id');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id', 'msgd_context_id_foreign')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'metrics_submission_geo_daily_context_id');
|
||||
|
||||
$table->bigInteger('submission_id');
|
||||
$table->foreign('submission_id', 'msgd_submission_id_foreign')->references('submission_id')->on('submissions')->onDelete('cascade');
|
||||
$table->index(['submission_id'], 'metrics_submission_geo_daily_submission_id');
|
||||
|
||||
$table->string('country', 2)->default('');
|
||||
$table->string('region', 3)->default('');
|
||||
$table->string('city', 255)->default('');
|
||||
$table->date('date');
|
||||
$table->integer('metric');
|
||||
$table->integer('metric_unique');
|
||||
|
||||
$table->index(['context_id', 'submission_id'], 'msgd_context_id_submission_id');
|
||||
switch (DB::getDriverName()) {
|
||||
case 'mysql':
|
||||
// See "Create a database table" here: https://db-ip.com/db/format/ip-to-city-lite/csv.html
|
||||
// where city is defined as varchar(80)
|
||||
$table->unique([DB::raw('load_id, context_id, submission_id, country, region, city(80), date')], 'msgd_uc_load_context_submission_c_r_c_date');
|
||||
break;
|
||||
case 'pgsql':
|
||||
$table->unique(['load_id', 'context_id', 'submission_id', 'country', 'region', 'city', 'date'], 'msgd_uc_load_context_submission_c_r_c_date');
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
Schema::create('metrics_submission_geo_monthly', function (Blueprint $table) {
|
||||
$table->comment('Monthly statistics by country, region and city for views and downloads of published submissions and galleys.');
|
||||
$table->bigIncrements('metrics_submission_geo_monthly_id');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id', 'msgm_context_id_foreign')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'metrics_submission_geo_monthly_context_id');
|
||||
|
||||
$table->bigInteger('submission_id');
|
||||
$table->foreign('submission_id', 'msgm_submission_id_foreign')->references('submission_id')->on('submissions')->onDelete('cascade');
|
||||
$table->index(['submission_id'], 'metrics_submission_geo_monthly_submission_id');
|
||||
|
||||
$table->string('country', 2)->default('');
|
||||
$table->string('region', 3)->default('');
|
||||
$table->string('city', 255)->default('');
|
||||
$table->integer('month');
|
||||
$table->integer('metric');
|
||||
$table->integer('metric_unique');
|
||||
|
||||
$table->index(['context_id', 'submission_id'], 'msgm_context_id_submission_id');
|
||||
switch (DB::getDriverName()) {
|
||||
case 'mysql':
|
||||
// See "Create a database table" here: https://db-ip.com/db/format/ip-to-city-lite/csv.html
|
||||
// where city is defined as varchar(80)
|
||||
$table->unique([DB::raw('context_id, submission_id, country, region, city(80), month')], 'msgm_uc_context_submission_c_r_c_month');
|
||||
break;
|
||||
case 'pgsql':
|
||||
$table->unique(['context_id', 'submission_id', 'country', 'region', 'city', 'month'], 'msgm_uc_context_submission_c_r_c_month');
|
||||
break;
|
||||
}
|
||||
});
|
||||
|
||||
// Usage stats total item temporary records
|
||||
Schema::create('usage_stats_total_temporary_records', function (Blueprint $table) {
|
||||
$table->comment('Temporary stats totals based on visitor log records. Data in this table is provisional. See the metrics_* tables for compiled stats.');
|
||||
$table->bigIncrements('usage_stats_temp_total_id');
|
||||
|
||||
$table->dateTime('date', $precision = 0);
|
||||
$table->string('ip', 64);
|
||||
$table->string('user_agent', 255);
|
||||
$table->bigInteger('line_number');
|
||||
$table->string('canonical_url', 255);
|
||||
|
||||
$table->bigInteger('issue_id')->nullable();
|
||||
$table->foreign('issue_id', 'ust_issue_id_foreign')->references('issue_id')->on('issues')->onDelete('cascade');
|
||||
$table->index(['issue_id'], 'usage_stats_total_temporary_records_issue_id');
|
||||
|
||||
$table->bigInteger('issue_galley_id')->nullable();
|
||||
$table->foreign('issue_galley_id', 'ust_issue_galley_id_foreign')->references('galley_id')->on('issue_galleys')->onDelete('cascade');
|
||||
$table->index(['issue_galley_id'], 'usage_stats_total_temporary_records_issue_galley_id');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id', 'ust_context_id_foreign')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'usage_stats_total_temporary_records_context_id');
|
||||
|
||||
$table->bigInteger('submission_id')->nullable();
|
||||
$table->foreign('submission_id', 'ust_submission_id_foreign')->references('submission_id')->on('submissions')->onDelete('cascade');
|
||||
$table->index(['submission_id'], 'usage_stats_total_temporary_records_submission_id');
|
||||
|
||||
$table->bigInteger('representation_id')->nullable();
|
||||
$table->foreign('representation_id', 'ust_representation_id_foreign')->references('galley_id')->on('publication_galleys')->onDelete('cascade');
|
||||
$table->index(['representation_id'], 'usage_stats_total_temporary_records_representation_id');
|
||||
|
||||
$table->bigInteger('submission_file_id')->unsigned()->nullable();
|
||||
$table->foreign('submission_file_id', 'ust_submission_file_id_foreign')->references('submission_file_id')->on('submission_files')->onDelete('cascade');
|
||||
$table->index(['submission_file_id'], 'usage_stats_total_temporary_records_submission_file_id');
|
||||
|
||||
$table->bigInteger('assoc_type');
|
||||
$table->smallInteger('file_type')->nullable();
|
||||
$table->string('country', 2)->default('');
|
||||
$table->string('region', 3)->default('');
|
||||
$table->string('city', 255)->default('');
|
||||
$table->string('load_id', 50);
|
||||
|
||||
$table->index(['load_id', 'context_id', 'ip'], 'ust_load_id_context_id_ip');
|
||||
});
|
||||
|
||||
// Usage stats unique item investigations temporary records
|
||||
// No need to consider issue_id and issue_galley_id here because
|
||||
// investigations are only relevant/calculated on submission level.
|
||||
Schema::create('usage_stats_unique_item_investigations_temporary_records', function (Blueprint $table) {
|
||||
$table->comment('Temporary stats on unique downloads based on visitor log records. Data in this table is provisional. See the metrics_* tables for compiled stats.');
|
||||
$table->bigIncrements('usage_stats_temp_unique_item_id');
|
||||
|
||||
$table->dateTime('date', $precision = 0);
|
||||
$table->string('ip', 64);
|
||||
$table->string('user_agent', 255);
|
||||
$table->bigInteger('line_number');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id', 'usii_context_id_foreign')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'usii_context_id');
|
||||
|
||||
$table->bigInteger('submission_id');
|
||||
$table->foreign('submission_id', 'usii_submission_id_foreign')->references('submission_id')->on('submissions')->onDelete('cascade');
|
||||
$table->index(['submission_id'], 'usii_submission_id');
|
||||
|
||||
$table->bigInteger('representation_id')->nullable();
|
||||
$table->foreign('representation_id', 'usii_representation_id_foreign')->references('galley_id')->on('publication_galleys')->onDelete('cascade');
|
||||
$table->index(['representation_id'], 'usii_representation_id');
|
||||
|
||||
$table->bigInteger('submission_file_id')->unsigned()->nullable();
|
||||
$table->foreign('submission_file_id', 'usii_submission_file_id_foreign')->references('submission_file_id')->on('submission_files')->onDelete('cascade');
|
||||
$table->index(['submission_file_id'], 'usii_submission_file_id');
|
||||
|
||||
$table->bigInteger('assoc_type');
|
||||
$table->smallInteger('file_type')->nullable();
|
||||
$table->string('country', 2)->default('');
|
||||
$table->string('region', 3)->default('');
|
||||
$table->string('city', 255)->default('');
|
||||
$table->string('load_id', 50);
|
||||
|
||||
$table->index(['load_id', 'context_id', 'ip'], 'usii_load_id_context_id_ip');
|
||||
});
|
||||
|
||||
// Usage stats unique item requests temporary records
|
||||
// No need to consider issue_id and issue_galley_id here because
|
||||
// requests are only relevant/calculated on submission level.
|
||||
Schema::create('usage_stats_unique_item_requests_temporary_records', function (Blueprint $table) {
|
||||
$table->comment('Temporary stats on unique views based on visitor log records. Data in this table is provisional. See the metrics_* tables for compiled stats.');
|
||||
$table->bigIncrements('usage_stats_temp_item_id');
|
||||
$table->dateTime('date', $precision = 0);
|
||||
$table->string('ip', 64);
|
||||
$table->string('user_agent', 255);
|
||||
$table->bigInteger('line_number');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id', 'usir_context_id_foreign')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'usir_context_id');
|
||||
|
||||
$table->bigInteger('submission_id');
|
||||
$table->foreign('submission_id', 'usir_submission_id_foreign')->references('submission_id')->on('submissions')->onDelete('cascade');
|
||||
$table->index(['submission_id'], 'usir_submission_id');
|
||||
|
||||
$table->bigInteger('representation_id')->nullable();
|
||||
$table->foreign('representation_id', 'usir_representation_id_foreign')->references('galley_id')->on('publication_galleys')->onDelete('cascade');
|
||||
$table->index(['representation_id'], 'usir_representation_id');
|
||||
|
||||
$table->bigInteger('submission_file_id')->unsigned()->nullable();
|
||||
$table->foreign('submission_file_id', 'usir_submission_file_id_foreign')->references('submission_file_id')->on('submission_files')->onDelete('cascade');
|
||||
$table->index(['submission_file_id'], 'usir_submission_file_id');
|
||||
|
||||
$table->bigInteger('assoc_type');
|
||||
$table->smallInteger('file_type')->nullable();
|
||||
$table->string('country', 2)->default('');
|
||||
$table->string('region', 3)->default('');
|
||||
$table->string('city', 255)->default('');
|
||||
$table->string('load_id', 50);
|
||||
|
||||
$table->index(['load_id', 'context_id', 'ip'], 'usir_load_id_context_id_ip');
|
||||
});
|
||||
|
||||
// Usage stats institution temporary records
|
||||
// This table is needed because of data normalization
|
||||
Schema::create('usage_stats_institution_temporary_records', function (Blueprint $table) {
|
||||
$table->comment('Temporary stats for views and downloads from institutions based on visitor log records. Data in this table is provisional. See the metrics_* tables for compiled stats.');
|
||||
$table->bigIncrements('usage_stats_temp_institution_id');
|
||||
|
||||
$table->string('load_id', 50);
|
||||
$table->bigInteger('line_number');
|
||||
|
||||
$table->bigInteger('institution_id');
|
||||
$table->foreign('institution_id', 'usi_institution_id_foreign')->references('institution_id')->on('institutions')->onDelete('cascade');
|
||||
$table->index(['institution_id'], 'usi_institution_id');
|
||||
|
||||
$table->unique(['load_id', 'line_number', 'institution_id'], 'usitr_load_id_line_number_institution_id');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migration.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::drop('metrics_context');
|
||||
Schema::drop('metrics_submission');
|
||||
Schema::drop('metrics_issue');
|
||||
Schema::drop('metrics_counter_submission_daily');
|
||||
Schema::drop('metrics_counter_submission_monthly');
|
||||
Schema::drop('metrics_counter_submission_institution_daily');
|
||||
Schema::drop('metrics_counter_submission_institution_monthly');
|
||||
Schema::drop('metrics_submission_geo_daily');
|
||||
Schema::drop('metrics_submission_geo_monthly');
|
||||
Schema::drop('usage_stats_total_temporary_records');
|
||||
Schema::drop('usage_stats_unique_item_investigations_temporary_records');
|
||||
Schema::drop('usage_stats_unique_item_requests_temporary_records');
|
||||
Schema::drop('usage_stats_institution_temporary_records');
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,455 @@
|
||||
<?php
|
||||
|
||||
/**
|
||||
* @file classes/migration/install/OJSMigration.php
|
||||
*
|
||||
* Copyright (c) 2014-2021 Simon Fraser University
|
||||
* Copyright (c) 2000-2021 John Willinsky
|
||||
* Distributed under the GNU GPL v3. For full terms see the file docs/COPYING.
|
||||
*
|
||||
* @class OJSMigration
|
||||
*
|
||||
* @brief Describe database table structures.
|
||||
*/
|
||||
|
||||
namespace APP\migration\install;
|
||||
|
||||
use Illuminate\Database\Schema\Blueprint;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Illuminate\Support\Facades\Schema;
|
||||
|
||||
class OJSMigration extends \PKP\migration\Migration
|
||||
{
|
||||
/**
|
||||
* Run the migrations.
|
||||
*/
|
||||
public function up(): void
|
||||
{
|
||||
// Journal sections.
|
||||
Schema::create('sections', function (Blueprint $table) {
|
||||
$table->comment('A list of all sections into which submissions can be organized, forming the table of contents.');
|
||||
$table->bigInteger('section_id')->autoIncrement();
|
||||
|
||||
$table->bigInteger('journal_id');
|
||||
$table->foreign('journal_id', 'sections_journal_id')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['journal_id'], 'sections_journal_id');
|
||||
|
||||
$table->bigInteger('review_form_id')->nullable();
|
||||
$table->foreign('review_form_id', 'sections_review_form_id')->references('review_form_id')->on('review_forms')->onDelete('set null');
|
||||
$table->index(['review_form_id'], 'sections_review_form_id');
|
||||
|
||||
$table->float('seq', 8, 2)->default(0);
|
||||
$table->smallInteger('editor_restricted')->default(0);
|
||||
$table->smallInteger('meta_indexed')->default(0);
|
||||
$table->smallInteger('meta_reviewed')->default(1);
|
||||
$table->smallInteger('abstracts_not_required')->default(0);
|
||||
$table->smallInteger('hide_title')->default(0);
|
||||
$table->smallInteger('hide_author')->default(0);
|
||||
$table->smallInteger('is_inactive')->default(0);
|
||||
$table->bigInteger('abstract_word_count')->nullable();
|
||||
});
|
||||
|
||||
// Section-specific settings
|
||||
Schema::create('section_settings', function (Blueprint $table) {
|
||||
$table->comment('More data about sections, including localized properties like section titles.');
|
||||
$table->bigIncrements('section_setting_id');
|
||||
|
||||
$table->bigInteger('section_id');
|
||||
$table->foreign('section_id', 'section_settings_section_id')->references('section_id')->on('sections')->onDelete('cascade');
|
||||
$table->index(['section_id'], 'section_settings_section_id');
|
||||
|
||||
$table->string('locale', 14)->default('');
|
||||
$table->string('setting_name', 255);
|
||||
$table->mediumText('setting_value')->nullable();
|
||||
|
||||
$table->unique(['section_id', 'locale', 'setting_name'], 'section_settings_unique');
|
||||
});
|
||||
|
||||
// Journal issues.
|
||||
Schema::create('issues', function (Blueprint $table) {
|
||||
$table->comment('A list of all journal issues, with identifying information like year, number, volume, etc.');
|
||||
$table->bigInteger('issue_id')->autoIncrement();
|
||||
|
||||
$table->bigInteger('journal_id');
|
||||
$table->foreign('journal_id', 'issues_journal_id')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['journal_id'], 'issues_journal_id');
|
||||
|
||||
$table->smallInteger('volume')->nullable();
|
||||
$table->string('number', 40)->nullable();
|
||||
$table->smallInteger('year')->nullable();
|
||||
$table->smallInteger('published')->default(0);
|
||||
$table->datetime('date_published')->nullable();
|
||||
$table->datetime('date_notified')->nullable();
|
||||
$table->datetime('last_modified')->nullable();
|
||||
$table->smallInteger('access_status')->default(1);
|
||||
$table->datetime('open_access_date')->nullable();
|
||||
$table->smallInteger('show_volume')->default(0);
|
||||
$table->smallInteger('show_number')->default(0);
|
||||
$table->smallInteger('show_year')->default(0);
|
||||
$table->smallInteger('show_title')->default(0);
|
||||
$table->string('style_file_name', 90)->nullable();
|
||||
$table->string('original_style_file_name', 255)->nullable();
|
||||
$table->string('url_path', 64)->nullable();
|
||||
|
||||
$table->bigInteger('doi_id')->nullable();
|
||||
$table->foreign('doi_id')->references('doi_id')->on('dois')->nullOnDelete();
|
||||
$table->index(['doi_id'], 'issues_doi_id');
|
||||
|
||||
$table->index(['url_path'], 'issues_url_path');
|
||||
});
|
||||
|
||||
// Locale-specific issue data
|
||||
Schema::create('issue_settings', function (Blueprint $table) {
|
||||
$table->comment('More data about issues, including localized properties such as issue titles.');
|
||||
$table->bigIncrements('issue_setting_id');
|
||||
|
||||
$table->bigInteger('issue_id');
|
||||
$table->foreign('issue_id', 'issue_settings_issue_id')->references('issue_id')->on('issues')->onDelete('cascade');
|
||||
$table->index(['issue_id'], 'issue_settings_issue_id');
|
||||
|
||||
$table->string('locale', 14)->default('');
|
||||
$table->string('setting_name', 255);
|
||||
$table->mediumText('setting_value')->nullable();
|
||||
|
||||
$table->unique(['issue_id', 'locale', 'setting_name'], 'issue_settings_unique');
|
||||
});
|
||||
// Add partial index (DBMS-specific)
|
||||
switch (DB::getDriverName()) {
|
||||
case 'mysql': DB::unprepared('CREATE INDEX issue_settings_name_value ON issue_settings (setting_name(50), setting_value(150))');
|
||||
break;
|
||||
case 'pgsql': DB::unprepared("CREATE INDEX issue_settings_name_value ON issue_settings (setting_name, setting_value) WHERE setting_name IN ('medra::registeredDoi', 'datacite::registeredDoi')");
|
||||
break;
|
||||
}
|
||||
|
||||
Schema::create('issue_files', function (Blueprint $table) {
|
||||
$table->comment('Relationships between issues and issue files, such as cover images.');
|
||||
$table->bigInteger('file_id')->autoIncrement();
|
||||
|
||||
$table->bigInteger('issue_id');
|
||||
$table->foreign('issue_id', 'issue_files_issue_id')->references('issue_id')->on('issues')->onDelete('cascade');
|
||||
$table->index(['issue_id'], 'issue_files_issue_id');
|
||||
|
||||
$table->string('file_name', 90);
|
||||
$table->string('file_type', 255);
|
||||
$table->bigInteger('file_size');
|
||||
$table->bigInteger('content_type');
|
||||
$table->string('original_file_name', 127)->nullable();
|
||||
$table->datetime('date_uploaded');
|
||||
$table->datetime('date_modified');
|
||||
});
|
||||
|
||||
// Issue galleys.
|
||||
Schema::create('issue_galleys', function (Blueprint $table) {
|
||||
$table->comment('Issue galleys are representations of the entire issue in a single file, such as a complete issue PDF.');
|
||||
$table->bigInteger('galley_id')->autoIncrement();
|
||||
|
||||
$table->string('locale', 14)->nullable();
|
||||
|
||||
$table->bigInteger('issue_id');
|
||||
$table->foreign('issue_id', 'issue_galleys_issue_id')->references('issue_id')->on('issues')->onDelete('cascade');
|
||||
$table->index(['issue_id'], 'issue_galleys_issue_id');
|
||||
|
||||
$table->bigInteger('file_id');
|
||||
$table->foreign('file_id', 'issue_galleys_file_id')->references('file_id')->on('issue_files')->onDelete('cascade');
|
||||
$table->index(['file_id'], 'issue_galleys_file_id');
|
||||
|
||||
$table->string('label', 255)->nullable();
|
||||
$table->float('seq', 8, 2)->default(0);
|
||||
$table->string('url_path', 64)->nullable();
|
||||
|
||||
$table->index(['url_path'], 'issue_galleys_url_path');
|
||||
});
|
||||
|
||||
// Issue galley metadata.
|
||||
Schema::create('issue_galley_settings', function (Blueprint $table) {
|
||||
$table->comment('More data about issue galleys, including localized content such as labels.');
|
||||
$table->bigIncrements('issue_galley_setting_id');
|
||||
|
||||
$table->bigInteger('galley_id');
|
||||
$table->foreign('galley_id', 'issue_galleys_settings_galley_id')->references('galley_id')->on('issue_galleys')->onDelete('cascade');
|
||||
$table->index(['galley_id'], 'issue_galley_settings_galley_id');
|
||||
|
||||
$table->string('locale', 14)->default('');
|
||||
$table->string('setting_name', 255);
|
||||
$table->mediumText('setting_value')->nullable();
|
||||
$table->string('setting_type', 6)->comment('(bool|int|float|string|object)');
|
||||
|
||||
$table->unique(['galley_id', 'locale', 'setting_name'], 'issue_galley_settings_unique');
|
||||
});
|
||||
|
||||
Schema::create('custom_issue_orders', function (Blueprint $table) {
|
||||
$table->comment('Ordering information for the issue list, when custom issue ordering is specified.');
|
||||
$table->bigIncrements('custom_issue_order_id');
|
||||
|
||||
$table->bigInteger('issue_id');
|
||||
$table->foreign('issue_id', 'custom_issue_orders_issue_id')->references('issue_id')->on('issues')->onDelete('cascade');
|
||||
$table->index(['issue_id'], 'custom_issue_orders_issue_id');
|
||||
|
||||
$table->bigInteger('journal_id');
|
||||
$table->foreign('journal_id', 'custom_issue_orders_journal_id')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['journal_id'], 'custom_issue_orders_journal_id');
|
||||
|
||||
$table->float('seq', 8, 2)->default(0);
|
||||
|
||||
$table->unique(['issue_id'], 'custom_issue_orders_unique');
|
||||
});
|
||||
|
||||
Schema::create('custom_section_orders', function (Blueprint $table) {
|
||||
$table->comment('Ordering information for sections within issues, when issue-specific section ordering is specified.');
|
||||
$table->bigIncrements('custom_section_order_id');
|
||||
|
||||
$table->bigInteger('issue_id');
|
||||
$table->foreign('issue_id', 'custom_section_orders_issue_id')->references('issue_id')->on('issues')->onDelete('cascade');
|
||||
$table->index(['issue_id'], 'custom_section_orders_issue_id');
|
||||
|
||||
$table->bigInteger('section_id');
|
||||
$table->foreign('section_id', 'custom_section_orders_section_id')->references('section_id')->on('sections')->onDelete('cascade');
|
||||
$table->index(['section_id'], 'custom_section_orders_section_id');
|
||||
|
||||
$table->float('seq', 8, 2)->default(0);
|
||||
|
||||
$table->unique(['issue_id', 'section_id'], 'custom_section_orders_unique');
|
||||
});
|
||||
|
||||
// Publications
|
||||
Schema::create('publications', function (Blueprint $table) {
|
||||
$table->comment('Each publication is one version of a submission.');
|
||||
$table->bigInteger('publication_id')->autoIncrement();
|
||||
|
||||
$table->bigInteger('access_status')->default(0)->nullable();
|
||||
$table->date('date_published')->nullable();
|
||||
$table->datetime('last_modified')->nullable();
|
||||
|
||||
$table->bigInteger('primary_contact_id')->nullable();
|
||||
$table->foreign('primary_contact_id', 'publications_primary_contact_id')->references('author_id')->on('authors')->onDelete('set null');
|
||||
$table->index(['primary_contact_id'], 'publications_primary_contact_id');
|
||||
|
||||
$table->bigInteger('section_id')->nullable();
|
||||
$table->foreign('section_id', 'publications_section_id')->references('section_id')->on('sections')->onDelete('set null');
|
||||
$table->index(['section_id'], 'publications_section_id');
|
||||
|
||||
$table->float('seq', 8, 2)->default(0);
|
||||
|
||||
$table->bigInteger('submission_id');
|
||||
$table->foreign('submission_id', 'publications_submission_id')->references('submission_id')->on('submissions')->onDelete('cascade');
|
||||
$table->index(['submission_id'], 'publications_submission_id');
|
||||
|
||||
$table->smallInteger('status')->default(1); // PKPSubmission::STATUS_QUEUED
|
||||
$table->string('url_path', 64)->nullable();
|
||||
$table->bigInteger('version')->nullable();
|
||||
|
||||
$table->bigInteger('doi_id')->nullable();
|
||||
$table->foreign('doi_id')->references('doi_id')->on('dois')->nullOnDelete();
|
||||
$table->index(['doi_id'], 'publications_doi_id');
|
||||
|
||||
$table->index(['url_path'], 'publications_url_path');
|
||||
});
|
||||
// The following foreign key relationships are for tables defined in SubmissionsMigration
|
||||
// but they depend on publications to exist so are created here.
|
||||
Schema::table('submissions', function (Blueprint $table) {
|
||||
$table->foreign('current_publication_id', 'submissions_publication_id')->references('publication_id')->on('publications')->onDelete('set null');
|
||||
$table->index(['current_publication_id'], 'submissions_publication_id');
|
||||
});
|
||||
Schema::table('publication_settings', function (Blueprint $table) {
|
||||
$table->foreign('publication_id', 'publication_settings_publication_id')->references('publication_id')->on('publications')->onDelete('cascade');
|
||||
$table->index(['publication_id'], 'publication_settings_publication_id');
|
||||
});
|
||||
Schema::table('authors', function (Blueprint $table) {
|
||||
$table->foreign('publication_id')->references('publication_id')->on('publications')->onDelete('cascade');
|
||||
$table->index(['publication_id'], 'authors_publication_id');
|
||||
});
|
||||
// Publication galleys
|
||||
Schema::create('publication_galleys', function (Blueprint $table) {
|
||||
$table->comment('Publication galleys are representations of a publication in a specific format, e.g. a PDF.');
|
||||
$table->bigInteger('galley_id')->autoIncrement();
|
||||
$table->string('locale', 14)->nullable();
|
||||
|
||||
$table->bigInteger('publication_id');
|
||||
$table->foreign('publication_id', 'publication_galleys_publication_id')->references('publication_id')->on('publications')->onDelete('cascade');
|
||||
$table->index(['publication_id'], 'publication_galleys_publication_id');
|
||||
|
||||
$table->string('label', 255)->nullable();
|
||||
|
||||
$table->bigInteger('submission_file_id')->unsigned()->nullable();
|
||||
$table->foreign('submission_file_id')->references('submission_file_id')->on('submission_files');
|
||||
$table->index(['submission_file_id'], 'publication_galleys_submission_file_id');
|
||||
|
||||
$table->float('seq', 8, 2)->default(0);
|
||||
$table->string('remote_url', 2047)->nullable();
|
||||
$table->smallInteger('is_approved')->default(0);
|
||||
$table->string('url_path', 64)->nullable();
|
||||
|
||||
$table->bigInteger('doi_id')->nullable();
|
||||
$table->foreign('doi_id')->references('doi_id')->on('dois')->nullOnDelete();
|
||||
$table->index(['doi_id'], 'publication_galleys_doi_id');
|
||||
|
||||
$table->index(['url_path'], 'publication_galleys_url_path');
|
||||
});
|
||||
|
||||
// Galley metadata.
|
||||
Schema::create('publication_galley_settings', function (Blueprint $table) {
|
||||
$table->comment('More data about publication galleys, including localized content such as labels.');
|
||||
$table->bigIncrements('publication_galley_setting_id');
|
||||
|
||||
$table->bigInteger('galley_id');
|
||||
$table->foreign('galley_id', 'publication_galley_settings_galley_id')->references('galley_id')->on('publication_galleys')->onDelete('cascade');
|
||||
$table->index(['galley_id'], 'publication_galley_settings_galley_id');
|
||||
|
||||
$table->string('locale', 14)->default('');
|
||||
$table->string('setting_name', 255);
|
||||
$table->mediumText('setting_value')->nullable();
|
||||
|
||||
$table->unique(['galley_id', 'locale', 'setting_name'], 'publication_galley_settings_unique');
|
||||
});
|
||||
// Add partial index (DBMS-specific)
|
||||
switch (DB::getDriverName()) {
|
||||
case 'mysql': DB::unprepared('CREATE INDEX publication_galley_settings_name_value ON publication_galley_settings (setting_name(50), setting_value(150))');
|
||||
break;
|
||||
case 'pgsql': DB::unprepared('CREATE INDEX publication_galley_settings_name_value ON publication_galley_settings (setting_name, setting_value)');
|
||||
break;
|
||||
}
|
||||
|
||||
// Subscription types.
|
||||
Schema::create('subscription_types', function (Blueprint $table) {
|
||||
$table->comment('Subscription types represent the kinds of subscriptions that a user or institution may have, such as an annual subscription or a discounted subscription.');
|
||||
$table->bigInteger('type_id')->autoIncrement();
|
||||
|
||||
$table->bigInteger('journal_id');
|
||||
$table->foreign('journal_id', 'subscription_types_journal_id')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['journal_id'], 'subscription_types_journal_id');
|
||||
|
||||
$table->float('cost', 8, 2);
|
||||
$table->string('currency_code_alpha', 3);
|
||||
$table->smallInteger('duration')->nullable();
|
||||
$table->smallInteger('format');
|
||||
$table->smallInteger('institutional')->default(0);
|
||||
$table->smallInteger('membership')->default(0);
|
||||
$table->smallInteger('disable_public_display');
|
||||
$table->float('seq', 8, 2);
|
||||
});
|
||||
|
||||
// Locale-specific subscription type data
|
||||
Schema::create('subscription_type_settings', function (Blueprint $table) {
|
||||
$table->comment('More data about subscription types, including localized properties such as names.');
|
||||
$table->bigIncrements('subscription_type_setting_id');
|
||||
|
||||
$table->bigInteger('type_id');
|
||||
$table->foreign('type_id', 'subscription_type_settings_type_id')->references('type_id')->on('subscription_types')->onDelete('cascade');
|
||||
$table->index(['type_id'], 'subscription_type_settings_type_id');
|
||||
|
||||
$table->string('locale', 14)->default('');
|
||||
$table->string('setting_name', 255);
|
||||
$table->mediumText('setting_value')->nullable();
|
||||
$table->string('setting_type', 6);
|
||||
|
||||
$table->unique(['type_id', 'locale', 'setting_name'], 'subscription_type_settings_unique');
|
||||
});
|
||||
|
||||
// Journal subscriptions.
|
||||
Schema::create('subscriptions', function (Blueprint $table) {
|
||||
$table->comment('A list of subscriptions, both institutional and individual, for journals that use subscription-based publishing.');
|
||||
$table->bigInteger('subscription_id')->autoIncrement();
|
||||
|
||||
$table->bigInteger('journal_id');
|
||||
$table->foreign('journal_id', 'subscriptions_journal_id')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['journal_id'], 'subscriptions_journal_id');
|
||||
|
||||
$table->bigInteger('user_id');
|
||||
$table->foreign('user_id', 'subscriptions_user_id')->references('user_id')->on('users')->onDelete('cascade');
|
||||
$table->index(['user_id'], 'subscriptions_user_id');
|
||||
|
||||
$table->bigInteger('type_id');
|
||||
$table->foreign('type_id', 'subscriptions_type_id')->references('type_id')->on('subscription_types')->onDelete('cascade');
|
||||
$table->index(['type_id'], 'subscriptions_type_id');
|
||||
|
||||
$table->date('date_start')->nullable();
|
||||
$table->datetime('date_end')->nullable();
|
||||
$table->smallInteger('status')->default(1);
|
||||
$table->string('membership', 40)->nullable();
|
||||
$table->string('reference_number', 40)->nullable();
|
||||
$table->text('notes')->nullable();
|
||||
});
|
||||
|
||||
// Journal institutional subscriptions.
|
||||
Schema::create('institutional_subscriptions', function (Blueprint $table) {
|
||||
$table->comment('A list of institutional subscriptions, linking a subscription with an institution.');
|
||||
$table->bigInteger('institutional_subscription_id')->autoIncrement();
|
||||
|
||||
$table->bigInteger('subscription_id');
|
||||
$table->foreign('subscription_id', 'institutional_subscriptions_subscription_id')->references('subscription_id')->on('subscriptions')->onDelete('cascade');
|
||||
$table->index(['subscription_id'], 'institutional_subscriptions_subscription_id');
|
||||
|
||||
$table->bigInteger('institution_id');
|
||||
$table->foreign('institution_id')->references('institution_id')->on('institutions')->onDelete('cascade');
|
||||
$table->index(['institution_id'], 'institutional_subscriptions_institution_id');
|
||||
|
||||
$table->string('mailing_address', 255)->nullable();
|
||||
$table->string('domain', 255)->nullable();
|
||||
|
||||
$table->index(['domain'], 'institutional_subscriptions_domain');
|
||||
});
|
||||
|
||||
// Logs queued (unfulfilled) payments.
|
||||
Schema::create('queued_payments', function (Blueprint $table) {
|
||||
$table->comment('Unfulfilled (queued) payments, i.e. payments that have not yet been completed via an online payment system.');
|
||||
$table->bigInteger('queued_payment_id')->autoIncrement();
|
||||
$table->datetime('date_created');
|
||||
$table->datetime('date_modified');
|
||||
$table->date('expiry_date')->nullable();
|
||||
$table->text('payment_data')->nullable();
|
||||
});
|
||||
|
||||
// Logs completed (fulfilled) payments.
|
||||
Schema::create('completed_payments', function (Blueprint $table) {
|
||||
$table->comment('A list of completed (fulfilled) payments relating to a payment type such as a subscription payment.');
|
||||
$table->bigInteger('completed_payment_id')->autoIncrement();
|
||||
$table->datetime('timestamp');
|
||||
$table->bigInteger('payment_type');
|
||||
|
||||
$table->bigInteger('context_id');
|
||||
$table->foreign('context_id', 'completed_payments_context_id')->references('journal_id')->on('journals')->onDelete('cascade');
|
||||
$table->index(['context_id'], 'completed_payments_context_id');
|
||||
|
||||
$table->bigInteger('user_id')->nullable();
|
||||
$table->foreign('user_id', 'completed_payments_user_id')->references('user_id')->on('users')->onDelete('set null');
|
||||
$table->index(['user_id'], 'completed_payments_user_id');
|
||||
|
||||
$table->bigInteger('assoc_id')->nullable();
|
||||
$table->float('amount', 8, 2);
|
||||
$table->string('currency_code_alpha', 3)->nullable();
|
||||
$table->string('payment_method_plugin_name', 80)->nullable();
|
||||
});
|
||||
|
||||
// Add additional foreign key constraints once all tables have been created
|
||||
Schema::table('journals', function (Blueprint $table) {
|
||||
$table->foreign('current_issue_id')->references('issue_id')->on('issues')->onDelete('set null');
|
||||
$table->index(['current_issue_id'], 'journals_issue_id');
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Reverse the migration.
|
||||
*/
|
||||
public function down(): void
|
||||
{
|
||||
Schema::drop('completed_payments');
|
||||
Schema::drop('queued_payments');
|
||||
Schema::drop('institutional_subscription_ip');
|
||||
Schema::drop('institutional_subscriptions');
|
||||
Schema::drop('subscriptions');
|
||||
Schema::drop('subscription_type_settings');
|
||||
Schema::drop('subscription_types');
|
||||
Schema::drop('publication_galley_settings');
|
||||
Schema::drop('publication_galleys');
|
||||
Schema::drop('publications');
|
||||
Schema::drop('custom_section_orders');
|
||||
Schema::drop('custom_issue_orders');
|
||||
Schema::drop('issue_files');
|
||||
Schema::drop('issue_galley_settings');
|
||||
Schema::drop('issue_galleys');
|
||||
Schema::drop('issue_settings');
|
||||
Schema::drop('issues');
|
||||
Schema::drop('section_settings');
|
||||
Schema::drop('sections');
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user