Просмотр файла libarea-0.9/app/Controllers/User/SettingController.php

Размер файла: 9.58Kb
<?php

declare(strict_types=1);

namespace App\Controllers\User;

use Hleb\Static\Request;
use Hleb\Base\Controller;

use App\Models\User\{SettingModel, UserModel, PreferencesModel};
use App\Models\{IgnoredModel, ActionModel};
use App\Models\Auth\AuthModel;
use UploadImage, Meta, Img, Html, SendEmail, Msg;

use App\Content\Сheck\Validator;

class SettingController extends Controller
{
    protected $limit = 25;

    public function profile(): void
    {
        $this->edit();
    }

    public function avatar(): void
    {
        $this->avatarEdit();
    }

    public function security(): void
    {
        $this->securityEdit();
    }

    public function preferences(): void
    {
        $this->preferencesEdit();
    }

    public function notification(): void
    {
        $this->notificationEdit();
    }

    public function coverUserRemove(): void
    {
        $this->coverRemove();
    }

    /**
     * Profile setup form
     * Форма настройки профиля
     *
     * @return void
     */
    public function index()
    {
        $new = SettingModel::getNewEmail();
        $email = $new['email'] ?? null;

        if ($code = Request::get('newemail')->value()) {
            if (SettingModel::available($code)) {
                SettingModel::editEmail($email);

                Msg::redirect(__('msg.change_saved'), 'success', url('setting'));
            }
        }

        render(
            '/user/setting/setting',
            [
                'meta'  => Meta::get(__('app.setting')),
                'data'  => [
                    'user'  => UserModel::get($this->container->user()->login(), 'slug'),
                    'new_email' => $email,
                ]
            ]
        );
    }

    function edit()
    {
        $user_id = $this->container->user()->id();
        Validator::setting($data = Request::allPost());

        $user = UserModel::get($user_id, 'id');

        SettingModel::edit(
            [
                'id'                   => $user_id,
                'email'                => $user['email'],
                'login'                => $user['login'],
                'name'                 => $data['name'],
                'activated'            => $user['activated'],
                'limiting_mode'        => $user['limiting_mode'],
                'scroll'               => Request::post('scroll')->value() == 'on' ? 1 : 0,
                'nsfw'                 => Request::post('nsfw')->value() == 'on' ? 1 : 0,
                'post_design'           => Request::post('post_design')->value() == 'on' ? 1 : 0,
                'trust_level'          => $user['trust_level'],
                'updated_at'           => date('Y-m-d H:i:s'),
                'color'                => Request::post('color')->asString('#339900'),
                'about'                => $_POST['about'], // for Markdown
                'template'             => $data['template'] ?? 'default',
                'lang'                 => $data['lang'] ?? 'ru',
                'whisper'              => $user['whisper'] ?? '',
                'website'              => Request::post('website')->asString(''),
                'location'             => Request::post('location')->asString(''),
                'public_email'         => $data['public_email'] ?? null,
                'github'               => Request::post('github')->asString(''),
                'skype'                => Request::post('skype')->asString(''),
                'telegram'             => Request::post('telegram')->asString(''),
                'vk'                   => Request::post('vk')->asString(''),
            ]
        );

        Msg::redirect(__('msg.change_saved'), 'success', url('setting'));
    }

    /**
     * Avatar and cover upload form
     * Форма загрузки аватарки и обложики
     *
     * @return void
     */
    function avatarForm()
    {
        render(
            '/user/setting/avatar',
            [
                'meta'  => Meta::get(__('app.avatar')),
                'data'  => [
                    'user'  => UserModel::get($this->container->user()->login(), 'slug'),
                ]
            ]
        );
    }

    function avatarEdit()
    {
        UploadImage::set($_FILES, $this->container->user()->id(), 'user');
    }

    /**
     * Change password form
     * Форма изменение пароля
     *
     * @return void
     */
    function securityForm()
    {
        render(
            '/user/setting/security',
            [
                'meta'  => Meta::get(__('app.security')),
                'data'  => []
            ]
        );
    }

    function securityEdit()
    {
        $data = Request::allPost();

        Validator::security($data, $this->container->user()->email());

        $newpass = password_hash($data['password2'], PASSWORD_BCRYPT);

        SettingModel::editPassword(['id' => $this->container->user()->id(), 'password' => $newpass]);

        Msg::redirect(__('msg.successfully'), 'success');
    }

    /**
     * Cover Removal
     * Удаление обложки
     *
     * @return void
     */
    function coverRemove()
    {
        $user = UserModel::get($this->container->user()->login(), 'slug');

        // Only the author and the admin can delete
        // Удалять может только автор и админ
        if ($user['id'] != $this->container->user()->id() && $this->container->user()->admin()) {
            redirect('/');
        }

        // Удалим, кроме дефолтной
        if ($user['cover_art'] != 'cover_art.jpeg') {
            unlink(HLEB_PUBLIC_DIR . Img::PATH['users_cover'] . $user['cover_art']);
            unlink(HLEB_PUBLIC_DIR . Img::PATH['users_cover_small'] . $user['cover_art']);
        }

        SettingModel::coverRemove(
            [
                'id' => $user['id'],
                'updated_at' => date('Y-m-d H:i:s'),
                'cover_art' => 'cover_art.jpeg'
            ]
        );

        Msg::redirect(__('msg.change_saved'), 'success', '/setting/avatar');
    }

    /**
     * Member preference setting form
     * Форма настройки предпочтений участника
     *
     * @return void
     */
    function notificationForm()
    {
        render(
            '/user/setting/notifications',
            [
                'meta'  => Meta::get(__('app.notifications')),
                'data'  => [
                    'notif' => SettingModel::getNotifications($this->container->user()->id()),
                ]
            ]
        );
    }

    function ignoredForm()
    {
        render(
            '/user/setting/ignored',
            [
                'meta'  => Meta::get(__('app.ignored')),
                'data'  => [
                    'ignored' => IgnoredModel::getIgnoredUsers($this->limit),
                ]
            ]
        );
    }

    function deletion()
    {
        render(
            '/user/setting/deletion',
            [
                'meta'  => Meta::get(__('app.delete_profile')),
                'data'  => []
            ]
        );
    }

    function notificationEdit()
    {
        SettingModel::setNotifications(
            [
                'setting_user_id'           => $this->container->user()->id(),
                'setting_email_pm'          => Request::post('setting_email_pm')->asInt(),
                'setting_email_appealed'    => Request::post('setting_email_appealed')->asInt(),
                'setting_email_post'        => 0,
                'setting_email_answer'      => 0,
            ]
        );

        Msg::redirect(__('msg.change_saved'), 'success', '/setting/notifications');
    }

    function newEmail()
    {
        $email = Request::post('email')->value();

        if (Validator::rulesNewEmail($email) === false) {
            return json_encode('error');
        }

        if (is_array(AuthModel::checkRepetitions($email, 'email'))) {
            return json_encode('repeat');
        }

        $code = Html::randomString('crypto', 20);

        SettingModel::setNewEmail($email, $code);

        SendEmail::mailText($this->container->user()->id(), 'new.email', ['link' => '/setting?newemail=' . $code, 'new_email' => $email]);

        return json_encode('success');
    }

    public function deleteActivation()
    {
        SettingModel::deletionUser($this->container->user()->id());

        ActionModel::addLogs(
            [
                'id_content'    => $this->container->user()->id(),
                'action_type'   => 'profile',
                'action_name'   => 'deleted',
                'url_content'   => url('profile', ['login' => $this->container->user()->login()]),
            ]
        );

        $this->container->auth()->logout();
    }

    function preferencesForm()
    {
        render(
            '/user/setting/preferences',
            [
                'meta'  => Meta::get(__('app.preferences')),
                'data'  => [
                    'signed'        => PreferencesModel::get(Html::pageNumber()),
                    'pagesCount'    => PreferencesModel::getCount(),
                    'blocks'        => PreferencesModel::getBlocks(),
                    'pNum'          => Html::pageNumber(),
                    'facet_arr'     => []
                ]
            ]
        );
    }

    function preferencesEdit()
    {
        if (!is_array($data = Request::post('id')->value())) {

            PreferencesModel::removal();
            Msg::redirect(__('msg.change_saved'), 'success', '/setting/preferences');
        }

        PreferencesModel::edit($data);

        Msg::redirect(__('msg.change_saved'), 'success', '/setting/preferences');
    }
}