OASIS_MOBILE/src/models/content_visibility.js
oasis-bot c332afd6ea upstream: integrar Oasis 1.3.1
Base del merge a tres bandas: git 0.9.5 de epsylon, esta rama y el src de la
APK oficial 1.3.1 (la variante movil: OASIS_MOBILE, regex sin \p{}, audio y
video de Android). Corre en el mismo nodejs-mobile 18.20.4 que ya usabamos.

Se conserva de la rama: Karvan, identidades y multicuenta, topbar y barra
inferior, borrado de EXIF sin sharp, filtro hot del foro, RTC sin STUN y los
modulos apagados en movil (wallet, banking, torrents).

Se toma de upstream lo que ya hace de serie: respuesta citada en chats, ssb-lan
en movil, configuracion en ~/.ssb/oasis (sobrevive a reinstalar el backend).
El asistente de bienvenida deja elegir workflow tambien en movil.
2026-10-18 02:52:17 +02:00

30 lines
1.6 KiB
JavaScript

const up = (v) => String(v == null ? '' : v).toUpperCase();
const arr = (v) => (Array.isArray(v) ? v : []);
const isPrivateFlag = (v) => {
if (v === false) return true;
const s = String(v == null ? '' : v).toLowerCase();
return s === 'private' || s === 'false' || s === '0';
};
const isContentVisibleTo = (type, c, viewer, author = null) => {
if (!c || typeof c !== 'object') return false;
if (c.encrypted === true || c.encryptedPayload || c.encryptedQuestion || c.encryptedText) return false;
const owner = String(author || c.author || '') === String(viewer);
switch (type) {
case 'task': return !isPrivateFlag(c.isPublic) || owner || arr(c.assignees).includes(viewer);
case 'event': return !isPrivateFlag(c.isPublic) || owner || arr(c.attendees).includes(viewer);
case 'forum': return !(c.isPrivate === true || c.isPrivate === 'true' || c.isPrivate === 'on') || owner;
case 'job': return up(c.visibility) !== 'HIDDEN' || owner || arr(c.subscribers).includes(viewer);
case 'housing':
case 'market': return up(c.visibility) !== 'HIDDEN' || owner;
case 'shop': return up(c.visibility) !== 'CLOSED' || owner;
case 'schoolCourse': return up(c.visibility) !== 'INVITE' || owner || arr(c.students).includes(viewer) || arr(c.invited).includes(viewer);
case 'tribe': return c.isAnonymous === false || owner || arr(c.members).includes(viewer);
case 'poll': return !c.chatId && !c.tribeId;
case 'room': return !c.tribeId && c.encrypted !== true;
case 'curriculum': return up(c.visibility) !== 'HIDDEN' || owner;
default: return !c.tribeId;
}
};
module.exports = { isContentVisibleTo };