Code Coverage
 
Classes and Traits
Functions and Methods
Lines
Total
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 10
CRAP
0.00% covered (danger)
0.00%
0 / 80
profilefields_update
0.00% covered (danger)
0.00%
0 / 1
0.00% covered (danger)
0.00%
0 / 10
240.00
0.00% covered (danger)
0.00%
0 / 80
 depends_on
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
 update_schema
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 revert_schema
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 update_data
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 revert_data
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 2
 update_youtube_profile_field
0.00% covered (danger)
0.00%
0 / 1
30.00
0.00% covered (danger)
0.00%
0 / 33
 update_other_profile_fields
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 6
 revert_youtube_profile_field
0.00% covered (danger)
0.00%
0 / 1
6.00
0.00% covered (danger)
0.00%
0 / 25
 revert_other_profile_fields
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 6
 get_youtube_url_part
0.00% covered (danger)
0.00%
0 / 1
2.00
0.00% covered (danger)
0.00%
0 / 1
<?php
/**
*
* This file is part of the phpBB Forum Software package.
*
* @copyright (c) phpBB Limited <https://www.phpbb.com>
* @license GNU General Public License, version 2 (GPL-2.0)
*
* For full copyright and license information, please see
* the docs/CREDITS.txt file.
*
*/
namespace phpbb\db\migration\data\v33x;
class profilefields_update extends \phpbb\db\migration\migration
{
    /** @var string YouTube URLs matcher: handle or custom URL or channel URL */
    protected $youtube_url_matcher = '(@[a-zA-Z0-9_.-]{3,30}|c/[a-zA-Z][\w\.,\-_]+|(channel|user)/[a-zA-Z][\w\.,\-_]+)';
    public static function depends_on(): array
    {
        return [
            '\phpbb\db\migration\data\v33x\v3310',
            '\phpbb\db\migration\data\v33x\profilefield_youtube_update',
        ];
    }
    public function update_schema(): array
    {
        return [
            'change_columns'    => [
                $this->table_prefix . 'profile_fields'            => [
                    'field_validation'        => ['VCHAR_UNI:128', ''],
                ],
            ]
        ];
    }
    public function revert_schema(): array
    {
        return [
            'change_columns'    => [
                $this->table_prefix . 'profile_fields'            => [
                    'field_validation'        => ['VCHAR_UNI:64', ''],
                ],
            ]
        ];
    }
    public function update_data(): array
    {
        return [
            ['custom', [[$this, 'update_youtube_profile_field']]],
            ['custom', [[$this, 'update_other_profile_fields']]],
        ];
    }
    public function revert_data(): array
    {
        return [
            ['custom', [[$this, 'revert_youtube_profile_field']]],
            ['custom', [[$this, 'revert_other_profile_fields']]],
        ];
    }
    public function update_youtube_profile_field(): bool
    {
        $profile_fields = $this->table_prefix . 'profile_fields';
        $profile_fields_data = $this->table_prefix . 'profile_fields_data';
        $end_time = time() + 5; // allow up to 5 seconds for migration to run
        $field_data = [
            'field_length'            => 20,
            'field_minlen'            => 3,
            'field_maxlen'            => 60,
            'field_validation'        => $this->youtube_url_matcher,
            'field_contact_url'        => 'https://youtube.com/%s',
            'field_contact_desc'    => 'VIEW_YOUTUBE_PROFILE',
        ];
        $sql = 'UPDATE ' . $profile_fields . '
            SET ' . $this->db->sql_build_array('UPDATE', $field_data) . "
            WHERE field_name = 'phpbb_youtube'";
        $this->db->sql_query($sql);
        $yt_profile_field = 'pf_phpbb_youtube';
        $has_youtube_url = $this->db->sql_like_expression($this->db->get_any_char() . 'youtube.com/' . $this->db->get_any_char());
        // We're done if the profile field doesn't exist
        if (!$this->db_tools->sql_column_exists($profile_fields_data, $yt_profile_field))
        {
            return true;
        }
        $update_aborted = false;
        $sql = 'SELECT user_id, pf_phpbb_youtube
            FROM ' . $profile_fields_data . "
            WHERE $yt_profile_field <> ''
                AND $yt_profile_field $has_youtube_url";
        $result = $this->db->sql_query($sql);
        while ($row = $this->db->sql_fetchrow($result))
        {
            $updated_youtube_url_part = $this->get_youtube_url_part($row['pf_phpbb_youtube']);
            if ($updated_youtube_url_part != $row['pf_phpbb_youtube'])
            {
                $this->db->sql_query(
                    "UPDATE $profile_fields_data
                    SET $yt_profile_field = '$updated_youtube_url_part'
                    WHERE user_id = {$row['user_id']}"
                );
            }
            if (time() > $end_time)
            {
                $update_aborted = true;
                break;
            }
        }
        $this->db->sql_freeresult($result);
        return $update_aborted != true;
    }
    public function update_other_profile_fields(): void
    {
        $profile_fields = $this->table_prefix . 'profile_fields';
        $this->db->sql_query(
            "UPDATE $profile_fields
                SET field_contact_url = 'https://facebook.com/%s/'
                WHERE field_name = 'phpbb_facebook'"
        );
        $this->db->sql_query(
            "UPDATE $profile_fields
                SET field_contact_url = 'https://twitter.com/%s'
                WHERE field_name = 'phpbb_twitter'"
        );
    }
    public function revert_youtube_profile_field(): void
    {
        $profile_fields = $this->table_prefix . 'profile_fields';
        $profile_fields_data = $this->table_prefix . 'profile_fields_data';
        $field_data = [
            'field_length'        => 40,
            'field_minlen'        => strlen('https://youtube.com/c/') + 1,
            'field_maxlen'        => 255,
            'field_validation'    => profilefield_youtube_update::$youtube_url_matcher,
            'field_contact_url'    => '%s'
        ];
        $sql = 'UPDATE ' . $profile_fields . '
            SET ' . $this->db->sql_build_array('UPDATE', $field_data) . "
            WHERE field_name = 'phpbb_youtube'";
        $this->db->sql_query($sql);
        $yt_profile_field = 'pf_phpbb_youtube';
        // We're done if the profile field doesn't exist
        if (!$this->db_tools->sql_column_exists($profile_fields_data, $yt_profile_field))
        {
            return;
        }
        $prepend_legacy_youtube_url = $this->db->sql_concatenate(
            "'https://youtube.com/'", $yt_profile_field
        );
        $is_not_already_youtube_url = $this->db->sql_not_like_expression(
            $this->db->get_any_char()
            . 'youtube.com/'
            . $this->db->get_any_char()
        );
        $this->db->sql_query(
            "UPDATE $profile_fields_data SET
                $yt_profile_field = $prepend_legacy_youtube_url
                WHERE $yt_profile_field <> ''
                AND $yt_profile_field $is_not_already_youtube_url"
        );
    }
    public function revert_other_profile_fields(): void
    {
        $profile_fields = $this->table_prefix . 'profile_fields';
        $this->db->sql_query(
            "UPDATE $profile_fields
                SET field_contact_url = 'http://facebook.com/%s/'
                WHERE field_name = 'phpbb_facebook'"
        );
        $this->db->sql_query(
            "UPDATE $profile_fields
                SET field_contact_url = 'http://twitter.com/%s'
                WHERE field_name = 'phpbb_twitter'"
        );
    }
    protected function get_youtube_url_part(string $profile_field_string): string
    {
        return preg_replace('#^https://(?:www\.)?youtube\.com/(.+)$#iu', '$1', $profile_field_string);
    }
}