OpportunitiesEntities
Docs
    Ring Platform

    Futuro descentralizado que se construye a sí mismo

    Iniciar sesión
    Entities
    Opportunities
    Store
    Docs
    Conceptos de la plataforma
    RING EconomíaSonoratek LLCImpacto globalIA encuentra Web3
    Empezar
    Inicio rápidoCalculadoraHoja de ruta
    Privacidad|Contacto
    v1.104.26|Sonoratek LLC

    Documentation

    Conceptos, valor y escenarios típicos de clon — menos código.

    Primeros pasos
    Requisitos previos
    Instalación
    Validación del primer éxito
    Próximos pasos
    Funcionalidades
    Blogs de miembros
    Personalización
    Ringization playbook
    Despliegue
    Despliegue autoalojado
    Arquitectura
    Arquitectura de News Kingdom
    Desarrollo
    OSS frente a enterprise

    Entrada rápida (CTOs · auditores · agentes)

    Bienvenida — misión y audiencias
    Referencia rápida
    Primeros pasos
    Arquitectura y Auth.js
    Modos de backend y bases de datos (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Lecturas de seguridad y cumplimiento
    ringdom.org — base LegioX
    Código fuente — licencia MIT (GitHub)

    Documentation

    Conceptos, valor y escenarios típicos de clon — menos código.

    Primeros pasos
    Requisitos previos
    Instalación
    Validación del primer éxito
    Próximos pasos
    Funcionalidades
    Blogs de miembros
    Personalización
    Ringization playbook
    Despliegue
    Despliegue autoalojado
    Arquitectura
    Arquitectura de News Kingdom
    Desarrollo
    OSS frente a enterprise

    Entrada rápida (CTOs · auditores · agentes)

    Bienvenida — misión y audiencias
    Referencia rápida
    Primeros pasos
    Arquitectura y Auth.js
    Modos de backend y bases de datos (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Lecturas de seguridad y cumplimiento
    ringdom.org — base LegioX
    Código fuente — licencia MIT (GitHub)

    Documentation

    Conceptos, valor y escenarios típicos de clon — menos código.

    Primeros pasos
    Requisitos previos
    Instalación
    Validación del primer éxito
    Próximos pasos
    Funcionalidades
    Blogs de miembros
    Personalización
    Ringization playbook
    Despliegue
    Despliegue autoalojado
    Arquitectura
    Arquitectura de News Kingdom
    Desarrollo
    OSS frente a enterprise

    Entrada rápida (CTOs · auditores · agentes)

    Bienvenida — misión y audiencias
    Referencia rápida
    Primeros pasos
    Arquitectura y Auth.js
    Modos de backend y bases de datos (DB_BACKEND_MODE)
    Self-hosted
    Ring MCP Tools
    Ring MCP Server
    Token economics
    Token launch jurisdictions
    Deploy (Docker · k8s)
    Lecturas de seguridad y cumplimiento
    ringdom.org — base LegioX
    Código fuente — licencia MIT (GitHub)
    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Ring Logo

    Loading documentation...

    Preparing Ring content

    Arquitectura de News Kingdom

    Usa las pestañas Fundador / Desarrollador de la barra lateral de la documentación para filtrar esta página. Los fundadores ven el flujo de negocio y los ajustes del operador. Los desarrolladores ven los servicios, las rutas, las variables de entorno y una prueba local.

    News Kingdom es la capa de promoción que se apoya en el módulo de noticias de Ring. Los miembros con el rol member o superior escriben artículos que viven en su espacio personal en /{username}/{slug}. Después, el autor puede pedir un lugar en el feed principal /news. Ring puntúa el artículo, pide al autor que pague un precio basado en esa puntuación y lo envía a los administradores de la plataforma en Telegram para que den el sí o el no definitivo.

    Cada solicitud de promoción pasa por un único campo del artículo, mainPageStatus:

    EtapaQué ocurremainPageStatus
    EnvíoEl autor pide aparecer en la página principalsubmitted
    PuntuaciónLa IA o una heurística puntúa ética, spam, duplicados y méritoai_scored
    Bloqueo estrictoÉtica demasiado baja, o riesgo de spam o de duplicado demasiado altopublished_blog_only
    PagoSe fija el precio y se abre un checkout de PaymentConductorpayment_pending
    PagadoEl webhook confirma el pago y los administradores reciben una tarjeta en Telegramawaiting_admin_approval
    AprobadoEl artículo pasa al feed principal de todo el sitiopublished_main
    RechazadoEl administrador lo rechaza. El artículo se queda en el blog del autorrejected

    Por qué importa para tu clon

    • Los miembros aportan el contenido y pagan por el alcance. Diriges un periódico sin contratar una redacción. Los autores que quieren la portada pagan por ella, y la decisión editorial final sigue siendo tuya.
    • Lo malo se filtra primero. La puntuación detiene el spam, los duplicados y las publicaciones de baja ética antes de que nadie pague y antes de que un administrador les dedique tiempo.
    • Apruebas desde el móvil. Cada envío pagado llega a tus administradores como un mensaje de Telegram con los botones Approve, Reject, View y Counter.
    • Las buenas historias tienen recompensa. Cuando un administrador aprueba una historia escrita por un miembro, Ring pone en cola un crédito de recompensa para el autor e inicia las traducciones a tus otros idiomas.

    Blogs de miembros

    Dónde vive el artículo antes de la promoción: la URL personal del autor.

    Módulo de noticias

    El feed principal, las categorías, los me gusta y el editor que usan los autores.

    Mapa de módulos (verificado en ring/web)

    AspectoRuta
    Máquina de estados, auditoría, aprobación y rechazofeatures/news/services/news-promotion-workflow.ts
    Puntuación con OpenRouter y preciofeatures/news/services/news-scoring-service.ts
    Heurística de duplicadosfeatures/news/services/news-duplicate-check.ts
    Fachada de checkout (purpose: 'news_promotion')features/news/services/news-payment-service.ts
    Manejadores del webhook de pagolib/payments/conductor/handlers/news-promotion.ts, news-promotion-paypal.ts
    Tarjeta y teclado de administración en Telegramfeatures/news/services/news-telegram-approval.ts
    Gestión de callbacks de Telegram (conectado desde )

    Carencias conocidas

    Documentación relacionada

    Related documentation

    Member Blogs

    Mismo flujo: dónde vive el artículo antes y después de solicitar la promoción.

    News Module

    Requisito previo: el módulo de noticias, el editor y el feed principal al que promociona News Kingdom.

    PaymentConductor architecture

    Depende de: cómo se enrutan el checkout news_promotion y sus webhooks.

    Manage via Telegram

    Ver también: el bot de administración que lleva los botones Approve, Reject y Counter.

    1. Docs
    2. /Arquitectura
    3. /Arquitectura de News Kingdom

    Actualizado 1 oct 20267 min de escucha

    Arquitectura de News Kingdom

    Usa las pestañas Fundador / Desarrollador de la barra lateral de la documentación para filtrar esta página. Los fundadores ven el flujo de negocio y los ajustes del operador. Los desarrolladores ven los servicios, las rutas, las variables de entorno y una prueba local.

    News Kingdom es la capa de promoción que se apoya en el módulo de noticias de Ring. Los miembros con el rol member o superior escriben artículos que viven en su espacio personal en /{username}/{slug}. Después, el autor puede pedir un lugar en el feed principal /news. Ring puntúa el artículo, pide al autor que pague un precio basado en esa puntuación y lo envía a los administradores de la plataforma en Telegram para que den el sí o el no definitivo.

    Cada solicitud de promoción pasa por un único campo del artículo, mainPageStatus:

    EtapaQué ocurremainPageStatus
    EnvíoEl autor pide aparecer en la página principalsubmitted
    PuntuaciónLa IA o una heurística puntúa ética, spam, duplicados y méritoai_scored
    Bloqueo estrictoÉtica demasiado baja, o riesgo de spam o de duplicado demasiado altopublished_blog_only
    PagoSe fija el precio y se abre un checkout de PaymentConductorpayment_pending
    PagadoEl webhook confirma el pago y los administradores reciben una tarjeta en Telegramawaiting_admin_approval
    AprobadoEl artículo pasa al feed principal de todo el sitiopublished_main
    RechazadoEl administrador lo rechaza. El artículo se queda en el blog del autorrejected

    Por qué importa para tu clon

    • Los miembros aportan el contenido y pagan por el alcance. Diriges un periódico sin contratar una redacción. Los autores que quieren la portada pagan por ella, y la decisión editorial final sigue siendo tuya.
    • Lo malo se filtra primero. La puntuación detiene el spam, los duplicados y las publicaciones de baja ética antes de que nadie pague y antes de que un administrador les dedique tiempo.
    • Apruebas desde el móvil. Cada envío pagado llega a tus administradores como un mensaje de Telegram con los botones Approve, Reject, View y Counter.
    • Las buenas historias tienen recompensa. Cuando un administrador aprueba una historia escrita por un miembro, Ring pone en cola un crédito de recompensa para el autor e inicia las traducciones a tus otros idiomas.

    Blogs de miembros

    Dónde vive el artículo antes de la promoción: la URL personal del autor.

    Módulo de noticias

    El feed principal, las categorías, los me gusta y el editor que usan los autores.

    Mapa de módulos (verificado en ring/web)

    AspectoRuta
    Máquina de estados, auditoría, aprobación y rechazofeatures/news/services/news-promotion-workflow.ts
    Puntuación con OpenRouter y preciofeatures/news/services/news-scoring-service.ts
    Heurística de duplicadosfeatures/news/services/news-duplicate-check.ts
    Fachada de checkout (purpose: 'news_promotion')features/news/services/news-payment-service.ts
    Manejadores del webhook de pagolib/payments/conductor/handlers/news-promotion.ts, news-promotion-paypal.ts
    Tarjeta y teclado de administración en Telegramfeatures/news/services/news-telegram-approval.ts
    Gestión de callbacks de Telegram (conectado desde )

    Carencias conocidas

    Documentación relacionada

    Related documentation

    Member Blogs

    Mismo flujo: dónde vive el artículo antes y después de solicitar la promoción.

    News Module

    Requisito previo: el módulo de noticias, el editor y el feed principal al que promociona News Kingdom.

    PaymentConductor architecture

    Depende de: cómo se enrutan el checkout news_promotion y sus webhooks.

    Manage via Telegram

    Ver también: el bot de administración que lleva los botones Approve, Reject y Counter.

    1. Docs
    2. /Arquitectura
    3. /Arquitectura de News Kingdom

    Actualizado 1 oct 20267 min de escucha

    Arquitectura de News Kingdom

    Usa las pestañas Fundador / Desarrollador de la barra lateral de la documentación para filtrar esta página. Los fundadores ven el flujo de negocio y los ajustes del operador. Los desarrolladores ven los servicios, las rutas, las variables de entorno y una prueba local.

    News Kingdom es la capa de promoción que se apoya en el módulo de noticias de Ring. Los miembros con el rol member o superior escriben artículos que viven en su espacio personal en /{username}/{slug}. Después, el autor puede pedir un lugar en el feed principal /news. Ring puntúa el artículo, pide al autor que pague un precio basado en esa puntuación y lo envía a los administradores de la plataforma en Telegram para que den el sí o el no definitivo.

    Cada solicitud de promoción pasa por un único campo del artículo, mainPageStatus:

    EtapaQué ocurremainPageStatus
    EnvíoEl autor pide aparecer en la página principalsubmitted
    PuntuaciónLa IA o una heurística puntúa ética, spam, duplicados y méritoai_scored
    Bloqueo estrictoÉtica demasiado baja, o riesgo de spam o de duplicado demasiado altopublished_blog_only
    PagoSe fija el precio y se abre un checkout de PaymentConductorpayment_pending
    PagadoEl webhook confirma el pago y los administradores reciben una tarjeta en Telegramawaiting_admin_approval
    AprobadoEl artículo pasa al feed principal de todo el sitiopublished_main
    RechazadoEl administrador lo rechaza. El artículo se queda en el blog del autorrejected

    Por qué importa para tu clon

    • Los miembros aportan el contenido y pagan por el alcance. Diriges un periódico sin contratar una redacción. Los autores que quieren la portada pagan por ella, y la decisión editorial final sigue siendo tuya.
    • Lo malo se filtra primero. La puntuación detiene el spam, los duplicados y las publicaciones de baja ética antes de que nadie pague y antes de que un administrador les dedique tiempo.
    • Apruebas desde el móvil. Cada envío pagado llega a tus administradores como un mensaje de Telegram con los botones Approve, Reject, View y Counter.
    • Las buenas historias tienen recompensa. Cuando un administrador aprueba una historia escrita por un miembro, Ring pone en cola un crédito de recompensa para el autor e inicia las traducciones a tus otros idiomas.

    Blogs de miembros

    Dónde vive el artículo antes de la promoción: la URL personal del autor.

    Módulo de noticias

    El feed principal, las categorías, los me gusta y el editor que usan los autores.

    Mapa de módulos (verificado en ring/web)

    AspectoRuta
    Máquina de estados, auditoría, aprobación y rechazofeatures/news/services/news-promotion-workflow.ts
    Puntuación con OpenRouter y preciofeatures/news/services/news-scoring-service.ts
    Heurística de duplicadosfeatures/news/services/news-duplicate-check.ts
    Fachada de checkout (purpose: 'news_promotion')features/news/services/news-payment-service.ts
    Manejadores del webhook de pagolib/payments/conductor/handlers/news-promotion.ts, news-promotion-paypal.ts
    Tarjeta y teclado de administración en Telegramfeatures/news/services/news-telegram-approval.ts
    Gestión de callbacks de Telegram (conectado desde )

    Carencias conocidas

    Documentación relacionada

    Related documentation

    Member Blogs

    Mismo flujo: dónde vive el artículo antes y después de solicitar la promoción.

    News Module

    Requisito previo: el módulo de noticias, el editor y el feed principal al que promociona News Kingdom.

    PaymentConductor architecture

    Depende de: cómo se enrutan el checkout news_promotion y sus webhooks.

    Manage via Telegram

    Ver también: el bot de administración que lleva los botones Approve, Reject y Counter.

    1. Docs
    2. /Arquitectura
    3. /Arquitectura de News Kingdom

    Actualizado 1 oct 20267 min de escucha

    PaymentConductor

    El checkout que cobra la tarifa de promoción con el procesador que hayas configurado.

    Gestión desde Telegram

    El bot de administración que lleva los botones de aprobación.

    Del blog del miembro a la página principal

    Escenarios típicos

    1. Periódico comunitario. Un clon de ciudad deja que los miembros locales publiquen en sus blogs y cobra una pequeña tarifa por las historias de portada. Los administradores aprueban las mejores en Telegram.
    2. Red de expertos. Un clon profesional mantiene alto el listón del mérito: los artículos sólidos reciben un precio bajo y los débiles quedan fuera por precio.
    3. Centro de campañas moderado. Un clon de un movimiento se apoya en las reglas de bloqueo estricto para que el spam nunca llegue a la cola del administrador.

    Ajustes del operador

    Los precios se fijan en UAH con variables de entorno del servidor. Si no las defines, se aplican estos valores por defecto:

    AjustePor defectoEfecto
    Precio base50 UAHPrecio mínimo para un artículo de mérito alto
    Escala2000 UAHCuánto sube el precio a medida que baja el mérito
    Máximo5000 UAHTope de precio
    Umbral de mérito bajomérito inferior a 0.25El precio sube al menos a 4999 UAH
    Contraoferta del administrador+25%El botón Counter de Telegram fija un nuevo importe que el autor debe pagar
    lib/telegram/admin-bot/news-callback-handler.ts
    app/api/telegram/admin-bot/webhook/route.ts
    Interfaz de promoción para miembrosfeatures/news/components/news-promotion-panel.tsx en /my-news
    Tipos de estado y de camposfeatures/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility)
    Mapeador de filas JSONBlib/news/map-news-document.ts
    Marca y URL absolutaslib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl)

    Rutas

    Método y rutaAutenticaciónFunción
    POST /api/news/promotion/submitSesión, solo el autor del artículoMarca promoteToMainPage, puntúa y abre el checkout
    PATCH /api/news/promotion/submitCabecera x-news-promotion-secretDev o pruebas: marcar como pagado y avisar a los administradores
    POST /api/payments/{wayforpay,stripe,paypal}/webhookFirma del procesadorConfirmación canónica del pago
    POST /api/news/promotion/wayforpay-webhookPayload del procesadorDelegado obsoleto hacia el webhook canónico de WayForPay
    POST /api/mcp/v1/news/[id]/{score,approve,reject,publish}Token de servicio (withMcpGuard)Operaciones de agentes y MCP sobre el mismo flujo

    Reglas de puntuación

    scoreNewsForMainPage() llama a OpenRouter cuando OPENROUTER_API_KEY está definida. Sin clave, mantiene los valores heurísticos por defecto (ethics 0.7, spam 0.2, merit 0.5) y registra model: 'heuristic'.

    • Riesgo de duplicado: 0.95 si otro artículo comparte slug o siteWideSlug. 0.9 si un artículo publicado (entre los primeros 200) tiene el mismo título.
    • Bloqueo estricto: ethics < NEWS_ETHICS_MIN o spamRisk > NEWS_SPAM_MAX o duplicateRisk > NEWS_DUPLICATE_MAX. Resultado: published_blog_only y sin checkout.
    • Precio: clamp(base, max, base + (1 - merit) * scale). Un mérito inferior a NEWS_MERIT_SOFT_REJECT sube el precio al menos a 4999. El mérito bajo no cambia el estado.

    Variables de entorno

    Ninguna de las claves NEWS_* está en env.local.template. El código las lee con estos valores por defecto.

    VariablePor defectoSe lee en
    NEWS_PROMO_BASE_UAH / NEWS_PROMO_SCALE_UAH / NEWS_PROMO_MAX_UAH50 / 2000 / 5000news-scoring-service.ts
    NEWS_ETHICS_MIN / NEWS_SPAM_MAX / NEWS_DUPLICATE_MAX0.35 / 0.85 / 0.9news-scoring-service.ts
    NEWS_MERIT_SOFT_REJECT0.25puntuación y flujo de promoción
    OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACKsin definirnews-scoring-service.ts
    PAYMENT_NEWS_PROCESSORrecurre a PAYMENT_DEFAULT_PROCESSOR y luego a wayforpaylib/payments/payment.config.ts
    NEWS_PROMOTION_WEBHOOK_SECRETsin definirPATCH /api/news/promotion/submit
    ADMIN_BOT_TOKENsin definirRespuestas a callbacks de Telegram

    Datos

    Las cuatro tablas usan el modelo de documentos JSONB (id, data jsonb, marcas de tiempo) en data/schema.sql (aplanado v4.1.0): news, news_categories, news_likes, news_submission_audit. Cada transición añade una entrada a data.mainPageStatusHistory y escribe una fila en news_submission_audit. data/migrations/002_news_content_schema.sql y 003_news_kingdom_upgrade.sql son históricos. Las instalaciones nuevas solo aplican schema.sql.

    Efectos secundarios de la aprobación

    approveMainPagePublication() fija status: 'published' y visibility: 'site-wide'. En las historias escritas por usuarios, después pone en cola enqueueRewardCreditAddEvent({ trigger: 'newsStoryApproved' }) y lanza generateArticleTranslations(). Los destinatarios en Telegram son usuarios con un rol de administrador de la plataforma y un communication.telegramId.

    Prueba local

    1. 1

      Aplica el esquema y crea un artículo de miembro

      Aplica data/schema.sql e inicia sesión como un usuario con rol member o superior. Crea un artículo en /news/create. Queda marcado con blogUsername y aparece en /{username}/{slug} una vez publicado.

    2. 2

      Envíalo a promoción

      La respuesta incluye status, aiScore y una redirección o los campos de pago para el checkout.

    3. 3

      Simula el pago en dev

    4. 4

      Aprueba

      Pulsa Approve en la tarjeta de Telegram o llama a POST /api/mcp/v1/news/<id>/approve con un token de servicio. Comprueba que mainPageStatus es published_main y que existe una fila en news_submission_audit.

    PaymentConductor

    El checkout que cobra la tarifa de promoción con el procesador que hayas configurado.

    Gestión desde Telegram

    El bot de administración que lleva los botones de aprobación.

    Del blog del miembro a la página principal

    Escenarios típicos

    1. Periódico comunitario. Un clon de ciudad deja que los miembros locales publiquen en sus blogs y cobra una pequeña tarifa por las historias de portada. Los administradores aprueban las mejores en Telegram.
    2. Red de expertos. Un clon profesional mantiene alto el listón del mérito: los artículos sólidos reciben un precio bajo y los débiles quedan fuera por precio.
    3. Centro de campañas moderado. Un clon de un movimiento se apoya en las reglas de bloqueo estricto para que el spam nunca llegue a la cola del administrador.

    Ajustes del operador

    Los precios se fijan en UAH con variables de entorno del servidor. Si no las defines, se aplican estos valores por defecto:

    AjustePor defectoEfecto
    Precio base50 UAHPrecio mínimo para un artículo de mérito alto
    Escala2000 UAHCuánto sube el precio a medida que baja el mérito
    Máximo5000 UAHTope de precio
    Umbral de mérito bajomérito inferior a 0.25El precio sube al menos a 4999 UAH
    Contraoferta del administrador+25%El botón Counter de Telegram fija un nuevo importe que el autor debe pagar
    lib/telegram/admin-bot/news-callback-handler.ts
    app/api/telegram/admin-bot/webhook/route.ts
    Interfaz de promoción para miembrosfeatures/news/components/news-promotion-panel.tsx en /my-news
    Tipos de estado y de camposfeatures/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility)
    Mapeador de filas JSONBlib/news/map-news-document.ts
    Marca y URL absolutaslib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl)

    Rutas

    Método y rutaAutenticaciónFunción
    POST /api/news/promotion/submitSesión, solo el autor del artículoMarca promoteToMainPage, puntúa y abre el checkout
    PATCH /api/news/promotion/submitCabecera x-news-promotion-secretDev o pruebas: marcar como pagado y avisar a los administradores
    POST /api/payments/{wayforpay,stripe,paypal}/webhookFirma del procesadorConfirmación canónica del pago
    POST /api/news/promotion/wayforpay-webhookPayload del procesadorDelegado obsoleto hacia el webhook canónico de WayForPay
    POST /api/mcp/v1/news/[id]/{score,approve,reject,publish}Token de servicio (withMcpGuard)Operaciones de agentes y MCP sobre el mismo flujo

    Reglas de puntuación

    scoreNewsForMainPage() llama a OpenRouter cuando OPENROUTER_API_KEY está definida. Sin clave, mantiene los valores heurísticos por defecto (ethics 0.7, spam 0.2, merit 0.5) y registra model: 'heuristic'.

    • Riesgo de duplicado: 0.95 si otro artículo comparte slug o siteWideSlug. 0.9 si un artículo publicado (entre los primeros 200) tiene el mismo título.
    • Bloqueo estricto: ethics < NEWS_ETHICS_MIN o spamRisk > NEWS_SPAM_MAX o duplicateRisk > NEWS_DUPLICATE_MAX. Resultado: published_blog_only y sin checkout.
    • Precio: clamp(base, max, base + (1 - merit) * scale). Un mérito inferior a NEWS_MERIT_SOFT_REJECT sube el precio al menos a 4999. El mérito bajo no cambia el estado.

    Variables de entorno

    Ninguna de las claves NEWS_* está en env.local.template. El código las lee con estos valores por defecto.

    VariablePor defectoSe lee en
    NEWS_PROMO_BASE_UAH / NEWS_PROMO_SCALE_UAH / NEWS_PROMO_MAX_UAH50 / 2000 / 5000news-scoring-service.ts
    NEWS_ETHICS_MIN / NEWS_SPAM_MAX / NEWS_DUPLICATE_MAX0.35 / 0.85 / 0.9news-scoring-service.ts
    NEWS_MERIT_SOFT_REJECT0.25puntuación y flujo de promoción
    OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACKsin definirnews-scoring-service.ts
    PAYMENT_NEWS_PROCESSORrecurre a PAYMENT_DEFAULT_PROCESSOR y luego a wayforpaylib/payments/payment.config.ts
    NEWS_PROMOTION_WEBHOOK_SECRETsin definirPATCH /api/news/promotion/submit
    ADMIN_BOT_TOKENsin definirRespuestas a callbacks de Telegram

    Datos

    Las cuatro tablas usan el modelo de documentos JSONB (id, data jsonb, marcas de tiempo) en data/schema.sql (aplanado v4.1.0): news, news_categories, news_likes, news_submission_audit. Cada transición añade una entrada a data.mainPageStatusHistory y escribe una fila en news_submission_audit. data/migrations/002_news_content_schema.sql y 003_news_kingdom_upgrade.sql son históricos. Las instalaciones nuevas solo aplican schema.sql.

    Efectos secundarios de la aprobación

    approveMainPagePublication() fija status: 'published' y visibility: 'site-wide'. En las historias escritas por usuarios, después pone en cola enqueueRewardCreditAddEvent({ trigger: 'newsStoryApproved' }) y lanza generateArticleTranslations(). Los destinatarios en Telegram son usuarios con un rol de administrador de la plataforma y un communication.telegramId.

    Prueba local

    1. 1

      Aplica el esquema y crea un artículo de miembro

      Aplica data/schema.sql e inicia sesión como un usuario con rol member o superior. Crea un artículo en /news/create. Queda marcado con blogUsername y aparece en /{username}/{slug} una vez publicado.

    2. 2

      Envíalo a promoción

      La respuesta incluye status, aiScore y una redirección o los campos de pago para el checkout.

    3. 3

      Simula el pago en dev

    4. 4

      Aprueba

      Pulsa Approve en la tarjeta de Telegram o llama a POST /api/mcp/v1/news/<id>/approve con un token de servicio. Comprueba que mainPageStatus es published_main y que existe una fila en news_submission_audit.

    PaymentConductor

    El checkout que cobra la tarifa de promoción con el procesador que hayas configurado.

    Gestión desde Telegram

    El bot de administración que lleva los botones de aprobación.

    Del blog del miembro a la página principal

    Escenarios típicos

    1. Periódico comunitario. Un clon de ciudad deja que los miembros locales publiquen en sus blogs y cobra una pequeña tarifa por las historias de portada. Los administradores aprueban las mejores en Telegram.
    2. Red de expertos. Un clon profesional mantiene alto el listón del mérito: los artículos sólidos reciben un precio bajo y los débiles quedan fuera por precio.
    3. Centro de campañas moderado. Un clon de un movimiento se apoya en las reglas de bloqueo estricto para que el spam nunca llegue a la cola del administrador.

    Ajustes del operador

    Los precios se fijan en UAH con variables de entorno del servidor. Si no las defines, se aplican estos valores por defecto:

    AjustePor defectoEfecto
    Precio base50 UAHPrecio mínimo para un artículo de mérito alto
    Escala2000 UAHCuánto sube el precio a medida que baja el mérito
    Máximo5000 UAHTope de precio
    Umbral de mérito bajomérito inferior a 0.25El precio sube al menos a 4999 UAH
    Contraoferta del administrador+25%El botón Counter de Telegram fija un nuevo importe que el autor debe pagar
    lib/telegram/admin-bot/news-callback-handler.ts
    app/api/telegram/admin-bot/webhook/route.ts
    Interfaz de promoción para miembrosfeatures/news/components/news-promotion-panel.tsx en /my-news
    Tipos de estado y de camposfeatures/news/types/index.ts (MainPageStatus, NewsContentType, NewsVisibility)
    Mapeador de filas JSONBlib/news/map-news-document.ts
    Marca y URL absolutaslib/site-branding.ts (localeBlogArticleUrl, absoluteSiteUrl)

    Rutas

    Método y rutaAutenticaciónFunción
    POST /api/news/promotion/submitSesión, solo el autor del artículoMarca promoteToMainPage, puntúa y abre el checkout
    PATCH /api/news/promotion/submitCabecera x-news-promotion-secretDev o pruebas: marcar como pagado y avisar a los administradores
    POST /api/payments/{wayforpay,stripe,paypal}/webhookFirma del procesadorConfirmación canónica del pago
    POST /api/news/promotion/wayforpay-webhookPayload del procesadorDelegado obsoleto hacia el webhook canónico de WayForPay
    POST /api/mcp/v1/news/[id]/{score,approve,reject,publish}Token de servicio (withMcpGuard)Operaciones de agentes y MCP sobre el mismo flujo

    Reglas de puntuación

    scoreNewsForMainPage() llama a OpenRouter cuando OPENROUTER_API_KEY está definida. Sin clave, mantiene los valores heurísticos por defecto (ethics 0.7, spam 0.2, merit 0.5) y registra model: 'heuristic'.

    • Riesgo de duplicado: 0.95 si otro artículo comparte slug o siteWideSlug. 0.9 si un artículo publicado (entre los primeros 200) tiene el mismo título.
    • Bloqueo estricto: ethics < NEWS_ETHICS_MIN o spamRisk > NEWS_SPAM_MAX o duplicateRisk > NEWS_DUPLICATE_MAX. Resultado: published_blog_only y sin checkout.
    • Precio: clamp(base, max, base + (1 - merit) * scale). Un mérito inferior a NEWS_MERIT_SOFT_REJECT sube el precio al menos a 4999. El mérito bajo no cambia el estado.

    Variables de entorno

    Ninguna de las claves NEWS_* está en env.local.template. El código las lee con estos valores por defecto.

    VariablePor defectoSe lee en
    NEWS_PROMO_BASE_UAH / NEWS_PROMO_SCALE_UAH / NEWS_PROMO_MAX_UAH50 / 2000 / 5000news-scoring-service.ts
    NEWS_ETHICS_MIN / NEWS_SPAM_MAX / NEWS_DUPLICATE_MAX0.35 / 0.85 / 0.9news-scoring-service.ts
    NEWS_MERIT_SOFT_REJECT0.25puntuación y flujo de promoción
    OPENROUTER_API_KEY, OPENROUTER_MODEL_PRIMARY, OPENROUTER_MODEL_FALLBACKsin definirnews-scoring-service.ts
    PAYMENT_NEWS_PROCESSORrecurre a PAYMENT_DEFAULT_PROCESSOR y luego a wayforpaylib/payments/payment.config.ts
    NEWS_PROMOTION_WEBHOOK_SECRETsin definirPATCH /api/news/promotion/submit
    ADMIN_BOT_TOKENsin definirRespuestas a callbacks de Telegram

    Datos

    Las cuatro tablas usan el modelo de documentos JSONB (id, data jsonb, marcas de tiempo) en data/schema.sql (aplanado v4.1.0): news, news_categories, news_likes, news_submission_audit. Cada transición añade una entrada a data.mainPageStatusHistory y escribe una fila en news_submission_audit. data/migrations/002_news_content_schema.sql y 003_news_kingdom_upgrade.sql son históricos. Las instalaciones nuevas solo aplican schema.sql.

    Efectos secundarios de la aprobación

    approveMainPagePublication() fija status: 'published' y visibility: 'site-wide'. En las historias escritas por usuarios, después pone en cola enqueueRewardCreditAddEvent({ trigger: 'newsStoryApproved' }) y lanza generateArticleTranslations(). Los destinatarios en Telegram son usuarios con un rol de administrador de la plataforma y un communication.telegramId.

    Prueba local

    1. 1

      Aplica el esquema y crea un artículo de miembro

      Aplica data/schema.sql e inicia sesión como un usuario con rol member o superior. Crea un artículo en /news/create. Queda marcado con blogUsername y aparece en /{username}/{slug} una vez publicado.

    2. 2

      Envíalo a promoción

      La respuesta incluye status, aiScore y una redirección o los campos de pago para el checkout.

    3. 3

      Simula el pago en dev

    4. 4

      Aprueba

      Pulsa Approve en la tarjeta de Telegram o llama a POST /api/mcp/v1/news/<id>/approve con un token de servicio. Comprueba que mainPageStatus es published_main y que existe una fila en news_submission_audit.