Skip to content
This repository was archived by the owner on Jan 20, 2021. It is now read-only.

Commit 1ebdbf5

Browse files
authored
Anonymous edit feature (#9)
* Remove deprecated middleware * Add password to Paste entity * Add new custom rule to determine password match * Improve paste menu * Add new FormRequest for update paste * Add fixed Paste test on PasteTableSeeder * Add the ability to edit a paste * Improve tests suite * Remove dead code * Add new alert style for callouts * Add the ability to set a password on paste creation and fork * Fix a bug that caused crashes when a password was null * Fix a stupid bug on LanguageFactory causing tests to fail
1 parent 70bcd16 commit 1ebdbf5

29 files changed

+613
-67
lines changed

app/Entities/Paste.php

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@ final class Paste extends Model
1717
protected $table = self::TABLE_NAME;
1818

1919
/** {@inheritdoc} */
20-
protected $fillable = ["paste_id", "language_id", "slug", "name", "extension", "code", "description"];
20+
protected $fillable = ["paste_id", "language_id", "slug", "name", "extension", "code", "description", "password"];
2121

2222
/** {@inheritdoc} */
2323
protected $guarded = ["id"];
2424

25+
/** {@inheritdoc} */
26+
protected $hidden = ["password"];
27+
2528
/** {@inheritdoc} */
2629
protected $casts = [
2730
"paste_id" => "integer",
@@ -45,6 +48,18 @@ public function getFileNameAttribute() : string
4548
return "{$this->name}.{$this->extension}";
4649
}
4750

51+
/**
52+
* Use built-in function to store the password for
53+
* a paste
54+
*
55+
* @param string|null $value
56+
* @return void
57+
*/
58+
public function setPasswordAttribute($value)
59+
{
60+
$this->attributes["password"] = !is_null($value) ? bcrypt($value) : $value;
61+
}
62+
4863
/**
4964
* Determine if a paste is a fork
5065
* of another one

app/Exceptions/Handler.php

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -43,14 +43,4 @@ public function render($request, Exception $exception)
4343
{
4444
return parent::render($request, $exception);
4545
}
46-
47-
/** {@inheritdoc} */
48-
protected function unauthenticated($request, AuthenticationException $exception)
49-
{
50-
if ($request->expectsJson()) {
51-
return response()->json(["error" => "Unauthenticated."], 401);
52-
}
53-
54-
return redirect()->guest(route("login"));
55-
}
5646
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
namespace Wdi\Http\Handlers\Paste;
4+
5+
use Illuminate\Http\Request;
6+
use Illuminate\View\View;
7+
use Wdi\Http\Handlers\Handler;
8+
9+
/**
10+
* Class EditPasteHandler
11+
* @package Wdi\Http\Handlers\Paste
12+
*/
13+
final class EditPasteHandler extends Handler
14+
{
15+
/**
16+
* @param \Illuminate\Http\Request $request
17+
* @return \Illuminate\View\View
18+
*/
19+
public function __invoke(Request $request) : View
20+
{
21+
return view("paste.edit")->with("paste", $request->paste);
22+
}
23+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
<?php
2+
3+
namespace Wdi\Http\Handlers\Paste;
4+
5+
use Illuminate\Http\RedirectResponse;
6+
use Wdi\Http\Handlers\Handler;
7+
use Wdi\Http\Requests\UpdatePasteRequest;
8+
9+
/**
10+
* Class UpdatePasteHandler
11+
* @package Wdi\Http\Handlers\Paste
12+
*/
13+
final class UpdatePasteHandler extends Handler
14+
{
15+
/**
16+
* @param \Wdi\Http\Requests\UpdatePasteRequest $request
17+
* @return \Illuminate\Http\RedirectResponse
18+
*/
19+
public function __invoke(UpdatePasteRequest $request) : RedirectResponse
20+
{
21+
$paste = $request->paste;
22+
$paste->update($request->only(["name", "description", "language_id", "extension", "code"]));
23+
24+
return redirect()->route("paste.show", $paste);
25+
}
26+
}

app/Http/Middleware/RedirectIfAuthenticated.php

Lines changed: 0 additions & 31 deletions
This file was deleted.

app/Http/Requests/AddPasteRequest.php

Lines changed: 10 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -36,12 +36,19 @@ public function rules() : array
3636
"min:3",
3737
],
3838
"code" => [
39-
"required"
39+
"required",
40+
],
41+
"password" => [
42+
"sometimes",
43+
"confirmed",
4044
],
4145
"language_id" => [
4246
"required",
43-
Rule::exists(Language::TABLE_NAME, "id")
44-
]
47+
Rule::exists(Language::TABLE_NAME, "id"),
48+
],
49+
"extension" => [
50+
"required",
51+
],
4552
];
4653
}
4754
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
<?php
2+
3+
namespace Wdi\Http\Requests;
4+
5+
use Illuminate\Foundation\Http\FormRequest;
6+
use Illuminate\Validation\Rule;
7+
use Wdi\Entities\Language;
8+
use Wdi\Rules\PasswordMatch;
9+
10+
/**
11+
* Class UpdatePasteRequest
12+
* @package Wdi\Http\Requests
13+
*/
14+
final class UpdatePasteRequest extends FormRequest
15+
{
16+
/**
17+
* Determine if the user is authorized to make this request.
18+
*
19+
* @return bool
20+
*/
21+
public function authorize() : bool
22+
{
23+
return true;
24+
}
25+
26+
/**
27+
* Get the validation rules that apply to the request.
28+
*
29+
* @return array
30+
*/
31+
public function rules() : array
32+
{
33+
return [
34+
"name" => [
35+
"required",
36+
"min:3",
37+
],
38+
"code" => [
39+
"required",
40+
],
41+
"password" => [
42+
"required",
43+
new PasswordMatch($this->paste->password),
44+
],
45+
"language_id" => [
46+
"required",
47+
Rule::exists(Language::TABLE_NAME, "id"),
48+
],
49+
"extension" => [
50+
"required",
51+
],
52+
];
53+
}
54+
}

