Your IP : 216.73.216.240


Current Path : /home/juvelize/saulnois/tmp/install_695d2cf0b4957/src/
Upload File :
Current File : /home/juvelize/saulnois/tmp/install_695d2cf0b4957/src/TTasks.php

<?php
/*
* @package		Tech Fry Library
* @license		https://www.gnu.org/licenses/gpl-3.0.en.html
*/

namespace TechFry\Library;

use Joomla\CMS\Factory;
use TechFry\Library\TDb;
use TechFry\Library\TNotify;
use TechFry\Library\TUser;
use TechFry\Library\TApi;
use TechFry\Library\TDynamic;

class TTasks
{
    public $db_table;
    
    public $task;

    public $data; // Data filled in form

    public $location; // frontend or backend

    public $is_new;

    public $trigger_point;

    /*
    email, tfmail, user, usergroup, usercf, article, webhook, runphp, string, date, numeric, database, redirect, message
    */
    
    public function __construct($data, $config = [])
    {
        $this->location = $config['location'] ?? 'frontend';
        $this->is_new = $config['is_new'] ?? 1;
        $this->trigger_point = $config['trigger_point'] ?? '';

        $this->data = $data;
    }

    // Method Called from Model
    public function execute_tasks()
    {
        $db = new TDb($this->db_table);
        $conditions = array(
            array('published', '=', 1),
        );
        $tasks = $db->get_items(array('order' => 'ordering ASC', 'conditions' => $conditions));
        
        foreach ($tasks as $task)
        {
            $this->task = $task;
            
            if (!$this->allow_trigger())
            {
                continue;
            }

            $action = $task->action_type ?? $task->type;
            $function = 'execute_' . $action;
            
            $settings = json_decode($task->params, true)['task_settings'];

            if (isset($settings['debug']) && $settings['debug'])
            {
                $n = new TNotify();
                $n->notify_admin('Data', '<pre>' . print_r($this->data, true) . '</pre>', array('to_address' => $settings['debug_email']));
            }

            $this->$function($settings);
        }

        return $this->data;
    }

    // Task 01: Send Email
    public function execute_email($task_settings)
    {        
        $notifier = new TNotify();

        $notifier->send_email($task_settings, $this->data);
    }

    // Task 02: Send email using TF Mail
    public function execute_tfmail($task_settings)
    {
        $user_id_field = $task_settings['user_id'];
        $user_id = $this->data[$user_id_field];
        
        // $data - user_id, mail_id, replaces
        $data = array(
            'mail_id' => $task_settings['mail_id'],
            'user_id' => $user_id,
            'replaces' => json_encode($this->data),
        );

        $mvc = Factory::getApplication()->bootComponent('com_tfmail')->getMVCFactory();
        $model = $mvc->createModel('Queue', 'administrator', ['ignore_request' => true]);

        $model->save($data);
    }

    // Task 03: Modify User Groups
    public function execute_usergroup($task_settings)
    {
        $user_id_field = $task_settings['user_id'];
        $user_id = $this->data[$user_id_field] ?? '';

        if (!$user_id)
        {
            $user_id = Factory::getApplication()->getIdentity()->id;
        }
        
        $tuser = new TUser();

        if ($user_id)
        {
            $add_groups = $task_settings['add_user_groups'] ?: [];
            foreach ($add_groups as $group)
            {
                $tuser->add_user_to_group($user_id, $group);
            }

            $remove_groups = $task_settings['remove_user_groups'] ?: [];
            foreach ($remove_groups as $group)
            {
                $tuser->remove_user_from_group($user_id, $group);
            }
        }
    }

    // Task 04: Modify User Custom Fields
    public function execute_usercf($task_settings)
    {            
        $user_id_field = $task_settings['user_id'];
        $user_id = $this->data[$user_id_field] ?? '';

        if (!$user_id)
        {
            $user_id = Factory::getApplication()->getIdentity()->id;
        }
        
        $tuser = new TUser();

        if ($user_id)
        {
            $user_cfs[] = $task_settings ?: [];
            $tuser->handle_fields($user_cfs, $user_id);
        }
    }

