Regress likes field of textures table
This commit is contained in:
parent
26a2b58048
commit
b119a8de6d
45
app/Console/Commands/RegressLikesField.php
Normal file
45
app/Console/Commands/RegressLikesField.php
Normal file
|
|
@ -0,0 +1,45 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
namespace App\Console\Commands;
|
||||||
|
|
||||||
|
use Schema;
|
||||||
|
use App\Models\Texture;
|
||||||
|
use Illuminate\Console\Command;
|
||||||
|
|
||||||
|
class RegressLikesField extends Command
|
||||||
|
{
|
||||||
|
/**
|
||||||
|
* The name and signature of the console command.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $signature = 'bs:migrate-v4:likes';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The console command description.
|
||||||
|
*
|
||||||
|
* @var string
|
||||||
|
*/
|
||||||
|
protected $description = 'Apply fixes for `likes` field of `textures` table.';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Execute the console command.
|
||||||
|
*
|
||||||
|
* @return mixed
|
||||||
|
*/
|
||||||
|
public function handle()
|
||||||
|
{
|
||||||
|
$this->info('We are going to update your `textures` table. Please wait...');
|
||||||
|
$textures = Texture::all();
|
||||||
|
$bar = $this->output->createProgressBar($textures->count());
|
||||||
|
|
||||||
|
$textures->each(function ($texture) use ($bar) {
|
||||||
|
$texture->likes = $texture->likers->count();
|
||||||
|
$texture->save();
|
||||||
|
$bar->advance();
|
||||||
|
});
|
||||||
|
|
||||||
|
$bar->finish();
|
||||||
|
$this->info("\nCongratulations! Table was updated successfully.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -18,6 +18,7 @@ class Kernel extends ConsoleKernel
|
||||||
Commands\MigratePlayersTable::class,
|
Commands\MigratePlayersTable::class,
|
||||||
Commands\MigrateCloset::class,
|
Commands\MigrateCloset::class,
|
||||||
Commands\ExecuteInstallation::class,
|
Commands\ExecuteInstallation::class,
|
||||||
|
Commands\RegressLikesField::class,
|
||||||
];
|
];
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
||||||
|
|
@ -95,6 +95,9 @@ class ClosetController extends Controller
|
||||||
$user->closet()->attach($tid, ['item_name' => $request->name]);
|
$user->closet()->attach($tid, ['item_name' => $request->name]);
|
||||||
$user->setScore(option('score_per_closet_item'), 'minus');
|
$user->setScore(option('score_per_closet_item'), 'minus');
|
||||||
|
|
||||||
|
$texture->likes++;
|
||||||
|
$texture->save();
|
||||||
|
|
||||||
$uploader = User::find($texture->uploader);
|
$uploader = User::find($texture->uploader);
|
||||||
if ($uploader && $uploader->uid != $user->uid) {
|
if ($uploader && $uploader->uid != $user->uid) {
|
||||||
$uploader->score += option('score_award_per_like', 0);
|
$uploader->score += option('score_award_per_like', 0);
|
||||||
|
|
@ -132,7 +135,11 @@ class ClosetController extends Controller
|
||||||
$user->setScore(option('score_per_closet_item'), 'plus');
|
$user->setScore(option('score_per_closet_item'), 'plus');
|
||||||
}
|
}
|
||||||
|
|
||||||
$uploader = User::find(Texture::find($tid)->uploader);
|
$texture = Texture::find($tid);
|
||||||
|
$texture->likes--;
|
||||||
|
$texture->save();
|
||||||
|
|
||||||
|
$uploader = User::find($texture->uploader);
|
||||||
$uploader->score -= option('score_award_per_like', 0);
|
$uploader->score -= option('score_award_per_like', 0);
|
||||||
$uploader->save();
|
$uploader->save();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -97,8 +97,7 @@ class SkinlibController extends Controller
|
||||||
$totalPages = ceil($query->count() / $itemsPerPage);
|
$totalPages = ceil($query->count() / $itemsPerPage);
|
||||||
|
|
||||||
$sort = $request->input('sort', 'time');
|
$sort = $request->input('sort', 'time');
|
||||||
$sortBy = $sort == 'time' ? 'upload_at' : ($sort == 'likes' ? 'likers_count' : $sort);
|
$sortBy = $sort == 'time' ? 'upload_at' : $sort;
|
||||||
$query->withCount('likers');
|
|
||||||
$query = $query->orderBy($sortBy, 'desc');
|
$query = $query->orderBy($sortBy, 'desc');
|
||||||
|
|
||||||
$textures = $query->skip(($currentPage - 1) * $itemsPerPage)->take($itemsPerPage)->get();
|
$textures = $query->skip(($currentPage - 1) * $itemsPerPage)->take($itemsPerPage)->get();
|
||||||
|
|
@ -228,10 +227,10 @@ class SkinlibController extends Controller
|
||||||
Storage::disk('textures')->put($t->hash, file_get_contents($request->file('file')));
|
Storage::disk('textures')->put($t->hash, file_get_contents($request->file('file')));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
$t->likes++;
|
||||||
$t->save();
|
$t->save();
|
||||||
|
|
||||||
$user->setScore($cost, 'minus');
|
$user->setScore($cost, 'minus');
|
||||||
|
|
||||||
$user->closet()->attach($t->tid, ['item_name' => $t->name]);
|
$user->closet()->attach($t->tid, ['item_name' => $t->name]);
|
||||||
|
|
||||||
return json(trans('skinlib.upload.success', ['name' => $request->input('name')]), 0, [
|
return json(trans('skinlib.upload.success', ['name' => $request->input('name')]), 0, [
|
||||||
|
|
@ -243,47 +242,47 @@ class SkinlibController extends Controller
|
||||||
|
|
||||||
public function delete(Request $request)
|
public function delete(Request $request)
|
||||||
{
|
{
|
||||||
$result = Texture::find($request->tid);
|
$texture = Texture::find($request->tid);
|
||||||
$user = Auth::user();
|
$user = Auth::user();
|
||||||
|
|
||||||
if (! $result) {
|
if (! $texture) {
|
||||||
return json(trans('skinlib.non-existent'), 1);
|
return json(trans('skinlib.non-existent'), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($result->uploader != $user->uid && ! $user->isAdmin()) {
|
if ($texture->uploader != $user->uid && ! $user->isAdmin()) {
|
||||||
return json(trans('skinlib.no-permission'), 1);
|
return json(trans('skinlib.no-permission'), 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
// check if file occupied
|
// check if file occupied
|
||||||
if (Texture::where('hash', $result->hash)->count() == 1) {
|
if (Texture::where('hash', $texture->hash)->count() == 1) {
|
||||||
Storage::disk('textures')->delete($result->hash);
|
Storage::disk('textures')->delete($texture->hash);
|
||||||
}
|
}
|
||||||
|
|
||||||
$result->likers()->get()->each(function ($user) use ($result) {
|
$texture->likers()->get()->each(function ($user) use ($texture) {
|
||||||
$user->closet()->detach($result->tid);
|
$user->closet()->detach($texture->tid);
|
||||||
if (option('return_score')) {
|
if (option('return_score')) {
|
||||||
$user->setScore(option('score_per_closet_item'), 'plus');
|
$user->setScore(option('score_per_closet_item'), 'plus');
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
if ($u = User::find($result->uploader)) {
|
if ($u = User::find($texture->uploader)) {
|
||||||
$ret = 0;
|
$ret = 0;
|
||||||
if (option('return_score')) {
|
if (option('return_score')) {
|
||||||
$ret += $result->size * (
|
$ret += $texture->size * (
|
||||||
$result->public
|
$texture->public
|
||||||
? option('score_per_storage')
|
? option('score_per_storage')
|
||||||
: option('private_score_per_storage')
|
: option('private_score_per_storage')
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($result->public && option('take_back_scores_after_deletion', true)) {
|
if ($texture->public && option('take_back_scores_after_deletion', true)) {
|
||||||
$ret -= option('score_award_per_texture', 0);
|
$ret -= option('score_award_per_texture', 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
$u->setScore($ret, 'plus');
|
$u->setScore($ret, 'plus');
|
||||||
}
|
}
|
||||||
|
|
||||||
if ($result->delete()) {
|
if ($texture->delete()) {
|
||||||
return json(trans('skinlib.delete.success'), 0);
|
return json(trans('skinlib.delete.success'), 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
@ -322,6 +321,7 @@ class SkinlibController extends Controller
|
||||||
if (option('return_score')) {
|
if (option('return_score')) {
|
||||||
$user->setScore(option('score_per_closet_item'), 'plus');
|
$user->setScore(option('score_per_closet_item'), 'plus');
|
||||||
}
|
}
|
||||||
|
$t->likes--;
|
||||||
});
|
});
|
||||||
|
|
||||||
@$uploader->setScore($score_diff, 'plus');
|
@$uploader->setScore($score_diff, 'plus');
|
||||||
|
|
|
||||||
|
|
@ -15,17 +15,9 @@ class Texture extends Model
|
||||||
'size' => 'integer',
|
'size' => 'integer',
|
||||||
'uploader' => 'integer',
|
'uploader' => 'integer',
|
||||||
'public' => 'boolean',
|
'public' => 'boolean',
|
||||||
|
'likes' => 'integer',
|
||||||
];
|
];
|
||||||
|
|
||||||
protected $appends = [
|
|
||||||
'likes',
|
|
||||||
];
|
|
||||||
|
|
||||||
public function getLikesAttribute()
|
|
||||||
{
|
|
||||||
return $this->likers()->count();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function scopeLike($query, $field, $value)
|
public function scopeLike($query, $field, $value)
|
||||||
{
|
{
|
||||||
return $query->where($field, 'LIKE', "%$value%");
|
return $query->where($field, 'LIKE', "%$value%");
|
||||||
|
|
|
||||||
|
|
@ -8,6 +8,7 @@ $factory->define(Texture::class, function (Faker\Generator $faker) {
|
||||||
'type' => 'steve',
|
'type' => 'steve',
|
||||||
'hash' => $faker->sha256,
|
'hash' => $faker->sha256,
|
||||||
'size' => rand(1, 2048),
|
'size' => rand(1, 2048),
|
||||||
|
'likes' => rand(1, 10),
|
||||||
'uploader' => factory(App\Models\User::class)->create()->uid,
|
'uploader' => factory(App\Models\User::class)->create()->uid,
|
||||||
'public' => true,
|
'public' => true,
|
||||||
'upload_at' => $faker->dateTime,
|
'upload_at' => $faker->dateTime,
|
||||||
|
|
@ -20,6 +21,7 @@ $factory->defineAs(Texture::class, 'alex', function (Faker\Generator $faker) {
|
||||||
'type' => 'alex',
|
'type' => 'alex',
|
||||||
'hash' => $faker->sha256,
|
'hash' => $faker->sha256,
|
||||||
'size' => rand(1, 2048),
|
'size' => rand(1, 2048),
|
||||||
|
'likes' => rand(1, 10),
|
||||||
'uploader' => factory(App\Models\User::class)->create()->uid,
|
'uploader' => factory(App\Models\User::class)->create()->uid,
|
||||||
'public' => true,
|
'public' => true,
|
||||||
'upload_at' => $faker->dateTime,
|
'upload_at' => $faker->dateTime,
|
||||||
|
|
|
||||||
26
database/migrations/2019_05_05_103143_add_likes_field.php
Normal file
26
database/migrations/2019_05_05_103143_add_likes_field.php
Normal file
|
|
@ -0,0 +1,26 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
use Illuminate\Support\Facades\Schema;
|
||||||
|
use Illuminate\Database\Schema\Blueprint;
|
||||||
|
use Illuminate\Database\Migrations\Migration;
|
||||||
|
|
||||||
|
class AddLikesField extends Migration
|
||||||
|
{
|
||||||
|
public function up()
|
||||||
|
{
|
||||||
|
if (! Schema::hasColumn('textures', 'likes')) {
|
||||||
|
Schema::table('textures', function (Blueprint $table) {
|
||||||
|
$table->integer('likes')->unsigned()->default(0);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function down()
|
||||||
|
{
|
||||||
|
if (Schema::hasColumn('textures', 'likes')) {
|
||||||
|
Schema::table('textures', function (Blueprint $table) {
|
||||||
|
$table->dropColumn('likes');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
8
database/update_scripts/update-4.1.3-to-4.1.4.php
Normal file
8
database/update_scripts/update-4.1.3-to-4.1.4.php
Normal file
|
|
@ -0,0 +1,8 @@
|
||||||
|
<?php
|
||||||
|
|
||||||
|
return [
|
||||||
|
'请您手动打开终端或 PowerShell 执行以下命令以完成升级:',
|
||||||
|
'Please open terminal or PowerShell to complete upgrade:',
|
||||||
|
'<code>php artisan migrate --force</code>',
|
||||||
|
'<code>php artisan bs:migrate-v4:likes</code>',
|
||||||
|
];
|
||||||
|
|
@ -219,7 +219,7 @@ class ClosetControllerTest extends TestCase
|
||||||
'code' => 0,
|
'code' => 0,
|
||||||
'message' => trans('user.closet.remove.success'),
|
'message' => trans('user.closet.remove.success'),
|
||||||
]);
|
]);
|
||||||
$this->assertEquals($likes, Texture::find($texture->tid)->likes);
|
$this->assertEquals($likes - 1, Texture::find($texture->tid)->likes);
|
||||||
$this->assertEquals($score + option('score_per_closet_item'), $this->user->score);
|
$this->assertEquals($score + option('score_per_closet_item'), $this->user->score);
|
||||||
$this->assertEquals(0, $this->user->closet()->count());
|
$this->assertEquals(0, $this->user->closet()->count());
|
||||||
$uploader->refresh();
|
$uploader->refresh();
|
||||||
|
|
@ -232,7 +232,7 @@ class ClosetControllerTest extends TestCase
|
||||||
$this->user->closet()->attach($texture->tid, ['item_name' => 'name']);
|
$this->user->closet()->attach($texture->tid, ['item_name' => 'name']);
|
||||||
$score = $this->user->score;
|
$score = $this->user->score;
|
||||||
$this->postJson('/user/closet/remove/'.$texture->tid)->assertJson(['code' => 0]);
|
$this->postJson('/user/closet/remove/'.$texture->tid)->assertJson(['code' => 0]);
|
||||||
$this->assertEquals($likes, Texture::find($texture->tid)->likes);
|
$this->assertEquals($likes - 1, Texture::find($texture->tid)->likes);
|
||||||
$this->assertEquals($score, $this->user->score);
|
$this->assertEquals($score, $this->user->score);
|
||||||
$this->assertEquals(0, $this->user->closet()->count());
|
$this->assertEquals(0, $this->user->closet()->count());
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -109,18 +109,6 @@ class SkinlibControllerTest extends TestCase
|
||||||
}, $items);
|
}, $items);
|
||||||
$this->assertArraySubset($ordered, $items);
|
$this->assertArraySubset($ordered, $items);
|
||||||
|
|
||||||
// Sort by `likes`
|
|
||||||
$user = factory(User::class)->create();
|
|
||||||
$user->closet()->attach($skins->random()->tid, ['item_name' => 'name']);
|
|
||||||
$items = $this->getJson('/skinlib/data?sort=likes')
|
|
||||||
->assertJson(['data' => [
|
|
||||||
'current_uid' => 0,
|
|
||||||
'total_pages' => 1,
|
|
||||||
]])
|
|
||||||
->decodeResponseJson('data')['items'];
|
|
||||||
$this->assertEquals(1, $items[0]['likes']);
|
|
||||||
$this->assertEquals(0, $items[1]['likes']);
|
|
||||||
|
|
||||||
// Search
|
// Search
|
||||||
$keyword = Str::limit($skins->random()->name, 1, '');
|
$keyword = Str::limit($skins->random()->name, 1, '');
|
||||||
$keyworded = $skins
|
$keyworded = $skins
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user