Scope
Model the DSL and add both schema calls to Services/InterlinedApiClient.Lists.cs.
Models (InterlinedList/Models/)
ListSchema — Name (required), Description, Fields (>= 1).
ListField — Key, Type, Label (required) + Required, DefaultValue, Options, Placeholder, HelpText, Validation, Visible, Visibility, DisplayOrder.
ListFieldValidation — Min, Max, MinLength, MaxLength, Pattern, Step.
ListFieldVisibility — Condition { Field, Operator, Value }.
ListFieldType — the twelve types as a constrained set: text, textarea, number, boolean, date, datetime, email, url, tel, select, multiselect, priority.
Note the wire mapping: each fields[] entry is stored as a ListProperty (key→propertyKey, label→propertyName, type→propertyType) — the properties body shape uses those names.
Service
GetListSchemaAsync(listId) → GET, response is wrapped: {"data": {...}}.
PutListSchemaDslAsync(listId, ListSchema) → destructive rebuild.
PutListPropertiesAsync(listId, properties) → non-destructive edits.
CreateListAsync gains an optional schema argument.
Error handling
400 responses name the offending column, e.g.
Invalid schema: Field 'year' has invalid type 'integer'. Valid types: text, number, ...
Surface that message against the field, not as a generic failure. Also handle: missing name, empty fields, a field missing key/type/label, select/multiselect without options, duplicate keys.
Acceptance criteria
Scope
Model the DSL and add both schema calls to
Services/InterlinedApiClient.Lists.cs.Models (
InterlinedList/Models/)ListSchema—Name(required),Description,Fields(>= 1).ListField—Key,Type,Label(required) +Required,DefaultValue,Options,Placeholder,HelpText,Validation,Visible,Visibility,DisplayOrder.ListFieldValidation—Min,Max,MinLength,MaxLength,Pattern,Step.ListFieldVisibility—Condition { Field, Operator, Value }.ListFieldType— the twelve types as a constrained set:text,textarea,number,boolean,date,datetime,email,url,tel,select,multiselect,priority.Note the wire mapping: each
fields[]entry is stored as aListProperty(key→propertyKey,label→propertyName,type→propertyType) — thepropertiesbody shape uses those names.Service
GetListSchemaAsync(listId)→GET, response is wrapped:{"data": {...}}.PutListSchemaDslAsync(listId, ListSchema)→ destructive rebuild.PutListPropertiesAsync(listId, properties)→ non-destructive edits.CreateListAsyncgains an optionalschemaargument.Error handling
400responses name the offending column, e.g.Invalid schema: Field 'year' has invalid type 'integer'. Valid types: text, number, ...Surface that message against the field, not as a generic failure. Also handle: missing
name, emptyfields, a field missingkey/type/label,select/multiselectwithoutoptions, duplicatekeys.Acceptance criteria
ListSummarykeeps compiling; schema is fetched separately, not folded into it.