feat(admin): add CampaignType to campaign + Call table - #194
Conversation
sukhada
commented
Jun 4, 2026
- Add CampaignType (SMS or CALL) to campaign
- Add new Call table
- Rename texter -> volunteer in admin UI
|
@sukhada i think rather than overloading (in both the inheritance and performance sense potentially) the current tables, it might make sense to create separate ones for the dialer that only include the columns relevant for dialer (ex. From previous analysis, the current tables aren't even well optimized for texting workloads, so I'd hesitate to extend them to cover dialer as well. In my mind the ideal would eventually be something like: This also helps avoid weird possible states (ex. what happens if a dialer campaign accidentally gets set to But to avoid extra changes to texting campaigns at this point, and because the dialer data structure could be somewhat fluid for a bit, I think leaving the existing tables alone for now and putting everything dialer related into their own tables might be a happy medium. Lmk what you think! *edit: Edited this comment to reflect this is more of a concern with using |
ajohn25
left a comment
There was a problem hiding this comment.
Reviewing non campaign_contact related things for now!
ajohn25
left a comment
There was a problem hiding this comment.
Required: Will need to run update-dump.sh to update schema-dump.sql
| * @returns { Promise<void> } | ||
| */ | ||
| exports.up = async function up(knex) { | ||
| await knex.schema.createTable("dialer_question_response", (table) => { |
There was a problem hiding this comment.
Question: Intentional decision to skip the "all responses in larger table" all_question_response, "current responses in view" question_response pattern? I think if we're committing to dialer survey answers not being editable this makes sense, but if we do want to leave the door open for that, might need to do similar
110a0b3 to
4243fe2
Compare
| // queries. The composite (contact_id, status) index also covers the NOT EXISTS | ||
| // subqueries that filter callable contacts by active/terminal call status. |
There was a problem hiding this comment.
Question: AKA we could later use this to distinguish btwn calls that are picked up and aren't to mark second passes right?
There was a problem hiding this comment.
yeah although I think we could just filter calls with the status NO_ANSWER for that as well!
* feat(dialer): volunteer caller backend (Design-B call tracking)
Backend for the volunteer dialer, stacked on dialer-campaign-type:
- GraphQL schema, resolvers, and Telnyx WebRTC token route
- dialer lib: shift assignment, contact-hours-aware serving, atomic
call_status claim, disposition + attempt tracking
- forward migrations (campaign-type's create migrations left untouched):
- 000009: drop call_campaigns_no_autoassign (call campaigns use autoassign
for shifts)
- 000010: add call_status/attempt_count/last_attempted_at to
dialer_campaign_contact and disposition to dialer_call
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* chore(dialer): address feedback
* feat(dialer): volunteer caller frontend (Telnyx WebRTC UI) (#207)
* chore(tool-versions): update node version (#195)
* feat(dialer): volunteer caller frontend (Telnyx WebRTC UI)
Frontend for the volunteer dialer, stacked on dialer-backend:
- VolunteerDialer container: WebRTC call controls, timer, status bar,
disposition form, contact flow
- TexterTodoList: call-shift request entry point (CallRequest) and
call-aware assignment summary
- AdminCampaignStats: call-campaign stat tweaks
- dialer GraphQL operations (hooks) and @telnyx/webrtc dependency
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
* feat(dialer): add canned responses + tags to calling (#208)
* feat(dialer): add canned responses + tags to calling
* feat(dialer): allow releasing calls (#209)
* feat(dialer): allow releasing calls
* feat(dialer): add texting history to call screen (#210)
* feat(dialer): add texting history to call screen
* chore: update seeds to not use logger.info
* chore(dialer): fix variable interpolation in script
---------
Co-authored-by: Aashish John <aashishjohn25@gmail.com>
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
---------
Co-authored-by: Claude Opus 4.8 <noreply@anthropic.com>
Co-authored-by: Aashish John <aashishjohn25@gmail.com>