1
0
mirror of https://github.com/Kovah/LinkAce.git synced 2025-04-21 23:42:10 +02:00

Add default settings for new users, update the setup, fix some smaller issues (#494)

This commit is contained in:
Kovah 2022-06-22 22:50:13 +02:00
parent 4e3604ad6c
commit 59bf073081
No known key found for this signature in database
GPG Key ID: AAAA031BA9830D7B
11 changed files with 163 additions and 69 deletions

View File

@ -3,6 +3,7 @@
namespace App\Actions\Fortify;
use App\Models\User;
use App\Settings\UserSettings;
use Illuminate\Support\Facades\Hash;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\Rule;

View File

@ -0,0 +1,61 @@
<?php
namespace App\Actions\Settings;
use App\Models\User;
use App\Settings\UserSettings;
use Spatie\LaravelSettings\Migrations\SettingsMigration;
class SetDefaultSettingsForUser extends SettingsMigration
{
public function __construct(protected User $user)
{
parent::__construct();
}
public function up(): void
{
$group = 'user-' . $this->user->id;
$defaults = UserSettings::defaults();
$this->migrator->add($group . '.timezone', $defaults['timezone']);
$this->migrator->add($group . '.date_format', $defaults['date_format']);
$this->migrator->add($group . '.time_format', $defaults['time_format']);
$this->migrator->add($group . '.locale', $defaults['locale']);
$this->migrator->add($group . '.links_private_default', $defaults['links_private_default']);
$this->migrator->add($group . '.notes_private_default', $defaults['notes_private_default']);
$this->migrator->add($group . '.lists_private_default', $defaults['lists_private_default']);
$this->migrator->add($group . '.tags_private_default', $defaults['tags_private_default']);
$this->migrator->add($group . '.archive_backups_enabled', $defaults['archive_backups_enabled']);
$this->migrator->add($group . '.archive_private_backups_enabled', $defaults['archive_private_backups_enabled']);
$this->migrator->add($group . '.listitem_count', $defaults['listitem_count']);
$this->migrator->add($group . '.darkmode_setting', $defaults['darkmode_setting']);
$this->migrator->add($group . '.link_display_mode', $defaults['link_display_mode']);
$this->migrator->add($group . '.links_new_tab', $defaults['links_new_tab']);
$this->migrator->add($group . '.markdown_for_text', $defaults['markdown_for_text']);
$this->migrator->add($group . '.share_email', $defaults['share_services']);
$this->migrator->add($group . '.share_buffer', $defaults['share_services']);
$this->migrator->add($group . '.share_evernote', $defaults['share_services']);
$this->migrator->add($group . '.share_facebook', $defaults['share_services']);
$this->migrator->add($group . '.share_flipboard', $defaults['share_services']);
$this->migrator->add($group . '.share_hackernews', $defaults['share_services']);
$this->migrator->add($group . '.share_linkedin', $defaults['share_services']);
$this->migrator->add($group . '.share_mastodon', $defaults['share_services']);
$this->migrator->add($group . '.share_pinterest', $defaults['share_services']);
$this->migrator->add($group . '.share_pocket', $defaults['share_services']);
$this->migrator->add($group . '.share_reddit', $defaults['share_services']);
$this->migrator->add($group . '.share_skype', $defaults['share_services']);
$this->migrator->add($group . '.share_sms', $defaults['share_services']);
$this->migrator->add($group . '.share_telegram', $defaults['share_services']);
$this->migrator->add($group . '.share_trello', $defaults['share_services']);
$this->migrator->add($group . '.share_tumblr', $defaults['share_services']);
$this->migrator->add($group . '.share_twitter', $defaults['share_services']);
$this->migrator->add($group . '.share_wechat', $defaults['share_services']);
$this->migrator->add($group . '.share_whatsapp', $defaults['share_services']);
$this->migrator->add($group . '.share_xing', $defaults['share_services']);
}
}

View File

@ -2,9 +2,10 @@
namespace App\Console\Commands;
use App\Actions\Fortify\CreateNewUser;
use App\Actions\Settings\SetDefaultSettingsForUser;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Hash;
class RegisterUserCommand extends Command
{
@ -32,12 +33,15 @@ class RegisterUserCommand extends Command
$password = $this->secret('Please enter a password for ' . $name);
User::create([
$user = (new CreateNewUser)->create([
'name' => $name,
'email' => $email,
'password' => Hash::make($password),
'password' => $password,
'password_confirmation' => $password,
]);
(new SetDefaultSettingsForUser($user))->up();
$this->info('User ' . $name . ' registered.');
}
}

View File

@ -36,7 +36,7 @@ class DatabaseController extends Controller
*/
public function configure(SetupDatabaseRequest $request): RedirectResponse
{
$this->createTempDatabaseConnection($request->all());
$this->createTempDatabaseConnection($request->validated());
if ($this->databaseHasData() && !$request->has('overwrite_data')) {
flash(trans('setup.database.data_present'), 'danger');
@ -69,7 +69,7 @@ class DatabaseController extends Controller
$this->dbConfig['username'] = $credentials['db_user'];
$this->dbConfig['password'] = $credentials['db_password'];
Config::set('database.connections.setup', $this->dbConfig);
Config::set('database.connections.mysql', $this->dbConfig);
}
/**
@ -84,7 +84,7 @@ class DatabaseController extends Controller
{
try {
Artisan::call('migrate:fresh', [
'--database' => 'setup', // Specify the correct connection
'--database' => 'mysql', // Specify the correct connection
'--force' => true, // Needed for production
'--no-interaction' => true,
]);
@ -135,7 +135,7 @@ class DatabaseController extends Controller
protected function databaseHasData(): bool
{
try {
$present_tables = DB::connection('setup')
$presentTables = DB::connection('mysql')
->getDoctrineSchemaManager()
->listTableNames();
} catch (PDOException|\Doctrine\DBAL\Exception $e) {
@ -143,6 +143,6 @@ class DatabaseController extends Controller
return false;
}
return count($present_tables) > 0;
return count($presentTables) > 0;
}
}

View File

@ -3,9 +3,8 @@
namespace App\Http\Controllers\Setup;
use App\Http\Controllers\Controller;
use App\Settings\SettingsAudit;
use App\Settings\SystemSettings;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Facades\Cache;
class MetaController extends Controller
{
@ -22,12 +21,13 @@ class MetaController extends Controller
/**
* Display a final screen after the setup was successful.
*
* @param SystemSettings $settings
* @return View
*/
public function complete(): View
public function complete(SystemSettings $settings): View
{
SettingsAudit::create(['key' => 'system_setup_completed', 'value' => true]);
Cache::forget('systemsettings');
$settings->setup_completed = true;
$settings->save();
return view('setup.complete');
}

View File

@ -2,6 +2,7 @@
namespace App\Http\Middleware;
use App\Settings\UserSettings;
use Closure;
use Illuminate\Http\Request;

View File

@ -50,4 +50,31 @@ class UserSettings extends Settings
{
return 'user-' . auth()->id();
}
/**
* Returns the default settings for users
*
* @return array{string: string|int|bool|null}
*/
public static function defaults(): array
{
return [
'timezone' => 'UTC',
'date_format' => config('linkace.default.date_format'),
'time_format' => config('linkace.default.time_format'),
'locale' => config('app.fallback_locale'),
'links_private_default' => false,
'notes_private_default' => false,
'lists_private_default' => false,
'tags_private_default' => false,
'archive_backups_enabled' => true,
'archive_private_backups_enabled' => true,
'listitem_count' => 24,
'darkmode_setting' => 2,
'link_display_mode' => 1,
'links_new_tab' => false,
'markdown_for_text' => true,
'share_services' => true,
];
}
}

View File

@ -49,7 +49,7 @@ return [
* additional prefix.
*/
'cache' => [
'enabled' => env('SETTINGS_CACHE_ENABLED', true),
'enabled' => false,
'store' => null,
'prefix' => 'settings',
'ttl' => null,

View File

@ -17,8 +17,6 @@ class MigrateExistingSettings extends SettingsMigration
$this->migrateSystemSettings();
$this->migrateGuestSettings();
$this->migrateUserSettings();
Artisan::call('settings:clear-cache');
}
protected function migrateSystemSettings(): void
@ -40,26 +38,26 @@ class MigrateExistingSettings extends SettingsMigration
$this->migrator->add('guest.links_new_tab', (bool)$this->sysSettings->get('guest_links_new_tab', true));
$this->migrator->add('guest.darkmode_setting', (int)$this->sysSettings->get('guest_darkmode_setting', 1));
$this->migrator->add('guest.share_email', (int)$this->sysSettings->get('guest_share_email', false));
$this->migrator->add('guest.share_buffer', (int)$this->sysSettings->get('guest_share_buffer', false));
$this->migrator->add('guest.share_evernote', (int)$this->sysSettings->get('guest_share_evernote', false));
$this->migrator->add('guest.share_facebook', (int)$this->sysSettings->get('guest_share_facebook', false));
$this->migrator->add('guest.share_flipboard', (int)$this->sysSettings->get('guest_share_flipboard', false));
$this->migrator->add('guest.share_hackernews', (int)$this->sysSettings->get('guest_share_hackernews', false));
$this->migrator->add('guest.share_linkedin', (int)$this->sysSettings->get('guest_share_linkedin', false));
$this->migrator->add('guest.share_mastodon', (int)$this->sysSettings->get('guest_share_mastodon', false));
$this->migrator->add('guest.share_pinterest', (int)$this->sysSettings->get('guest_share_pinterest', false));
$this->migrator->add('guest.share_pocket', (int)$this->sysSettings->get('guest_share_pocket', false));
$this->migrator->add('guest.share_reddit', (int)$this->sysSettings->get('guest_share_reddit', false));
$this->migrator->add('guest.share_skype', (int)$this->sysSettings->get('guest_share_skype', false));
$this->migrator->add('guest.share_sms', (int)$this->sysSettings->get('guest_share_sms', false));
$this->migrator->add('guest.share_telegram', (int)$this->sysSettings->get('guest_share_telegram', false));
$this->migrator->add('guest.share_trello', (int)$this->sysSettings->get('guest_share_trello', false));
$this->migrator->add('guest.share_tumblr', (int)$this->sysSettings->get('guest_share_tumblr', false));
$this->migrator->add('guest.share_twitter', (int)$this->sysSettings->get('guest_share_twitter', false));
$this->migrator->add('guest.share_wechat', (int)$this->sysSettings->get('guest_share_wechat', false));
$this->migrator->add('guest.share_whatsapp', (int)$this->sysSettings->get('guest_share_whatsapp', false));
$this->migrator->add('guest.share_xing', (int)$this->sysSettings->get('guest_share_xing', false));
$this->migrator->add('guest.share_email', (bool)$this->sysSettings->get('guest_share_email', false));
$this->migrator->add('guest.share_buffer', (bool)$this->sysSettings->get('guest_share_buffer', false));
$this->migrator->add('guest.share_evernote', (bool)$this->sysSettings->get('guest_share_evernote', false));
$this->migrator->add('guest.share_facebook', (bool)$this->sysSettings->get('guest_share_facebook', false));
$this->migrator->add('guest.share_flipboard', (bool)$this->sysSettings->get('guest_share_flipboard', false));
$this->migrator->add('guest.share_hackernews', (bool)$this->sysSettings->get('guest_share_hackernews', false));
$this->migrator->add('guest.share_linkedin', (bool)$this->sysSettings->get('guest_share_linkedin', false));
$this->migrator->add('guest.share_mastodon', (bool)$this->sysSettings->get('guest_share_mastodon', false));
$this->migrator->add('guest.share_pinterest', (bool)$this->sysSettings->get('guest_share_pinterest', false));
$this->migrator->add('guest.share_pocket', (bool)$this->sysSettings->get('guest_share_pocket', false));
$this->migrator->add('guest.share_reddit', (bool)$this->sysSettings->get('guest_share_reddit', false));
$this->migrator->add('guest.share_skype', (bool)$this->sysSettings->get('guest_share_skype', false));
$this->migrator->add('guest.share_sms', (bool)$this->sysSettings->get('guest_share_sms', false));
$this->migrator->add('guest.share_telegram', (bool)$this->sysSettings->get('guest_share_telegram', false));
$this->migrator->add('guest.share_trello', (bool)$this->sysSettings->get('guest_share_trello', false));
$this->migrator->add('guest.share_tumblr', (bool)$this->sysSettings->get('guest_share_tumblr', false));
$this->migrator->add('guest.share_twitter', (bool)$this->sysSettings->get('guest_share_twitter', false));
$this->migrator->add('guest.share_wechat', (bool)$this->sysSettings->get('guest_share_wechat', false));
$this->migrator->add('guest.share_whatsapp', (bool)$this->sysSettings->get('guest_share_whatsapp', false));
$this->migrator->add('guest.share_xing', (bool)$this->sysSettings->get('guest_share_xing', false));
}
protected function migrateUserSettings(): void
@ -108,30 +106,30 @@ class MigrateExistingSettings extends SettingsMigration
);
$this->migrator->add('user-1.listitem_count', (int)$this->userSettings->get('listitem_count', 24));
$this->migrator->add('user-1.darkmode_setting', (int)$this->userSettings->get('darkmode_setting', 1));
$this->migrator->add('user-1.darkmode_setting', (int)$this->userSettings->get('darkmode_setting', 2));
$this->migrator->add('user-1.link_display_mode', (int)$this->userSettings->get('link_display_mode', 1));
$this->migrator->add('user-1.links_new_tab', (bool)$this->userSettings->get('links_new_tab', false));
$this->migrator->add('user-1.markdown_for_text', (bool)$this->userSettings->get('markdown_for_text', 1));
$this->migrator->add('user-1.markdown_for_text', (bool)$this->userSettings->get('markdown_for_text', true));
$this->migrator->add('user-1.share_email', (int)$this->userSettings->get('share_email', false));
$this->migrator->add('user-1.share_buffer', (int)$this->userSettings->get('share_buffer', false));
$this->migrator->add('user-1.share_evernote', (int)$this->userSettings->get('share_evernote', false));
$this->migrator->add('user-1.share_facebook', (int)$this->userSettings->get('share_facebook', false));
$this->migrator->add('user-1.share_flipboard', (int)$this->userSettings->get('share_flipboard', false));
$this->migrator->add('user-1.share_hackernews', (int)$this->userSettings->get('share_hackernews', false));
$this->migrator->add('user-1.share_linkedin', (int)$this->userSettings->get('share_linkedin', false));
$this->migrator->add('user-1.share_mastodon', (int)$this->userSettings->get('share_mastodon', false));
$this->migrator->add('user-1.share_pinterest', (int)$this->userSettings->get('share_pinterest', false));
$this->migrator->add('user-1.share_pocket', (int)$this->userSettings->get('share_pocket', false));
$this->migrator->add('user-1.share_reddit', (int)$this->userSettings->get('share_reddit', false));
$this->migrator->add('user-1.share_skype', (int)$this->userSettings->get('share_skype', false));
$this->migrator->add('user-1.share_sms', (int)$this->userSettings->get('share_sms', false));
$this->migrator->add('user-1.share_telegram', (int)$this->userSettings->get('share_telegram', false));
$this->migrator->add('user-1.share_trello', (int)$this->userSettings->get('share_trello', false));
$this->migrator->add('user-1.share_tumblr', (int)$this->userSettings->get('share_tumblr', false));
$this->migrator->add('user-1.share_twitter', (int)$this->userSettings->get('share_twitter', false));
$this->migrator->add('user-1.share_wechat', (int)$this->userSettings->get('share_wechat', false));
$this->migrator->add('user-1.share_whatsapp', (int)$this->userSettings->get('share_whatsapp', false));
$this->migrator->add('user-1.share_xing', (int)$this->userSettings->get('share_xing', false));
$this->migrator->add('user-1.share_email', (bool)$this->userSettings->get('share_email', true));
$this->migrator->add('user-1.share_buffer', (bool)$this->userSettings->get('share_buffer', true));
$this->migrator->add('user-1.share_evernote', (bool)$this->userSettings->get('share_evernote', true));
$this->migrator->add('user-1.share_facebook', (bool)$this->userSettings->get('share_facebook', true));
$this->migrator->add('user-1.share_flipboard', (bool)$this->userSettings->get('share_flipboard', true));
$this->migrator->add('user-1.share_hackernews', (bool)$this->userSettings->get('share_hackernews', true));
$this->migrator->add('user-1.share_linkedin', (bool)$this->userSettings->get('share_linkedin', true));
$this->migrator->add('user-1.share_mastodon', (bool)$this->userSettings->get('share_mastodon', true));
$this->migrator->add('user-1.share_pinterest', (bool)$this->userSettings->get('share_pinterest', true));
$this->migrator->add('user-1.share_pocket', (bool)$this->userSettings->get('share_pocket', true));
$this->migrator->add('user-1.share_reddit', (bool)$this->userSettings->get('share_reddit', true));
$this->migrator->add('user-1.share_skype', (bool)$this->userSettings->get('share_skype', true));
$this->migrator->add('user-1.share_sms', (bool)$this->userSettings->get('share_sms', true));
$this->migrator->add('user-1.share_telegram', (bool)$this->userSettings->get('share_telegram', true));
$this->migrator->add('user-1.share_trello', (bool)$this->userSettings->get('share_trello', true));
$this->migrator->add('user-1.share_tumblr', (bool)$this->userSettings->get('share_tumblr', true));
$this->migrator->add('user-1.share_twitter', (bool)$this->userSettings->get('share_twitter', true));
$this->migrator->add('user-1.share_wechat', (bool)$this->userSettings->get('share_wechat', true));
$this->migrator->add('user-1.share_whatsapp', (bool)$this->userSettings->get('share_whatsapp', true));
$this->migrator->add('user-1.share_xing', (bool)$this->userSettings->get('share_xing', true));
}
}

