cache fixes

on newRoom and deleteRooms clear cache
add some checks for empty groups list
isekai-main
Barış Soner Uşaklı 2 years ago
parent 18a1663b5e
commit 547bde8939

@ -26,7 +26,7 @@ define('forum/chats/create', [
save: {
label: '[[global:create]]',
className: 'btn-primary',
callback: async function () {
callback: function () {
const roomName = modal.find('[component="chat/room/name"]').val();
const uids = modal.find('[component="chat/room/users"] [component="chat/user"]').find('[data-uid]').map(
(i, el) => $(el).attr('data-uid')
@ -38,16 +38,25 @@ define('forum/chats/create', [
alerts.error('[[error:no-users-selected]]');
return false;
}
if (type === 'public' && !groups) {
if (type === 'public' && !groups.length) {
alerts.error('[[error:no-groups-selected]]');
return false;
}
await createRoom({
if (!app.user.uid) {
alerts.error('[[error:not-logged-in]]');
return false;
}
api.post(`/chats`, {
roomName: roomName,
uids: uids,
type: type,
groups: groups,
});
}).then(({ roomId }) => {
ajaxify.go('chats/' + roomId);
modal.modal('hide');
}).catch(alerts.error);
return false;
},
},
},
@ -73,13 +82,5 @@ define('forum/chats/create', [
});
}
async function createRoom(params) {
if (!app.user.uid) {
return alerts.error('[[error:not-logged-in]]');
}
const { roomId } = await api.post(`/chats`, params);
ajaxify.go('chats/' + roomId);
}
return create;
});

@ -52,6 +52,9 @@ chatsAPI.create = async function (caller, data) {
if (!isPublic && !data.uids.length) {
throw new Error('[[error:no-users-selected]]');
}
if (isPublic && (!Array.isArray(data.groups) || !data.groups.length)) {
throw new Error('[[error:no-groups-selected]]');
}
await Promise.all(data.uids.map(async uid => messaging.canMessageUser(caller.uid, uid)));
const roomId = await messaging.newRoom(caller.uid, data);

@ -125,8 +125,15 @@ Messaging.getPublicRooms = async (callerUid, uid) => {
const allRoomIds = await Messaging.getPublicRoomIdsFromSet('chat:rooms:public:order');
const allRoomData = await Messaging.getRoomsData(allRoomIds);
console.log(allRoomIds, allRoomData);
const checks = await Promise.all(
allRoomData.map(room => groups.isMemberOfAny(uid, room && room.groups))
allRoomData.map(
room => room && (
!Array.isArray(room.groups) ||
!room.groups.length ||
groups.isMemberOfAny(uid, room && room.groups)
)
)
);
const roomData = allRoomData.filter((room, idx) => room && checks[idx]);
const roomIds = roomData.map(r => r.roomId);

@ -10,9 +10,10 @@ const groups = require('../groups');
const plugins = require('../plugins');
const privileges = require('../privileges');
const meta = require('../meta');
const cache = require('../cache');
const cacheCreate = require('../cacheCreate');
const cache = cacheCreate({
const roomUidCache = cacheCreate({
name: 'chat:room:uids',
max: 500,
ttl: 0,
@ -104,6 +105,11 @@ module.exports = function (Messaging) {
Messaging.addRoomToUsers(roomId, [uid].concat(data.uids), now),
]);
cache.del([
'chat:rooms:public:all',
'chat:rooms:public:order:all',
]);
if (!isPublic) {
// chat owner should also get the user-join system message
await Messaging.addSystemMessage('user-join', uid, roomId);
@ -136,6 +142,11 @@ module.exports = function (Messaging) {
db.deleteAll(roomIds.map(id => `chat:room:${id}`)),
db.sortedSetRemove('chat:rooms', roomIds),
db.sortedSetRemove('chat:rooms:public', roomIds),
db.sortedSetRemove('chat:rooms:public:order', roomIds),
]);
cache.del([
'chat:rooms:public:all',
'chat:rooms:public:order:all',
]);
};
@ -252,7 +263,7 @@ module.exports = function (Messaging) {
...groupChats.map(id => [`chat:room:${id}`, { groupChat: 1, userCount: countMap[id] }]),
...privateChats.map(id => [`chat:room:${id}`, { groupChat: 0, userCount: countMap[id] }]),
]);
cache.del(roomIds.map(id => `chat:room:${id}:users`));
roomUidCache.del(roomIds.map(id => `chat:room:${id}:users`));
}
Messaging.leaveRoom = async (uids, roomId) => {
@ -301,12 +312,12 @@ module.exports = function (Messaging) {
Messaging.getAllUidsInRoom = async function (roomId) {
const cacheKey = `chat:room:${roomId}:users`;
let uids = cache.get(cacheKey);
let uids = roomUidCache.get(cacheKey);
if (uids !== undefined) {
return uids;
}
uids = await Messaging.getUidsInRoom(roomId, 0, -1);
cache.set(cacheKey, uids);
roomUidCache.set(cacheKey, uids);
return uids;
};
@ -373,7 +384,9 @@ module.exports = function (Messaging) {
}
if (!room ||
(!room.public && !inRoom) ||
(room.public && !(await groups.isMemberOfAny(uid, room.groups)))
(room.public && (
Array.isArray(room.groups) && room.groups.length && !(await groups.isMemberOfAny(uid, room.groups)))
)
) {
return null;
}

Loading…
Cancel
Save