Fix varchar(191) by replacing with 255 #135 (#376)

* Add Nullable

* Edit filament & AppServiceProvider

* Pint

* Patch tests

* Actually patching tests

* Actually patching tests

* Remove length

* Remove defaultStringLength

* Let’s see the differences

---------

Co-authored-by: Lance Pioch <git@lance.sh>
This commit is contained in:
MartinOscar 2024-06-16 19:56:18 +02:00 committed by GitHub
parent 482e8ed6b2
commit aa08e774a1
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
37 changed files with 958 additions and 663 deletions

View File

@ -36,7 +36,7 @@ class CreateDatabaseHost extends CreateRecord
->required() ->required()
->live(onBlur: true) ->live(onBlur: true)
->afterStateUpdated(fn ($state, Forms\Set $set) => $set('name', $state)) ->afterStateUpdated(fn ($state, Forms\Set $set) => $set('name', $state))
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('port') Forms\Components\TextInput::make('port')
->columnSpan(1) ->columnSpan(1)
->helperText('The port that MySQL is running on for this host.') ->helperText('The port that MySQL is running on for this host.')
@ -57,12 +57,12 @@ class CreateDatabaseHost extends CreateRecord
Forms\Components\TextInput::make('username') Forms\Components\TextInput::make('username')
->helperText('The username of an account that has enough permissions to create new users and databases on the system.') ->helperText('The username of an account that has enough permissions to create new users and databases on the system.')
->required() ->required()
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('password') Forms\Components\TextInput::make('password')
->helperText('The password for the database user.') ->helperText('The password for the database user.')
->password() ->password()
->revealable() ->revealable()
->maxLength(191) ->maxLength(255)
->required(), ->required(),
Forms\Components\Select::make('node_id') Forms\Components\Select::make('node_id')
->searchable() ->searchable()

View File

@ -32,7 +32,7 @@ class EditDatabaseHost extends EditRecord
->required() ->required()
->live(onBlur: true) ->live(onBlur: true)
->afterStateUpdated(fn ($state, Forms\Set $set) => $set('name', $state)) ->afterStateUpdated(fn ($state, Forms\Set $set) => $set('name', $state))
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('port') Forms\Components\TextInput::make('port')
->columnSpan(1) ->columnSpan(1)
->helperText('The port that MySQL is running on for this host.') ->helperText('The port that MySQL is running on for this host.')
@ -52,12 +52,12 @@ class EditDatabaseHost extends EditRecord
Forms\Components\TextInput::make('username') Forms\Components\TextInput::make('username')
->helperText('The username of an account that has enough permissions to create new users and databases on the system.') ->helperText('The username of an account that has enough permissions to create new users and databases on the system.')
->required() ->required()
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('password') Forms\Components\TextInput::make('password')
->helperText('The password for the database user.') ->helperText('The password for the database user.')
->password() ->password()
->revealable() ->revealable()
->maxLength(191) ->maxLength(255)
->required(), ->required(),
Forms\Components\Select::make('node_id') Forms\Components\Select::make('node_id')
->searchable() ->searchable()

View File

@ -25,14 +25,14 @@ class CreateDatabase extends CreateRecord
->numeric(), ->numeric(),
Forms\Components\TextInput::make('database') Forms\Components\TextInput::make('database')
->required() ->required()
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('remote') Forms\Components\TextInput::make('remote')
->required() ->required()
->maxLength(191) ->maxLength(255)
->default('%'), ->default('%'),
Forms\Components\TextInput::make('username') Forms\Components\TextInput::make('username')
->required() ->required()
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('password') Forms\Components\TextInput::make('password')
->password() ->password()
->revealable() ->revealable()

View File

@ -26,14 +26,14 @@ class EditDatabase extends EditRecord
->numeric(), ->numeric(),
Forms\Components\TextInput::make('database') Forms\Components\TextInput::make('database')
->required() ->required()
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('remote') Forms\Components\TextInput::make('remote')
->required() ->required()
->maxLength(191) ->maxLength(255)
->default('%'), ->default('%'),
Forms\Components\TextInput::make('username') Forms\Components\TextInput::make('username')
->required() ->required()
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('password') Forms\Components\TextInput::make('password')
->password() ->password()
->revealable() ->revealable()

View File