View File

@ -3,6 +3,7 @@
namespace Tests\Commands;
use App\Models\User;
use App\Settings\SettingsAudit;
use Illuminate\Foundation\Testing\RefreshDatabase;
use Tests\TestCase;
@ -10,13 +11,10 @@ class RegisterUserCommandTest extends TestCase
{
use RefreshDatabase;
protected function setUp(): void
{
parent::setUp();
}
public function testCommandWithInput(): void
{
User::factory()->create(); // Create admin dummy user
$this->artisan('registeruser', [
'name' => 'Test',
'email' => 'test@linkace.org',
@ -25,7 +23,9 @@ class RegisterUserCommandTest extends TestCase
->expectsOutput('User Test registered.')
->assertExitCode(0);
$databaseUser = User::first();
$databaseUser = User::latest('id')->first();
//var_dump(User::all());
$this->assertEquals('Test', $databaseUser->name);
$this->assertEquals('test@linkace.org', $databaseUser->email);
@ -33,6 +33,8 @@ class RegisterUserCommandTest extends TestCase
public function testCommandWithoutInput(): void
{
User::factory()->create(); // Create admin dummy user
$this->artisan('registeruser')
->expectsQuestion('Please enter the user name', 'Test')
->expectsQuestion('Please enter the user email address', 'test@linkace.org')
@ -40,7 +42,7 @@ class RegisterUserCommandTest extends TestCase
->expectsOutput('User Test registered.')
->assertExitCode(0);
$databaseUser = User::first();
$databaseUser = User::latest('id')->first();
$this->assertEquals('Test', $databaseUser->name);
$this->assertEquals('test@linkace.org', $databaseUser->email);

View File

@ -56,7 +56,7 @@ class SettingsEntryTest extends TestCase
public function testDarkmodeSettingsChange(): void
{
$settings = app(UserSettings::class);
$settings->darkmode_setting = 2;
$settings->darkmode_setting = 0;
$settings->save();
$historyEntry = Audit::where('auditable_type', SettingsAudit::class)->with('auditable')->latest()->first();
@ -64,7 +64,7 @@ class SettingsEntryTest extends TestCase
$output = (new SettingsEntry($historyEntry))->render();
$this->assertStringContainsString(
'Changed Darkmode for User 1 from <code>Permanent</code> to <code>Automatically</code>',
'Changed Darkmode for User 1 from <code>Automatically</code> to <code>Disabled</code>',
$output
);
}
@ -104,7 +104,7 @@ class SettingsEntryTest extends TestCase
public function testSharingSettingsChange(): void
{
$settings = app(UserSettings::class);
$settings->share_email = true;
$settings->share_email = false;
$settings->save();
$historyEntry = Audit::where('auditable_type', SettingsAudit::class)->with('auditable')->latest()->first();
@ -112,7 +112,7 @@ class SettingsEntryTest extends TestCase
$output = (new SettingsEntry($historyEntry))->render();
$this->assertStringContainsString(
'Changed Link Sharing: Email from <code>No</code> to <code>Yes</code>',
'Changed Link Sharing: Email from <code>Yes</code> to <code>No</code>',
$output
);
}