2024-06-10 03:31:51 +00:00
|
|
|
<?php
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
2024-06-10 22:06:42 +00:00
|
|
|
use App\Models\Link_interaction;
|
2024-06-10 03:31:51 +00:00
|
|
|
use Illuminate\Http\Request;
|
|
|
|
use App\Models\Shortlink;
|
2024-06-10 03:41:52 +00:00
|
|
|
use GuzzleHttp\Client;
|
2024-06-10 03:31:51 +00:00
|
|
|
|
|
|
|
class ShortlinkController extends Controller
|
|
|
|
{
|
|
|
|
public function create(Request $request) {
|
|
|
|
if (auth()->user() == null) {
|
|
|
|
return response()->json(['error' => 'Unauthorized'], 401);
|
|
|
|
}
|
|
|
|
|
|
|
|
try {
|
|
|
|
$request->validate([
|
|
|
|
'url' => 'required|url'
|
|
|
|
]);
|
|
|
|
|
|
|
|
//check if url returns 200 at its final redirect
|
2024-06-10 03:41:52 +00:00
|
|
|
$guzzle = new Client([
|
|
|
|
'timeout' => 5
|
|
|
|
]);
|
|
|
|
try {
|
|
|
|
$response = $guzzle->get($request->url, ['allow_redirects' => ['track_redirects' => true]]);
|
|
|
|
if ($response->getStatusCode() != 200) {
|
|
|
|
return back()->withErrors([
|
|
|
|
'error' => 'The URL provided did not return a valid response'
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
return back()->withErrors([
|
|
|
|
'error' => 'The URL provided did not return a valid response'
|
|
|
|
]);
|
|
|
|
}
|
2024-06-10 03:31:51 +00:00
|
|
|
|
|
|
|
$shortlink = new Shortlink();
|
|
|
|
$shortlink->create($request->url, auth()->id());
|
|
|
|
return redirect("/l/{$shortlink->shortid}");
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
return back()->withErrors([
|
|
|
|
'error' => $e->getMessage()
|
|
|
|
]);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2024-06-10 22:06:42 +00:00
|
|
|
public static function goto(Request $request, $id) {
|
2024-06-10 03:31:51 +00:00
|
|
|
try {
|
2024-06-10 22:29:22 +00:00
|
|
|
$shortlink = Shortlink::where('shortid', $id)->first();
|
2024-06-10 03:31:51 +00:00
|
|
|
// check if the link is expired or if it has reached the max clicks
|
2024-06-10 22:06:42 +00:00
|
|
|
if ($shortlink->expires_at != null && strtotime($shortlink->expires_at) < time()) {
|
|
|
|
return response()->json(['error' => 'This link has expired'], 404);
|
|
|
|
}
|
|
|
|
|
|
|
|
if ($shortlink->max_clicks != null && $shortlink->max_clicks <= (new Link_interaction())->getTotalInteractions($id)) {
|
|
|
|
return response()->json(['error' => 'This link has reached the maximum number of clicks'], 404);
|
|
|
|
}
|
|
|
|
|
2024-06-10 03:31:51 +00:00
|
|
|
// log the interaction
|
2024-06-10 22:06:42 +00:00
|
|
|
[Link_interactionController::class, 'access']($request);
|
|
|
|
|
2024-06-10 03:31:51 +00:00
|
|
|
return redirect($shortlink->destination);
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
return response()->json(['error' => $e->getMessage()], 404);
|
|
|
|
}
|
|
|
|
}
|
2024-06-10 22:06:42 +00:00
|
|
|
|
|
|
|
public function getDetails(Request $request, $id) {
|
|
|
|
try {
|
2024-06-10 22:29:22 +00:00
|
|
|
$shortlink = Shortlink::where('shortid', $id)->first();
|
2024-06-10 22:06:42 +00:00
|
|
|
if ($shortlink->user_id != auth()->id()) {
|
|
|
|
return response()->json(['error' => 'Unauthorized'], 401);
|
|
|
|
}
|
|
|
|
$countrylist = (new Link_interactionController)->getCountryArray($id);
|
2024-06-11 00:17:06 +00:00
|
|
|
$coordinates = Link_interaction::getCoordinates($id);
|
|
|
|
$timestamps = Link_interaction::getTimes($id);
|
|
|
|
return view('details', ['shortlink' => $shortlink, 'countrylist' => $countrylist, 'coordinates' => $coordinates, 'timestamps' => $timestamps]);
|
2024-06-10 22:06:42 +00:00
|
|
|
} catch (\Exception $e) {
|
|
|
|
return response()->json(['error' => $e->getMessage()], 404);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function update(Request $request, $id) {
|
|
|
|
try {
|
2024-06-10 22:29:22 +00:00
|
|
|
$shortlink = Shortlink::where('shortid', $id)->first();
|
2024-06-10 22:06:42 +00:00
|
|
|
if ($shortlink->user_id != auth()->id()) {
|
|
|
|
return response()->json(['error' => 'Unauthorized'], 401);
|
|
|
|
}
|
|
|
|
$request['expiry-toggle'] = $request->input('expiry-toggle') == 'on';
|
|
|
|
$data = $request->validate([
|
|
|
|
'maxclicks' => 'required|integer|min:0',
|
|
|
|
'expiry-toggle' => 'required|boolean'
|
|
|
|
]);
|
|
|
|
if ($request->input('expiry-toggle')) {
|
|
|
|
$request->validate([
|
|
|
|
'expiry-date' => 'date_format:Y-m-d|required',
|
|
|
|
'expiry-hour' => 'date_format:H|min:0|max:23|required',
|
|
|
|
'expiry-minute' => 'date_format:i|min:0|max:59|required'
|
|
|
|
]);
|
|
|
|
$request->expires_at = \DateTime::createFromFormat('Y-m-d H:i', $request['expiry-date'] . ' ' . $request['expiry-hour'] . ':' . $request['expiry-minute']);
|
|
|
|
} else {
|
|
|
|
$request->expires_at = null;
|
|
|
|
}
|
|
|
|
$shortlink->modify($request->maxclicks, $request->expires_at);
|
|
|
|
return back();
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
return response()->json(['error' => $e->getMessage()], 400);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function delete(Request $request, $id) {
|
|
|
|
try {
|
2024-06-10 22:29:22 +00:00
|
|
|
$shortlink = Shortlink::where('shortid', $id)->first();
|
2024-06-10 22:06:42 +00:00
|
|
|
$shortlink->delete();
|
|
|
|
return redirect('profile');
|
|
|
|
} catch (\Exception $e) {
|
|
|
|
return response()->json(['error' => $e->getMessage()], 404);
|
|
|
|
}
|
|
|
|
}
|
2024-06-10 22:29:22 +00:00
|
|
|
|
|
|
|
public function getLinksByUser(Request $request) {
|
|
|
|
if (auth()->user() == null) {
|
|
|
|
return redirect('home');
|
|
|
|
}
|
|
|
|
$shortlinks = Shortlink::where('user_id', auth()->id())->get();
|
|
|
|
return view('profile', ['shortlinks' => $shortlinks]);
|
|
|
|
}
|
2024-06-10 03:31:51 +00:00
|
|
|
}
|