@@ -2,11 +2,15 @@
|
||||
|
||||
namespace App;
|
||||
|
||||
use Illuminate\Database\Eloquent\Builder;
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use Staudenmeir\EloquentEagerLimit\HasEagerLimit;
|
||||
|
||||
class Ejaculation extends Model
|
||||
{
|
||||
//
|
||||
use HasEagerLimit;
|
||||
|
||||
protected $fillable = [
|
||||
'user_id', 'ejaculated_date',
|
||||
@@ -34,4 +38,45 @@ class Ejaculation extends Model
|
||||
return $v->name;
|
||||
})->all());
|
||||
}
|
||||
|
||||
public function likes()
|
||||
{
|
||||
return $this->hasMany(Like::class);
|
||||
}
|
||||
|
||||
public function scopeWithLikes(Builder $query)
|
||||
{
|
||||
if (Auth::check()) {
|
||||
// TODO - このスコープを使うことでlikesが常に直近10件で絞られるのは汚染されすぎ感がある。別名を付与できないか?
|
||||
// - (ejaculation_id, user_id) でユニークなわけですが、is_liked はサブクエリ発行させるのとLeft JoinしてNULLかどうかで結果を見るのどっちがいいんでしょうね
|
||||
return $query
|
||||
->with([
|
||||
'likes' => function ($query) {
|
||||
$query->latest()->take(10);
|
||||
},
|
||||
'likes.user' => function ($query) {
|
||||
$query->where('is_protected', false)
|
||||
->orWhere('id', Auth::id());
|
||||
}
|
||||
])
|
||||
->withCount([
|
||||
'likes',
|
||||
'likes as is_liked' => function ($query) {
|
||||
$query->where('user_id', Auth::id());
|
||||
}
|
||||
]);
|
||||
} else {
|
||||
return $query
|
||||
->with([
|
||||
'likes' => function ($query) {
|
||||
$query->latest()->take(10);
|
||||
},
|
||||
'likes.user' => function ($query) {
|
||||
$query->where('is_protected', false);
|
||||
}
|
||||
])
|
||||
->withCount('likes')
|
||||
->addSelect(DB::raw('0 as is_liked'));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
73
app/Http/Controllers/Api/LikeController.php
Normal file
73
app/Http/Controllers/Api/LikeController.php
Normal file
@@ -0,0 +1,73 @@
|
||||
<?php
|
||||
|
||||
namespace App\Http\Controllers\Api;
|
||||
|
||||
use App\Ejaculation;
|
||||
use App\Http\Controllers\Controller;
|
||||
use App\Like;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Validator;
|
||||
|
||||
class LikeController extends Controller
|
||||
{
|
||||
public function store(Request $request)
|
||||
{
|
||||
$request->validate([
|
||||
'id' => 'required|integer|exists:ejaculations'
|
||||
]);
|
||||
|
||||
$keys = [
|
||||
'user_id' => Auth::id(),
|
||||
'ejaculation_id' => $request->input('id')
|
||||
];
|
||||
|
||||
$like = Like::query()->where($keys)->first();
|
||||
if ($like) {
|
||||
$data = [
|
||||
'errors' => [
|
||||
['message' => 'このチェックインはすでにいいね済です。']
|
||||
],
|
||||
'ejaculation' => $like->ejaculation
|
||||
];
|
||||
|
||||
return response()->json($data, 409);
|
||||
}
|
||||
|
||||
$like = Like::create($keys);
|
||||
|
||||
return [
|
||||
'ejaculation' => $like->ejaculation
|
||||
];
|
||||
}
|
||||
|
||||
public function destroy($id)
|
||||
{
|
||||
Validator::make(compact('id'), [
|
||||
'id' => 'required|integer'
|
||||
])->validate();
|
||||
|
||||
$like = Like::query()->where([
|
||||
'user_id' => Auth::id(),
|
||||
'ejaculation_id' => $id
|
||||
])->first();
|
||||
if ($like === null) {
|
||||
$ejaculation = Ejaculation::find($id);
|
||||
|
||||
$data = [
|
||||
'errors' => [
|
||||
['message' => 'このチェックインはいいねされていません。']
|
||||
],
|
||||
'ejaculation' => $ejaculation
|
||||
];
|
||||
|
||||
return response()->json($data, 404);
|
||||
}
|
||||
|
||||
$like->delete();
|
||||
|
||||
return [
|
||||
'ejaculation' => $like->ejaculation
|
||||
];
|
||||
}
|
||||
}
|
@@ -78,7 +78,9 @@ class EjaculationController extends Controller
|
||||
|
||||
public function show($id)
|
||||
{
|
||||
$ejaculation = Ejaculation::findOrFail($id);
|
||||
$ejaculation = Ejaculation::where('id', $id)
|
||||
->withLikes()
|
||||
->firstOrFail();
|
||||
$user = User::findOrFail($ejaculation->user_id);
|
||||
|
||||
// 1つ前のチェックインからの経過時間を求める
|
||||
|
@@ -69,6 +69,7 @@ SQL
|
||||
->orderBy('ejaculations.ejaculated_date', 'desc')
|
||||
->select('ejaculations.*')
|
||||
->with('user', 'tags')
|
||||
->withLikes()
|
||||
->take(10)
|
||||
->get();
|
||||
|
||||
|
@@ -28,6 +28,7 @@ class SearchController extends Controller
|
||||
->where('is_private', false)
|
||||
->orderBy('ejaculated_date', 'desc')
|
||||
->with(['user', 'tags'])
|
||||
->withLikes()
|
||||
->paginate(20)
|
||||
->appends($inputs);
|
||||
|
||||
|
@@ -46,11 +46,12 @@ class SettingController extends Controller
|
||||
|
||||
public function updatePrivacy(Request $request)
|
||||
{
|
||||
$inputs = $request->all(['is_protected', 'accept_analytics']);
|
||||
$inputs = $request->all(['is_protected', 'accept_analytics', 'private_likes']);
|
||||
|
||||
$user = Auth::user();
|
||||
$user->is_protected = $inputs['is_protected'] ?? false;
|
||||
$user->accept_analytics = $inputs['accept_analytics'] ?? false;
|
||||
$user->private_likes = $inputs['private_likes'] ?? false;
|
||||
$user->save();
|
||||
|
||||
return redirect()->route('setting.privacy')->with('status', 'プライバシー設定を更新しました。');
|
||||
|
@@ -16,6 +16,7 @@ class TimelineController extends Controller
|
||||
->orderBy('ejaculations.ejaculated_date', 'desc')
|
||||
->select('ejaculations.*')
|
||||
->with('user', 'tags')
|
||||
->withLikes()
|
||||
->paginate(21);
|
||||
|
||||
return view('timeline.public')->with(compact('ejaculations'));
|
||||
|
@@ -41,6 +41,7 @@ SQL
|
||||
}
|
||||
$ejaculations = $query->orderBy('ejaculated_date', 'desc')
|
||||
->with('tags')
|
||||
->withLikes()
|
||||
->paginate(20);
|
||||
|
||||
// よく使っているタグ
|
||||
@@ -176,4 +177,19 @@ SQL
|
||||
|
||||
return view('user.profile')->with(compact('user', 'ejaculations'));
|
||||
}
|
||||
|
||||
public function likes($name)
|
||||
{
|
||||
$user = User::where('name', $name)->first();
|
||||
if (empty($user)) {
|
||||
abort(404);
|
||||
}
|
||||
|
||||
$likes = $user->likes()
|
||||
->orderBy('created_at', 'desc')
|
||||
->with('ejaculation.user', 'ejaculation.tags')
|
||||
->paginate(20);
|
||||
|
||||
return view('user.likes')->with(compact('user', 'likes'));
|
||||
}
|
||||
}
|
||||
|
@@ -38,7 +38,12 @@ class Kernel extends HttpKernel
|
||||
\App\Http\Middleware\NormalizeLineEnding::class,
|
||||
],
|
||||
|
||||
// 現時点では内部APIしかないので、認証の手間を省くためにステートフルにしている。
|
||||
'api' => [
|
||||
\App\Http\Middleware\EncryptCookies::class,
|
||||
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
|
||||
\Illuminate\Session\Middleware\StartSession::class,
|
||||
\App\Http\Middleware\VerifyCsrfToken::class,
|
||||
'throttle:60,1',
|
||||
'bindings',
|
||||
],
|
||||
|
23
app/Like.php
Normal file
23
app/Like.php
Normal file
@@ -0,0 +1,23 @@
|
||||
<?php
|
||||
|
||||
namespace App;
|
||||
|
||||
use Illuminate\Database\Eloquent\Model;
|
||||
use Staudenmeir\EloquentEagerLimit\HasEagerLimit;
|
||||
|
||||
class Like extends Model
|
||||
{
|
||||
use HasEagerLimit;
|
||||
|
||||
protected $fillable = ['user_id', 'ejaculation_id'];
|
||||
|
||||
public function user()
|
||||
{
|
||||
return $this->belongsTo(User::class);
|
||||
}
|
||||
|
||||
public function ejaculation()
|
||||
{
|
||||
return $this->belongsTo(Ejaculation::class)->withLikes();
|
||||
}
|
||||
}
|
@@ -20,6 +20,7 @@ class User extends Authenticatable
|
||||
'is_protected', 'accept_analytics',
|
||||
'display_name', 'description',
|
||||
'twitter_id', 'twitter_name',
|
||||
'private_likes',
|
||||
];
|
||||
|
||||
/**
|
||||
@@ -51,4 +52,9 @@ class User extends Authenticatable
|
||||
{
|
||||
return Auth::check() && $this->id === Auth::user()->id;
|
||||
}
|
||||
|
||||
public function likes()
|
||||
{
|
||||
return $this->hasMany(Like::class);
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user