45 lines
1.9 KiB
JavaScript
45 lines
1.9 KiB
JavaScript
|
|
/// <reference path="../pb_data/types.d.ts" />
|
||
|
|
|
||
|
|
// Add `flavor` to client_logs: which build variant a device runs, clean or adult.
|
||
|
|
//
|
||
|
|
// WHY THIS MIGRATION EXISTS: the app was already sending the field and PocketBase
|
||
|
|
// was silently throwing it away. An unknown key in a create payload is simply
|
||
|
|
// dropped — no error, no warning, HTTP 200 — which is the same silent-drop
|
||
|
|
// behaviour already documented for hidden fields in amber-app/CLAUDE.md. So the
|
||
|
|
// status dashboard's "Podle varianty" row read `neznámá` for every record while the
|
||
|
|
// client believed it was reporting the variant, and the only way to notice was to
|
||
|
|
// query the stored rows and find the field missing.
|
||
|
|
//
|
||
|
|
// Not folded into `meta`, though that would have needed no migration and the
|
||
|
|
// dashboard already falls back to reading it there: the variant is a first-class
|
||
|
|
// dimension of every record, exactly like `platform` and `appVersion` beside it,
|
||
|
|
// and burying it in a json blob would make the one query it exists for — group the
|
||
|
|
// errors by variant — awkward for no benefit.
|
||
|
|
//
|
||
|
|
// Additive and nullable, so existing rows stay valid and simply have no variant.
|
||
|
|
// Fourteen days from now the retention cron will have aged all of them out and the
|
||
|
|
// column will be populated for everything.
|
||
|
|
|
||
|
|
migrate(
|
||
|
|
(app) => {
|
||
|
|
const logs = app.findCollectionByNameOrId("client_logs")
|
||
|
|
logs.fields.add(
|
||
|
|
new TextField({
|
||
|
|
name: "flavor",
|
||
|
|
// "clean" | "adult". Not required: every row written before the app build
|
||
|
|
// that sends it, and any future client that omits it, must still be
|
||
|
|
// accepted — losing a diagnostic record over a missing dimension would be
|
||
|
|
// a worse trade than not knowing the variant.
|
||
|
|
required: false,
|
||
|
|
max: 20,
|
||
|
|
}),
|
||
|
|
)
|
||
|
|
app.save(logs)
|
||
|
|
},
|
||
|
|
(app) => {
|
||
|
|
const logs = app.findCollectionByNameOrId("client_logs")
|
||
|
|
logs.fields.removeByName("flavor")
|
||
|
|
app.save(logs)
|
||
|
|
},
|
||
|
|
)
|