Skip to content

Commit 2c91db0

Browse files
committed
Add support of expiration date
1 parent e1724d2 commit 2c91db0

File tree

8 files changed

+101
-6
lines changed

8 files changed

+101
-6
lines changed
Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
<?php
2+
3+
use Illuminate\Support\Facades\Schema;
4+
use Illuminate\Database\Migrations\Migration;
5+
6+
class AddExpiresAtToUrls extends Migration
7+
{
8+
/**
9+
* Run the migrations.
10+
*
11+
* @return void
12+
*/
13+
public function up()
14+
{
15+
Schema::table('shorturl_urls', function ($table) {
16+
$table->dateTime('expires_at')->nullable()->after('counter');
17+
});
18+
}
19+
}

resources/views/urls/create.blade.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,18 @@
3333
@endif
3434
</div>
3535
</div>
36-
<div class="col-8 text-right">By <a href="https://github.com/gallib/laravel-short-url" title="by gallib/laravel-short-url" target="_blank">Gallib/laravel-short-url</a></div>
36+
<div class="col-4">
37+
<div class="form-group">
38+
<label for="expires_at">Expires at (optional)</label>
39+
<input type="datetime-local" class="form-control {{ $errors->has('expires_at') ? 'is-invalid' : '' }}" id="expires_at" name="expires_at" placeholder="Set your expiration date" value="{{ old('expires_at') }}">
40+
@if ($errors->has('expires_at'))
41+
<small id="code-error" class="form-text text-danger">
42+
{{ $errors->first('expires_at') }}
43+
</small>
44+
@endif
45+
</div>
46+
</div>
47+
<div class="col-4 text-right">By <a href="https://github.com/gallib/laravel-short-url" title="by gallib/laravel-short-url" target="_blank">Gallib/laravel-short-url</a></div>
3748
</div>
3849
</form>
3950
</div>

resources/views/urls/edit.blade.php

Lines changed: 12 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,18 @@
3434
@endif
3535
</div>
3636
</div>
37-
<div class="col-8 text-right">By <a href="https://github.com/gallib/laravel-short-url" title="by gallib/laravel-short-url" target="_blank">Gallib/laravel-short-url</a></div>
37+
<div class="col-4">
38+
<div class="form-group">
39+
<label for="expires_at">Expires at (optional)</label>
40+
<input type="datetime-local" class="form-control {{ $errors->has('expires_at') ? 'is-invalid' : '' }}" id="expires_at" name="expires_at" placeholder="Set your expiration date" value="{{ old('expires_at', ($url->couldExpire() ? $url->expires_at->format('Y-m-d\TH:i') : null)) }}">
41+
@if ($errors->has('expires_at'))
42+
<small id="code-error" class="form-text text-danger">
43+
{{ $errors->first('expires_at') }}
44+
</small>
45+
@endif
46+
</div>
47+
</div>
48+
<div class="col-4 text-right">By <a href="https://github.com/gallib/laravel-short-url" title="by gallib/laravel-short-url" target="_blank">Gallib/laravel-short-url</a></div>
3849
</div>
3950
</form>
4051
</div>

src/Http/Controllers/RedirectController.php

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,13 @@ public function redirect($code)
2121
});
2222

2323
if ($url !== null) {
24+
if ($url->hasExpired()) {
25+
abort(410);
26+
}
27+
2428
$url->increment('counter');
2529

26-
return redirect()->away($url->url, 301);
30+
return redirect()->away($url->url, $url->couldExpire() ? 302 : 301);
2731
}
2832

2933
abort(404);

src/Http/Controllers/UrlController.php

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Gallib\ShortUrl\Http\Controllers;
44

5+
use Carbon\Carbon;
56
use Gallib\ShortUrl\Url;
67
use Illuminate\Routing\Controller;
78
use Gallib\ShortUrl\Http\Requests\UrlRequest;
@@ -40,10 +41,16 @@ public function create()
4041
*/
4142
public function store(UrlRequest $request)
4243
{
43-
$url = Url::create([
44+
$data = [
4445
'url' => $request->get('url'),
4546
'code' => $request->get('code') ? \Str::slug($request->get('code')) : \Hasher::generate(),
46-
]);
47+
];
48+
49+
if ($request->filled('expires_at')) {
50+
$data['expires_at'] = Carbon::parse($request->get('expires_at'))->toDateTimeString();
51+
}
52+
53+
$url = Url::create($data);
4754

4855
return new UrlResponse($url);
4956
}
@@ -74,7 +81,16 @@ public function update(UrlRequest $request, $id)
7481

7582
\Cache::forget("url.{$url['code']}");
7683

77-
$url->update($request->all());
84+
$data = [
85+
'url' => $request->get('url'),
86+
'code' => $request->get('code'),
87+
];
88+
89+
if ($request->filled('expires_at')) {
90+
$data['expires_at'] = Carbon::parse($request->get('expires_at'))->toDateTimeString();
91+
}
92+
93+
$url->update($data);
7894

7995
return new UrlResponse($url);
8096
}

src/Http/Requests/UrlRequest.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@ public function rules()
3333
return [
3434
'url' => ['required', 'url', new Blacklist()],
3535
'code' => 'max:255'.$uniqueCode,
36+
'expires_at' => 'date|after:now|nullable',
3637
];
3738
}
3839

src/Http/Responses/UrlResponse.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ public function toResponse($request)
4343
'url' => $this->url->url,
4444
'short_url' => $shortUrl,
4545
'counter' => $this->url->counter,
46+
'expires_at' => $this->url->expires_at,
4647
], 201);
4748
}
4849

src/Url.php

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace Gallib\ShortUrl;
44

5+
use Carbon\Carbon;
56
use Illuminate\Database\Eloquent\Model;
67

78
class Url extends Model
@@ -21,6 +22,16 @@ class Url extends Model
2122
protected $fillable = [
2223
'url',
2324
'code',
25+
'expires_at',
26+
];
27+
28+
/**
29+
* The attributes that should be mutated to dates.
30+
*
31+
* @var array
32+
*/
33+
protected $dates = [
34+
'expires_at',
2435
];
2536

2637
/**
@@ -40,4 +51,25 @@ protected static function boot()
4051
app()->make('url-parser')->setUrlInfos($url);
4152
});
4253
}
54+
55+
public function couldExpire(): bool
56+
{
57+
return $this->expires_at !== null;
58+
}
59+
60+
/**
61+
* Return whether an url has expired
62+
*
63+
* @return boolean
64+
*/
65+
public function hasExpired(): bool
66+
{
67+
if (!$this->couldExpire()) {
68+
return false;
69+
}
70+
71+
$expiresAt = new Carbon($this->expires_at);
72+
73+
return !$expiresAt->isFuture();
74+
}
4375
}

0 commit comments

Comments
 (0)