Skip to content

feat(commcare): lookup_table get + create atoms#390

Merged
jjackson merged 1 commit into
mainfrom
emdash/ocs-vw0t6
May 22, 2026
Merged

feat(commcare): lookup_table get + create atoms#390
jjackson merged 1 commit into
mainfrom
emdash/ocs-vw0t6

Conversation

@jjackson
Copy link
Copy Markdown
Owner

Summary

First 2/14 of the REST-clean `commcare_*` atom batch (task #4). Both verified end-to-end against `connect-ace-prod` (round-trip: get→404, create, get→returns).

  • `commcare_get_lookup_table` — finds table by `tag` via list-filter
  • `commcare_create_lookup_table` — POST with full LookupTable schema

Auth model change

`LookupTableResource` requires API-key auth (no `allow_session_auth`). Other Tastypie resources (`application`, `case`) accept session — different per-resource. To handle both:

  • Extended `CommCareBackendOptions` with optional `hqUsername` + `hqApiKey`
  • New private `apiKeyAuthHeader()` helper builds `ApiKey :`
  • Atoms that need API key throw typed errors when creds missing
  • Server bootstrap reads from `ACE_HQ_USERNAME` + `ACE_HQ_API_KEY`

Tested on

  • ✅ `connect-ace-prod` (Pro Edition) — full round-trip works
  • ❌ `ace-interviews-master` — still blocked on accounts@ Pro provisioning (LOOKUP_TABLES privilege)

Test plan

  • `npx tsx scripts/probe-commcare-lookup-table.ts --domain connect-ace-prod --table ace-interviews-probe-table --commit` — round-trip works
  • Re-verify on `ace-interviews-master` once Pro lands

🤖 Generated with Claude Code

First two atoms in the REST-clean commcare_* atom matrix. Both verified
end-to-end against connect-ace-prod (round-trip: get→404, create, get→
returns the same fields back).

  - commcare_get_lookup_table: GET /a/<domain>/api/v0.5/lookup_table/,
    finds the table whose `tag` matches, normalizes to {id, tag,
    is_global, fields, item_attributes}. Returns {table: null} if no
    match — used by verifier to grade "interview_schedule exists".

  - commcare_create_lookup_table: POST /a/<domain>/api/v0.5/lookup_table/
    with the LookupTable schema. Returns new UUID hex id. Used by the
    domain-bootstrap skill to create the interview_schedule table for
    the cohort flow.

Both endpoints require API-key auth (Tastypie LookupTableResource sets
`RequirePermissionAuthentication(edit_apps)` WITHOUT allow_session_auth,
unlike `application` and `case` which permit sessions). Extended
CommCareBackendOptions with optional `hqUsername` + `hqApiKey`; new
private helper `apiKeyAuthHeader()` builds the `ApiKey
<username>:<key>` value. Server bootstrap reads from ACE_HQ_USERNAME +
ACE_HQ_API_KEY env. Atoms that need API key but don't have it throw a
typed error pointing at /ace:doctor.

Atom code verified against /tmp/ace-refs/hq/corehq/apps/fixtures/
resources/v0_1.py:111-244 — fields, request body shape, and the
`tag already exists` BadRequest case.

Cannot yet round-trip on ace-interviews-master itself because Pro
Edition (LOOKUP_TABLES privilege) hasn't been provisioned yet
(accounts@ email out, awaiting response). Tested on connect-ace-prod
where ACE already has the privilege — proves atom correctness without
blocking on subscription.

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
@jjackson jjackson enabled auto-merge May 22, 2026 00:22
@jjackson jjackson merged commit c008369 into main May 22, 2026
2 checks passed
jjackson added a commit that referenced this pull request May 22, 2026
Continues the REST commcare atom batch. All verified end-to-end against
connect-ace-prod.

  - commcare_get_lookup_table_rows: GETs all rows in domain and
    filters by data_type_id. Flattens fields to {col: first-value}.
  - commcare_lookup_table_append_rows: POSTs one row per call (Tastypie
    doesn't support list POST for this resource). Round-trip verified
    by appending 3 interview_schedule rows.
  - commcare_list_users: GET /a/<domain>/api/v0.5/user/ with pagination
    and optional group filter. Returns each user's id, username, basic
    profile, and full user_data.
  - commcare_get_user: GET single user by couch id.
  - commcare_update_user_field: GET → mutate user_data → PUT. V0_5
    resource doesn't expose PATCH so we PUT the merged user_data dict.
    Pass value=null to clear.

All five atoms use the new API-key auth pattern (introduced in PR #390).

Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant