diff --git a/app/Events/TextureDeleting.php b/app/Events/TextureDeleting.php new file mode 100644 index 00000000..59522ff6 --- /dev/null +++ b/app/Events/TextureDeleting.php @@ -0,0 +1,13 @@ +texture = $texture; + } +} diff --git a/app/Http/Controllers/SkinlibController.php b/app/Http/Controllers/SkinlibController.php index 2c670452..ec1f6a85 100644 --- a/app/Http/Controllers/SkinlibController.php +++ b/app/Http/Controllers/SkinlibController.php @@ -258,37 +258,10 @@ class SkinlibController extends Controller Storage::disk('textures')->delete($texture->hash); } - $texture->likers()->get()->each(function ($user) use ($texture) { - $user->closet()->detach($texture->tid); - if (option('return_score')) { - $user->setScore(option('score_per_closet_item'), 'plus'); - } - }); - - if ($u = User::find($texture->uploader)) { - $ret = 0; - if (option('return_score')) { - $ret += $texture->size * ( - $texture->public - ? option('score_per_storage') - : option('private_score_per_storage') - ); - } - - if ($texture->public && option('take_back_scores_after_deletion', true)) { - $ret -= option('score_award_per_texture', 0); - } - - $u->setScore($ret, 'plus'); - } - - if ($texture->delete()) { - return json(trans('skinlib.delete.success'), 0); - } + $texture->delete(); + return json(trans('skinlib.delete.success'), 0); } - // @codeCoverageIgnore - public function privacy(Request $request) { $t = Texture::find($request->input('tid')); @@ -335,8 +308,6 @@ class SkinlibController extends Controller ); } - // @codeCoverageIgnore - public function rename(Request $request) { $this->validate($request, [ diff --git a/app/Listeners/TextureRemoved.php b/app/Listeners/TextureRemoved.php new file mode 100644 index 00000000..a5a8cd2d --- /dev/null +++ b/app/Listeners/TextureRemoved.php @@ -0,0 +1,35 @@ +texture; + + $texture->likers()->get()->each(function ($user) use ($texture) { + $user->closet()->detach($texture->tid); + if (option('return_score')) { + $user->setScore(option('score_per_closet_item'), 'plus'); + } + }); + + if ($uploader = \App\Models\User::find($texture->uploader)) { + $ret = 0; + if (option('return_score')) { + $ret += $texture->size * ( + $texture->public + ? option('score_per_storage') + : option('private_score_per_storage') + ); + } + + if ($texture->public && option('take_back_scores_after_deletion', true)) { + $ret -= option('score_award_per_texture', 0); + } + + $uploader->setScore($ret, 'plus'); + } + } +} diff --git a/app/Models/Texture.php b/app/Models/Texture.php index d4f2a629..e3411ca3 100644 --- a/app/Models/Texture.php +++ b/app/Models/Texture.php @@ -18,6 +18,10 @@ class Texture extends Model 'likes' => 'integer', ]; + protected $dispatchesEvents = [ + 'deleting' => \App\Events\TextureDeleting::class, + ]; + public function scopeLike($query, $field, $value) { return $query->where($field, 'LIKE', "%$value%"); diff --git a/app/Providers/EventServiceProvider.php b/app/Providers/EventServiceProvider.php index cd208a74..10764a40 100644 --- a/app/Providers/EventServiceProvider.php +++ b/app/Providers/EventServiceProvider.php @@ -18,6 +18,9 @@ class EventServiceProvider extends ServiceProvider 'App\Events\PlayerRetrieved' => [ 'App\Listeners\ResetInvalidTextureForPlayer', ], + 'App\Events\TextureDeleting' => [ + 'App\Listeners\TextureRemoved', + ], ]; /** diff --git a/resources/misc/changelogs/en/4.2.0.md b/resources/misc/changelogs/en/4.2.0.md index be485edd..fd946100 100644 --- a/resources/misc/changelogs/en/4.2.0.md +++ b/resources/misc/changelogs/en/4.2.0.md @@ -1,8 +1,10 @@ ## Added - Chart at administration panel will show today's data. +- New event for plugins: `TextureDeleting`. ## Fixed - Fixed resetting options of "Customize" page. - Fixed that dashboard of user center cannot be centered. (Thanks @outtimes) +- Fix data consistency when deleting texture. diff --git a/resources/misc/changelogs/zh_CN/4.2.0.md b/resources/misc/changelogs/zh_CN/4.2.0.md index bf6d850e..10e028e8 100644 --- a/resources/misc/changelogs/zh_CN/4.2.0.md +++ b/resources/misc/changelogs/zh_CN/4.2.0.md @@ -1,8 +1,10 @@ ## 新增 - 管理面板中的图表可显示当天的数据 +- 新的插件事件:`TextureDeleting` ## 修复 - 修复「个性化」页面不能重置选项的问题 - 修复用户中心仪表盘不能居中的问题(感谢 @outtimes) +- 修复删除材质时的数据一致性 diff --git a/tests/ReportControllerTest.php b/tests/ReportControllerTest.php index 864acde1..7197e028 100644 --- a/tests/ReportControllerTest.php +++ b/tests/ReportControllerTest.php @@ -177,7 +177,11 @@ class ReportControllerTest extends TestCase $this->assertEquals($score - 5, $reporter->score); // Delete texture - option(['reporter_score_modification' => -7]); + option([ + 'reporter_score_modification' => -7, + 'return_score' => false, + 'take_back_scores_after_deletion' => false, + ]); $report->refresh(); $report->status = Report::PENDING; $report->save();