@ -25,11 +25,11 @@ class CreateEgg extends CreateRecord
->schema([ ->schema([
Forms\Components\TextInput::make('name') Forms\Components\TextInput::make('name')
->required() ->required()
->maxLength(191) ->maxLength(255)
->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2])
->helperText('A simple, human-readable name to use as an identifier for this Egg.'), ->helperText('A simple, human-readable name to use as an identifier for this Egg.'),
Forms\Components\TextInput::make('author') Forms\Components\TextInput::make('author')
->maxLength(191) ->maxLength(255)
->required() ->required()
->email() ->email()
->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2])
@ -88,7 +88,7 @@ class CreateEgg extends CreateRecord
->helperText('If you would like to default to settings from another Egg select it from the menu above.'), ->helperText('If you would like to default to settings from another Egg select it from the menu above.'),
Forms\Components\TextInput::make('config_stop') Forms\Components\TextInput::make('config_stop')
->required() ->required()
->maxLength(191) ->maxLength(255)
->label('Stop Command') ->label('Stop Command')
->helperText('The command that should be sent to server processes to stop them gracefully. If you need to send a SIGINT you should enter ^C here.'), ->helperText('The command that should be sent to server processes to stop them gracefully. If you need to send a SIGINT you should enter ^C here.'),
Forms\Components\Textarea::make('config_startup')->rows(10)->json() Forms\Components\Textarea::make('config_startup')->rows(10)->json()
@ -140,7 +140,7 @@ class CreateEgg extends CreateRecord
Forms\Components\TextInput::make('name') Forms\Components\TextInput::make('name')
->live() ->live()
->debounce(750) ->debounce(750)
->maxLength(191) ->maxLength(255)
->columnSpanFull() ->columnSpanFull()
->afterStateUpdated(fn (Forms\Set $set, $state) => $set('env_variable', str($state)->trim()->snake()->upper()->toString()) ->afterStateUpdated(fn (Forms\Set $set, $state) => $set('env_variable', str($state)->trim()->snake()->upper()->toString())
) )
@ -148,13 +148,13 @@ class CreateEgg extends CreateRecord
Forms\Components\Textarea::make('description')->columnSpanFull(), Forms\Components\Textarea::make('description')->columnSpanFull(),
Forms\Components\TextInput::make('env_variable') Forms\Components\TextInput::make('env_variable')
->label('Environment Variable') ->label('Environment Variable')
->maxLength(191) ->maxLength(255)
->prefix('{{') ->prefix('{{')
->suffix('}}') ->suffix('}}')
->hintIcon('tabler-code') ->hintIcon('tabler-code')
->hintIconTooltip(fn ($state) => "{{{$state}}}") ->hintIconTooltip(fn ($state) => "{{{$state}}}")
->required(), ->required(),
Forms\Components\TextInput::make('default_value')->maxLength(191), Forms\Components\TextInput::make('default_value')->maxLength(255),
Forms\Components\Fieldset::make('User Permissions') Forms\Components\Fieldset::make('User Permissions')
->schema([ ->schema([
Forms\Components\Checkbox::make('user_viewable')->label('Viewable'), Forms\Components\Checkbox::make('user_viewable')->label('Viewable'),
@ -173,7 +173,7 @@ class CreateEgg extends CreateRecord
Forms\Components\TextInput::make('script_container') Forms\Components\TextInput::make('script_container')
->required() ->required()
->maxLength(191) ->maxLength(255)
->default('alpine:3.4'), ->default('alpine:3.4'),
Forms\Components\Select::make('script_entry') Forms\Components\Select::make('script_entry')

View File

@ -25,7 +25,7 @@ class EditEgg extends EditRecord
->schema([ ->schema([
Forms\Components\TextInput::make('name') Forms\Components\TextInput::make('name')
->required() ->required()
->maxLength(191) ->maxLength(255)
->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 1]) ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 1])
->helperText('A simple, human-readable name to use as an identifier for this Egg.'), ->helperText('A simple, human-readable name to use as an identifier for this Egg.'),
Forms\Components\TextInput::make('uuid') Forms\Components\TextInput::make('uuid')
@ -42,7 +42,7 @@ class EditEgg extends EditRecord
->helperText('A description of this Egg that will be displayed throughout the Panel as needed.'), ->helperText('A description of this Egg that will be displayed throughout the Panel as needed.'),
Forms\Components\TextInput::make('author') Forms\Components\TextInput::make('author')
->required() ->required()
->maxLength(191) ->maxLength(255)
->email() ->email()
->disabled() ->disabled()
->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2]) ->columnSpan(['default' => 1, 'sm' => 1, 'md' => 2, 'lg' => 2])
@ -95,7 +95,7 @@ class EditEgg extends EditRecord
->relationship('configFrom', 'name', ignoreRecord: true) ->relationship('configFrom', 'name', ignoreRecord: true)
->helperText('If you would like to default to settings from another Egg select it from the menu above.'), ->helperText('If you would like to default to settings from another Egg select it from the menu above.'),
Forms\Components\TextInput::make('config_stop') Forms\Components\TextInput::make('config_stop')
->maxLength(191) ->maxLength(255)
->label('Stop Command') ->label('Stop Command')
->helperText('The command that should be sent to server processes to stop them gracefully. If you need to send a SIGINT you should enter ^C here.'), ->helperText('The command that should be sent to server processes to stop them gracefully. If you need to send a SIGINT you should enter ^C here.'),
Forms\Components\Textarea::make('config_startup')->rows(10)->json() Forms\Components\Textarea::make('config_startup')->rows(10)->json()
@ -143,7 +143,7 @@ class EditEgg extends EditRecord
Forms\Components\TextInput::make('name') Forms\Components\TextInput::make('name')
->live() ->live()
->debounce(750) ->debounce(750)
->maxLength(191) ->maxLength(255)
->columnSpanFull() ->columnSpanFull()
->afterStateUpdated(fn (Forms\Set $set, $state) => $set('env_variable', str($state)->trim()->snake()->upper()->toString()) ->afterStateUpdated(fn (Forms\Set $set, $state) => $set('env_variable', str($state)->trim()->snake()->upper()->toString())
) )
@ -151,13 +151,13 @@ class EditEgg extends EditRecord
Forms\Components\Textarea::make('description')->columnSpanFull(), Forms\Components\Textarea::make('description')->columnSpanFull(),
Forms\Components\TextInput::make('env_variable') Forms\Components\TextInput::make('env_variable')
->label('Environment Variable') ->label('Environment Variable')
->maxLength(191) ->maxLength(255)
->prefix('{{') ->prefix('{{')
->suffix('}}') ->suffix('}}')
->hintIcon('tabler-code') ->hintIcon('tabler-code')
->hintIconTooltip(fn ($state) => "{{{$state}}}") ->hintIconTooltip(fn ($state) => "{{{$state}}}")
->required(), ->required(),
Forms\Components\TextInput::make('default_value')->maxLength(191), Forms\Components\TextInput::make('default_value')->maxLength(255),
Forms\Components\Fieldset::make('User Permissions') Forms\Components\Fieldset::make('User Permissions')
->schema([ ->schema([
Forms\Components\Checkbox::make('user_viewable')->label('Viewable'), Forms\Components\Checkbox::make('user_viewable')->label('Viewable'),
@ -176,12 +176,12 @@ class EditEgg extends EditRecord
Forms\Components\TextInput::make('script_container') Forms\Components\TextInput::make('script_container')
->required() ->required()
->maxLength(191) ->maxLength(255)
->default('alpine:3.4'), ->default('alpine:3.4'),
Forms\Components\TextInput::make('script_entry') Forms\Components\TextInput::make('script_entry')
->required() ->required()
->maxLength(191) ->maxLength(255)
->default('ash'), ->default('ash'),
MonacoEditor::make('script_install') MonacoEditor::make('script_install')

View File

@ -48,11 +48,11 @@ class CreateMount extends CreateRecord
Forms\Components\TextInput::make('source') Forms\Components\TextInput::make('source')
->required() ->required()
->helperText('File path on the host system to mount to a container.') ->helperText('File path on the host system to mount to a container.')
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('target') Forms\Components\TextInput::make('target')
->required() ->required()
->helperText('Where the mount will be accessible inside a container.') ->helperText('Where the mount will be accessible inside a container.')
->maxLength(191), ->maxLength(255),
Forms\Components\ToggleButtons::make('user_mountable') Forms\Components\ToggleButtons::make('user_mountable')
->hidden() ->hidden()
->label('User mountable?') ->label('User mountable?')

View File

@ -45,11 +45,11 @@ class EditMount extends EditRecord
Forms\Components\TextInput::make('source') Forms\Components\TextInput::make('source')
->required() ->required()
->helperText('File path on the host system to mount to a container.') ->helperText('File path on the host system to mount to a container.')
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('target') Forms\Components\TextInput::make('target')
->required() ->required()
->helperText('Where the mount will be accessible inside a container.') ->helperText('Where the mount will be accessible inside a container.')
->maxLength(191), ->maxLength(255),
Forms\Components\ToggleButtons::make('user_mountable') Forms\Components\ToggleButtons::make('user_mountable')
->hidden() ->hidden()
->label('User mountable?') ->label('User mountable?')

View File

@ -93,7 +93,7 @@ class CreateNode extends CreateRecord
$set('dns', false); $set('dns', false);
}) })
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('ip') Forms\Components\TextInput::make('ip')
->disabled() ->disabled()

View File

@ -94,7 +94,7 @@ class EditNode extends EditRecord
$set('dns', false); $set('dns', false);
}) })
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('ip') Forms\Components\TextInput::make('ip')
->disabled() ->disabled()

