Add Nami Settings
This commit is contained in:
		
							parent
							
								
									072ab6abb8
								
							
						
					
					
						commit
						7d3f52ec45
					
				|  | @ -3,14 +3,10 @@ | ||||||
| namespace App\Setting; | namespace App\Setting; | ||||||
| 
 | 
 | ||||||
| use App\Group; | use App\Group; | ||||||
| use App\Initialize\Actions\NamiLoginCheckAction; |  | ||||||
| use App\Nami\Actions\SettingSaveAction; |  | ||||||
| use App\Setting\Contracts\Storeable; |  | ||||||
| use Lorisleiva\Actions\ActionRequest; |  | ||||||
| use Zoomyboy\LaravelNami\Api; | use Zoomyboy\LaravelNami\Api; | ||||||
| use Zoomyboy\LaravelNami\Nami; | use Zoomyboy\LaravelNami\Nami; | ||||||
| 
 | 
 | ||||||
| class NamiSettings extends LocalSettings implements Storeable | class NamiSettings extends LocalSettings | ||||||
| { | { | ||||||
|     public int $mglnr; |     public int $mglnr; | ||||||
| 
 | 
 | ||||||
|  | @ -43,14 +39,6 @@ class NamiSettings extends LocalSettings implements Storeable | ||||||
|         ]; |         ]; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     public function beforeSave(ActionRequest $request): void |  | ||||||
|     { |  | ||||||
|         NamiLoginCheckAction::run([ |  | ||||||
|             'mglnr' => $request->mglnr, |  | ||||||
|             'password' => $request->password, |  | ||||||
|         ]); |  | ||||||
|     } |  | ||||||
| 
 |  | ||||||
|     public function localGroup(): ?Group |     public function localGroup(): ?Group | ||||||
|     { |     { | ||||||
|         return Group::firstWhere('nami_id', $this->default_group_id); |         return Group::firstWhere('nami_id', $this->default_group_id); | ||||||
|  |  | ||||||
|  | @ -182,6 +182,7 @@ return [ | ||||||
|         Modules\Module\ModuleServiceProvider::class, |         Modules\Module\ModuleServiceProvider::class, | ||||||
|         Modules\Invoice\InvoiceServiceProvider::class, |         Modules\Invoice\InvoiceServiceProvider::class, | ||||||
|         Modules\Mailgateway\MailgatewayServiceProvider::class, |         Modules\Mailgateway\MailgatewayServiceProvider::class, | ||||||
|  |         Modules\Nami\NamiServiceProvider::class, | ||||||
|     ], |     ], | ||||||
| 
 | 
 | ||||||
|     /* |     /* | ||||||
|  |  | ||||||
|  | @ -0,0 +1,69 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace Modules\Nami\Components; | ||||||
|  | 
 | ||||||
|  | use App\Initialize\Actions\NamiLoginCheckAction; | ||||||
|  | use App\Setting\NamiSettings; | ||||||
|  | use Illuminate\Validation\ValidationException; | ||||||
|  | use Livewire\Component; | ||||||
|  | use Zoomyboy\LaravelNami\LoginException; | ||||||
|  | 
 | ||||||
|  | class SettingView extends Component | ||||||
|  | { | ||||||
|  | 
 | ||||||
|  |     public $settingClass = NamiSettings::class; | ||||||
|  |     public string $password = ''; | ||||||
|  |     public string $mglnr = ''; | ||||||
|  |     public string $default_group_id = ''; | ||||||
|  | 
 | ||||||
|  |     public function rules(): array | ||||||
|  |     { | ||||||
|  |         return [ | ||||||
|  |             'password' => 'required|string', | ||||||
|  |             'default_group_id' => 'required', | ||||||
|  |             'mglnr' => 'required', | ||||||
|  |         ]; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function mount(): void | ||||||
|  |     { | ||||||
|  |         $this->mglnr = app(NamiSettings::class)->mglnr; | ||||||
|  |         $this->default_group_id = app(NamiSettings::class)->default_group_id; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function save(): void | ||||||
|  |     { | ||||||
|  |         $validated = $this->validate(); | ||||||
|  |         try { | ||||||
|  |             NamiLoginCheckAction::run([ | ||||||
|  |                 'mglnr' => $this->mglnr, | ||||||
|  |                 'password' => $this->password, | ||||||
|  |             ]); | ||||||
|  |             app(NamiSettings::class)->fill($validated)->save(); | ||||||
|  |             $this->dispatch('success', 'Einstellungen gespeichert.'); | ||||||
|  |         } catch (LoginException $e) { | ||||||
|  |             throw ValidationException::withMessages([ | ||||||
|  |                 'mglnr' => 'Login fehlgeschlagen.', | ||||||
|  |             ]); | ||||||
|  |         } | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     public function render() | ||||||
|  |     { | ||||||
|  |         return <<<'HTML' | ||||||
|  |             <x-page::setting-layout :active="$settingClass"> | ||||||
|  |                 <x-slot:right> | ||||||
|  |                     <x-form::save-button form="namisettingform"></x-form::save-button> | ||||||
|  |                 </x-slot:right> | ||||||
|  |                 <form id="namisettingform" class="grow p-6 grid grid-cols-2 gap-3 items-start content-start" wire:submit.prevent="save"> | ||||||
|  |                     <div class="col-span-full text-gray-100 mb-3"> | ||||||
|  |                         <p class="text-sm">Hier kannst du deine Zugangsdaten zu NaMi anpassen, falls sich z.B. dein Passwort geändert hat.</p> | ||||||
|  |                     </div> | ||||||
|  |                     <x-form::text name="mglnr" wire:model="mglnr" label="Mitgliedsnummer"></x-form::text> | ||||||
|  |                     <x-form::text name="default_group_id" wire:model="default_group_id" label="Standard-Gruppierung"></x-form::text> | ||||||
|  |                     <x-form::text name="password" wire:model="password" label="Passwort" name="password" type="password"></x-form::text> | ||||||
|  |                 </form> | ||||||
|  |             </x-page::setting-layout> | ||||||
|  |         HTML; | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,31 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace Modules\Nami; | ||||||
|  | 
 | ||||||
|  | use Illuminate\Routing\Router; | ||||||
|  | use Illuminate\Support\ServiceProvider; | ||||||
|  | use Modules\Nami\Components\SettingView; | ||||||
|  | 
 | ||||||
|  | class NamiServiceProvider extends ServiceProvider | ||||||
|  | { | ||||||
|  |     /** | ||||||
|  |      * Register services. | ||||||
|  |      * | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public function register() | ||||||
|  |     { | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     /** | ||||||
|  |      * Bootstrap services. | ||||||
|  |      * | ||||||
|  |      * @return void | ||||||
|  |      */ | ||||||
|  |     public function boot() | ||||||
|  |     { | ||||||
|  |         app(Router::class)->middleware(['web', 'auth:web'])->group(function ($router) { | ||||||
|  |             $router->get('/setting/nami', SettingView::class)->name('setting.nami'); | ||||||
|  |         }); | ||||||
|  |     } | ||||||
|  | } | ||||||
|  | @ -0,0 +1,90 @@ | ||||||
|  | <?php | ||||||
|  | 
 | ||||||
