Add Conversations model

This commit is contained in:
Daniel Supernault 2022-04-20 05:07:20 -06:00
parent cc6b78c436
commit f34a1e9d8e
No known key found for this signature in database
GPG key ID: 0DEF1C662C9033F7
6 changed files with 181 additions and 10 deletions

View file

@ -81,6 +81,7 @@ use App\Jobs\MediaPipeline\MediaSyncLicensePipeline;
use App\Services\DiscoverService; use App\Services\DiscoverService;
use App\Services\CustomEmojiService; use App\Services\CustomEmojiService;
use App\Services\MarkerService; use App\Services\MarkerService;
use App\Models\Conversation;
class ApiV1Controller extends Controller class ApiV1Controller extends Controller
{ {
@ -1876,8 +1877,12 @@ class ApiV1Controller extends Controller
return $q->whereToId($pid)->whereIsHidden(true); return $q->whereToId($pid)->whereIsHidden(true);
}); });
} else { } else {
$dms = DirectMessage::when($scope === 'inbox', function($q, $scope) use($pid) { $dms = Conversation::when($scope === 'inbox', function($q, $scope) use($pid) {
return $q->whereIsHidden(false)->where('to_id', $pid)->orWhere('from_id', $pid); return $q->whereIsHidden(false)
->where('to_id', $pid)
->orWhere('from_id', $pid)
->orderByDesc('status_id')
->groupBy(['to_id', 'from_id']);
}) })
->when($scope === 'sent', function($q, $scope) use($pid) { ->when($scope === 'sent', function($q, $scope) use($pid) {
return $q->whereFromId($pid)->groupBy('to_id'); return $q->whereFromId($pid)->groupBy('to_id');
@ -1887,7 +1892,7 @@ class ApiV1Controller extends Controller
}); });
} }
$dms = $dms->orderByDesc('created_at') $dms = $dms->orderByDesc('status_id')
->simplePaginate($limit) ->simplePaginate($limit)
->map(function($dm) use($pid) { ->map(function($dm) use($pid) {
$from = $pid == $dm->to_id ? $dm->from_id : $dm->to_id; $from = $pid == $dm->to_id ? $dm->from_id : $dm->to_id;

View file

@ -20,6 +20,7 @@ use App\Jobs\StatusPipeline\NewStatusPipeline;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use App\Util\ActivityPub\Helpers; use App\Util\ActivityPub\Helpers;
use App\Services\WebfingerService; use App\Services\WebfingerService;
use App\Models\Conversation;
class DirectMessageController extends Controller class DirectMessageController extends Controller
{ {
@ -329,6 +330,19 @@ class DirectMessageController extends Controller
$dm->type = $request->input('type'); $dm->type = $request->input('type');
$dm->save(); $dm->save();
Conversation::updateOrInsert(
[
'to_id' => $recipient->id,
'from_id' => $profile->id
],
[
'type' => $dm->type,
'status_id' => $status->id,
'dm_id' => $dm->id,
'is_hidden' => $hidden
]
);
if(filter_var($msg, FILTER_VALIDATE_URL)) { if(filter_var($msg, FILTER_VALIDATE_URL)) {
if(Helpers::validateUrl($msg)) { if(Helpers::validateUrl($msg)) {
$dm->type = 'link'; $dm->type = 'link';
@ -573,6 +587,19 @@ class DirectMessageController extends Controller
$dm->is_hidden = $hidden; $dm->is_hidden = $hidden;
$dm->save(); $dm->save();
Conversation::updateOrInsert(
[
'to_id' => $recipient->id,
'from_id' => $profile->id
],
[
'type' => $dm->type,
'status_id' => $status->id,
'dm_id' => $dm->id,
'is_hidden' => $hidden
]
);
if($recipient->domain) { if($recipient->domain) {
$this->remoteDeliver($dm); $this->remoteDeliver($dm);
} }

View file

@ -28,6 +28,7 @@ use App\Jobs\StoryPipeline\StoryReplyDeliver;
use App\Jobs\StoryPipeline\StoryFanout; use App\Jobs\StoryPipeline\StoryFanout;
use App\Jobs\StoryPipeline\StoryDelete; use App\Jobs\StoryPipeline\StoryDelete;
use ImageOptimizer; use ImageOptimizer;
use App\Models\Conversation;
class StoryComposeController extends Controller class StoryComposeController extends Controller
{ {
@ -420,6 +421,19 @@ class StoryComposeController extends Controller
]); ]);
$dm->save(); $dm->save();
Conversation::updateOrInsert(
[
'to_id' => $story->profile_id,
'from_id' => $pid
],
[
'type' => 'story:react',
'status_id' => $status->id,
'dm_id' => $dm->id,
'is_hidden' => false
]
);
if($story->local) { if($story->local) {
// generate notification // generate notification
$n = new Notification; $n = new Notification;
@ -481,6 +495,19 @@ class StoryComposeController extends Controller
]); ]);
$dm->save(); $dm->save();
Conversation::updateOrInsert(
[
'to_id' => $story->profile_id,
'from_id' => $pid
],
[
'type' => 'story:comment',
'status_id' => $status->id,
'dm_id' => $dm->id,
'is_hidden' => false
]
);
if($story->local) { if($story->local) {
// generate notification // generate notification
$n = new Notification; $n = new Notification;

View file

@ -0,0 +1,11 @@
<?php
namespace App\Models;
use Illuminate\Database\Eloquent\Factories\HasFactory;
use Illuminate\Database\Eloquent\Model;
class Conversation extends Model
{
use HasFactory;
}

View file

@ -368,6 +368,19 @@ class Inbox
$dm->type = 'text'; $dm->type = 'text';
$dm->save(); $dm->save();
Conversation::updateOrInsert(
[
'to_id' => $profile->id,
'from_id' => $actor->id
],
[
'type' => 'text',
'status_id' => $status->id,
'dm_id' => $dm->id,
'is_hidden' => $hidden
]
);
if(count($activity['attachment'])) { if(count($activity['attachment'])) {
$photos = 0; $photos = 0;
$videos = 0; $videos = 0;
@ -911,6 +924,19 @@ class Inbox
]); ]);
$dm->save(); $dm->save();
Conversation::updateOrInsert(
[
'to_id' => $story->profile_id,
'from_id' => $actorProfile->id
],
[
'type' => 'story:react',
'status_id' => $status->id,
'dm_id' => $dm->id,
'is_hidden' => false
]
);
$n = new Notification; $n = new Notification;
$n->profile_id = $dm->to_id; $n->profile_id = $dm->to_id;
$n->actor_id = $dm->from_id; $n->actor_id = $dm->from_id;
@ -1007,6 +1033,19 @@ class Inbox
]); ]);
$dm->save(); $dm->save();
Conversation::updateOrInsert(
[
'to_id' => $story->profile_id,
'from_id' => $actorProfile->id
],
[
'type' => 'story:comment',
'status_id' => $status->id,
'dm_id' => $dm->id,
'is_hidden' => false
]
);
$n = new Notification; $n = new Notification;
$n->profile_id = $dm->to_id; $n->profile_id = $dm->to_id;
$n->actor_id = $dm->from_id; $n->actor_id = $dm->from_id;

View file

@ -0,0 +1,62 @@
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
use App\DirectMessage;
use App\Models\Conversation;
use Illuminate\Support\Facades\DB;
class CreateConversationsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('conversations', function (Blueprint $table) {
$table->bigIncrements('id');
$table->bigInteger('to_id')->unsigned()->index();
$table->bigInteger('from_id')->unsigned()->index();
$table->bigInteger('dm_id')->unsigned()->nullable();
$table->bigInteger('status_id')->unsigned()->nullable();
$table->string('type')->nullable();
$table->boolean('is_hidden')->default(false)->index();
$table->boolean('has_seen')->default(false)->index();
$table->json('metadata')->nullable();
$table->unique(['to_id', 'from_id']);
$table->timestamps();
});
sleep(10);
if(DirectMessage::count()) {
foreach(DirectMessage::lazy() as $msg) {
Conversation::updateOrInsert([
'to_id' => $msg->to_id,
'from_id' => $msg->from_id,
],
[
'dm_id' => $msg->id,
'status_id' => $msg->status_id,
'type' => $msg->type,
'created_at' => $msg->created_at,
'updated_at' => $msg->updated_at
]);
}
}
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::dropIfExists('conversations');
}
}