    // Task 05: Webhook Request
    public function execute_webhook($task_settings)
    {        
        $headers = [];

        if ($task_settings['content_type'])
        {
            $headers['Content-Type'] = $task_settings['content_type'];
        }

        if ($task_settings['accept'])
        {
            $headers['Accept'] = $task_settings['accept'];
        }

        if ($task_settings['headers'])
        {
            foreach ($task_settings['headers'] as $header)
            {
                $key = $header['key'];
                $headers[$key] = $header['val'];
            }
        }

        $post_data = [];
        if ($task_settings['data'])
        {
            $dynamic = new TDynamic();
            
            foreach ($task_settings['data'] as $data)
            {
                $value = $dynamic->replace_fields($data['val'], $this->data);

                $keys = explode('.', $data['key']);
                $temp =& $post_data;
                foreach ($keys as $key)
                {
                    if (!isset($temp[$key]) || !is_array($temp[$key])) 
                    {
                        $temp[$key] = [];
                    }
                    $temp =& $temp[$key];
                }
                $temp = $value;
            }
        }
        
        $api = new TApi($task_settings['url'], $headers);

        $response = $api->send_request($task_settings['method'], $post_data);

        $this->data = json_encode($response, true);

        if ($task_settings['debug'])
        {
            $n = new TNotify();
            $n->notify_admin('Webhook Response', print_r($response, true), array('to_address' => $task_settings['debug_email']));
        }
    }

    // Task 06: Create Joomla User
    public function execute_user($task_settings)
    {
        $email_field = $task_settings['email'] ?: 'email';
        
        if (isset($this->data[$email_field]) && $this->data[$email_field])
        {
            $user_data = array('email' => $this->data[$email_field]);

            $name_field = $task_settings['name'];
            $username_field = $task_settings['username'];
            $pw_field = $task_settings['password'];
            $group_field = $task_settings['usergroup'];

            if ($name_field)
            {
                $user_data['name'] = $this->data[$name_field];
            }

            if ($username_field)
            {
                $user_data['username'] = $this->data[$username_field];
            }

            if ($pw_field)
            {
                $user_data['password'] = $this->data[$pw_field];
            }

            if ($name_field)
            {
                $user_data['groups'] = $this->data[$group_field];
            }

            $customfields = $task_settings['customfields'];
            if ($customfields)
            {
                foreach ($customfields as $customfield)
                {
                    $k = $customfield['cf_name'];
                    $user_data['com_fields'][$k] = $customfield['cf_value'];
                }
            }

            $profilefields = $task_settings['profilefields'];
            if ($profilefields)
            {
                foreach ($profilefields as $profilefield)
                {
                    $k = $profilefield['pf_name'];
                    $user_data['profile'][$k] = $profilefield['pf_value'];
                }
            }

            $tuser = new TUser();
            $user = $tuser->create_user($user_data);
            
            $this->data['created_by'] = $user->id;
        }
    }

    // Task 07: Create Joomla Article
    public function execute_article($task_settings)
    {
        $title_field = $task_settings['title'] ?: 'title';
        if ($task_settings['jcategory'])
        {
            $catid = $task_settings['jcategory'];
        }
        else
        {
            $catid_field = $task_settings['catid'];
            $catid = $this->data[$catid_field];
        }

        $art_data = array(
            'title' => $this->data[$title_field],
            'catid' => $catid,
            'state' => $task_settings['published'],
            'access' => $task_settings['access'],
            'language' => $task_settings['language'],
        );

        $dynamic = new TDynamic();

        if ($task_settings['introtext'])
        {
            $art_data['introtext'] = $dynamic->replace_fields($task_settings['introtext'], $this->data);
        }

        if ($task_settings['fulltext'])
        {
            $art_data['fulltext'] = $dynamic->replace_fields($task_settings['fulltext'], $this->data);
        }

        $customfields = $task_settings['customfields'];
        if ($customfields)
        {
            foreach ($customfields as $customfield)
            {
                $k = $customfield['cf_name'];
                $art_data['com_fields'][$k] = $customfield['cf_value'];
            }
        }

        $tarticle = new TArticle();
        $article_id = $tarticle->create_article($art_data);
    }

    // Task 08: Custom PHP Script
    public function execute_runphp($task_settings)
    {
        eval($task_settings['code']);
    }

    // Task 09: String Function
    public function execute_string($task_settings)
    {
        $settings = json_decode($this->task->params, true);
        $action_field = $settings['action_field'];
        $save_field = isset($settings['save_field']) && $settings['save_field'] ? $settings['save_field'] : $action_field;

        $string = $this->data[$action_field];
        $function = $task_settings['str_function'];

        $p1 = $task_settings['p1'] ?? '';
        $p2 = $task_settings['p2'] ?? '';

        $str = new TString($string);

        $this->data[$save_field] = $str->process($function, array($p1, $p2));
    }

    // Task 10: Date Function
    public function execute_date($task_settings)
    {
        $settings = json_decode($this->task->params, true);
        $action_field = $settings['action_field'];
        $save_field = isset($settings['save_field']) && $settings['save_field'] ? $settings['save_field'] : $action_field;

        $date = $this->data[$action_field];
        $function = $task_settings['date_function'];

        $p1 = $task_settings['p1'] ?? '';

        $d = new TDate($date);

        $this->data[$save_field] = $d->process($function, $p1);
    }

