ソースを参照

Update DirectMessageController, fix pgsql bug

Daniel Supernault 4 年 前
コミット
f1c28e7d0c
1 ファイル変更243 行追加119 行削除
  1. 243 119
      app/Http/Controllers/DirectMessageController.php

+ 243 - 119
app/Http/Controllers/DirectMessageController.php

@@ -39,129 +39,253 @@ class DirectMessageController extends Controller
 		$action = $request->input('a', 'inbox');
 		$page = $request->input('page');
 
-		if($action == 'inbox') {
-			$dms = DirectMessage::selectRaw('*, max(created_at) as createdAt')
-			->whereToId($profile)
-			->with(['author','status'])
-			->whereIsHidden(false)
-			->groupBy('from_id')
-			->latest()
-			->when($page, function($q, $page) {
-				if($page > 1) {
-					return $q->offset($page * 8 - 8);
-				}
-			})
-			->limit(8)
-			->get()
-			->map(function($r) use($profile) {
-				return $r->from_id !== $profile ? [
-					'id' => (string) $r->from_id,
-					'name' => $r->author->name,
-					'username' => $r->author->username,
-					'avatar' => $r->author->avatarUrl(),
-					'url' => $r->author->url(),
-					'isLocal' => (bool) !$r->author->domain,
-					'domain' => $r->author->domain,
-					'timeAgo' => $r->created_at->diffForHumans(null, true, true),
-					'lastMessage' => $r->status->caption,
-					'messages' => []
-				] : [
-					'id' => (string) $r->to_id,
-					'name' => $r->recipient->name,
-					'username' => $r->recipient->username,
-					'avatar' => $r->recipient->avatarUrl(),
-					'url' => $r->recipient->url(),
-					'isLocal' => (bool) !$r->recipient->domain,
-					'domain' => $r->recipient->domain,
-					'timeAgo' => $r->created_at->diffForHumans(null, true, true),
-					'lastMessage' => $r->status->caption,
-					'messages' => []
-				];
-			});
-		}
+		if(config('database.default') == 'pgsql') {
+			if($action == 'inbox') {
+				$dms = DirectMessage::select('id', 'type', 'to_id', 'from_id', 'id', 'status_id', 'is_hidden', 'meta', 'created_at', 'read_at')
+				->whereToId($profile)
+				->with(['author','status'])
+				->whereIsHidden(false)
+				->when($page, function($q, $page) {
+					if($page > 1) {
+						return $q->offset($page * 8 - 8);
+					}
+				})
+				->latest()
+				->get()
+				->unique('from_id')
+				->take(8)
+				->map(function($r) use($profile) {
+					return $r->from_id !== $profile ? [
+						'id' => (string) $r->from_id,
+						'name' => $r->author->name,
+						'username' => $r->author->username,
+						'avatar' => $r->author->avatarUrl(),
+						'url' => $r->author->url(),
+						'isLocal' => (bool) !$r->author->domain,
+						'domain' => $r->author->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					] : [
+						'id' => (string) $r->to_id,
+						'name' => $r->recipient->name,
+						'username' => $r->recipient->username,
+						'avatar' => $r->recipient->avatarUrl(),
+						'url' => $r->recipient->url(),
+						'isLocal' => (bool) !$r->recipient->domain,
+						'domain' => $r->recipient->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					];
+				})->values();
+			}
 
-		if($action == 'sent') {
-			$dms = DirectMessage::selectRaw('*, max(created_at) as createdAt')
-			->whereFromId($profile)
-			->with(['author','status'])
-			->groupBy('to_id')
-			->orderBy('createdAt', 'desc')
-			->when($page, function($q, $page) {
-				if($page > 1) {
-					return $q->offset($page * 8 - 8);
-				}
-			})
-			->limit(8)
-			->get()
-			->map(function($r) use($profile) {
-				return $r->from_id !== $profile ? [
-					'id' => (string) $r->from_id,
-					'name' => $r->author->name,
-					'username' => $r->author->username,
-					'avatar' => $r->author->avatarUrl(),
-					'url' => $r->author->url(),
-					'isLocal' => (bool) !$r->author->domain,
-					'domain' => $r->author->domain,
-					'timeAgo' => $r->created_at->diffForHumans(null, true, true),
-					'lastMessage' => $r->status->caption,
-					'messages' => []
-				] : [
-					'id' => (string) $r->to_id,
-					'name' => $r->recipient->name,
-					'username' => $r->recipient->username,
-					'avatar' => $r->recipient->avatarUrl(),
-					'url' => $r->recipient->url(),
-					'isLocal' => (bool) !$r->recipient->domain,
-					'domain' => $r->recipient->domain,
-					'timeAgo' => $r->created_at->diffForHumans(null, true, true),
-					'lastMessage' => $r->status->caption,
-					'messages' => []
-				];
-			});
-		}
+			if($action == 'sent') {
+				$dms = DirectMessage::select('id', 'type', 'to_id', 'from_id', 'id', 'status_id', 'is_hidden', 'meta', 'created_at', 'read_at')
+				->whereFromId($profile)
+				->with(['author','status'])
+				->orderBy('id', 'desc')
+				->when($page, function($q, $page) {
+					if($page > 1) {
+						return $q->offset($page * 8 - 8);
+					}
+				})
+				->get()
+				->unique('to_id')
+				->take(8)
+				->map(function($r) use($profile) {
+					return $r->from_id !== $profile ? [
+						'id' => (string) $r->from_id,
+						'name' => $r->author->name,
+						'username' => $r->author->username,
+						'avatar' => $r->author->avatarUrl(),
+						'url' => $r->author->url(),
+						'isLocal' => (bool) !$r->author->domain,
+						'domain' => $r->author->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					] : [
+						'id' => (string) $r->to_id,
+						'name' => $r->recipient->name,
+						'username' => $r->recipient->username,
+						'avatar' => $r->recipient->avatarUrl(),
+						'url' => $r->recipient->url(),
+						'isLocal' => (bool) !$r->recipient->domain,
+						'domain' => $r->recipient->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					];
+				});
+			}
 
-		if($action == 'filtered') {
-			$dms = DirectMessage::selectRaw('*, max(created_at) as createdAt')
-			->whereToId($profile)
-			->with(['author','status'])
-			->whereIsHidden(true)
-			->groupBy('from_id')
-			->orderBy('createdAt', 'desc')
-			->when($page, function($q, $page) {
-				if($page > 1) {
-					return $q->offset($page * 8 - 8);
-				}
-			})
-			->limit(8)
-			->get()
-			->map(function($r) use($profile) {
-				return $r->from_id !== $profile ? [
-					'id' => (string) $r->from_id,
-					'name' => $r->author->name,
-					'username' => $r->author->username,
-					'avatar' => $r->author->avatarUrl(),
-					'url' => $r->author->url(),
-					'isLocal' => (bool) !$r->author->domain,
-					'domain' => $r->author->domain,
-					'timeAgo' => $r->created_at->diffForHumans(null, true, true),
-					'lastMessage' => $r->status->caption,
-					'messages' => []
-				] : [
-					'id' => (string) $r->to_id,
-					'name' => $r->recipient->name,
-					'username' => $r->recipient->username,
-					'avatar' => $r->recipient->avatarUrl(),
-					'url' => $r->recipient->url(),
-					'isLocal' => (bool) !$r->recipient->domain,
-					'domain' => $r->recipient->domain,
-					'timeAgo' => $r->created_at->diffForHumans(null, true, true),
-					'lastMessage' => $r->status->caption,
-					'messages' => []
-				];
-			});
+			if($action == 'filtered') {
+				$dms = DirectMessage::select('id', 'type', 'to_id', 'from_id', 'id', 'status_id', 'is_hidden', 'meta', 'created_at', 'read_at')
+				->whereToId($profile)
+				->with(['author','status'])
+				->whereIsHidden(true)
+				->orderBy('id', 'desc')
+				->when($page, function($q, $page) {
+					if($page > 1) {
+						return $q->offset($page * 8 - 8);
+					}
+				})
+				->get()
+				->unique('from_id')
+				->take(8)
+				->map(function($r) use($profile) {
+					return $r->from_id !== $profile ? [
+						'id' => (string) $r->from_id,
+						'name' => $r->author->name,
+						'username' => $r->author->username,
+						'avatar' => $r->author->avatarUrl(),
+						'url' => $r->author->url(),
+						'isLocal' => (bool) !$r->author->domain,
+						'domain' => $r->author->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					] : [
+						'id' => (string) $r->to_id,
+						'name' => $r->recipient->name,
+						'username' => $r->recipient->username,
+						'avatar' => $r->recipient->avatarUrl(),
+						'url' => $r->recipient->url(),
+						'isLocal' => (bool) !$r->recipient->domain,
+						'domain' => $r->recipient->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					];
+				});
+			} 
+		} elseif(config('database.default') == 'mysql') {
+			if($action == 'inbox') {
+				$dms = DirectMessage::selectRaw('*, max(created_at) as createdAt')
+				->whereToId($profile)
+				->with(['author','status'])
+				->whereIsHidden(false)
+				->groupBy('from_id')
+				->latest()
+				->when($page, function($q, $page) {
+					if($page > 1) {
+						return $q->offset($page * 8 - 8);
+					}
+				})
+				->limit(8)
+				->get()
+				->map(function($r) use($profile) {
+					return $r->from_id !== $profile ? [
+						'id' => (string) $r->from_id,
+						'name' => $r->author->name,
+						'username' => $r->author->username,
+						'avatar' => $r->author->avatarUrl(),
+						'url' => $r->author->url(),
+						'isLocal' => (bool) !$r->author->domain,
+						'domain' => $r->author->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					] : [
+						'id' => (string) $r->to_id,
+						'name' => $r->recipient->name,
+						'username' => $r->recipient->username,
+						'avatar' => $r->recipient->avatarUrl(),
+						'url' => $r->recipient->url(),
+						'isLocal' => (bool) !$r->recipient->domain,
+						'domain' => $r->recipient->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					];
+				});
+			}
+
+			if($action == 'sent') {
+				$dms = DirectMessage::selectRaw('*, max(created_at) as createdAt')
+				->whereFromId($profile)
+				->with(['author','status'])
+				->groupBy('to_id')
+				->orderBy('createdAt', 'desc')
+				->when($page, function($q, $page) {
+					if($page > 1) {
+						return $q->offset($page * 8 - 8);
+					}
+				})
+				->limit(8)
+				->get()
+				->map(function($r) use($profile) {
+					return $r->from_id !== $profile ? [
+						'id' => (string) $r->from_id,
+						'name' => $r->author->name,
+						'username' => $r->author->username,
+						'avatar' => $r->author->avatarUrl(),
+						'url' => $r->author->url(),
+						'isLocal' => (bool) !$r->author->domain,
+						'domain' => $r->author->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					] : [
+						'id' => (string) $r->to_id,
+						'name' => $r->recipient->name,
+						'username' => $r->recipient->username,
+						'avatar' => $r->recipient->avatarUrl(),
+						'url' => $r->recipient->url(),
+						'isLocal' => (bool) !$r->recipient->domain,
+						'domain' => $r->recipient->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					];
+				});
+			}
+
+			if($action == 'filtered') {
+				$dms = DirectMessage::selectRaw('*, max(created_at) as createdAt')
+				->whereToId($profile)
+				->with(['author','status'])
+				->whereIsHidden(true)
+				->groupBy('from_id')
+				->orderBy('createdAt', 'desc')
+				->when($page, function($q, $page) {
+					if($page > 1) {
+						return $q->offset($page * 8 - 8);
+					}
+				})
+				->limit(8)
+				->get()
+				->map(function($r) use($profile) {
+					return $r->from_id !== $profile ? [
+						'id' => (string) $r->from_id,
+						'name' => $r->author->name,
+						'username' => $r->author->username,
+						'avatar' => $r->author->avatarUrl(),
+						'url' => $r->author->url(),
+						'isLocal' => (bool) !$r->author->domain,
+						'domain' => $r->author->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					] : [
+						'id' => (string) $r->to_id,
+						'name' => $r->recipient->name,
+						'username' => $r->recipient->username,
+						'avatar' => $r->recipient->avatarUrl(),
+						'url' => $r->recipient->url(),
+						'isLocal' => (bool) !$r->recipient->domain,
+						'domain' => $r->recipient->domain,
+						'timeAgo' => $r->created_at->diffForHumans(null, true, true),
+						'lastMessage' => $r->status->caption,
+						'messages' => []
+					];
+				});
+			}
 		}
 
-		return response()->json($dms);
+		return response()->json($dms->all());
 	}
 
 	public function create(Request $request)