<?php 
 
namespace Lagdo\Polr\Admin\App; 
 
use Valitron\Validator; 
 
use Jaxon\Sentry\Armada as JaxonClass; 
 
class Link extends JaxonClass 
{ 
    public function editLongUrl($ending) 
    { 
        $ending = trim($ending); 
        // Validate the input 
        if(!$this->validator->validateLinkEnding($ending)) 
        { 
            $this->notify->error('Ending not valid.', 'Error'); 
            return $this->response; 
        } 
 
        // Fetch the link from the Polr instance 
        $apiResponse = $this->apiClient->get('links/' . $ending, 
            ['query' => ['key' => $this->apiKey]]); 
        $jsonResponse = json_decode($apiResponse->getBody()->getContents()); 
        $link = $jsonResponse->result; 
 
        $title = 'Long URL'; 
        $content = $this->view()->render('polr_admin::snippets.edit_long_url', ['link' => $link]); 
        $buttons = [ 
            [ 
                'title' => 'Save link', 
                'class' => 'btn btn-primary btn-sm', 
                'click' => $this->rq()->saveLongUrl($link->short_url, rq()->form('edit-long-url')), 
            ], 
            [ 
                'title' => 'Cancel', 
                'class' => 'btn btn-danger btn-sm', 
                'click' => 'close', 
            ] 
        ]; 
        $this->dialog->show($title, $content, $buttons); 
 
        return $this->response; 
    } 
 
    public function saveLongUrl($ending, array $values) 
    { 
        // Validate the new URL 
        $values['ending'] = trim($ending); 
        if(!$this->validator->validateLinkUrl($values, true)) 
        { 
            $this->notify->error('Link not valid.', 'Error'); 
            return $this->response; 
        } 
 
        // Update the link in the Polr instance 
        $apiResponse = $this->apiClient->put('links/' . $values['ending'], 
            ['query' => ['key' => $this->apiKey, 'url' => $values['url']]]); 
        $jsonResponse = json_decode($apiResponse->getBody()->getContents()); 
 
        // Reload the datatable 
        $this->response->script("polr.home.reloadLinkTables()"); 
        // Show a confirmation message 
        $this->notify->info("Long URL successfully changed.", 'Success'); 
        // Hide the dialog 
        $this->dialog->hide(); 
 
        return $this->response; 
    } 
 
    public function setLinkStatus($ending, $status) 
    { 
        // Validate the new URL 
        $values = [ 
            'ending' => trim($ending), 
            'status' => trim($status), 
        ]; 
        if(!$this->validator->validateLinkStatus($values)) 
        { 
            $this->notify->error('Status not valid.', 'Error'); 
            return $this->response; 
        } 
 
        // Update the link in the Polr instance 
        $update = ($values['status']) ? 'enable' : 'disable'; 
        $apiResponse = $this->apiClient->put('links/' . $values['ending'], 
            ['query' => ['key' => $this->apiKey, 'status' => $update]]); 
        $jsonResponse = json_decode($apiResponse->getBody()->getContents()); 
 
        // Reload the datatable 
        $this->response->script("polr.home.reloadLinkTables()"); 
        // Show a confirmation message 
        $this->notify->info("Link successfully {$update}d.", 'Success'); 
 
        return $this->response; 
    } 
 
    public function deleteLink($ending) 
    { 
        $ending = trim($ending); 
        // Validate the input 
        if(!$this->validator->validateLinkEnding($ending)) 
        { 
            $this->notify->error('Ending not valid.', 'Error'); 
            return $this->response; 
        } 
 
        // Delete the link in the Polr instance 
        $apiResponse = $this->apiClient->delete('links/' . $ending, 
            ['query' => ['key' => $this->apiKey]]); 
        $jsonResponse = json_decode($apiResponse->getBody()->getContents()); 
 
        // Reload the datatable 
        $this->response->script("polr.home.reloadLinkTables()"); 
        // Show a confirmation message 
        $this->notify->info("Link successfully deleted.", 'Success'); 
 
 
        return $this->response; 
    } 
 