    // Task 11: Numeric Function
    public function execute_numeric($task_settings)
    {
        $settings = json_decode($this->task->params, true);
        $action_field = $settings['action_field'];
        $save_field = isset($settings['save_field']) && $settings['save_field'] ? $settings['save_field'] : $action_field;

        $number = $this->data[$action_field];
        $function = $task_settings['num_function'];

        $p1 = $task_settings['p1'] ?? '';

        $n = new TNumeric($number);

        $this->data[$save_field] = $n->process($function, $p1);
    }

    // Task 12: Joomla Database
    public function execute_joomla_db($task_settings)
    {
        // Setting conditions mandatory
        if (!isset($task_settings['filter']) || !$task_settings['filter'])
        {
            return;
        }
        
        $function = 'joomla_db_' . $task_settings['sub_action'];

        // update_records, delete_records, replace_records
        $this->$function($task_settings);
    }

    // Task 12 A: Update records in database
    public function joomla_db_update_records($task_settings)
    {
        $conditions = $task_settings['filter'];

        $db = new TDb($task_settings['table_name']);

        if ($task_settings['column_type'] == 'date')
        {
            // To Do: Add or subtract date based on params
            $task_settings['column_value'] = Factory::getDate()->toSql();
        }

        $sets = array($task_settings['column_name'] => $task_settings['column_value']);
        
        $db->update_records($sets, $conditions);
    }

    // Task 12 B: Delete record from database
    public function joomla_db_delete_records($task_settings)
    {
        $conditions = $task_settings['filter'];

        $db = new TDb($task_settings['table_name']);

        $db->delete_items($conditions);
    }

    // Task 12 C: Replace records
    public function joomla_db_replace_records($task_settings)
    {
        $conditions = $task_settings['filter'];

        $db = new TDb($task_settings['table_name']);
        
        $db->replace_column($conditions, $task_settings['column_name'], $task_settings['replace'], $task_settings['replace_with']);
    }

    // Task 13: Redirect
    public function execute_redirect($task_settings)
    {        
        $app = Factory::getApplication();

        if ($task_settings['message'])
        {
            $dynamic = new TDynamic();
            $task_settings['message'] = $dynamic->replace_fields($task_settings['message'], $this->data);
            
            $message_type = $task_settings['message_type'];
            $app->enqueueMessage($task_settings['message'], $message_type);
        }
        
        if ($task_settings['redirct_url'])
        {
            $app->redirect($task_settings['redirct_url']);
        }
    }

    public function allow_trigger()
    {
        // Check for conditions
        if (isset($this->task->conditions) && $this->task->conditions)
        {
            $conditions = json_decode($this->task->conditions, true);
        }
        else
        {
            return true;
        }

        foreach ($conditions as $condition)
        {
            $where_field = $condition['where_field'] ?? '';
            $where_operator = $condition['where_operator'] ?? '';
            $where_value = $condition['where_value'] ?? null;

            if (!array_key_exists($where_field, $this->data)) 
            {
                return false;
            }

            $field_value = $this->data[$where_field];

            switch ($where_operator)
            {
                case '=':
                    if ($field_value != $where_value) return false;
                    break;

                case '!=':
                case '<>':
                    if ($field_value == $where_value) return false;
                    break;

                case '>':
                    if ($field_value <= $where_value) return false;
                    break;

                case '<':
                    if ($field_value >= $where_value) return false;
                    break;

                case '>=':
                    if ($field_value < $where_value) return false;
                    break;

                case '<=':
                    if ($field_value > $where_value) return false;
                    break;

                case 'IN':
                    if (!is_array($where_value)) $where_value = explode(',', $where_value);
                    if (!in_array($field_value, $where_value)) return false;
                    break;

                case 'NOT IN':
                    if (!is_array($where_value)) $where_value = explode(',', $where_value);
                    if (in_array($field_value, $where_value)) return false;
                    break;

                case 'LIKE':
                    if (stripos($field_value, str_replace('%', '', $where_value)) == false) return false;
                    break;

                case 'NOT LIKE':
                    if (stripos($field_value, str_replace('%', '', $where_value)) != false) return false;
                    break;

                case 'IS NULL':
                    if (!is_null($field_value)) return false;
                    break;

                case 'IS NOT NULL':
                    if (is_null($field_value)) return false;
                    break;

                default:
                    return false;
            }
        }

        return true;
    }
}