Files
nnterp-react-admin/database/seeders/MessengerSeeder.php
2026-03-13 20:49:46 +08:00

159 lines
6.1 KiB
PHP

<?php
namespace Database\Seeders;
use Illuminate\Database\Seeder;
use App\Models\User;
use App\Models\ChMessage;
use App\Models\ChFavorite;
use App\Models\ChPinned;
use Carbon\Carbon;
class MessengerSeeder extends Seeder
{
public function run()
{
if (ChMessage::exists()) {
return;
}
// Get company user and created users
$companyUser = User::where('type', 'company')->first();
if (!$companyUser) return;
$createdUsers = User::whereIn('type', ['staff', 'client', 'vendor'])
->where('created_by', $companyUser->id)
->limit(10)
->get();
if ($createdUsers->count() < 2) return;
$conversations = [
[
"Hi there! How's your day going?",
"Hey! Pretty good, thanks for asking. How about you?",
"Not bad at all. Just working on the quarterly report.",
"Oh nice! Need any help with that?",
"Actually, yes. Could you review the financial section?",
"Of course! Send it over and I'll take a look.",
"Perfect, sending it now. Thanks!",
"No problem, happy to help 😊"
],
[
"Good morning! Ready for today's meeting?",
"Morning! Yes, I've prepared all the materials.",
"Great! What time should we start?",
"How about 10 AM? That works for everyone.",
"Perfect. I'll send the calendar invite.",
"Sounds good. See you then!"
],
[
"The client loved the presentation!",
"Really? That's fantastic news!",
"Yes, they want to move forward with the project.",
"Excellent work! This calls for a celebration 🎉",
"Definitely! Drinks after work?",
"Count me in!"
],
[
"Quick question about the budget",
"Sure, what's up?",
"Do we have approval for the additional resources?",
"Let me check with management and get back to you.",
"Thanks, no rush but would be good to know soon.",
"I'll follow up by end of day.",
"Perfect, appreciate it!"
],
[
"Hey, are you free for a quick call?",
"Sure! What's it about?",
"Need to discuss the timeline for the new feature.",
"Ah yes, I was thinking about that too.",
"Great minds think alike! 😄",
"Haha exactly! Give me 5 minutes?",
"Perfect, I'll call you then."
]
];
// Create realistic conversations between company and created users
foreach ($createdUsers as $index => $user) {
$conversation = $conversations[$index % count($conversations)];
$baseTime = Carbon::now()->subDays(rand(0, 7));
foreach ($conversation as $msgIndex => $messageText) {
$isFromCompany = $msgIndex % 2 === 0;
$fromId = $isFromCompany ? $companyUser->id : $user->id;
$toId = $isFromCompany ? $user->id : $companyUser->id;
ChMessage::create([
'from_id' => $fromId,
'to_id' => $toId,
'body' => $messageText,
'seen' => $msgIndex < count($conversation) - 2 ? 1 : rand(0, 1),
'created_at' => $baseTime->copy()->addMinutes($msgIndex * rand(2, 15)),
]);
}
}
// Create conversations between created users
$quickChats = [
["Hey, got a minute?", "Sure! What's up?", "Can you help me with this task?", "Of course! What do you need?"],
["Thanks for yesterday's help!", "No problem at all!", "Really saved me a lot of time.", "Glad I could help! 😊"],
["Are you joining the team lunch?", "Definitely! What time?", "12:30 at the usual place", "Perfect, see you there!"],
];
for ($i = 0; $i < min(3, $createdUsers->count() - 1); $i++) {
$user1 = $createdUsers->skip($i)->first();
$user2 = $createdUsers->skip($i + 1)->first();
$chat = $quickChats[$i % count($quickChats)];
$baseTime = Carbon::now()->subDays(rand(1, 5));
foreach ($chat as $msgIndex => $messageText) {
$isFromUser1 = $msgIndex % 2 === 0;
$fromId = $isFromUser1 ? $user1->id : $user2->id;
$toId = $isFromUser1 ? $user2->id : $user1->id;
ChMessage::create([
'from_id' => $fromId,
'to_id' => $toId,
'body' => $messageText,
'seen' => $msgIndex < count($chat) - 1 ? 1 : rand(0, 1),
'created_at' => $baseTime->copy()->addMinutes($msgIndex * rand(3, 10)),
]);
}
}
// Add favorites and pinned contacts for some users
foreach ($createdUsers->take(3) as $user) {
// Favorites
$userFavorites = $createdUsers->where('id', '!=', $user->id)->random(rand(1, 3));
foreach ($userFavorites as $favUser) {
ChFavorite::firstOrCreate(
[
'user_id' => $user->id,
'favorite_id'=> $favUser->id,
],
[
'created_at' => now(),
'updated_at' => now(),
]
);
}
// Pins
$userPinned = $createdUsers->where('id', '!=', $user->id)->random(rand(1, 2));
foreach ($userPinned as $pinnedUser) {
ChPinned::firstOrCreate(
[
'user_id' => $user->id,
'pinned_id' => $pinnedUser->id,
],
[
'created_at' => now(),
'updated_at' => now(),
]
);
}
}
}
}