feat(routes): expand chatwoot parity coverage

This commit is contained in:
2026-06-04 21:07:48 +08:00
parent 4c7ed4f5c3
commit de6a05e0e6
7 changed files with 512 additions and 28 deletions
+119 -1
View File
@@ -177,6 +177,124 @@ var criticalRoutes = []route{
{Method: "GET", Path: "/api/v1/accounts/:account_id/agent_capacity_policies/", Controller: "api/v1/accounts/agent_capacity_policies#index", Source: "routes.rb:123"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/csat_survey_responses/", Controller: "api/v1/accounts/csat_survey_responses#index", Source: "routes.rb:219"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/csat_survey_responses/metrics", Controller: "api/v1/accounts/csat_survey_responses#metrics", Source: "routes.rb:221"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/preferences/", Controller: "api/v1/accounts/captain/preferences#show", Source: "routes.rb:63"},
{Method: "PUT", Path: "/api/v1/accounts/:account_id/captain/preferences/", Controller: "api/v1/accounts/captain/preferences#update", Source: "routes.rb:63"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/", Controller: "api/v1/accounts/captain/assistants#index", Source: "routes.rb:64"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/assistants/", Controller: "api/v1/accounts/captain/assistants#create", Source: "routes.rb:64"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id", Controller: "api/v1/accounts/captain/assistants#show", Source: "routes.rb:64"},
{Method: "PUT", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id", Controller: "api/v1/accounts/captain/assistants#update", Source: "routes.rb:64"},
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id", Controller: "api/v1/accounts/captain/assistants#destroy", Source: "routes.rb:64"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/playground", Controller: "api/v1/accounts/captain/assistants#playground", Source: "routes.rb:66"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/tools", Controller: "api/v1/accounts/captain/assistants#tools", Source: "routes.rb:69"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/inboxes", Controller: "api/v1/accounts/captain/assistants/inboxes#index", Source: "routes.rb:71"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/inboxes", Controller: "api/v1/accounts/captain/assistants/inboxes#create", Source: "routes.rb:71"},
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/inboxes/:inbox_id", Controller: "api/v1/accounts/captain/assistants/inboxes#destroy", Source: "routes.rb:71"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/", Controller: "api/v1/accounts/captain/assistants/scenarios#index", Source: "routes.rb:72"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/", Controller: "api/v1/accounts/captain/assistants/scenarios#create", Source: "routes.rb:72"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/:scenario_id", Controller: "api/v1/accounts/captain/assistants/scenarios#show", Source: "routes.rb:72"},
{Method: "PUT", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/:scenario_id", Controller: "api/v1/accounts/captain/assistants/scenarios#update", Source: "routes.rb:72"},
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/assistants/:assistant_id/scenarios/:scenario_id", Controller: "api/v1/accounts/captain/assistants/scenarios#destroy", Source: "routes.rb:72"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistant_responses/", Controller: "api/v1/accounts/captain/assistant_responses#index", Source: "routes.rb:74"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/assistant_responses/", Controller: "api/v1/accounts/captain/assistant_responses#create", Source: "routes.rb:74"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/assistant_responses/:response_id", Controller: "api/v1/accounts/captain/assistant_responses#show", Source: "routes.rb:74"},
{Method: "PUT", Path: "/api/v1/accounts/:account_id/captain/assistant_responses/:response_id", Controller: "api/v1/accounts/captain/assistant_responses#update", Source: "routes.rb:74"},
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/assistant_responses/:response_id", Controller: "api/v1/accounts/captain/assistant_responses#destroy", Source: "routes.rb:74"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/bulk_actions/", Controller: "api/v1/accounts/captain/bulk_actions#create", Source: "routes.rb:75"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/copilot_threads/", Controller: "api/v1/accounts/captain/copilot_threads#index", Source: "routes.rb:76"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/copilot_threads/", Controller: "api/v1/accounts/captain/copilot_threads#create", Source: "routes.rb:76"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/copilot_threads/:thread_id/copilot_messages/", Controller: "api/v1/accounts/captain/copilot_messages#index", Source: "routes.rb:77"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/copilot_threads/:thread_id/copilot_messages/", Controller: "api/v1/accounts/captain/copilot_messages#create", Source: "routes.rb:77"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/custom_tools/", Controller: "api/v1/accounts/captain/custom_tools#index", Source: "routes.rb:79"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/custom_tools/", Controller: "api/v1/accounts/captain/custom_tools#create", Source: "routes.rb:79"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/custom_tools/:tool_id", Controller: "api/v1/accounts/captain/custom_tools#show", Source: "routes.rb:79"},
{Method: "PUT", Path: "/api/v1/accounts/:account_id/captain/custom_tools/:tool_id", Controller: "api/v1/accounts/captain/custom_tools#update", Source: "routes.rb:79"},
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/custom_tools/:tool_id", Controller: "api/v1/accounts/captain/custom_tools#destroy", Source: "routes.rb:79"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/custom_tools/test", Controller: "api/v1/accounts/captain/custom_tools#test", Source: "routes.rb:80"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/documents/", Controller: "api/v1/accounts/captain/documents#index", Source: "routes.rb:82"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/documents/", Controller: "api/v1/accounts/captain/documents#create", Source: "routes.rb:82"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/captain/documents/:document_id", Controller: "api/v1/accounts/captain/documents#show", Source: "routes.rb:82"},
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/captain/documents/:document_id", Controller: "api/v1/accounts/captain/documents#destroy", Source: "routes.rb:82"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/documents/:document_id/sync", Controller: "api/v1/accounts/captain/documents#sync", Source: "routes.rb:83"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/tasks/rewrite", Controller: "api/v1/accounts/captain/tasks#rewrite", Source: "routes.rb:86"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/tasks/summarize", Controller: "api/v1/accounts/captain/tasks#summarize", Source: "routes.rb:87"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/tasks/reply_suggestion", Controller: "api/v1/accounts/captain/tasks#reply_suggestion", Source: "routes.rb:88"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/tasks/label_suggestion", Controller: "api/v1/accounts/captain/tasks#label_suggestion", Source: "routes.rb:89"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/captain/tasks/follow_up", Controller: "api/v1/accounts/captain/tasks#follow_up", Source: "routes.rb:90"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/assignment_policies/", Controller: "api/v1/accounts/assignment_policies#index", Source: "routes.rb:306"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/assignment_policies/", Controller: "api/v1/accounts/assignment_policies#create", Source: "routes.rb:306"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id", Controller: "api/v1/accounts/assignment_policies#show", Source: "routes.rb:306"},
{Method: "PUT", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id", Controller: "api/v1/accounts/assignment_policies#update", Source: "routes.rb:306"},
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id", Controller: "api/v1/accounts/assignment_policies#destroy", Source: "routes.rb:306"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id/inboxes", Controller: "api/v1/accounts/assignment_policies/inboxes#index", Source: "routes.rb:307"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id/inboxes", Controller: "api/v1/accounts/assignment_policies/inboxes#create", Source: "routes.rb:307"},
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/assignment_policies/:policy_id/inboxes/:inbox_id", Controller: "api/v1/accounts/assignment_policies/inboxes#destroy", Source: "routes.rb:307"},
{Method: "GET", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/assignment_policy/", Controller: "api/v1/accounts/inboxes/assignment_policy#show", Source: "routes.rb:311"},
{Method: "POST", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/assignment_policy/", Controller: "api/v1/accounts/inboxes/assignment_policy#create", Source: "routes.rb:311"},
{Method: "DELETE", Path: "/api/v1/accounts/:account_id/inboxes/:inbox_id/assignment_policy/", Controller: "api/v1/accounts/inboxes/assignment_policy#destroy", Source: "routes.rb:311"},
{Method: "POST", Path: "/api/v1/widget/direct_uploads", Controller: "api/v1/widget/direct_uploads#create", Source: "routes.rb:443"},
{Method: "POST", Path: "/api/v1/widget/config", Controller: "api/v1/widget/config#create", Source: "routes.rb:444"},
{Method: "GET", Path: "/api/v1/widget/campaigns", Controller: "api/v1/widget/campaigns#index", Source: "routes.rb:445"},
{Method: "POST", Path: "/api/v1/widget/events", Controller: "api/v1/widget/events#create", Source: "routes.rb:446"},
{Method: "GET", Path: "/api/v1/widget/messages", Controller: "api/v1/widget/messages#index", Source: "routes.rb:447"},
{Method: "POST", Path: "/api/v1/widget/messages", Controller: "api/v1/widget/messages#create", Source: "routes.rb:447"},
{Method: "PUT", Path: "/api/v1/widget/messages/:message_id", Controller: "api/v1/widget/messages#update", Source: "routes.rb:447"},
{Method: "GET", Path: "/api/v1/widget/conversations", Controller: "api/v1/widget/conversations#index", Source: "routes.rb:448"},
{Method: "POST", Path: "/api/v1/widget/conversations", Controller: "api/v1/widget/conversations#create", Source: "routes.rb:448"},
{Method: "POST", Path: "/api/v1/widget/conversations/destroy_custom_attributes", Controller: "api/v1/widget/conversations#destroy_custom_attributes", Source: "routes.rb:450"},
{Method: "POST", Path: "/api/v1/widget/conversations/set_custom_attributes", Controller: "api/v1/widget/conversations#set_custom_attributes", Source: "routes.rb:451"},
{Method: "POST", Path: "/api/v1/widget/conversations/update_last_seen", Controller: "api/v1/widget/conversations#update_last_seen", Source: "routes.rb:452"},
{Method: "POST", Path: "/api/v1/widget/conversations/toggle_typing", Controller: "api/v1/widget/conversations#toggle_typing", Source: "routes.rb:453"},
{Method: "POST", Path: "/api/v1/widget/conversations/transcript", Controller: "api/v1/widget/conversations#transcript", Source: "routes.rb:454"},
{Method: "GET", Path: "/api/v1/widget/conversations/toggle_status", Controller: "api/v1/widget/conversations#toggle_status", Source: "routes.rb:455"},
{Method: "GET", Path: "/api/v1/widget/contact", Controller: "api/v1/widget/contact#show", Source: "routes.rb:458"},
{Method: "PUT", Path: "/api/v1/widget/contact", Controller: "api/v1/widget/contact#update", Source: "routes.rb:458"},
{Method: "POST", Path: "/api/v1/widget/contact/destroy_custom_attributes", Controller: "api/v1/widget/contact#destroy_custom_attributes", Source: "routes.rb:460"},
{Method: "PATCH", Path: "/api/v1/widget/contact/set_user", Controller: "api/v1/widget/contact#set_user", Source: "routes.rb:461"},
{Method: "GET", Path: "/api/v1/widget/inbox_members", Controller: "api/v1/widget/inbox_members#index", Source: "routes.rb:463"},
{Method: "POST", Path: "/api/v1/widget/labels", Controller: "api/v1/widget/labels#create", Source: "routes.rb:464"},
{Method: "DELETE", Path: "/api/v1/widget/labels/:label_id", Controller: "api/v1/widget/labels#destroy", Source: "routes.rb:464"},
{Method: "POST", Path: "/api/v1/widget/integrations/dyte/add_participant_to_meeting", Controller: "api/v1/widget/integrations/dyte#add_participant_to_meeting", Source: "routes.rb:469"},
{Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts", Controller: "public/api/v1/inboxes/contacts#create", Source: "routes.rb:572"},
{Method: "GET", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id", Controller: "public/api/v1/inboxes/contacts#show", Source: "routes.rb:572"},
{Method: "PUT", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id", Controller: "public/api/v1/inboxes/contacts#update", Source: "routes.rb:572"},
{Method: "GET", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations", Controller: "public/api/v1/inboxes/conversations#index", Source: "routes.rb:573"},
{Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations", Controller: "public/api/v1/inboxes/conversations#create", Source: "routes.rb:573"},
{Method: "GET", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id", Controller: "public/api/v1/inboxes/conversations#show", Source: "routes.rb:573"},
{Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/toggle_status", Controller: "public/api/v1/inboxes/conversations#toggle_status", Source: "routes.rb:575"},
{Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/toggle_typing", Controller: "public/api/v1/inboxes/conversations#toggle_typing", Source: "routes.rb:576"},
{Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/update_last_seen", Controller: "public/api/v1/inboxes/conversations#update_last_seen", Source: "routes.rb:577"},
{Method: "GET", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/messages", Controller: "public/api/v1/inboxes/messages#index", Source: "routes.rb:580"},
{Method: "POST", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/messages", Controller: "public/api/v1/inboxes/messages#create", Source: "routes.rb:580"},
{Method: "PUT", Path: "/public/api/v1/inboxes/:inbox_id/contacts/:contact_id/conversations/:conversation_id/messages/:message_id", Controller: "public/api/v1/inboxes/messages#update", Source: "routes.rb:580"},
{Method: "GET", Path: "/public/api/v1/csat_survey/:id", Controller: "public/api/v1/csat_survey#show", Source: "routes.rb:585"},
{Method: "PUT", Path: "/public/api/v1/csat_survey/:id", Controller: "public/api/v1/csat_survey#update", Source: "routes.rb:585"},
{Method: "POST", Path: "/api/v2/accounts/", Controller: "api/v2/accounts#create", Source: "routes.rb:478"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/summary_reports/agent", Controller: "api/v2/accounts/summary_reports#agent", Source: "routes.rb:481"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/summary_reports/team", Controller: "api/v2/accounts/summary_reports#team", Source: "routes.rb:482"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/summary_reports/inbox", Controller: "api/v2/accounts/summary_reports#inbox", Source: "routes.rb:483"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/summary_reports/label", Controller: "api/v2/accounts/summary_reports#label", Source: "routes.rb:484"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/summary_reports/channel", Controller: "api/v2/accounts/summary_reports#channel", Source: "routes.rb:485"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports", Controller: "api/v2/accounts/reports#index", Source: "routes.rb:488"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/summary", Controller: "api/v2/accounts/reports#summary", Source: "routes.rb:491"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/bot_summary", Controller: "api/v2/accounts/reports#bot_summary", Source: "routes.rb:492"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/agents", Controller: "api/v2/accounts/reports#agents", Source: "routes.rb:493"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/inboxes", Controller: "api/v2/accounts/reports#inboxes", Source: "routes.rb:494"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/labels", Controller: "api/v2/accounts/reports#labels", Source: "routes.rb:495"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/teams", Controller: "api/v2/accounts/reports#teams", Source: "routes.rb:496"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/conversations", Controller: "api/v2/accounts/reports#conversations", Source: "routes.rb:497"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/conversations_summary", Controller: "api/v2/accounts/reports#conversations_summary", Source: "routes.rb:498"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/conversation_traffic", Controller: "api/v2/accounts/reports#conversation_traffic", Source: "routes.rb:499"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/bot_metrics", Controller: "api/v2/accounts/reports#bot_metrics", Source: "routes.rb:500"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/inbox_label_matrix", Controller: "api/v2/accounts/reports#inbox_label_matrix", Source: "routes.rb:501"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/first_response_time_distribution", Controller: "api/v2/accounts/reports#first_response_time_distribution", Source: "routes.rb:502"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/reports/outgoing_messages_count", Controller: "api/v2/accounts/reports#outgoing_messages_count", Source: "routes.rb:503"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/live_reports/conversation_metrics", Controller: "api/v2/accounts/live_reports#conversation_metrics", Source: "routes.rb:508"},
{Method: "GET", Path: "/api/v2/accounts/:account_id/live_reports/grouped_conversation_metrics", Controller: "api/v2/accounts/live_reports#grouped_conversation_metrics", Source: "routes.rb:509"},
}
func main() {
@@ -284,7 +402,7 @@ func writeParity(path string, gochatPath string, chatwootPath string, gochatRout
b.WriteString("Generated from:\n\n")
b.WriteString("- GoChat route dump: `" + gochatPath + "`\n")
b.WriteString("- Chatwoot route source: `" + chatwootPath + "`\n\n")
b.WriteString("This report covers tracked frontend-critical API v1 account routes from `reference/chatwoot/config/routes.rb`. Ruby is not installed in the workspace, so Chatwoot routes are sourced from static route declarations instead of `bin/rails routes`.\n\n")
b.WriteString("This report covers tracked frontend-critical Chatwoot routes from `reference/chatwoot/config/routes.rb`, including API v1 account routes, Captain/Copilot, assignment policies, widget/public APIs, and API v2 reports. Ruby is not installed in the workspace, so Chatwoot routes are sourced from static route declarations instead of `bin/rails routes`.\n\n")
b.WriteString(fmt.Sprintf("Summary: %d exact, %d method-compatible, %d parameter-compatible, %d missing out of %d tracked critical routes.\n\n", len(exact), len(methodCompatible), len(compatible), len(missing), len(criticalRoutes)))
b.WriteString("## Missing Critical Routes\n\n")