| @@ -44,9 +44,14 @@ | ||
| 44 | 44 | * Carries the stored object_types AND the live-row predicate |
| 45 | 45 | * name on Digest_Index, so the reader, the proxy stamper and |
| 46 | 46 | * the authoritative-absence answer all read one id-space fact |
| 47 | 47 | * instead of each re-deciding it. |
| 48 | - * - fingerprint — config-change detection membership + the barcode flag. | |
| 48 | + * - repair — explicit drill_down/self_heal support, with a reason for nulls. | |
| 49 | + * - fingerprint — UNIVERSAL config-change detection membership; every | |
| 50 | + * collection carries it (null is invalid), with the barcode | |
| 51 | + * flag naming recipe membership. The contract-version lever | |
| 52 | + * itself lives in Config_Fingerprint::PAYLOAD_CONTRACT_VERSION, | |
| 53 | + * keyed by these same names. | |
| 49 | 54 | * - backfill — uuid backfill support: the meta-store kind (post, order, |
| 50 | 55 | * user, or term) and the SCAN |
| 51 | 56 | * scope (products+variations scan together — which is why |
| 52 | 57 | * scan_post_types lives here and not on identity). |
| @@ -78,11 +83,23 @@ | ||
| 78 | 83 | 'write' => array( 'route' => '/wc/v3/products' ), |
| 79 | 84 | 'journal' => array( 'object_type' => 'product' ), |
| 80 | 85 | 'digest' => array( |
| 81 | 86 | 'id_space' => 'products', |
| 87 | + 'label' => '', | |
| 82 | 88 | 'object_types' => array( 'product', 'variation' ), |
| 89 | + 'child_type' => 'variation', | |
| 90 | + 'select' => 'row_digest_select_sql', | |
| 91 | + 'id_column' => 'p.ID', | |
| 92 | + 'live_max' => 'product_live_max_id_sql', | |
| 93 | + 'servable' => 'servable_product_ids', | |
| 94 | + 'published_ids' => 'published_product_ids', | |
| 83 | 95 | 'live_rows' => 'live_row_exists_sql', |
| 84 | 96 | ), |
| 97 | + 'repair' => array( | |
| 98 | + 'drill_down' => true, | |
| 99 | + 'self_heal' => true, | |
| 100 | + 'reason' => 'Products support drill-down and automatic repair, including variations in their shared id-space.', | |
| 101 | + ), | |
| 85 | 102 | 'fingerprint' => array( 'barcode' => true ), |
| 86 | 103 | 'backfill' => array( |
| 87 | 104 | 'kind' => 'post', |
| 88 | 105 | 'scan_post_types' => array( 'product', 'product_variation' ), |
| @@ -98,14 +115,22 @@ | ||
| 98 | 115 | // serialized-product filter, not a proxy list page. |
| 99 | 116 | 'bulk_reader' => null, |
| 100 | 117 | 'loader' => 'product', |
| 101 | 118 | ), |
| 102 | - 'proxy' => null, // hydrated via the per-id /variations controller | |
| 119 | + // No wcpos proxy lane, and that is principled (ADR 0034): the flat | |
| 120 | + // /variations route is both the per-id hydration lane AND the | |
| 121 | + // list/seed lane (bare collection pages for the idle trickle). | |
| 122 | + 'proxy' => null, | |
| 103 | 123 | // Variations use WooCommerce's nested REST resource. The write controller |
| 104 | 124 | // takes the parent from create payloads and the stored object thereafter. |
| 105 | 125 | 'write' => array( 'route' => '/wc/v3/products' ), |
| 106 | 126 | 'journal' => array( 'object_type' => 'variation' ), |
| 107 | 127 | 'digest' => null, // folded into the products id-space (owner row carries it) |
| 128 | + 'repair' => array( | |
| 129 | + 'drill_down' => null, | |
| 130 | + 'self_heal' => null, | |
| 131 | + 'reason' => 'Variations are repaired through the products id-space.', | |
| 132 | + ), | |
| 108 | 133 | 'fingerprint' => array( 'barcode' => true ), |
| 109 | 134 | 'backfill' => array( |
| 110 | 135 | 'kind' => 'post', |
| 111 | 136 | 'scan_post_types' => array( 'product', 'product_variation' ), |
| @@ -128,12 +153,21 @@ | ||
| 128 | 153 | 'write' => array( 'route' => '/wc/v3/orders' ), |
| 129 | 154 | 'journal' => array( 'object_type' => 'order' ), // orders consume the journal via the payload-windowed pull lane, catalogue via the pointer stream |
| 130 | 155 | 'digest' => array( |
| 131 | 156 | 'id_space' => 'orders', |
| 157 | + 'label' => 'order ', | |
| 132 | 158 | 'object_types' => array( 'order' ), |
| 159 | + 'select' => 'order_digest_select_sql', | |
| 160 | + 'id_column' => '{id}', | |
| 161 | + 'live_max' => 'order_live_max_id_sql', | |
| 133 | 162 | 'live_rows' => 'order_live_row_exists_sql', |
| 134 | 163 | ), |
| 135 | - 'fingerprint' => null, | |
| 164 | + 'repair' => array( | |
| 165 | + 'drill_down' => null, | |
| 166 | + 'self_heal' => null, | |
| 167 | + 'reason' => 'Detection is available; drill-down and automatic repair are not implemented.', | |
| 168 | + ), | |
| 169 | + 'fingerprint' => array( 'barcode' => false ), | |
| 136 | 170 | 'backfill' => array( 'kind' => 'order' ), |
| 137 | 171 | ), |
| 138 | 172 | 'customers' => array( |
| 139 | 173 | 'object_type' => 'customer', |
| @@ -152,12 +186,21 @@ | ||
| 152 | 186 | 'write' => array( 'route' => '/wc/v3/customers' ), |
| 153 | 187 | 'journal' => array( 'object_type' => 'customer' ), |
| 154 | 188 | 'digest' => array( |
| 155 | 189 | 'id_space' => 'customers', |
| 190 | + 'label' => 'customer ', | |
| 156 | 191 | 'object_types' => array( 'customer' ), |
| 192 | + 'select' => 'customer_digest_select_sql', | |
| 193 | + 'id_column' => 'u.ID', | |
| 194 | + 'live_max' => 'customer_live_max_id_sql', | |
| 157 | 195 | 'live_rows' => 'customer_live_row_exists_sql', |
| 158 | 196 | ), |
| 159 | - 'fingerprint' => null, | |
| 197 | + 'repair' => array( | |
| 198 | + 'drill_down' => null, | |
| 199 | + 'self_heal' => null, | |
| 200 | + 'reason' => 'Detection is available; drill-down and automatic repair are not implemented.', | |
| 201 | + ), | |
| 202 | + 'fingerprint' => array( 'barcode' => false ), | |
| 160 | 203 | 'backfill' => array( 'kind' => 'user' ), |
| 161 | 204 | ), |
| 162 | 205 | 'categories' => array( |
| 163 | 206 | 'object_type' => 'category', |
| @@ -176,9 +219,14 @@ | ||
| 176 | 219 | ), |
| 177 | 220 | 'write' => array( 'route' => '/wc/v3/products/categories' ), |
| 178 | 221 | 'journal' => array( 'object_type' => 'category' ), |
| 179 | 222 | 'digest' => null, |
| 180 | - 'fingerprint' => null, | |
| 223 | + 'repair' => array( | |
| 224 | + 'drill_down' => null, | |
| 225 | + 'self_heal' => null, | |
| 226 | + 'reason' => 'No digest id-space is implemented for this collection.', | |
| 227 | + ), | |
| 228 | + 'fingerprint' => array( 'barcode' => false ), | |
| 181 | 229 | 'backfill' => array( |
| 182 | 230 | 'kind' => 'term', |
| 183 | 231 | 'taxonomy' => 'product_cat', |
| 184 | 232 | ), |
| @@ -200,9 +248,14 @@ | ||
| 200 | 248 | ), |
| 201 | 249 | 'write' => array( 'route' => '/wc/v3/products/brands' ), |
| 202 | 250 | 'journal' => array( 'object_type' => 'brand' ), |
| 203 | 251 | 'digest' => null, |
| 204 | - 'fingerprint' => null, | |
| 252 | + 'repair' => array( | |
| 253 | + 'drill_down' => null, | |
| 254 | + 'self_heal' => null, | |
| 255 | + 'reason' => 'No digest id-space is implemented for this collection.', | |
| 256 | + ), | |
| 257 | + 'fingerprint' => array( 'barcode' => false ), | |
| 205 | 258 | 'backfill' => array( |
| 206 | 259 | 'kind' => 'term', |
| 207 | 260 | 'taxonomy' => 'product_brand', |
| 208 | 261 | ), |
| @@ -224,9 +277,14 @@ | ||
| 224 | 277 | ), |
| 225 | 278 | 'write' => null, // read-only: no client push path exists |
| 226 | 279 | 'journal' => array( 'object_type' => 'tag' ), |
| 227 | 280 | 'digest' => null, |
| 228 | - 'fingerprint' => null, | |
| 281 | + 'repair' => array( | |
| 282 | + 'drill_down' => null, | |
| 283 | + 'self_heal' => null, | |
| 284 | + 'reason' => 'No digest id-space is implemented for this collection.', | |
| 285 | + ), | |
| 286 | + 'fingerprint' => array( 'barcode' => false ), | |
| 229 | 287 | 'backfill' => array( |
| 230 | 288 | 'kind' => 'term', |
| 231 | 289 | 'taxonomy' => 'product_tag', |
| 232 | 290 | ), |
| @@ -248,9 +306,14 @@ | ||
| 248 | 306 | ), |
| 249 | 307 | 'write' => array( 'route' => '/wc/v3/coupons' ), |
| 250 | 308 | 'journal' => array( 'object_type' => 'coupon' ), |
| 251 | 309 | 'digest' => null, |
| 252 | - 'fingerprint' => null, | |
| 310 | + 'repair' => array( | |
| 311 | + 'drill_down' => null, | |
| 312 | + 'self_heal' => null, | |
| 313 | + 'reason' => 'No digest id-space is implemented for this collection.', | |
| 314 | + ), | |
| 315 | + 'fingerprint' => array( 'barcode' => false ), | |
| 253 | 316 | 'backfill' => array( |
| 254 | 317 | 'kind' => 'post', |
| 255 | 318 | 'scan_post_types' => array( 'shop_coupon' ), |
| 256 | 319 | ), |
| @@ -266,8 +329,13 @@ | ||
| 266 | 329 | ), |
| 267 | 330 | 'write' => null, // principled read-only |
| 268 | 331 | 'journal' => array( 'object_type' => 'tax_rate' ), |
| 269 | 332 | 'digest' => null, |
| 333 | + 'repair' => array( | |
| 334 | + 'drill_down' => null, | |
| 335 | + 'self_heal' => null, | |
| 336 | + 'reason' => 'No digest id-space is implemented for this collection.', | |
| 337 | + ), | |
| 270 | 338 | 'fingerprint' => array( 'barcode' => false ), |
| 271 | 339 | 'backfill' => null, // no meta store to stamp |
| 272 | 340 | ), |
| 273 | 341 | ); |