View File

@ -64,7 +64,7 @@ class CreateServer extends CreateRecord
'lg' => 3, 'lg' => 3,
]) ])
->required() ->required()
->maxLength(191), ->maxLength(255),
Forms\Components\Select::make('owner_id') Forms\Components\Select::make('owner_id')
->prefixIcon('tabler-user') ->prefixIcon('tabler-user')
@ -403,7 +403,7 @@ class CreateServer extends CreateRecord
$text = Forms\Components\TextInput::make('variable_value') $text = Forms\Components\TextInput::make('variable_value')
->hidden($this->shouldHideComponent(...)) ->hidden($this->shouldHideComponent(...))
->maxLength(191) ->maxLength(255)
->required(fn (Forms\Get $get) => in_array('required', explode('|', $get('rules')))) ->required(fn (Forms\Get $get) => in_array('required', explode('|', $get('rules'))))
->rules( ->rules(
fn (Forms\Get $get): Closure => function (string $attribute, $value, Closure $fail) use ($get) { fn (Forms\Get $get): Closure => function (string $attribute, $value, Closure $fail) use ($get) {

View File

@ -125,7 +125,7 @@ class EditServer extends EditRecord
'lg' => 3, 'lg' => 3,
]) ])
->required() ->required()
->maxLength(191), ->maxLength(255),
Forms\Components\Select::make('owner_id') Forms\Components\Select::make('owner_id')
->prefixIcon('tabler-user') ->prefixIcon('tabler-user')
@ -172,7 +172,7 @@ class EditServer extends EditRecord
'md' => 2, 'md' => 2,
'lg' => 3, 'lg' => 3,
]) ])
->maxLength(191), ->maxLength(255),
Forms\Components\Select::make('node_id') Forms\Components\Select::make('node_id')
->label('Node') ->label('Node')
->relationship('node', 'name') ->relationship('node', 'name')

View File

