Honor If-Match when deleting documents (#21)

Compare the document ETag and delete it in one datastore operation so a stale If-Match returns 412 and leaves the newer document in place.

Co-authored-by: Cursor Agent <[email protected]>
This commit is contained in:
Pijus KamandulisandCursor Agent authored and GitHub committed 2026-11-05 20:27:13 +02:00
1 parent af271092c3
commit 2fddaf7498
6 files changed
+185 -14

No files matched your search

+9 -1
View File
@@ -67,7 +67,7 @@ func (h *Handlers) DeleteDocument(c *gin.Context) {
collectionId := c.Param("collId")
documentId := c.Param("docId")
status := h.dataStore.DeleteDocument(databaseId, collectionId, documentId)
status := h.dataStore.DeleteDocumentIfMatch(databaseId, collectionId, documentId, c.GetHeader(headers.IfMatch))
if status == datastore.StatusOk {
c.Status(http.StatusNoContent)
return
@@ -78,6 +78,12 @@ func (h *Handlers) DeleteDocument(c *gin.Context) {
return
}
if status == datastore.PreconditionFailed {
c.Header(headers.ErrorCode, "PreconditionFailed")
c.JSON(http.StatusPreconditionFailed, constants.PreconditionFailedResponse)
return
}
c.IndentedJSON(http.StatusInternalServerError, constants.UnknownErrorResponse)
}
@@ -424,6 +430,8 @@ func dataStoreStatusToResponseCode(status datastore.DataStoreStatus) int {
return http.StatusConflict
case datastore.BadRequest:
return http.StatusBadRequest
case datastore.PreconditionFailed:
return http.StatusPreconditionFailed
default:
return http.StatusInternalServerError
}