Skip to content

Epic: List schema / columns (DSL) — no longer API-blocked #16

Description

@Adron

Summary

Lists on interlinedlist.com are structured data with typed columns. The Windows app treats every row as a freeform JSON blob (Views/ListsView.xaml has an inline JSON editor), because CLAUDE.md records the schema DSL as "only partially reverse engineered ... not implemented".

That blocker is stale. The DSL is now fully published at /help/api/lists-dsl, and both endpoints answer the bearer sync-token.

Live verification (2026-09-15, test account)

GET /api/lists/{id}/schema  ->  200  {"data":{"name":"New list","fields":[]}}

The contract

  • GET /api/lists/{id}/schema — read the schema as DSL.
  • PUT /api/lists/{id}/schema — two body shapes, selected by payload:
    • a schema DSL object → destructive rebuild (wipes and recreates all columns);
    • a properties array → non-destructive small edits (rename a label, add/remove one column) preserving row data.
  • POST /api/lists also accepts schema at create time.

The DSL

{ "name": "Books to Read", "description": "My reading backlog.",
  "fields": [
    { "key": "title",  "type": "text",    "label": "Title", "required": true },
    { "key": "year",   "type": "number",  "label": "Year" },
    { "key": "read",   "type": "boolean", "label": "Read", "defaultValue": false }
  ] }
  • fields must contain at least one column; keys must be unique.
  • Field props: key, type, label (required) + required, defaultValue, options, placeholder, helpText, validation, visible, visibility, displayOrder.
  • Twelve types: text, textarea, number, boolean, date, datetime, email, url, tel, select, multiselect, priority.
  • Row data (POST /api/lists/{id}/data) is keyed by each column's key, not its label.

Why this matters

Every other list feature — typed row entry, Powered Templates, Create from…, GitHub-backed lists, saved views — assumes real columns exist. This epic is the foundation for them.

Repo conventions to follow

  • Service: one partial class InterlinedApiClient file per domain in InterlinedList/Services/.
  • Wire types in InterlinedList/Models/ matching real API JSON.
  • ViewModel per view in InterlinedList/ViewModels/ (CommunityToolkit.Mvvm ObservableObject + [RelayCommand]).
  • View is a self-contained UserControl in InterlinedList/Views/ that news up its own VM from AppServices.Session.
  • Strata tokens only — no colors/fonts/radii outside Resources/Palette.xaml + Theme.*.xaml.
  • Read-after-write for any mutating endpoint whose response envelope has not been live-verified.

Metadata

Metadata

Assignees

No one assigned

    Labels

    P0Must have for a credible parity claimarea:listsArea: listsepicFeature-area parent issue with sub-issuesparityWeb/API feature-parity work

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions