SmsKeywordService - el escritor para palabras clave entrante (MS1 Task 3)

FeatureVOIPService
Se descapó
27 de agosto de 2026 a las 20:06 UTC
Autor
Kamo
Compromit
4260460

Cierra la tarea 2 de TODO que quedó atrás. Hasta que esto se comprometa un TPOP entrante verificado llegó a BulkTextInboundControlor, fue reconocido, fue registrado, y entonces DROPPED - el endpoint aceptó opt-outs y no suprimió nada. SmsKeywordService es el escritor único: añade el WORM ConsentRecord y Actualiza la fila de AgentContactState la puerta de salida ya lee, en una transacción (plan de la Decisión M2 - libro mayor plus proyección derivada, no dos fuentes de la verdad; MS2 hace que la puerta lea ConsentRecord directamente, después de lo cual el proyección se convierte en un caché). Orden: normalizar o rechazar; interpretar; insertar el recibo de idempotencia; entonces STOP / START / HELP. UNKNOWN vuelve inmediatamente y no escribe nada, así que un El mensaje ordinario cae a la hora de un manejo normal. Decisiones que vale la pena discutir con más tarde. * Escribe AgentContactState directamente en lugar de llamar a AIService. **************** ya está expuesto en POST **************** y todavía es inutilizable desde aquí para tres razones independientes: VOIPService no tiene cliente a AIService; AIService autentica esa superficie con un secreto DIFERENTE ************* no interno.auth.secret); y el punto final no acepta desnudo E.164, sólo **************** y un desnudo El número es exactamente lo que es un STOP entrante. * La tecla de contacto es "tel:E164". AGENT-CONTACT-STATE es único en (ORGANIZATION-ID, CONTACT-KEY) y no tiene columna telefónica, por lo que no hay ninguna parte De lo contrario un número desnudo puede ir. CONSEQUENCIA, NO CIERRA POR MS1: esta fila no fusionarse con una fila posterior de "líder: úid" para el mismo humano, así que una consulta de puerta La fila con llave de plomo no ve opción. MS2 lo cierra haciendo leer la puerta ConsentRecord, que está en clave. * Un STOP desnudo establece los cuatro canales. No dice "sólo SMS", y leyéndolo De esa manera deja al inquilino enviando un correo electrónico a alguien que les dijo que se detuvieran. El comienzo Re-subsor a SMS SOLO - un START enviado a un número de campaña es evidencia sobre SMS y nada más. * Un null org registra el recibo y NOSOTROS más. Sin fila de consentimiento, no. proyección: una Consensoria con una organización nula es la supresión global postura C1 prohíbe, y **************** es nulo = falso de todos modos. La evidencia de que un STOP llegó todavía late el silencio de hoy. * consentedAt prefiere el tiempo de eventos y los registros del transportista que se utilizó. El webhook entrante de Twilio lleva NO marcar ningún momento, por lo que la entidad javadoc's "app-set from the event, nunca ahora&rd...no es satisfactorio para ello. Flowroute lo hace enviar "timestamp", por lo que InboundSms ganó un componente de "carrierEventAt" y el Flowroute parser lo lee (Instant / OffsetDateTime / desnudo local, normalizado a UTC; cualquier cosa ilegible es nula, nunca una conjetura). La prueba de la fila de consentimientoBlob lleva "consentedAtSource": "carrier" . "receipt". El tiempo de recepción es defensible y inventado no lo es; los dos son indistinguibles Después es lo que no sobreviviría a la revisión. * handle() toma un registro, no los seis parámetros de posición del plan. El plan la firma no podía llevar el tiempo de recibo, la hora del evento transportista o la cruda carga útil a prueba, y cuatro de sus parámetros eran adyacentes Strings. Re y A compila silenciosamente y suprime el propio número del inquilino. VOIPServiceApplication ganancias ************* **************** no necesita ninguna entrada: basePaquetes coincide sub-packages y com.kamo.z.shared.comms ya está listado. VoipRepositoryScanTest conduce JpaRepositorios de Spring DataRegistrar sobre la misma lista de paquetes y afirma que los tres repositorios SmsKeywordService inyectan obtener definiciones de frijol. Una bota completa de "SpringBootTest" NO está disponible en este servicio. sin recursos de prueba, ninguna prueba de contexto existente - por lo que esto ejerce el registrador que en realidad decide el resultado, sin una fuente de datos. TDD observó fallas, literalmente. Rojo antes de la implementación: [ERROR] SmsKeywordServiceTest.java no puede encontrar símbolo [ERROR] símbolo: clase SmsKeywordService [ERROR] símbolo: clase ención deKeywordEvento [ERROR] ubicación: clase **************** [INFO] BUILD FAILURE [ERROR] ************* no puede encontrar símbolo [ERROR] símbolo: método portadorEventAt() Green after: SmsKeywordServiceTest 17/17; Full suite 314/314. Mutation 1 - retiró el org del ConsentenciaRecorde: [ERROR] Pruebas ejecutadas: 17, Fallos: 2, Errores: 0 . FAILURA . espera: 100 L pero fue: null [ERROR] **************** [una fila de consentimiento con una supresión global de org EI . La postura C1 prohíbe] [ERROR] **************** Mutación 2 y retirada el recibo de inserción: [ERROR] Pruebas ejecutadas: 17, Fallos: 3, Errores: 0 . FAILURA. Se buscaba pero no se invocaba: [ERROR] **************** [ERROR] **************** [ERROR] **************** NOTA: el plan dice que esta mutación debe poner rojo la prueba de RETRY. No lo hace. **************** stubs la existencia() pre--check a true, así que se enciende cortocircuita antes del inserto y permanece GREEN bajo esta mutación. El plan nombró la prueba equivocada. Mutación 2b de abajo es la que cubre el reintestro ruta, y sin ejecutarlo la reclamación de idempotencia M1 habría descansado en un mutación que prueba algo más. Mutación 2b. eliminado el pre-chequeo existente en su lugar: [ERROR] Pruebas ejecutadas: 17, Fallos: 2, Errores: 0 . FAILURA . ******************* Nunca quisí aquí: [ERROR] **************** [ERROR] **************** Mutation 3 optó por SMS sólo en lugar de los cuatro canales: [ERROR] Pruebas de ejecución: 17, Fallos: 1, Errores: 0 . . . . . . . . . . . . . . . . . . . . . . . Esperar que el valor sea verdad pero era falso [ERROR] **************** Mutación 4 . . . . . . . . . . . . . . . . . . . . . paquetes, es decir, el CrashLoop mismo: [ERROR] Pruebas de ejecución: 3, Fallos: 2, Errores: 0 . FAILURE. [ERROR] **************** [ConsentenciaRecordRepository no tiene definición de frijol. ************* no está cubierto por los archivos de la mano de pudieran. Esto no es un plazo de ejecución nulo: el contexto REFUSES A START y la cápsula CrashLoops.] [ERROR] **************** [La sonda de esta prueba se ha desviado de la anotación real de VOIPServiceApplication] Todo revirtió. Suite completa después de la reversión: Pruebas de ejecución: 314, Fallos: 0, Errores: 0. DDL NO LANDED. Esto depende de la adición de la biblioteca compartida de kamo. comms.sms.inbound.receipt y ********** ninguno de los cuales existe en la base de datos. Construido localmente contra un tarro de lib compartida en un PRIVATE -Dmaven.repo.local; el frasco de 1,6.0 de á/.m2 fue verificado byte-idicid antes y después (md5 *************

Todos los cambios

Como lo que ves enviaste?

Cada una de estas actualizaciones aterriza en su espacio de trabajo automáticamente. Empieza gratis y verlo crecer semana tras semana.

Arranzar gratis para siempreVer Precios