user edit form

This commit is contained in:
2018-07-22 23:08:16 +02:00
parent ddb885b4e2
commit 1c6dedbb34
29 changed files with 730 additions and 395 deletions
@@ -49,16 +49,14 @@ class RegisterController extends Controller
*/
protected function validator(array $data)
{
return Validator::make($data, [
return $this->makeValidator($data, [
'name' => [
'regex:/^[a-zA-Z0-9_.-]+$/',
'required',
'string',
'max:255',
VALI_NAME,
'unique:users'
],
'email' => 'required|string|email|max:255|unique:users',
'password' => 'required|string|min:6|max:1000|confirmed', // max len to foil DOS attempts
'email' => ['required', 'unique:users', VALI_EMAIL],
'password' => ['required', 'confirmed', VALI_PASSWORD],
]);
}
+27 -1
View File
@@ -3,13 +3,39 @@
namespace App\Http\Controllers;
use Illuminate\Foundation\Bus\DispatchesJobs;
use Illuminate\Http\Request;
use Illuminate\Routing\Controller as BaseController;
use Illuminate\Foundation\Validation\ValidatesRequests;
use Illuminate\Foundation\Auth\Access\AuthorizesRequests;
class Controller extends BaseController
{
use AuthorizesRequests, DispatchesJobs, ValidatesRequests;
use AuthorizesRequests,
DispatchesJobs,
ValidatesRequests {
ValidatesRequests::validate as validate_orig;
ValidatesRequests::validateWithBag as validateWithBag_orig;
}
// Hacks to allow recursive nesting of validations in string and array format
public function makeValidator($data, $rules, $messages = array(), $customAttributes = array())
{
return \Validator::make($data, vali($rules), $messages, $customAttributes);
}
public function validate(Request $request, array $rules,
array $messages = [], array $customAttributes = [])
{
return objBag($this->validate_orig($request, vali($rules), $messages, $customAttributes));
}
public function validateWithBag($errorBag, Request $request, array $rules,
array $messages = [], array $customAttributes = [])
{
return objBag($this->validateWithBag_orig($errorBag, $request, vali($rules),
$messages, $customAttributes));
}
protected function backWithErrors($errors)
{
+25 -18
View File
@@ -54,21 +54,24 @@ class TableController extends Controller
/** @var User $u */
$u = \Auth::user();
$this->validate($request, [
'name' => 'required|string|max:255',
'title' => 'string|string|max:255',
'description' => 'string|nullable|max:4000',
'license' => 'string|nullable|max:4000',
'origin' => 'string|nullable|max:4000',
$input = $this->validate($request, [
'name' => [
'required',
VALI_NAME,
Rule::unique('tables'),
],
'title' => ['required', VALI_LINE],
'description' => ['nullable', VALI_TEXT],
'license' => ['nullable', VALI_TEXT],
'origin' => ['nullable', VALI_TEXT],
'columns' => 'required|string',
'data' => 'string|nullable',
]);
// Check if table name is unique for user
$tabName = $request->get('name');
if ($u->tables()->where('name', $tabName)->exists()) {
if ($u->tables()->where('name', $input->name)->exists()) {
return $this->backWithErrors([
'name' => "A table called \"$tabName\" already exists in your account.",
'name' => "A table called \"$input->name\" already exists in your account.",
]);
}
@@ -76,7 +79,7 @@ class TableController extends Controller
/** @var Column[] $columns */
$columns = [];
$column_keys = []; // for checking duplicates
$colTable = array_map('str_getcsv', explode("\n", $request->get('columns')));
$colTable = array_map('str_getcsv', explode("\n", $input->columns));
// prevent griefing via long list of columns
if (count($colTable) > 100) return $this->backWithErrors(['columns' => "Too many columns"]);
@@ -104,7 +107,7 @@ class TableController extends Controller
}
if (count($columns) == 0) return $this->backWithErrors(['columns' => "Define at least one column"]);
$rowTable = array_map('str_getcsv', explode("\n", $request->get('data')));
$rowTable = array_map('str_getcsv', explode("\n", $input->data));
// Preparing data to insert into the Rows table
$rowsData = null;
@@ -116,6 +119,10 @@ class TableController extends Controller
$parsed = [];
foreach ($row as $i => $val) {
$key = $columns[$i]->name;
if (strlen($val) > 255) {
// try to stop people inserting unstructured crap / malformed CSV
throw new NotApplicableException("Value for column $key too long.");
}
$parsed[$key] = $columns[$i]->cast($val);
}
return [
@@ -127,7 +134,7 @@ class TableController extends Controller
}
$revisionFields = [
'note' => "Initial revision of table $u->name/$tabName",
'note' => "Initial revision of table $u->name/$input->name",
'columns' => json_encode($columns),
'row_count' => count($rowsData),
];
@@ -135,11 +142,11 @@ class TableController extends Controller
$tableFields = [
'owner_id' => $u->id,
'revision_id' => 0,
'name' => $tabName,
'title' => $request->get('title'),
'description' => $request->get('description'),
'license' => $request->get('license'),
'origin' => $request->get('origin'),
'name' => $input->name,
'title' => $input->title,
'description' => $input->description,
'license' => $input->license,
'origin' => $input->origin,
];
\DB::transaction(function () use ($revisionFields, $tableFields, $rowsData) {
@@ -156,6 +163,6 @@ class TableController extends Controller
$revision->rows()->createMany($rowsData);
});
return redirect(route('table.view', ['user' => $u, 'table' => $tabName]));
return redirect(route('table.view', ['user' => $u, 'table' => $input->name]));
}
}
+57 -4
View File
@@ -3,7 +3,12 @@
namespace App\Http\Controllers;
use App\Models\EmailConfirmation;
use App\Models\User;
use Hash;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;
use MightyPork\Utils\Str;
class UserController extends Controller
{
@@ -22,18 +27,66 @@ class UserController extends Controller
}
/**
* Edit user profile
* Edit own profile
*
* @param User $user
* @return \Illuminate\View\View
*/
public function edit()
{
return view('user.edit')->with('user', \Auth::user());
return view('user.edit')->with('user', \user());
}
public function store()
/**
* Store changed profile
*/
public function store(Request $request)
{
echo "Not impl";
$input = $this->validate($request, [
'name' => [
'required',
VALI_NAME,
Rule::unique('users')->ignoreModel(\user()),
],
'email' => [
'required',
VALI_EMAIL,
Rule::unique('users')->ignoreModel(\user()),
],
'bio' => ['nullable', VALI_TEXT],
'title' => ['required', VALI_LINE],
'website' => ['required', VALI_LINE],
'new_password' => ['nullable', 'confirmed', VALI_PASSWORD],
]);
$user = user();
if ($input->email != $user->email) {
$confirmation = EmailConfirmation::create([
'user_id' => $user->id,
'email' => $input->email,
'token' => Str::random(60),
]);
flash()->warning("New e-mail confirmation sent to $input->email.")->important();
// TODO send the e-mail
unset($input->email);
}
$user->fill($input->all());
if ($input->has('new_password')) {
$user->password = Hash::make($input->new_password);
flash()->warning('Password changed');
}
$user->save();
flash()->success('Settings saved');
return back();
}
}