@ -52,7 +52,7 @@ class EditProfile extends \Filament\Pages\Auth\EditProfile
->label(trans('strings.username')) ->label(trans('strings.username'))
->disabled() ->disabled()
->readOnly() ->readOnly()
->maxLength(191) ->maxLength(255)
->unique(ignoreRecord: true) ->unique(ignoreRecord: true)
->autofocus(), ->autofocus(),
@ -61,7 +61,7 @@ class EditProfile extends \Filament\Pages\Auth\EditProfile
->label(trans('strings.email')) ->label(trans('strings.email'))
->email() ->email()
->required() ->required()
->maxLength(191) ->maxLength(255)
->unique(ignoreRecord: true), ->unique(ignoreRecord: true),
TextInput::make('password') TextInput::make('password')

View File

@ -20,8 +20,8 @@ class EditUser extends EditRecord
return $form return $form
->schema([ ->schema([
Section::make()->schema([ Section::make()->schema([
Forms\Components\TextInput::make('username')->required()->maxLength(191), Forms\Components\TextInput::make('username')->required()->maxLength(255),
Forms\Components\TextInput::make('email')->email()->required()->maxLength(191), Forms\Components\TextInput::make('email')->email()->required()->maxLength(255),
Forms\Components\TextInput::make('password') Forms\Components\TextInput::make('password')
->dehydrateStateUsing(fn (string $state): string => Hash::make($state)) ->dehydrateStateUsing(fn (string $state): string => Hash::make($state))

View File

@ -85,12 +85,12 @@ class ListUsers extends ListRecords
Forms\Components\TextInput::make('username') Forms\Components\TextInput::make('username')
->alphaNum() ->alphaNum()
->required() ->required()
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('email') Forms\Components\TextInput::make('email')
->email() ->email()
->required() ->required()
->unique() ->unique()
->maxLength(191), ->maxLength(255),
Forms\Components\TextInput::make('password') Forms\Components\TextInput::make('password')
->hintIcon('tabler-question-mark') ->hintIcon('tabler-question-mark')

View File

@ -9,14 +9,14 @@ class EggFormRequest extends AdminFormRequest
public function rules(): array public function rules(): array
{ {
$rules = [ $rules = [
'name' => 'required|string|max:191', 'name' => 'required|string|max:255',
'description' => 'nullable|string', 'description' => 'nullable|string',
'docker_images' => 'required|string', 'docker_images' => 'required|string',
'force_outgoing_ip' => 'sometimes|boolean', 'force_outgoing_ip' => 'sometimes|boolean',
'file_denylist' => 'array', 'file_denylist' => 'array',
'startup' => 'required|string', 'startup' => 'required|string',
'config_from' => 'sometimes|bail|nullable|numeric', 'config_from' => 'sometimes|bail|nullable|numeric',
'config_stop' => 'required_without:config_from|nullable|string|max:191', 'config_stop' => 'required_without:config_from|nullable|string|max:255',
'config_startup' => 'required_without:config_from|nullable|json', 'config_startup' => 'required_without:config_from|nullable|json',
'config_logs' => 'required_without:config_from|nullable|json', 'config_logs' => 'required_without:config_from|nullable|json',
'config_files' => 'required_without:config_from|nullable|json', 'config_files' => 'required_without:config_from|nullable|json',

View File

@ -13,9 +13,9 @@ class EggVariableFormRequest extends AdminFormRequest
public function rules(): array public function rules(): array
{ {
return [ return [
'name' => 'required|string|min:1|max:191', 'name' => 'required|string|min:1|max:255',
'description' => 'sometimes|nullable|string', 'description' => 'sometimes|nullable|string',
'env_variable' => 'required|regex:/^[\w]{1,191}$/|notIn:' . EggVariable::RESERVED_ENV_NAMES, 'env_variable' => 'required|regex:/^[\w]{1,255}$/|notIn:' . EggVariable::RESERVED_ENV_NAMES,
'options' => 'sometimes|required|array', 'options' => 'sometimes|required|array',
'rules' => 'bail|required|string', 'rules' => 'bail|required|string',
'default_value' => 'present', 'default_value' => 'present',

View File

@ -10,7 +10,7 @@ class AllocationFormRequest extends AdminFormRequest
{ {
return [ return [
'allocation_ip' => 'required|string', 'allocation_ip' => 'required|string',
'allocation_alias' => 'sometimes|nullable|string|max:191', 'allocation_alias' => 'sometimes|nullable|string|max:255',
'allocation_ports' => 'required|array', 'allocation_ports' => 'required|array',
]; ];
} }

View File

@ -13,8 +13,8 @@ class AdvancedSettingsFormRequest extends AdminFormRequest
{ {
return [ return [
'recaptcha:enabled' => 'required|in:true,false', 'recaptcha:enabled' => 'required|in:true,false',
'recaptcha:secret_key' => 'required|string|max:191', 'recaptcha:secret_key' => 'required|string|max:255',
'recaptcha:website_key' => 'required|string|max:191', 'recaptcha:website_key' => 'required|string|max:255',
'panel:guzzle:timeout' => 'required|integer|between:1,60', 'panel:guzzle:timeout' => 'required|integer|between:1,60',
'panel:guzzle:connect_timeout' => 'required|integer|between:1,60', 'panel:guzzle:connect_timeout' => 'required|integer|between:1,60',
'panel:client_features:allocations:enabled' => 'required|in:true,false', 'panel:client_features:allocations:enabled' => 'required|in:true,false',

View File

@ -13,7 +13,7 @@ class BaseSettingsFormRequest extends AdminFormRequest
public function rules(): array public function rules(): array
{ {
return [ return [
'app:name' => 'required|string|max:191', 'app:name' => 'required|string|max:255',
'panel:auth:2fa_required' => 'required|integer|in:0,1,2', 'panel:auth:2fa_required' => 'required|integer|in:0,1,2',
'app:locale' => ['required', 'string', Rule::in(array_keys($this->getAvailableLanguages()))], 'app:locale' => ['required', 'string', Rule::in(array_keys($this->getAvailableLanguages()))],
]; ];

View File

@ -16,10 +16,10 @@ class MailSettingsFormRequest extends AdminFormRequest
'mail:mailers:smtp:host' => 'required|string', 'mail:mailers:smtp:host' => 'required|string',
'mail:mailers:smtp:port' => 'required|integer|between:1,65535', 'mail:mailers:smtp:port' => 'required|integer|between:1,65535',
'mail:mailers:smtp:encryption' => ['present', Rule::in([null, 'tls', 'ssl'])], 'mail:mailers:smtp:encryption' => ['present', Rule::in([null, 'tls', 'ssl'])],
'mail:mailers:smtp:username' => 'nullable|string|max:191', 'mail:mailers:smtp:username' => 'nullable|string|max:255',
'mail:mailers:smtp:password' => 'nullable|string|max:191', 'mail:mailers:smtp:password' => 'nullable|string|max:255',
'mail:from:address' => 'required|string|email', 'mail:from:address' => 'required|string|email',
'mail:from:name' => 'nullable|string|max:191', 'mail:from:name' => 'nullable|string|max:255',
]; ];
} }

View File

@ -15,7 +15,7 @@ class StoreAllocationRequest extends ApplicationApiRequest
{ {
return [ return [
'ip' => 'required|string', 'ip' => 'required|string',
'alias' => 'sometimes|nullable|string|max:191', 'alias' => 'sometimes|nullable|string|max:255',
'ports' => 'required|array', 'ports' => 'required|array',
'ports.*' => 'string', 'ports.*' => 'string',
]; ];

View File

@ -15,7 +15,7 @@ class StoreBackupRequest extends ClientApiRequest
public function rules(): array public function rules(): array
{ {
return [ return [
'name' => 'nullable|string|max:191', 'name' => 'nullable|string|max:255',
'is_locked' => 'nullable|boolean', 'is_locked' => 'nullable|boolean',
'ignored' => 'nullable|string', 'ignored' => 'nullable|string',
]; ];

View File

@ -14,7 +14,7 @@ class StoreSubuserRequest extends SubuserRequest
public function rules(): array public function rules(): array
{ {
return [ return [
'email' => 'required|email|between:1,191', 'email' => 'required|email|between:1,255',
'permissions' => 'required|array', 'permissions' => 'required|array',
'permissions.*' => 'string', 'permissions.*' => 'string',
]; ];

View File

@ -16,8 +16,8 @@ class AuditLog extends Model
public static array $validationRules = [ public static array $validationRules = [
'uuid' => 'required|uuid', 'uuid' => 'required|uuid',
'action' => 'required|string|max:191', 'action' => 'required|string|max:255',
'subaction' => 'nullable|string|max:191', 'subaction' => 'nullable|string|max:255',
'device' => 'array', 'device' => 'array',
'device.ip_address' => 'ip', 'device.ip_address' => 'ip',
'device.user_agent' => 'string', 'device.user_agent' => 'string',

View File

@ -46,7 +46,7 @@ class DatabaseHost extends Model
* Validation rules to assign to this model. * Validation rules to assign to this model.
*/ */
public static array $validationRules = [ public static array $validationRules = [
'name' => 'required|string|max:191', 'name' => 'required|string|max:255',
'host' => 'required|string', 'host' => 'required|string',
'port' => 'required|numeric|between:1,65535', 'port' => 'required|numeric|between:1,65535',
'username' => 'required|string|max:32', 'username' => 'required|string|max:32',

View File

@ -105,7 +105,7 @@ class Egg extends Model
public static array $validationRules = [ public static array $validationRules = [
'uuid' => 'required|string|size:36', 'uuid' => 'required|string|size:36',
'name' => 'required|string|max:191', 'name' => 'required|string|max:255',
'description' => 'string|nullable', 'description' => 'string|nullable',
'features' => 'array|nullable', 'features' => 'array|nullable',
'author' => 'required|string|email', 'author' => 'required|string|email',
@ -115,7 +115,7 @@ class Egg extends Model
'docker_images.*' => 'required|string', 'docker_images.*' => 'required|string',
'startup' => 'required|nullable|string', 'startup' => 'required|nullable|string',
'config_from' => 'sometimes|bail|nullable|numeric|exists:eggs,id', 'config_from' => 'sometimes|bail|nullable|numeric|exists:eggs,id',
'config_stop' => 'required_without:config_from|nullable|string|max:191', 'config_stop' => 'required_without:config_from|nullable|string|max:255',
'config_startup' => 'required_without:config_from|nullable|json', 'config_startup' => 'required_without:config_from|nullable|json',
'config_logs' => 'required_without:config_from|nullable|json', 'config_logs' => 'required_without:config_from|nullable|json',
'config_files' => 'required_without:config_from|nullable|json', 'config_files' => 'required_without:config_from|nullable|json',

View File

@ -52,9 +52,9 @@ class EggVariable extends Model
public static array $validationRules = [ public static array $validationRules = [
'egg_id' => 'exists:eggs,id', 'egg_id' => 'exists:eggs,id',
'sort' => 'nullable', 'sort' => 'nullable',
'name' => 'required|string|between:1,191', 'name' => 'required|string|between:1,255',
'description' => 'string', 'description' => 'string',
'env_variable' => 'required|alphaDash|between:1,191|notIn:' . self::RESERVED_ENV_NAMES, 'env_variable' => 'required|alphaDash|between:1,255|notIn:' . self::RESERVED_ENV_NAMES,
'default_value' => 'string', 'default_value' => 'string',
'user_viewable' => 'boolean', 'user_viewable' => 'boolean',
'user_editable' => 'boolean', 'user_editable' => 'boolean',

View File

@ -41,7 +41,7 @@ class Mount extends Model
*/ */
public static array $validationRules = [ public static array $validationRules = [
'name' => 'required|string|min:2|max:64|unique:mounts,name', 'name' => 'required|string|min:2|max:64|unique:mounts,name',
'description' => 'nullable|string|max:191', 'description' => 'nullable|string|max:255',
'source' => 'required|string', 'source' => 'required|string',
'target' => 'required|string', 'target' => 'required|string',
'read_only' => 'sometimes|boolean', 'read_only' => 'sometimes|boolean',

View File

@ -76,7 +76,7 @@ class Schedule extends Model
public static array $validationRules = [ public static array $validationRules = [
'server_id' => 'required|exists:servers,id', 'server_id' => 'required|exists:servers,id',
'name' => 'required|string|max:191', 'name' => 'required|string|max:255',
'cron_day_of_week' => 'required|string', 'cron_day_of_week' => 'required|string',
'cron_month' => 'required|string', 'cron_month' => 'required|string',
'cron_day_of_month' => 'required|string', 'cron_day_of_month' => 'required|string',

View File

@ -139,9 +139,9 @@ class Server extends Model
protected $guarded = ['id', self::CREATED_AT, self::UPDATED_AT, 'deleted_at', 'installed_at']; protected $guarded = ['id', self::CREATED_AT, self::UPDATED_AT, 'deleted_at', 'installed_at'];
public static array $validationRules = [ public static array $validationRules = [
'external_id' => 'sometimes|nullable|string|between:1,191|unique:servers', 'external_id' => 'sometimes|nullable|string|between:1,255|unique:servers',
'owner_id' => 'required|integer|exists:users,id', 'owner_id' => 'required|integer|exists:users,id',
'name' => 'required|string|min:1|max:191', 'name' => 'required|string|min:1|max:255',
'node_id' => 'required|exists:nodes,id', 'node_id' => 'required|exists:nodes,id',
'description' => 'string', 'description' => 'string',
'status' => 'nullable|string', 'status' => 'nullable|string',
@ -156,7 +156,7 @@ class Server extends Model
'egg_id' => 'required|exists:eggs,id', 'egg_id' => 'required|exists:eggs,id',
'startup' => 'required|string', 'startup' => 'required|string',
'skip_scripts' => 'sometimes|boolean', 'skip_scripts' => 'sometimes|boolean',
'image' => 'required|string|max:191', 'image' => 'required|string|max:255',
'database_limit' => 'present|nullable|integer|min:0', 'database_limit' => 'present|nullable|integer|min:0',
'allocation_limit' => 'sometimes|nullable|integer|min:0', 'allocation_limit' => 'sometimes|nullable|integer|min:0',
'backup_limit' => 'present|nullable|integer|min:0', 'backup_limit' => 'present|nullable|integer|min:0',

View File

@ -21,7 +21,7 @@ class Setting extends Model
protected $fillable = ['key', 'value']; protected $fillable = ['key', 'value'];
public static array $validationRules = [ public static array $validationRules = [
'key' => 'required|string|between:1,191', 'key' => 'required|string|between:1,255',
'value' => 'string', 'value' => 'string',
]; ];

View File

@ -155,11 +155,11 @@ class User extends Model implements AuthenticatableContract, AuthorizableContrac
*/ */
public static array $validationRules = [ public static array $validationRules = [
'uuid' => 'nullable|string|size:36|unique:users,uuid', 'uuid' => 'nullable|string|size:36|unique:users,uuid',
'email' => 'required|email|between:1,191|unique:users,email', 'email' => 'required|email|between:1,255|unique:users,email',
'external_id' => 'sometimes|nullable|string|max:191|unique:users,external_id', 'external_id' => 'sometimes|nullable|string|max:255|unique:users,external_id',
'username' => 'required|between:1,191|unique:users,username', 'username' => 'required|between:1,255|unique:users,username',
'name_first' => 'nullable|string|between:0,191', 'name_first' => 'nullable|string|between:0,255',
'name_last' => 'nullable|string|between:0,191', 'name_last' => 'nullable|string|between:0,255',
'password' => 'sometimes|nullable|string', 'password' => 'sometimes|nullable|string',
'root_admin' => 'boolean', 'root_admin' => 'boolean',
'language' => 'string', 'language' => 'string',

View File

@ -16,7 +16,6 @@ use Illuminate\Support\Facades\Broadcast;
use Illuminate\Support\Facades\Event; use Illuminate\Support\Facades\Event;
use Illuminate\Support\Facades\Gate; use Illuminate\Support\Facades\Gate;
use Illuminate\Support\Facades\Http; use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Schema;
use Illuminate\Support\Facades\URL; use Illuminate\Support\Facades\URL;
use Illuminate\Support\Facades\View; use Illuminate\Support\Facades\View;
use Illuminate\Support\ServiceProvider; use Illuminate\Support\ServiceProvider;
@ -30,8 +29,6 @@ class AppServiceProvider extends ServiceProvider
*/ */
public function boot(): void public function boot(): void
{ {
Schema::defaultStringLength(191);
$versionData = app(SoftwareVersionService::class)->versionData(); $versionData = app(SoftwareVersionService::class)->versionData();
View::share('appVersion', $versionData['version'] ?? 'undefined'); View::share('appVersion', $versionData['version'] ?? 'undefined');
View::share('appIsGit', $versionData['is_git'] ?? false); View::share('appIsGit', $versionData['is_git'] ?? false);

View File

@ -0,0 +1,289 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('activity_log_subjects', function (Blueprint $table) {
$table->string('subject_type')->change();
});
Schema::table('activity_logs', function (Blueprint $table) {
$table->string('event')->change();
$table->string('ip')->change();
$table->string('actor_type')->nullable()->default(null)->change();
});
Schema::table('allocations', function (Blueprint $table) {
$table->string('ip')->change();
$table->string('notes')->nullable()->default(null)->change();
});
Schema::table('audit_logs', function (Blueprint $table) {
$table->string('action')->change();
$table->string('subaction')->nullable()->default(null)->change();
});
Schema::table('backups', function (Blueprint $table) {
$table->string('name')->change();
$table->string('disk')->change();
$table->string('checksum')->nullable()->default(null)->change();
});
Schema::table('database_hosts', function (Blueprint $table) {
$table->string('name')->change();
$table->string('host')->change();
$table->string('username')->change();
});
Schema::table('databases', function (Blueprint $table) {
$table->string('database')->change();
$table->string('username')->change();
$table->string('remote')->default('%')->change();
});
Schema::table('egg_variables', function (Blueprint $table) {
$table->string('name')->change();
$table->string('env_variable')->change();
});
Schema::table('eggs', function (Blueprint $table) {
$table->string('author')->change();
$table->string('name')->change();
$table->string('config_stop')->nullable()->default(null)->change();
$table->string('script_container')->default('alpine:3.4')->change();
$table->string('script_entry')->default('ash')->change();
});
Schema::table('failed_jobs', function (Blueprint $table) {
$table->string('uuid')->nullable()->default(null)->change();
});
Schema::table('jobs', function (Blueprint $table) {
$table->string('queue')->change();
});
Schema::table('migrations', function (Blueprint $table) {
$table->string('migration')->change();
});
Schema::table('mounts', function (Blueprint $table) {
$table->string('name')->change();
$table->string('source')->change();
$table->string('target')->change();
});
Schema::table('nodes', function (Blueprint $table) {
$table->string('name')->change();
$table->string('fqdn')->change();
$table->string('scheme')->default('https')->change();
$table->string('daemon_sftp_alias')->nullable()->default(null)->change();
$table->string('daemon_base')->change();
});
Schema::table('notifications', function (Blueprint $table) {
$table->string('id')->change();
$table->string('type')->change();
$table->string('notifiable_type')->change();
});
Schema::table('password_resets', function (Blueprint $table) {
$table->string('email')->change();
$table->string('token')->change();
});
Schema::table('recovery_tokens', function (Blueprint $table) {
$table->string('token')->change();
});
Schema::table('schedules', function (Blueprint $table) {
$table->string('name')->change();
$table->string('cron_day_of_week')->change();
$table->string('cron_month')->change();
$table->string('cron_day_of_month')->change();
$table->string('cron_hour')->change();
$table->string('cron_minute')->change();
});
Schema::table('servers', function (Blueprint $table) {
$table->string('external_id')->nullable()->default(null)->change();
$table->string('name')->change();
$table->string('status')->nullable()->default(null)->change();
$table->string('threads')->nullable()->default(null)->change();
$table->string('image')->change();
});
Schema::table('sessions', function (Blueprint $table) {
$table->string('id')->change();
});
Schema::table('settings', function (Blueprint $table) {
$table->string('key')->change();
});
Schema::table('tasks', function (Blueprint $table) {
$table->string('action')->change();
});
Schema::table('user_ssh_keys', function (Blueprint $table) {
$table->string('name')->change();
$table->string('fingerprint')->change();
});
Schema::table('users', function (Blueprint $table) {
$table->string('external_id')->nullable()->default(null)->change();
$table->string('username')->change();
$table->string('email')->change();
$table->string('name_first')->nullable()->default(null)->change();
$table->string('name_last')->nullable()->default(null)->change();
$table->string('remember_token')->nullable()->default(null)->change();
});
}
/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('activity_log_subjects', function (Blueprint $table) {
$table->string('subject_type', 191)->change();
});
Schema::table('activity_logs', function (Blueprint $table) {
$table->string('event', 191)->change();
$table->string('ip', 191)->change();
$table->string('actor_type', 191)->nullable()->default(null)->change();
});
Schema::table('allocations', function (Blueprint $table) {
$table->string('ip', 191)->change();
$table->string('notes', 191)->nullable()->default(null)->change();
});
Schema::table('audit_logs', function (Blueprint $table) {
$table->string('action', 191)->change();
$table->string('subaction', 191)->nullable()->default(null)->change();
});
Schema::table('backups', function (Blueprint $table) {
$table->string('name', 191)->change();
$table->string('disk', 191)->change();
$table->string('checksum', 191)->nullable()->default(null)->change();
});
Schema::table('database_hosts', function (Blueprint $table) {
$table->string('name', 191)->change();
$table->string('host', 191)->change();
$table->string('username', 191)->change();
});
Schema::table('databases', function (Blueprint $table) {
$table->string('database', 191)->change();
$table->string('username', 191)->change();
$table->string('remote', 191)->default('%', 191)->change();
});
Schema::table('egg_variables', function (Blueprint $table) {
$table->string('name', 191)->change();
$table->string('env_variable', 191)->change();
});
Schema::table('eggs', function (Blueprint $table) {
$table->string('author', 191)->change();
$table->string('name', 191)->change();
$table->string('config_stop', 191)->nullable()->default(null)->change();
$table->string('script_container', 191)->default('alpine:3.4', 191)->change();
$table->string('script_entry', 191)->default('ash', 191)->change();
});
Schema::table('failed_jobs', function (Blueprint $table) {
$table->string('uuid', 191)->nullable()->default(null)->change();
});
Schema::table('jobs', function (Blueprint $table) {
$table->string('queue', 191)->change();
});
Schema::table('migrations', function (Blueprint $table) {
$table->string('migration', 191)->change();
});
Schema::table('mounts', function (Blueprint $table) {
$table->string('name', 191)->change();
$table->string('source', 191)->change();
$table->string('target', 191)->change();
});
Schema::table('nodes', function (Blueprint $table) {
$table->string('name', 191)->change();
$table->string('fqdn', 191)->change();
$table->string('scheme', 191)->default('https', 191)->change();
$table->string('daemon_sftp_alias', 191)->nullable()->default(null)->change();
$table->string('daemon_base', 191)->change();
});
Schema::table('notifications', function (Blueprint $table) {
$table->string('id', 191)->change();
$table->string('type', 191)->change();
$table->string('notifiable_type', 191)->change();
});
Schema::table('password_resets', function (Blueprint $table) {
$table->string('email', 191)->change();
$table->string('token', 191)->change();
});
Schema::table('recovery_tokens', function (Blueprint $table) {
$table->string('token', 191)->change();
});
Schema::table('schedules', function (Blueprint $table) {
$table->string('name', 191)->change();
$table->string('cron_day_of_week', 191)->change();
$table->string('cron_month', 191)->change();
$table->string('cron_day_of_month', 191)->change();
$table->string('cron_hour', 191)->change();
$table->string('cron_minute', 191)->change();
});
Schema::table('servers', function (Blueprint $table) {
$table->string('external_id', 191)->nullable()->default(null)->change();
$table->string('name', 191)->change();
$table->string('status', 191)->nullable()->default(null)->change();
$table->string('threads', 191)->nullable()->default(null)->change();
$table->string('image', 191)->change();
});
Schema::table('sessions', function (Blueprint $table) {
$table->string('id', 191)->change();
});
Schema::table('settings', function (Blueprint $table) {
$table->string('key', 191)->change();
});
Schema::table('tasks', function (Blueprint $table) {
$table->string('action', 191)->change();
});
Schema::table('user_ssh_keys', function (Blueprint $table) {
$table->string('name', 191)->change();
$table->string('fingerprint', 191)->change();
});
Schema::table('users', function (Blueprint $table) {
$table->string('external_id', 191)->nullable()->default(null)->change();
$table->string('username', 191)->change();
$table->string('email', 191)->change();
$table->string('name_first', 191)->nullable()->default(null)->change();
$table->string('name_last', 191)->nullable()->default(null)->change();
$table->string('remember_token', 191)->nullable()->default(null)->change();
});
}
};

File diff suppressed because it is too large Load Diff

View File

@ -80,7 +80,7 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase
{ {
[$user, $server] = $this->generateTestAccount(); [$user, $server] = $this->generateTestAccount();
$email = str_repeat(Str::random(20), 9) . '1@gmail.com'; // 191 is the hard limit for the column in MySQL. $email = str_repeat(Str::random(35), 7) . '@gmail.com'; // 255 is the hard limit for the column in MySQL.
$response = $this->actingAs($user)->postJson($this->link($server) . '/users', [ $response = $this->actingAs($user)->postJson($this->link($server) . '/users', [
'email' => $email, 'email' => $email,
@ -99,7 +99,7 @@ class CreateServerSubuserTest extends ClientApiIntegrationTestCase
]); ]);
$response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY); $response->assertStatus(Response::HTTP_UNPROCESSABLE_ENTITY);
$response->assertJsonPath('errors.0.detail', 'The email must be between 1 and 191 characters.'); $response->assertJsonPath('errors.0.detail', 'The email must be between 1 and 255 characters.');
$response->assertJsonPath('errors.0.meta.source_field', 'email'); $response->assertJsonPath('errors.0.meta.source_field', 'email');
} }