=============================================================== ARQUITECTURA — OASIS MOBILE (Node.js) =============================================================== ENTRY POINT: nodejs-project/nodejs-project/main.js -> Inicia servidor SSB -> Arranca backend Koa en puerto 3000 -------------------------------------------------------------- BACKEND (Koa.js) -------------------------------------------------------------- ARCHIVO: src/backend/backend.js (3249 lineas) - Router con 100+ rutas GET/POST - Carga todos los modelos al inicio - Middleware: validacion host, idioma (cookies), SSB sync status - Patron: ctx.body = await vistaView(datos) RUTAS CLAVE: GET / -> home / feed GET /inhabitants -> lista de usuarios GET /author/:id -> perfil de usuario GET /tribes -> lista de tribes POST /tribes/generate-invite -> genera invite code de tribe POST /tribes/join-code -> unirse a tribe con codigo GET /invites -> pagina de invites/pubs SSB POST /settings/invite/accept -> aceptar invite de pub SSB GET /wallet -> wallet ECOin GET /wallet/receive -> recibir (tiene QR de direccion) -------------------------------------------------------------- MODELOS (src/models/) -------------------------------------------------------------- about_model.js -> perfiles de usuario (nombre, foto, descripcion) tribes_model.js -> tribes: crear, unirse, invites - generateInvite(tribeId) -> devuelve string con invite code - joinByInvite(inviteCode) -> une al usuario al tribe - inviteMode: 'strict' | 'open' courts_model.js -> sistema de tribunales banking_model.js -> ECOin wallet parliament_model.js -> gobernanza + 35 modelos mas -------------------------------------------------------------- VISTAS (src/views/) — Hyperaxe SSR -------------------------------------------------------------- Patron de uso: const { div, h2, p, ... } = require('../server/node_modules/hyperaxe'); exports.miVista = async (datos) => { return template('Titulo', section(div(...))) } VISTAS MODIFICADAS (QR): inhabitants_view.js -> perfil usuario + lista inhabitants invites_view.js -> invites de pubs SSB tribes_view.js -> invite page de tribes wallet_view.js -> (ya tenia QR de direccion ECOin) OTRAS VISTAS IMPORTANTES: main_views.js -> template() base con header/footer feed_view.js -> timeline principal tribes_view.js -> vistas de tribes (lista, detalle, forms) banking_views.js -> wallet/banking UI -------------------------------------------------------------- FRONTEND (CSS/Assets) -------------------------------------------------------------- src/client/assets/ styles/style.css -> CSS principal (modificado para QR) styles/mobile.css -> estilos movil themes/ -> temas visuales OasisMobile.css -> tema principal de la app Dark-SNH.css Matrix-SNH.css Purple-SNH.css Clear-SNH.css translations/ -> ficheros i18n (es, en, ...) images/ -> imagenes estaticas -------------------------------------------------------------- SSB (Secure Scuttlebutt) -------------------------------------------------------------- src/server/SSB_server.js -> servidor SSB config.keys.id -> ID del usuario actual (@xxx.ed25519) Identidad SSB: @.ed25519 Mensajes SSB: { type, content, ... } firmados con clave privada Replicacion: via pubs (servidores de federacion) Pubs: gossip.json en ~/.ssb/gossip.json Invite codes SSB formato: host:port:@key.ed25519~invite_token -------------------------------------------------------------- TRIBES vs PUBS -------------------------------------------------------------- PUB: Servidor SSB de federacion (conectividad de red) Invite: string "host:port:@key~token" TRIBE: Comunidad/grupo dentro de la app (social) Invite: codigo generado por tribesModel.generateInvite() inviteMode: 'strict' (solo autor) | 'open' (cualquier miembro)