<?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;
}
}
|