102 lines
4.1 KiB
Text
102 lines
4.1 KiB
Text
===============================================================
|
|
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: @<base64_ed25519_pubkey>.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)
|