Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
13 changes: 13 additions & 0 deletions config/users.php
Original file line number Diff line number Diff line change
Expand Up @@ -87,6 +87,19 @@

'registration_form_honeypot_field' => null,

/*
|--------------------------------------------------------------------------
| Delete replaced profile form assets
|--------------------------------------------------------------------------
|
| When uploading replacement assets through the user:profile_form
| should existing assets be deleted from the container. If false
| they will be unlinked from the user but left in the container.
|
*/

'delete_replaced_profile_form_assets' => false,

/*
|--------------------------------------------------------------------------
| User Wizard Invitation Email
Expand Down
4 changes: 1 addition & 3 deletions src/Auth/UserTags.php
Original file line number Diff line number Diff line change
Expand Up @@ -731,9 +731,7 @@ protected function getProfileTabs()
'display' => $section->display(),
'instructions' => $section->instructions(),
'fields' => $section->fields()->addValues($values)->preProcess()->all()
->reject(fn ($field) => in_array($field->handle(), ['password', 'password_confirmation', 'roles', 'groups'])
|| $field->fieldtype()->handle() === 'assets'
)
->reject(fn ($field) => in_array($field->handle(), ['password', 'password_confirmation', 'roles', 'groups']))
->map(fn ($field) => $this->getRenderableField($field, 'user.profile'))
->values()
->all(),
Expand Down
18 changes: 18 additions & 0 deletions src/Http/Controllers/User/ProfileController.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace Statamic\Http\Controllers\User;

use Statamic\Facades\Asset;
use Statamic\Facades\User;
use Statamic\Http\Requests\UserProfileRequest;

Expand All @@ -19,6 +20,23 @@ public function __invoke(UserProfileRequest $request)
$user->set($key, $value);
}

$processedAssets = $request->processedAssets();
if (config('statamic.users.delete_replaced_profile_form_assets')) {
User::blueprint()
->fields()
->addValues($user->data()->all())
->only($processedAssets->keys())
->preProcess()
->values()
->flatten()
->map(fn ($id) => Asset::findById($id))
->filter()
->each->delete();
}
foreach ($processedAssets as $key => $value) {
$user->set($key, $value);
}

$user->save();

return $this->successfulResponse();
Expand Down
5 changes: 4 additions & 1 deletion src/Http/Controllers/User/RegisterController.php
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,10 @@ public function __invoke(UserRegisterRequest $request)
$user = User::make()
->email($request->email)
->password($request->password)
->data($request->processedValues());
->data(array_merge(
$request->processedValues()->all(),
$request->processedAssets()->all(),
));

if ($roles = config('statamic.users.new_user_roles')) {
$user->explicitRoles($roles);
Expand Down
58 changes: 54 additions & 4 deletions src/Http/Requests/UserProfileRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,18 @@
use Illuminate\Validation\ValidationException;
use Statamic\Facades\Site;
use Statamic\Facades\User;
use Statamic\Forms\Uploaders\AssetsUploader;
use Statamic\Rules\AllowedFile;
use Statamic\Rules\UniqueUserValue;
use Statamic\Support\Arr;

class UserProfileRequest extends FormRequest
{
use Localizable;

public $blueprintFields;
public $submittedValues;
public $submittedAssets;

public function authorize(): bool
{
Expand Down Expand Up @@ -49,24 +53,44 @@ protected function failedValidation(Validator $validator)

public function processedValues()
{
return $this->blueprintFields->process()->values()
return $this->blueprintFields
->addValues($this->submittedValues)
->process()
->values()
->only(array_keys($this->submittedValues))
->except(['email', 'password', 'groups', 'roles', 'super']);
}

public function processedAssets()
{
return $this->blueprintFields
->addValues($this->uploadAssetFiles($this->blueprintFields))
->process()
->values()
->only(array_keys($this->submittedAssets));
}

public function validator()
{
$blueprint = User::blueprint();

$fields = $blueprint->fields();
$this->submittedValues = $this->valuesWithoutAssetFields($fields);
$this->blueprintFields = $fields->addValues($this->submittedValues);
$this->submittedAssets = $this->normalizeAssetsValues($fields);
$this->blueprintFields = $fields;

$userId = User::current()->id();

return $this->blueprintFields
return $fields
->addValues(array_merge(
$this->submittedValues,
$this->submittedAssets,
))
->validator()
->withRules(['email' => ['required', 'email', new UniqueUserValue(except: $userId)]])
->withRules(array_merge(
['email' => ['required', 'email', new UniqueUserValue(except: $userId)]],
$this->extraRules($fields),
))
->withReplacements(['id' => $userId])
->validator();
}
Expand All @@ -86,4 +110,30 @@ private function valuesWithoutAssetFields($fields)

return $this->except($assets);
}

private function normalizeAssetsValues($fields)
{
return $fields->all()
->filter(fn ($field) => $field->fieldtype()->handle() === 'assets' && $this->hasFile($field->handle()))
->map(fn ($field) => Arr::wrap($this->file($field->handle())))
->all();
}

protected function uploadAssetFiles($fields)
{
return $fields->all()
->filter(fn ($field) => $field->fieldtype()->handle() === 'assets' && $this->hasFile($field->handle()))
->map(fn ($field) => AssetsUploader::field($field)->upload($this->file($field->handle())))
->all();
}

private function extraRules($fields)
{
return $fields->all()
->filter(fn ($field) => $field->fieldtype()->handle() === 'assets')
->mapWithKeys(function ($field) {
return [$field->handle().'.*' => ['file', new AllowedFile]];
})
->all();
}
}
59 changes: 53 additions & 6 deletions src/Http/Requests/UserRegisterRequest.php
Original file line number Diff line number Diff line change
Expand Up @@ -10,14 +10,18 @@
use Illuminate\Validation\ValidationException;
use Statamic\Facades\Site;
use Statamic\Facades\User;
use Statamic\Forms\Uploaders\AssetsUploader;
use Statamic\Rules\AllowedFile;
use Statamic\Rules\UniqueUserValue;
use Statamic\Support\Arr;

class UserRegisterRequest extends FormRequest
{
use Localizable;

public $blueprintFields;
public $submittedValues;
public $submittedAssets;

public function authorize(): bool
{
Expand Down Expand Up @@ -50,11 +54,23 @@ protected function failedValidation(Validator $validator)

public function processedValues()
{
return $this->blueprintFields->process()->values()
return $this->blueprintFields
->addValues($this->submittedValues)
->process()
->values()
->only(array_keys($this->submittedValues))
->except(['email', 'groups', 'roles', 'super', 'password_confirmation']);
}

public function processedAssets()
{
return $this->blueprintFields
->addValues($this->uploadAssetFiles($this->blueprintFields))
->process()
->values()
->only(array_keys($this->submittedAssets));
}

public function validator()
{
$blueprint = User::blueprint();
Expand All @@ -63,14 +79,19 @@ public function validator()

$fields = $blueprint->fields();
$this->submittedValues = $this->valuesWithoutAssetFields($fields);
$this->blueprintFields = $fields->addValues($this->submittedValues);

return $this->blueprintFields
$this->submittedAssets = $this->normalizeAssetsValues($fields);
$this->blueprintFields = $fields;

return $fields
->addValues(array_merge(
$this->submittedValues,
$this->submittedAssets,
))
->validator()
->withRules([
->withRules(array_merge([
'email' => ['required', 'email', new UniqueUserValue],
'password' => ['required', 'confirmed', Password::default()],
])
], $this->extraRules($fields)))
->validator();
}

Expand All @@ -89,4 +110,30 @@ private function valuesWithoutAssetFields($fields)

return $this->except($assets);
}

private function normalizeAssetsValues($fields)
{
return $fields->all()
->filter(fn ($field) => $field->fieldtype()->handle() === 'assets' && $this->hasFile($field->handle()))
->map(fn ($field) => Arr::wrap($this->file($field->handle())))
->all();
}

protected function uploadAssetFiles($fields)
{
return $fields->all()
->filter(fn ($field) => $field->fieldtype()->handle() === 'assets' && $this->hasFile($field->handle()))
->map(fn ($field) => AssetsUploader::field($field)->upload($this->file($field->handle())))
->all();
}

private function extraRules($fields)
{
return $fields->all()
->filter(fn ($field) => $field->fieldtype()->handle() === 'assets')
->mapWithKeys(function ($field) {
return [$field->handle().'.*' => ['file', new AllowedFile]];
})
->all();
}
}
Loading