Commit 6ecf2866 authored by Yassine Doghri's avatar Yassine Doghri
Browse files

feat: add media entity and link documents, images and audio files to it

parent 1d1490b0
Loading
Loading
Loading
Loading
+2 −0
Original line number Diff line number Diff line
@@ -50,6 +50,8 @@ RUN apt-get update \
    # gd for image processing
    && docker-php-ext-configure gd --with-webp --with-jpeg --with-freetype \
    && docker-php-ext-install gd \
    && docker-php-ext-install exif \
    && docker-php-ext-enable exif \
    # redis extension for cache
    && pecl install -o -f redis \
    && rm -rf /tmp/pear \
+1 −1
Original line number Diff line number Diff line
@@ -46,7 +46,7 @@ class MapController extends BaseController
                    'location_url' => $episode->location->url,
                    'episode_link' => $episode->link,
                    'podcast_link' => $episode->podcast->link,
                    'cover_path' => $episode->cover->thumbnail_url,
                    'cover_url' => $episode->cover->thumbnail_url,
                    'podcast_title' => $episode->podcast->title,
                    'episode_title' => $episode->title,
                ];
+83 −0
Original line number Diff line number Diff line
<?php

declare(strict_types=1);

/**
 * @copyright  2021 Podlibre
 * @license    https://www.gnu.org/licenses/agpl-3.0.en.html AGPL3
 * @link       https://castopod.org/
 */

namespace App\Database\Migrations;

use CodeIgniter\Database\Migration;

class AddMedia extends Migration
{
    public function up(): void
    {
        $this->forge->addField([
            'id' => [
                'type' => 'INT',
                'unsigned' => true,
                'auto_increment' => true,
            ],
            'file_path' => [
                'type' => 'VARCHAR',
                'constraint' => 255,
            ],
            'file_size' => [
                'type' => 'INT',
                'unsigned' => true,
                'comment' => 'File size in bytes',
            ],
            'file_content_type' => [
                'type' => 'VARCHAR',
                'constraint' => 45,
            ],
            'file_metadata' => [
                'type' => 'JSON',
                'nullable' => true,
            ],
            'type' => [
                'type' => 'ENUM',
                'constraint' => ['image', 'audio', 'video', 'transcript', 'chapters', 'document'],
            ],
            'description' => [
                'type' => 'TEXT',
            ],
            'language_code' => [
                'type' => 'VARCHAR',
                'constraint' => 2,
            ],
            'uploaded_by' => [
                'type' => 'INT',
                'unsigned' => true,
            ],
            'updated_by' => [
                'type' => 'INT',
                'unsigned' => true,
            ],
            'uploaded_at' => [
                'type' => 'DATETIME',
            ],
            'updated_at' => [
                'type' => 'DATETIME',
            ],
            'deleted_at' => [
                'type' => 'DATETIME',
                'null' => true,
            ],
        ]);

        $this->forge->addKey('id', true);
        $this->forge->addForeignKey('uploaded_by', 'users', 'id');
        $this->forge->addForeignKey('updated_by', 'users', 'id');
        $this->forge->createTable('media');
    }

