diff --git a/docs/api/openapi.yaml b/docs/api/openapi.yaml index ef09fc52e..5e97c78b7 100644 --- a/docs/api/openapi.yaml +++ b/docs/api/openapi.yaml @@ -1735,6 +1735,31 @@ paths: "401": *a1 "422": *a3 "429": *a4 + /api/measurements/restore: + post: + tags: + - Measurements + summary: Restore soft-deleted measurements + description: Un-tombstones up to 200 of the caller's soft-deleted measurement rows in one call — the delete-Undo + counterpart to `/api/measurements/bulk-delete`. Idempotent via the `Idempotency-Key` header; rate-limited + `measurements:restore:`. Forged / foreign / not-deleted ids are silently skipped — `restored` is the + count of rows actually un-tombstoned. The restored rows re-surface in `/api/sync/changes` as upserts. + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/MeasurementsRestoreRequest" + responses: + "200": + description: Restore processed. + content: + application/json: + schema: + $ref: "#/components/schemas/MeasurementsRestoreResponse" + "401": *a1 + "422": *a3 + "429": *a4 /api/sleep/night: get: tags: @@ -4229,6 +4254,20 @@ components: required: - ids description: 1..200 measurement ids, scoped to the caller. Forged / foreign ids are silently skipped (no existence leak). + MeasurementsRestoreRequest: + type: object + properties: + ids: + minItems: 1 + maxItems: 200 + type: array + items: + type: string + minLength: 1 + required: + - ids + description: 1..200 measurement ids, scoped to the caller. Forged / foreign / not-deleted ids are silently skipped (no + existence leak). DeviceRegisterRequest: type: object properties: @@ -7323,6 +7362,33 @@ components: required: - deleted additionalProperties: false + MeasurementsRestoreResponse: + type: object + properties: + data: + $ref: "#/components/schemas/MeasurementsRestoreResult" + error: + type: "null" + meta: + type: object + properties: + requestId: + type: string + additionalProperties: false + required: + - data + - error + additionalProperties: false + MeasurementsRestoreResult: + type: object + properties: + restored: + type: integer + minimum: 0 + maximum: 9007199254740991 + required: + - restored + additionalProperties: false SleepNightResponse: type: object properties: diff --git a/docs/ui-guidelines.md b/docs/ui-guidelines.md index fcb14b166..3e58b9069 100644 --- a/docs/ui-guidelines.md +++ b/docs/ui-guidelines.md @@ -149,9 +149,38 @@ Wrap inputs in `