app/Providers/RouteServiceProvider.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ public function boot()
2323
Route::model("language", Language::class);
2424

2525
Route::bind("paste", function ($slug) {
26-
return Paste::select(["id", "language_id", "paste_id", "user_id", "slug", "name", "extension", "code", "description", "created_at", "updated_at"])
26+
return Paste::select(["id", "language_id", "paste_id", "user_id", "slug", "name", "extension", "code", "description", "password", "created_at", "updated_at"])
2727
->where("slug", $slug)->firstOrFail();
2828
});
2929
}

app/Rules/PasswordMatch.php

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
<?php
2+
3+
namespace Wdi\Rules;
4+
5+
use Hash;
6+
use Illuminate\Contracts\Validation\Rule;
7+
8+
/**
9+
* Class PasswordMatch
10+
* @package Wdi\Rules
11+
*/
12+
final class PasswordMatch implements Rule
13+
{
14+
/** @var string */
15+
private $password;
16+
17+
/**
18+
* Create a new rule instance.
19+
* @param string $password
20+
*/
21+
public function __construct(string $password)
22+
{
23+
$this->password = $password;
24+
}
25+
26+
/**
27+
* Determine if the validation rule passes.
28+
*
29+
* @param string $attribute
30+
* @param mixed $value
31+
* @return bool
32+
*/
33+
public function passes($attribute, $value)
34+
{
35+
return Hash::check($value, $this->password);
36+
}
37+
38+
/**
39+
* Get the validation error message.
40+
*
41+
* @return string
42+
*/
43+
public function message()
44+
{
45+
return "La password non corrisponde.";
46+
}
47+
}

database/factories/LanguageFactory.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
/** @var \Illuminate\Database\Eloquent\Factory $factory */
44
$factory->define(\Wdi\Entities\Language::class, function (Faker\Generator $faker) {
55
return [
6-
"name" => $faker->unique()->word,
6+
"name" => $faker->lexify("???????"),
77
"extensions" => $faker->randomElements(config("procedural.extensions"), 3),
88
];
99
});

0 commit comments

Comments
 (0)