<?php
declare(strict_types=1);
namespace DoctrineMigrations;
use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration;
/**
* Auto-generated Migration: Please modify to your needs!
*/
final class Version20241114200328 extends AbstractMigration
{
public function getDescription(): string
{
return '';
}
public function up(Schema $schema): void
{
// this up() migration is auto-generated, please modify it to your needs
// Fetch all users with non-empty params
$users = $this->connection->fetchAllAssociative('SELECT id, params FROM user WHERE params IS NOT NULL');
foreach ($users as $user) {
$userId = $user['id'];
$params = unserialize($user['params']);
// Check if params is a valid array
if (!\is_array($params)) {
continue;
}
// Extract all stream IDs referenced in this user's params
$streamIds = $this->getStreamIdsFromParams($params);
// Fetch only the direct message streams relevant to this user
$directMessageStreamIds = $this->getDirectMessageStreamIds($streamIds);
// Clean up the params for the current user
$updatedParams = $this->removeDirectMessageStreams($params, $directMessageStreamIds);
// Update the user params in the database if changes were made
if ($updatedParams !== $params) {
$this->addSql('UPDATE user SET params = ? WHERE id = ?', [serialize($updatedParams), $userId]);
}
}
}
public function down(Schema $schema): void
{
// this down() migration is auto-generated, please modify it to your needs
// No rollback required
}
/**
* Extract stream IDs from user's params.
*/
private function getStreamIdsFromParams(array $params): array
{
$streamIds = [];
if (isset($params['workspaces']) && \is_array($params['workspaces'])) {
foreach ($params['workspaces'] as $workspace) {
// Collect stream IDs from favorites
if (isset($workspace['favorites'])) {
$streamIds = array_merge($streamIds, $workspace['favorites']);
}
// Collect stream IDs from folders
if (isset($workspace['folders']) && \is_array($workspace['folders'])) {
foreach ($workspace['folders'] as $folder) {
$streamIds = array_merge($streamIds, $folder);
}
}
// Collect stream IDs from unassigned
if (isset($workspace['unassigned'])) {
$streamIds = array_merge($streamIds, $workspace['unassigned']);
}
}
}
return array_unique($streamIds);
}
/**
* Fetch direct message streams for a given set of stream IDs.
*/
private function getDirectMessageStreamIds(array $streamIds): array
{
if (empty($streamIds)) {
return [];
}
// Fetch only the streams that are marked as direct messages
$placeholders = implode(',', array_fill(0, \count($streamIds), '?'));
$query = "SELECT id FROM w_stream WHERE direct_message = 1 AND id IN ($placeholders)";
$streams = $this->connection->fetchAllAssociative($query, $streamIds);
return array_column($streams, 'id');
}
/**
* Remove direct message streams from user params.
*/
private function removeDirectMessageStreams(array $params, array $directMessageStreamIds): array
{
if (isset($params['workspaces']) && \is_array($params['workspaces'])) {
foreach ($params['workspaces'] as &$workspace) {
// Remove from favorites
if (isset($workspace['favorites'])) {
$workspace['favorites'] = array_values(
array_diff($workspace['favorites'], $directMessageStreamIds)
);
}
// Remove from folders
if (isset($workspace['folders']) && \is_array($workspace['folders'])) {
foreach ($workspace['folders'] as &$folder) {
$folder = array_values(
array_diff($folder, $directMessageStreamIds)
);
}
}
// Remove from unassigned streams
if (isset($workspace['unassigned'])) {
$workspace['unassigned'] = array_values(
array_diff($workspace['unassigned'], $directMessageStreamIds)
);
}
}
}
return $params;
}
}