|  | namespace Modules\Module; | ||||||
|  | 
 | ||||||
|  | use App\Setting\NamiSettings; | ||||||
|  | use Illuminate\Foundation\Testing\DatabaseTransactions; | ||||||
|  | use Livewire\Livewire; | ||||||
|  | use Modules\Nami\Components\SettingView; | ||||||
|  | use Tests\TestCase; | ||||||
|  | use Zoomyboy\LaravelNami\Authentication\Auth; | ||||||
|  | use Zoomyboy\LaravelNami\Fakes\LoginFake; | ||||||
|  | 
 | ||||||
|  | uses(TestCase::class); | ||||||
|  | uses(DatabaseTransactions::class); | ||||||
|  | 
 | ||||||
|  | it('it renders page', function () { | ||||||
|  |     test()->withoutExceptionHandling()->login()->loginNami(); | ||||||
|  | 
 | ||||||
|  |     test()->get(route('setting.nami'))->assertSeeLivewire(SettingView::class); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | it('it displays active credentials', function () { | ||||||
|  |     test()->withoutExceptionHandling()->login()->loginNami(); | ||||||
|  |     app(NamiSettings::class)->fill(['mglnr' => 903, 'password' => 'secret', 'default_group_id' => 55])->save(); | ||||||
|  | 
 | ||||||
|  |     Livewire::test(SettingView::class) | ||||||
|  |         ->assertSet('mglnr', 903) | ||||||
|  |         ->assertSet('password', '') | ||||||
|  |         ->assertSet('default_group_id', 55) | ||||||
|  |         ->assertSee('Mitgliedsnummer') | ||||||
|  |         ->assertSee('Standard-Gruppierung') | ||||||
|  |         ->assertSee('Passwort') | ||||||
|  |         ->assertDontSee('secret'); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | it('it saves credentials', function () { | ||||||
|  |     test()->withoutExceptionHandling()->login()->loginNami(); | ||||||
|  |     Auth::success(100, 'secretneu'); | ||||||
|  |     app(NamiSettings::class)->fill(['mglnr' => 903, 'password' => 'secret', 'default_group_id' => 55])->save(); | ||||||
|  | 
 | ||||||
|  |     Livewire::test(SettingView::class) | ||||||
|  |         ->set('mglnr', 100) | ||||||
|  |         ->set('password', 'secretneu') | ||||||
|  |         ->set('default_group_id', 80) | ||||||
|  |         ->call('save') | ||||||
|  |         ->assertHasNoErrors() | ||||||
|  |         ->assertDispatched('success', 'Einstellungen gespeichert.'); | ||||||
|  | 
 | ||||||
|  |     $this->assertEquals(100, app(NamiSettings::class)->mglnr); | ||||||
|  |     $this->assertEquals('secretneu', app(NamiSettings::class)->password); | ||||||
|  |     $this->assertEquals('80', app(NamiSettings::class)->default_group_id); | ||||||
|  | }); | ||||||
|  | 
 | ||||||
|  | it('validates fields', function ($name, $value, $errors) { | ||||||
|  |     test()->withoutExceptionHandling()->login()->loginNami(); | ||||||
|  |     Auth::success(100, 'secretneu'); | ||||||
|  |     app(NamiSettings::class)->fill(['mglnr' => 903, 'password' => 'secret', 'default_group_id' => 55])->save(); | ||||||
|  | 
 | ||||||
|  |     Livewire::test(SettingView::class) | ||||||
|  |         ->set('mglnr', 100) | ||||||
|  |         ->set('password', 'secretneu') | ||||||
|  |         ->set('default_group_id', 80) | ||||||
|  |         ->set($name, $value) | ||||||
|  |         ->call('save') | ||||||
|  |         ->assertHasErrors($errors) | ||||||
|  |         ->assertNotDispatched('success'); | ||||||
|  | })->with([ | ||||||
|  |     ['password', '', ['password' => 'required']], | ||||||
|  |     ['mglnr', '', ['mglnr' => 'required']], | ||||||
|  |     ['default_group_id', '', ['default_group_id' => 'required']], | ||||||
|  |     ['default_group_id', null, ['default_group_id' => 'required']], | ||||||
|  | ]); | ||||||
|  | 
 | ||||||
|  | it('it throws error when saving failed', function () { | ||||||
|  |     test()->withoutExceptionHandling()->login()->loginNami(); | ||||||
|  |     app(NamiSettings::class)->fill(['mglnr' => 903, 'password' => 'secret', 'default_group_id' => 55])->save(); | ||||||
|  | 
 | ||||||
|  |     Livewire::test(SettingView::class) | ||||||
|  |         ->set('mglnr', 100) | ||||||
|  |         ->set('password', 'secretneu') | ||||||
|  |         ->set('default_group_id', 80) | ||||||
|  |         ->call('save') | ||||||
|  |         ->assertHasErrors(['mglnr' => 'Login fehlgeschlagen.']) | ||||||
|  |         ->assertNotDispatched('success'); | ||||||
|  | 
 | ||||||
|  |     $settings = app(NamiSettings::class)->refresh(); | ||||||
|  |     $this->assertEquals(903, $settings->mglnr); | ||||||
|  |     $this->assertEquals('secret', $settings->password); | ||||||
|  |     $this->assertEquals('55', $settings->default_group_id); | ||||||
|  | }); | ||||||
|  | @ -1,47 +0,0 @@ | ||||||
| <template> |  | ||||||
|     <page-layout> |  | ||||||
|         <template #right> |  | ||||||
|             <f-save-button form="namisettingform"></f-save-button> |  | ||||||
|         </template> |  | ||||||
|         <setting-layout> |  | ||||||
|             <form id="namisettingform" class="grow p-6 grid grid-cols-2 gap-3 items-start content-start" @submit.prevent="submit"> |  | ||||||
|                 <div class="col-span-full text-gray-100 mb-3"> |  | ||||||
|                     <p class="text-sm">Hier kannst du deine Zugangsdaten zu NaMi anpassen, falls sich z.B. dein Passwort geändert hat.</p> |  | ||||||
|                 </div> |  | ||||||
|                 <f-text id="mglnr" v-model="inner.mglnr" label="Mitgliedsnummer"></f-text> |  | ||||||
|                 <f-text id="default_group_id" v-model="inner.default_group_id" label="Standard-Gruppierung"></f-text> |  | ||||||
|                 <f-text id="password" v-model="inner.password" label="Passwort" name="password" type="password"></f-text> |  | ||||||
|             </form> |  | ||||||
|         </setting-layout> |  | ||||||
|     </page-layout> |  | ||||||
| </template> |  | ||||||
| 
 |  | ||||||
| <script> |  | ||||||
| import SettingLayout from './Layout.vue'; |  | ||||||
| 
 |  | ||||||
| export default { |  | ||||||
|     components: { |  | ||||||
|         SettingLayout, |  | ||||||
|     }, |  | ||||||
|     props: { |  | ||||||
|         data: { |  | ||||||
|             type: Object, |  | ||||||
|             default: () => { |  | ||||||
|                 return {}; |  | ||||||
|             }, |  | ||||||
|         }, |  | ||||||
|     }, |  | ||||||
|     data: function () { |  | ||||||
|         return { |  | ||||||
|             inner: {...this.data}, |  | ||||||
|         }; |  | ||||||
|     }, |  | ||||||
|     methods: { |  | ||||||
|         submit() { |  | ||||||
|             this.$inertia.post('/setting/nami', this.inner, { |  | ||||||
|                 onSuccess: () => this.$success('Einstellungen gespeichert.'), |  | ||||||
|             }); |  | ||||||
|         }, |  | ||||||
|     }, |  | ||||||
| }; |  | ||||||
| </script> |  | ||||||
		Loading…
	
		Reference in New Issue