    public function down(): void
    {
        $this->forge->dropTable('media');
    }
}
+8 −18
Original line number Diff line number Diff line
@@ -46,25 +46,13 @@ class AddPodcasts extends Migration
            'description_html' => [
                'type' => 'TEXT',
            ],
            'cover_path' => [
                'type' => 'VARCHAR',
                'constraint' => 255,
            ],
            // constraint is 13 because the longest safe mimetype for images is image/svg+xml,
            // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types
            'cover_mimetype' => [
                'type' => 'VARCHAR',
                'constraint' => 13,
            ],
            'banner_path' => [
                'type' => 'VARCHAR',
                'constraint' => 255,
                'null' => true,
                'default' => null,
            'cover_id' => [
                'type' => 'INT',
                'unsigned' => true,
            ],
            'banner_mimetype' => [
                'type' => 'VARCHAR',
                'constraint' => 13,
            'banner_id' => [
                'type' => 'INT',
                'unsigned' => true,
                'null' => true,
                'default' => null,
            ],
@@ -209,6 +197,8 @@ class AddPodcasts extends Migration
        $this->forge->addUniqueKey('guid');
        $this->forge->addUniqueKey('actor_id');
        $this->forge->addForeignKey('actor_id', config('Fediverse')->tablesPrefix . 'actors', 'id', '', 'CASCADE');
        $this->forge->addForeignKey('cover_id', 'media', 'id');
        $this->forge->addForeignKey('banner_id', 'media', 'id');
        $this->forge->addForeignKey('category_id', 'categories', 'id');
        $this->forge->addForeignKey('language_code', 'languages', 'code');
        $this->forge->addForeignKey('created_by', 'users', 'id');
+16 −39
Original line number Diff line number Diff line
@@ -40,29 +40,9 @@ class AddEpisodes extends Migration
                'type' => 'VARCHAR',
                'constraint' => 128,
            ],
            'audio_file_path' => [
                'type' => 'VARCHAR',
                'constraint' => 255,
            ],
            'audio_file_duration' => [
                // exact value for duration with max 99999,999 ~ 27.7 hours
                'type' => 'DECIMAL(8,3)',
                'unsigned' => true,
                'comment' => 'Playtime in seconds',
            ],
            'audio_file_mimetype' => [
                'type' => 'VARCHAR',
                'constraint' => 255,
            ],
            'audio_file_size' => [
                'type' => 'INT',
                'unsigned' => true,
                'comment' => 'File size in bytes',
            ],
            'audio_file_header_size' => [
            'audio_id' => [
                'type' => 'INT',
                'unsigned' => true,
                'comment' => 'Header size in bytes',
            ],
            'description_markdown' => [
                'type' => 'TEXT',
@@ -70,34 +50,27 @@ class AddEpisodes extends Migration
            'description_html' => [
                'type' => 'TEXT',
            ],
            'cover_path' => [
                'type' => 'VARCHAR',
                'constraint' => 255,
                'null' => true,
            ],
            // constraint is 13 because the longest safe mimetype for images is image/svg+xml,
            // see https://developer.mozilla.org/en-US/docs/Web/HTTP/Basics_of_HTTP/MIME_types#image_types
            'cover_mimetype' => [
                'type' => 'VARCHAR',
                'constraint' => 13,
            'cover_id' => [
                'type' => 'INT',
                'unsigned' => true,
                'null' => true,
            ],
            'transcript_file_path' => [
                'type' => 'VARCHAR',
                'constraint' => 255,
            'transcript_id' => [
                'type' => 'INT',
                'unsigned' => true,
                'null' => true,
            ],
            'transcript_file_remote_url' => [
            'transcript_remote_url' => [
                'type' => 'VARCHAR',
                'constraint' => 512,
                'null' => true,
            ],
            'chapters_file_path' => [
                'type' => 'VARCHAR',
                'constraint' => 255,
            'chapters_id' => [
                'type' => 'INT',
                'unsigned' => true,
                'null' => true,
            ],
            'chapters_file_remote_url' => [
            'chapters_remote_url' => [
                'type' => 'VARCHAR',
                'constraint' => 512,
                'null' => true,
@@ -183,6 +156,10 @@ class AddEpisodes extends Migration
        $this->forge->addPrimaryKey('id');
        $this->forge->addUniqueKey(['podcast_id', 'slug']);
        $this->forge->addForeignKey('podcast_id', 'podcasts', 'id', '', 'CASCADE');
        $this->forge->addForeignKey('audio_id', 'media', 'id');
        $this->forge->addForeignKey('cover_id', 'media', 'id');
        $this->forge->addForeignKey('transcript_id', 'media', 'id');
        $this->forge->addForeignKey('chapters_id', 'media', 'id');
        $this->forge->addForeignKey('created_by', 'users', 'id');
        $this->forge->addForeignKey('updated_by', 'users', 'id');
        $this->forge->createTable('episodes');
Loading