- Shipped
- October 15, 2026 at 4:49 AM UTC
- Author
- Kamo
- Commit
- e653f74
Owner 2026-10-15: one company-wide do-not-contact list per organization, scoped per channel ("Only that channel"). - DDL **************** (DO_NOT_CONTACT, DO_NOT_CONTACT_EVENT append-only for kamo_app, DO_NOT_CONTACT_SETTINGS), applied 2026-10-15 04:35Z. - DoNotContactBeans declares shared-lib's DoNotContactList (repositories already inside the com.kamo.z.shared.comms scan; VoipRepositoryScanTest pins them). - /api/voip/do-not-contact (MANAGE_VOIP_SETTINGS): list/search, add, import (up to 1000 lines), POST /{id}/remove with a required reason, history, activity, settings (call mode WARN | BLOCK, default WARN). GET /check needs only the session: what the softphone and the mobile app ask before dialling ({listed, recordedAt, source, mode, message: "{number} asked not to be called on {date}."}). - Lookup for other services: GET **************** ?orgId=&channel=&address= (KAMOAI_INTERNAL_SECRET); a service with the shared-lib scan calls **************** channel, address). - Texts: SmsGateway refuses a number listed for SMS with OPTED_OUT (never retried) for every sender, a person's or an SI's sms_send; the HELP reply is exempt (Attempt.keywordReply). Bulk /send and /test-send refuse it with 409. Transactional template and internal sends keep their existing rules. - STOP lists the number for texts (source SMS_STOP); START/UNSTOP takes it off for texts only (SMS_START, reason "Texted START"). The STOP projection on AGENT_CONTACT_STATE now sets texts only: email, chat and social keep their own opt-outs (owner: a STOP text blocks texts only). Tests: DoNotContactControllerTest, SmsGatewayTest, SmsKeywordServiceTest, **************** VoipRepositoryScanTest (RED on origin/main, GREEN here), VoipMessageServiceKeywordTest, InternalAuthFilterKamoaiTest.
