В чат могут оставлять сообщения авторизованные пользователи, остальные могут только читать. Это задача RBAC и ACF, поэтому эту часть пока не беру во внимание.
Создаем модель:
- количество записей предусматриваем много, поэтому primary_key (id) пусть будет bigint
- конечно же нам нужно знать кто прислал сообщение, добавляем поле user_id (int), где будем хранить id автора сообщения
- собственно, само сообщение text (с типом text)
- дата создания сообщения created_at (int)
Итак, получилась модель
Но, подумав, я решил что пусть в этом чате пользователи могут оставлять личные сообщения. То есть кликают по имени юзера и тогда сообщение видит только тот пользователь, кому оно адресовано.id, user_id, text, created_at
Добавим в модельку поле for_user(int), где будем хранить id пользователя для кого предназначено сообщение.
Теперь наша модель (пусть это будет Chat) выглядит следующим образом:
Возможность отправки в общий чат картинок, файлов и прочей лабуды пока исключаем. Чат нам нужен просто для общения "текстом".id, user_id, for_user, text, created_at
Как же мы будем выбирать сообщения. Я думаю что проблем особых нет
Выбрать все записи, где for_user равен равен NULL, либо for_user равен id пользователя просматривающего чат (исключаем чужие сообщения), сортируем по id в обратном порядке, ну и лимит 50 какой-нибудь. Так мы получаем все сообщения которые отправлены в общий чат или лично нам, выбираем последние 50 записей с конца. Конечно же через with подгрузим id-шники пользователей из связанных таблиц
Вроде бы все так пока что?
Еще немного подумав о том, что бывают плохие пользователи, которые хотят флудить и матюкаться. Значит будем их "мутить", то есть лишать права писать в чат на какое-то время.
Добавим в таблицу USER поле mute (int), где будем хранить время окончания мута (например, текущее время + 3600 [1 час] ), и каждый раз проверять его когда пользователь хочет что-то в чат написать. Если в поле стоит время то проверяем, истекло оно или нет и:
- если истекло, то обнуляем это поле в NULL и разрешаем пользователю отправить сообщение
- если не истекло, то пользователь пока не может еще писать в чат
- если поле =NULL - сообщение можно принять и положить в БД (Chat)
Скажите, есть ли у вас замечания по моему ходу мыслей? Буду рад любым комментариям.