    public function checkAvailability($ending) 
    { 
        $ending = trim($ending); 
        // Validate the input 
        if(!$this->validator->validateLinkEnding($ending)) 
        { 
            $this->response->html('link-availability-status', 
                '<span style="color:orange"><i class="fa fa-exclamation-triangle"></i> Invalid Custom URL Ending</span>'); 
            return $this->response; 
        } 
 
        // Fetch the link from the Polr instance 
        try 
        { 
            $apiResponse = $this->apiClient->get('links/' . $ending, 
                ['query' => ['key' => $this->apiKey]]); 
            $jsonResponse = json_decode($apiResponse->getBody()->getContents()); 
 
            // if ending already exists 
            $this->response->html('link-availability-status', 
                '<span style="color:red"><i class="fa fa-ban"></i> Already in use</span>'); 
        } 
        catch(\Exception $e) 
        { 
            $this->response->html('link-availability-status', 
                '<span style="color:green"><i class="fa fa-check"></i> Available</span>'); 
        } 
 
        return $this->response; 
    } 
 
    public function shorten(array $values) 
    { 
        // Validate URL form data 
        if(!$this->validator->validateLinkUrl($values, false)) 
        { 
            $this->notify->error('Invalid URL or custom ending.', 'Error'); 
            return $this->response; 
        } 
 
        // API request parameters 
        $parameters = [ 
            'key' => $this->apiKey, 
            'url' => $values['url'], 
            'secret' => ($values['options'] == "s" ? 'true' : 'false'), 
            'ip' => $this->remoteAddress, 
        ]; 
        if($values['ending'] != '') 
        { 
            $parameters['ending'] = $values['ending']; 
        } 
 
        // Update the link in the Polr instance 
        $apiResponse = $this->apiClient->post('links', ['query' => $parameters]); 
        $jsonResponse = json_decode($apiResponse->getBody()->getContents()); 
        $short_url = $jsonResponse->result; 
 
        $title = 'Shortened URL'; 
        $content = $this->view()->render('polr_admin::shorten.result', ['short_url' => $short_url]); 
        $buttons = []; 
        $this->dialog->show($title, $content, $buttons); 
        $this->jq('.result-box')->focus()->select(); 
 
        return $this->response; 
    } 
 
    protected function datatableParameters($parameters) 
    { 
        // The boolean parameters sent by Guzzle in a HTTP request are not recognized 
        // by Datatables. So we need to convert them to strings "true" or "false". 
        foreach($parameters['columns'] as &$column) 
        { 
            $column['searchable'] = ($column['searchable']) ? 'true' : 'false'; 
            $column['orderable'] = ($column['orderable']) ? 'true' : 'false'; 
            $column['search']['regex'] = ($column['search']['regex']) ? 'true' : 'false'; 
        } 
        // Set the "key" parameter 
        $parameters['key'] = $this->apiKey; 
        return $parameters; 
    } 
 
    public function getAdminLinks($parameters) 
    { 
        // Fetch the links from the Polr instance 
        $apiResponse = $this->apiClient->get('links', [ 
            'query' => $this->datatableParameters($parameters) 
        ]); 
        $jsonResponse = json_decode($apiResponse->getBody()->getContents()); 
        $this->dtRenderer->settings = $jsonResponse->settings; 
 
        $this->response->datatables->make($jsonResponse->result->data, 
            $jsonResponse->result->recordsTotal, $jsonResponse->result->draw) 
            ->add('disable', [$this->dtRenderer, 'renderToggleLinkActiveCell']) 
            ->add('delete', [$this->dtRenderer, 'renderDeleteLinkCell']) 
            ->edit('clicks', [$this->dtRenderer, 'renderClicksCell']) 
            ->edit('long_url', [$this->dtRenderer, 'renderLongUrlCell']) 
            ->escape(['short_url', 'creator']) 
            ->attr([ 
                'data-id' => 'id', 
                'data-ending' => 'short_url', 
            ]); 
 
        return $this->response; 
    } 
 
    public function getUserLinks($parameters) 
    { 
        // Fetch the links from the Polr instance 
        $apiResponse = $this->apiClient->get('users/me/links', [ 
            'query' => $this->datatableParameters($parameters) 
        ]); 
        $jsonResponse = json_decode($apiResponse->getBody()->getContents()); 
        $this->dtRenderer->settings = $jsonResponse->settings; 
 
        $this->response->datatables->make($jsonResponse->result->data, 
            $jsonResponse->result->recordsTotal, $jsonResponse->result->draw) 
            ->edit('clicks', [$this->dtRenderer, 'renderClicksCell']) 
            ->edit('long_url', [$this->dtRenderer, 'renderLongUrlCell']) 
            ->escape(['short_url']) 
            ->attr([ 
                'data-id' => 'id', 
                'data-ending' => 'short_url', 
            ]); 
 
        return $this->response; 
    } 
} 
 
 |