diff --git a/README.md b/README.md index edd53d1..977c47c 100644 --- a/README.md +++ b/README.md @@ -1,25 +1,12 @@ -# Laravel Ensi Audit +# Laravel Auditing -Пакет для работы с историей изменений данных Ensi в Laravel приложениях. -Является форком [owen-it/laravel-auditing](https://github.com/owen-it/laravel-auditing). +Opiniated fork of [owen-it/laravel-auditing](https://github.com/owen-it/laravel-auditing) ## Установка -1. Добавьте в composer.json в repositories - -``` -repositories: [ - { - "type": "vcs", - "url": "https://gitlab.com/greensight/ensi/packages/laravel-ensi-audit.git" - } -], - -``` - -2. `composer require ensi/laravel-ensi-audit` -3. `php artisan vendor:publish --provider="Ensi\LaravelEnsiAudit\EnsiAuditServiceProvider"` -4. Добавьте в `config/app` класс провайдера `Ensi\LaravelEnsiAudit\EnsiAuditServiceProvider::class` +1. `composer require greensight/laravel-auditing` +2. `php artisan vendor:publish --provider="Greensight\LaravelAuditing\LaravelAuditingServiceProvider"` +3. Добавьте в `config/app` класс провайдера `Greensight\LaravelAuditing\LaravelAuditingServiceProvider::class` ## Использование @@ -27,8 +14,8 @@ repositories: [ Чтобы включить логирование для конкретной модели надо добавить ей трейт `SupportsAudit` и интерфейс `Auditable` ```php -use Ensi\LaravelEnsiAudit\Contracts\Auditable; -use Ensi\LaravelEnsiAudit\SupportsAudit; +use Greensight\LaravelAuditing\Contracts\Auditable; +use Greensight\LaravelAuditing\SupportsAudit; class Something extends Model implements Auditable { use SupportsAudit; @@ -37,7 +24,7 @@ class Something extends Model implements Auditable { ``` В случае, если мы меняем данные дочерних с логической точки зрения моделей и хотим чтобы в истории это изменение проходило под родительской моделью, необходимо в транзакции до изменения данных задать корневую сущность (т.е модель). -Делается это через фасад `Transaction` или менеджер `\\Ensi\\LaravelEnsiAudit\\Transactions\\ExtendedTransactionManager` +Делается это через фасад `Transaction` или менеджер `\\Greensight\\LaravelAuditing\\Transactions\\ExtendedTransactionManager` ```php DB::transaction(function () { @@ -47,10 +34,10 @@ DB::transaction(function () { }); ``` -Для добавления в историю данных о том кто произвел изменения (конкретный пользователь, или, например, консольная команда) опять же нужно это сделать до изменения данных, но уже через фасад `Subject` или инъекцию `\\Ensi\\LaravelEnsiAudit\\Resolvers\\SubjectManager` +Для добавления в историю данных о том кто произвел изменения (конкретный пользователь, или, например, консольная команда) опять же нужно это сделать до изменения данных, но уже через фасад `Subject` или инъекцию `\\Greensight\\LaravelAuditing\\Resolvers\\SubjectManager` ```php -Subject::attach($subject); // $subject - объект реализующий Ensi\LaravelEnsiAudit\Contracts +Subject::attach($subject); // $subject - объект реализующий Greensight\LaravelAuditing\Contracts ``` Субъект не отвязывается после завершения транзакции. @@ -59,7 +46,7 @@ Subject::attach($subject); // $subject - объект реализующий Ens При обработке http запросов, можно задавать субъекта в middleware. В консольных командах и обработчиках очереди событий переназначать в процессе выполнения. -Субъектом может являться любая сущность, поддерживающая интерфейс `\Ensi\LaravelEnsiAudit\Contracts\Principal`. +Субъектом может являться любая сущность, поддерживающая интерфейс `\Greensight\LaravelAuditing\Contracts\Principal`. Если субъектом является выполняемое задание, например, импорт из файла, то оно может возвращать идентификатор пользователя, создавшего задание в методе `getUserIdentifier()`, а в качестве наименования возвращать имя импортируемого файла. @@ -70,4 +57,4 @@ Subject::attach($subject); // $subject - объект реализующий Ens ## Лицензия -[Открытая лицензия на право использования программы для ЭВМ Greensight Ecom Platform (GEP)](LICENSE.md). +[The MIT License (MIT)](LICENSE.md). diff --git a/composer.json b/composer.json index d794e91..bdb083b 100644 --- a/composer.json +++ b/composer.json @@ -1,5 +1,5 @@ { - "name": "ensi/laravel-ensi-audit", + "name": "greensight/laravel-auditing", "description": "", "type": "library", "license": "MIT", @@ -19,19 +19,19 @@ }, "autoload": { "psr-4": { - "Ensi\\LaravelEnsiAudit\\": "src/" + "Greensight\\LaravelAuditing\\": "src/" } }, "autoload-dev": { "psr-4": { - "Ensi\\LaravelEnsiAudit\\Tests\\": "tests/", - "Ensi\\LaravelEnsiAudit\\Database\\Factories\\": "tests/database/factories/" + "Greensight\\LaravelAuditing\\Tests\\": "tests/", + "Greensight\\LaravelAuditing\\Database\\Factories\\": "tests/database/factories/" } }, "extra": { "laravel": { "providers": [ - "Ensi\\LaravelEnsiAudit\\EnsiAuditServiceProvider" + "Greensight\\LaravelAuditing\\LaravelAuditingServiceProvider" ] } }, diff --git a/config/ensi-audit.php b/config/ensi-audit.php index 4fd8e84..859ba7c 100644 --- a/config/ensi-audit.php +++ b/config/ensi-audit.php @@ -13,7 +13,7 @@ | */ - 'implementation' => Ensi\LaravelEnsiAudit\Models\Audit::class, + 'implementation' => Greensight\LaravelAuditing\Models\Audit::class, /* |-------------------------------------------------------------------------- @@ -37,10 +37,10 @@ | */ 'resolver' => [ - 'user' => Ensi\LaravelEnsiAudit\Facades\Subject::class, - 'ip_address' => Ensi\LaravelEnsiAudit\Resolvers\IpAddressResolver::class, - 'user_agent' => Ensi\LaravelEnsiAudit\Resolvers\UserAgentResolver::class, - 'url' => Ensi\LaravelEnsiAudit\Resolvers\UrlResolver::class, + 'user' => Greensight\LaravelAuditing\Facades\Subject::class, + 'ip_address' => Greensight\LaravelAuditing\Resolvers\IpAddressResolver::class, + 'user_agent' => Greensight\LaravelAuditing\Resolvers\UserAgentResolver::class, + 'url' => Greensight\LaravelAuditing\Resolvers\UrlResolver::class, ], /* diff --git a/src/Audit.php b/src/Audit.php index 8af0f27..de8464f 100644 --- a/src/Audit.php +++ b/src/Audit.php @@ -1,14 +1,14 @@ toAudit(), $this->getTransactionAttributes()); - $implementation = Config::get('ensi-audit.implementation', \Ensi\LaravelEnsiAudit\Models\Audit::class); + $implementation = Config::get('laravel-auditing.implementation', \Greensight\LaravelAuditing\Models\Audit::class); return call_user_func([$implementation, 'create'], $fields); } diff --git a/src/Encoders/Base64Encoder.php b/src/Encoders/Base64Encoder.php index 5632e51..1d802c0 100644 --- a/src/Encoders/Base64Encoder.php +++ b/src/Encoders/Base64Encoder.php @@ -1,8 +1,8 @@ registerPublishing(); $this->registerListeners(); - $this->mergeConfigFrom(__DIR__.'/../config/ensi-audit.php', 'ensi-audit'); + $this->mergeConfigFrom(__DIR__.'/../config/laravel-auditing.php', 'laravel-auditing'); } /** @@ -54,7 +54,7 @@ public function register() $this->app->singleton(Auditor::class, function (Application $app) { - return new \Ensi\LaravelEnsiAudit\Auditor($app); + return new \Greensight\LaravelAuditing\Auditor($app); }); $this->app->singleton(SubjectManager::class); @@ -71,7 +71,7 @@ private function registerPublishing() { if ($this->app->runningInConsole()) { $this->publishes([ - __DIR__.'/../config/ensi-audit.php' => base_path('config/ensi-audit.php'), + __DIR__.'/../config/laravel-auditing.php' => base_path('config/laravel-auditing.php'), ], 'config'); $this->publishes([ diff --git a/src/Models/Audit.php b/src/Models/Audit.php index 70d9ff9..1bcf74d 100644 --- a/src/Models/Audit.php +++ b/src/Models/Audit.php @@ -1,6 +1,6 @@ morphMany( - Config::get('ensi-audit.implementation', Models\Audit::class), + Config::get('laravel-auditing.implementation', Models\Audit::class), 'auditable' ); } @@ -334,7 +334,7 @@ public function transformAudit(array $data): array */ protected function resolveUser() { - $userResolver = Config::get('ensi-audit.resolver.user'); + $userResolver = Config::get('laravel-auditing.resolver.user'); if (is_subclass_of($userResolver, UserResolver::class)) { return call_user_func([$userResolver, 'resolve']); @@ -352,7 +352,7 @@ protected function resolveUser() */ protected function resolveUrl(): string { - $urlResolver = Config::get('ensi-audit.resolver.url'); + $urlResolver = Config::get('laravel-auditing.resolver.url'); if (is_subclass_of($urlResolver, UrlResolver::class)) { return call_user_func([$urlResolver, 'resolve']); @@ -370,7 +370,7 @@ protected function resolveUrl(): string */ protected function resolveIpAddress(): string { - $ipAddressResolver = Config::get('ensi-audit.resolver.ip_address'); + $ipAddressResolver = Config::get('laravel-auditing.resolver.ip_address'); if (is_subclass_of($ipAddressResolver, IpAddressResolver::class)) { return call_user_func([$ipAddressResolver, 'resolve']); @@ -388,7 +388,7 @@ protected function resolveIpAddress(): string */ protected function resolveUserAgent() { - $userAgentResolver = Config::get('ensi-audit.resolver.user_agent'); + $userAgentResolver = Config::get('laravel-auditing.resolver.user_agent'); if (is_subclass_of($userAgentResolver, UserAgentResolver::class)) { return call_user_func([$userAgentResolver, 'resolve']); @@ -473,7 +473,7 @@ public function getAuditEvent() */ public function getAuditEvents(): array { - return $this->auditEvents ?? Config::get('ensi-audit.events', [ + return $this->auditEvents ?? Config::get('laravel-auditing.events', [ 'created', 'updated', 'deleted', @@ -509,10 +509,10 @@ public static function enableAuditing() public static function isAuditingEnabled(): bool { if (App::runningInConsole()) { - return Config::get('ensi-audit.console', false); + return Config::get('laravel-auditing.console', false); } - return Config::get('ensi-audit.enabled', true); + return Config::get('laravel-auditing.enabled', true); } /** @@ -536,7 +536,7 @@ public function getAuditExclude(): array */ public function getAuditStrict(): bool { - return $this->auditStrict ?? Config::get('ensi-audit.strict', false); + return $this->auditStrict ?? Config::get('laravel-auditing.strict', false); } /** @@ -544,7 +544,7 @@ public function getAuditStrict(): bool */ public function getAuditTimestamps(): bool { - return $this->auditTimestamps ?? Config::get('ensi-audit.timestamps', false); + return $this->auditTimestamps ?? Config::get('laravel-auditing.timestamps', false); } /** @@ -552,7 +552,7 @@ public function getAuditTimestamps(): bool */ public function getAuditDriver() { - return $this->auditDriver ?? Config::get('ensi-audit.driver', 'database'); + return $this->auditDriver ?? Config::get('laravel-auditing.driver', 'database'); } /** @@ -560,7 +560,7 @@ public function getAuditDriver() */ public function getAuditThreshold(): int { - return $this->auditThreshold ?? Config::get('ensi-audit.threshold', 0); + return $this->auditThreshold ?? Config::get('laravel-auditing.threshold', 0); } /** diff --git a/src/Transactions/TransactionAttributesHolder.php b/src/Transactions/TransactionAttributesHolder.php index 868da2e..898db10 100644 --- a/src/Transactions/TransactionAttributesHolder.php +++ b/src/Transactions/TransactionAttributesHolder.php @@ -1,9 +1,9 @@ set('ensi-audit.drivers.database.connection', 'testing'); - $app['config']->set('ensi-audit.user.morph_prefix', 'user'); - $app['config']->set('ensi-audit.user.guards', [ + $app['config']->set('laravel-auditing.drivers.database.connection', 'testing'); + $app['config']->set('laravel-auditing.user.morph_prefix', 'user'); + $app['config']->set('laravel-auditing.user.guards', [ 'web', 'api', ]); - $app['config']->set('ensi-audit.resolver.user', Subject::class); - $app['config']->set('ensi-audit.resolver.url', UrlResolver::class); - $app['config']->set('ensi-audit.resolver.ip_address', IpAddressResolver::class); - $app['config']->set('ensi-audit.resolver.user_agent', UserAgentResolver::class); - $app['config']->set('ensi-audit.console', true); + $app['config']->set('laravel-auditing.resolver.user', Subject::class); + $app['config']->set('laravel-auditing.resolver.url', UrlResolver::class); + $app['config']->set('laravel-auditing.resolver.ip_address', IpAddressResolver::class); + $app['config']->set('laravel-auditing.resolver.user_agent', UserAgentResolver::class); + $app['config']->set('laravel-auditing.console', true); } /** @@ -54,7 +54,7 @@ public function setUp(): void protected function getPackageProviders($app) { return [ - EnsiAuditServiceProvider::class, + LaravelAuditingServiceProvider::class, ]; } } diff --git a/tests/Functional/AuditingTest.php b/tests/Functional/AuditingTest.php index 76ae529..8b6c453 100644 --- a/tests/Functional/AuditingTest.php +++ b/tests/Functional/AuditingTest.php @@ -1,17 +1,17 @@ app['config']->set('ensi-audit.console', false); + $this->app['config']->set('laravel-auditing.console', false); User::factory()->create(); @@ -38,7 +38,7 @@ public function itWillNotAuditModelsWhenRunningFromTheConsole() */ public function itWillAuditModelsWhenRunningFromTheConsole() { - $this->app['config']->set('ensi-audit.console', true); + $this->app['config']->set('laravel-auditing.console', true); User::factory()->create(); @@ -54,7 +54,7 @@ public function itWillAlwaysAuditModelsWhenNotRunningFromTheConsole() App::shouldReceive('runningInConsole') ->andReturn(false); - $this->app['config']->set('ensi-audit.console', false); + $this->app['config']->set('laravel-auditing.console', false); User::factory()->create(); @@ -67,7 +67,7 @@ public function itWillAlwaysAuditModelsWhenNotRunningFromTheConsole() */ public function itWillNotAuditTheRetrievingEvent() { - $this->app['config']->set('ensi-audit.console', true); + $this->app['config']->set('laravel-auditing.console', true); User::factory()->create(); @@ -85,8 +85,8 @@ public function itWillNotAuditTheRetrievingEvent() */ public function itWillAuditTheRetrievingEvent() { - $this->app['config']->set('ensi-audit.console', true); - $this->app['config']->set('ensi-audit.events', [ + $this->app['config']->set('laravel-auditing.console', true); + $this->app['config']->set('laravel-auditing.events', [ 'created', 'retrieved', ]); @@ -107,7 +107,7 @@ public function itWillAuditTheRetrievingEvent() */ public function itWillAuditTheRetrievedEvent() { - $this->app['config']->set('ensi-audit.events', [ + $this->app['config']->set('laravel-auditing.events', [ 'retrieved', ]); @@ -132,7 +132,7 @@ public function itWillAuditTheRetrievedEvent() */ public function itWillAuditTheCreatedEvent() { - $this->app['config']->set('ensi-audit.events', [ + $this->app['config']->set('laravel-auditing.events', [ 'created', ]); @@ -160,7 +160,7 @@ public function itWillAuditTheCreatedEvent() */ public function itWillAuditTheUpdatedEvent() { - $this->app['config']->set('ensi-audit.events', [ + $this->app['config']->set('laravel-auditing.events', [ 'updated', ]); @@ -199,7 +199,7 @@ public function itWillAuditTheUpdatedEvent() */ public function itWillAuditTheDeletedEvent() { - $this->app['config']->set('ensi-audit.events', [ + $this->app['config']->set('laravel-auditing.events', [ 'deleted', ]); @@ -229,7 +229,7 @@ public function itWillAuditTheDeletedEvent() */ public function itWillAuditTheRestoredEvent() { - $this->app['config']->set('ensi-audit.events', [ + $this->app['config']->set('laravel-auditing.events', [ 'restored', ]); @@ -260,8 +260,8 @@ public function itWillAuditTheRestoredEvent() */ public function itWillKeepAllAudits() { - $this->app['config']->set('ensi-audit.threshold', 0); - $this->app['config']->set('ensi-audit.events', [ + $this->app['config']->set('laravel-auditing.threshold', 0); + $this->app['config']->set('laravel-auditing.events', [ 'updated', ]); @@ -283,8 +283,8 @@ public function itWillKeepAllAudits() */ public function itWillRemoveOlderAuditsAboveTheThreshold() { - $this->app['config']->set('ensi-audit.threshold', 10); - $this->app['config']->set('ensi-audit.events', [ + $this->app['config']->set('laravel-auditing.threshold', 10); + $this->app['config']->set('laravel-auditing.events', [ 'updated', ]); @@ -306,7 +306,7 @@ public function itWillRemoveOlderAuditsAboveTheThreshold() */ public function itWillNotAuditDueToUnsupportedDriver() { - $this->app['config']->set('ensi-audit.driver', 'foo'); + $this->app['config']->set('laravel-auditing.driver', 'foo'); $this->expectException(InvalidArgumentException::class); $this->expectExceptionMessage('Driver [foo] not supported.'); @@ -320,7 +320,7 @@ public function itWillNotAuditDueToUnsupportedDriver() public function itWillNotAuditDueToClassWithoutDriverInterface() { // We just pass a FQCN that does not implement the AuditDriver interface - $this->app['config']->set('ensi-audit.driver', self::class); + $this->app['config']->set('laravel-auditing.driver', self::class); $this->expectException(AuditingException::class); $this->expectExceptionMessage('The driver must implement the AuditDriver contract'); @@ -333,7 +333,7 @@ public function itWillNotAuditDueToClassWithoutDriverInterface() */ public function itWillAuditUsingTheDefaultDriver() { - $this->app['config']->set('ensi-audit.driver', null); + $this->app['config']->set('laravel-auditing.driver', null); Article::factory()->create([ 'title' => 'How To Audit Using The Fallback Driver', diff --git a/tests/Functional/CommandTest.php b/tests/Functional/CommandTest.php index efb23d9..0a0686c 100644 --- a/tests/Functional/CommandTest.php +++ b/tests/Functional/CommandTest.php @@ -1,8 +1,8 @@ app['config']->set('ensi-audit.console', false); + $this->app['config']->set('laravel-auditing.console', false); $this->assertFalse(Article::isAuditingEnabled()); } @@ -52,7 +52,7 @@ public function itWillNotAuditModelsWhenRunningFromTheConsole() */ public function itWillAuditModelsWhenRunningFromTheConsole() { - $this->app['config']->set('ensi-audit.console', true); + $this->app['config']->set('laravel-auditing.console', true); $this->assertTrue(Article::isAuditingEnabled()); } @@ -66,7 +66,7 @@ public function itWillAlwaysAuditModelsWhenNotRunningFromTheConsole() App::shouldReceive('runningInConsole') ->andReturn(false); - $this->app['config']->set('ensi-audit.console', false); + $this->app['config']->set('laravel-auditing.console', false); $this->assertTrue(Article::isAuditingEnabled()); } @@ -152,7 +152,7 @@ public function itReturnsTheCustomAuditEventsFromAttribute() */ public function itReturnsTheCustomAuditEventsFromConfig() { - $this->app['config']->set('ensi-audit.events', [ + $this->app['config']->set('laravel-auditing.events', [ 'published' => 'getPublishedEventAttributes', 'archived', ]); @@ -317,7 +317,7 @@ public function itFailsWhenTheIpAddressResolverImplementationIsInvalid() $this->expectException(AuditingException::class); $this->expectExceptionMessage('Invalid IpAddressResolver implementation'); - $this->app['config']->set('ensi-audit.resolver.ip_address', null); + $this->app['config']->set('laravel-auditing.resolver.ip_address', null); $model = new Article(); @@ -336,7 +336,7 @@ public function itFailsWhenTheUrlResolverImplementationIsInvalid() $this->expectException(AuditingException::class); $this->expectExceptionMessage('Invalid UrlResolver implementation'); - $this->app['config']->set('ensi-audit.resolver.url', null); + $this->app['config']->set('laravel-auditing.resolver.url', null); $model = new Article(); @@ -355,7 +355,7 @@ public function itFailsWhenTheUserAgentResolverImplementationIsInvalid() $this->expectException(AuditingException::class); $this->expectExceptionMessage('Invalid UserAgentResolver implementation'); - $this->app['config']->set('ensi-audit.resolver.user_agent', null); + $this->app['config']->set('laravel-auditing.resolver.user_agent', null); $model = new Article(); @@ -374,7 +374,7 @@ public function itFailsWhenTheUserResolverImplementationIsInvalid() $this->expectException(AuditingException::class); $this->expectExceptionMessage('Invalid UserResolver implementation'); - $this->app['config']->set('ensi-audit.resolver.user', null); + $this->app['config']->set('laravel-auditing.resolver.user', null); $model = new Article(); @@ -471,7 +471,7 @@ public function itReturnsTheAuditDataIncludingSubjectAttributes() { */ public function itExcludesAttributesFromTheAuditDataWhenInStrictMode() { - $this->app['config']->set('ensi-audit.strict', true); + $this->app['config']->set('laravel-auditing.strict', true); $model = Article::factory()->make([ 'title' => 'How To Audit Eloquent Models', @@ -706,7 +706,7 @@ public function itReturnsTheCustomAuditStrictValueFromAttribute() */ public function itReturnsTheCustomAuditStrictValueFromConfig() { - $this->app['config']->set('ensi-audit.strict', true); + $this->app['config']->set('laravel-auditing.strict', true); $model = new Article(); @@ -743,7 +743,7 @@ public function itReturnsTheCustomAuditTimestampsValueFromAttribute() */ public function itReturnsTheCustomAuditTimestampsValueFromConfig() { - $this->app['config']->set('ensi-audit.timestamps', true); + $this->app['config']->set('laravel-auditing.timestamps', true); $model = new Article(); @@ -780,7 +780,7 @@ public function itReturnsTheCustomAuditDriverValueFromAttribute() */ public function itReturnsTheCustomAuditDriverValueFromConfig() { - $this->app['config']->set('ensi-audit.driver', 'RedisDriver'); + $this->app['config']->set('laravel-auditing.driver', 'RedisDriver'); $model = new Article(); @@ -817,7 +817,7 @@ public function itReturnsTheCustomAuditThresholdValueFromAttribute() */ public function itReturnsTheCustomAuditThresholdValueFromConfig() { - $this->app['config']->set('ensi-audit.threshold', 200); + $this->app['config']->set('laravel-auditing.threshold', 200); $model = new Article(); @@ -864,7 +864,7 @@ public function generateTags(): array public function itFailsToTransitionWhenTheAuditAuditableTypeDoesNotMatchTheModelType() { $this->expectException(AuditableTransitionException::class); - $this->expectExceptionMessage('Expected Auditable type Ensi\LaravelEnsiAudit\Tests\Models\Article, got Ensi\LaravelEnsiAudit\Tests\Models\User instead'); + $this->expectExceptionMessage('Expected Auditable type Greensight\LaravelAuditing\Tests\Models\Article, got Greensight\LaravelAuditing\Tests\Models\User instead'); $audit = AuditFactory::new()->make([ 'auditable_type' => User::class, @@ -1010,7 +1010,7 @@ public function itFailsToTransitionWhenTheAuditableAttributeCompatibilityIsNotMe $model->transitionTo($incompatibleAudit); } catch (AuditableTransitionException $e) { $this->assertSame( - 'Incompatibility between [Ensi\LaravelEnsiAudit\Tests\Models\Article:1] and [Ensi\LaravelEnsiAudit\Models\Audit:3]', + 'Incompatibility between [Greensight\LaravelAuditing\Tests\Models\Article:1] and [Greensight\LaravelAuditing\Models\Audit:3]', $e->getMessage() ); diff --git a/tests/Unit/TransactionRegistryTest.php b/tests/Unit/TransactionRegistryTest.php index b417c5a..f443cc1 100644 --- a/tests/Unit/TransactionRegistryTest.php +++ b/tests/Unit/TransactionRegistryTest.php @@ -1,9 +1,9 @@