Add moderator notes to users & organizations (#6094)

* Moderator notes

* Use macros

* Improve queries

* Query cache

* Accept missing If-Match if no existing note

* Undo v2 compat changes

* Fix tests

* Remove CONSTRAINT CHECK on moderation_notes

* Respect 1-indexing on moderation_notes.version default in DB migration

* Remove double Option

* .body("") -> .finish()

* .remove() -> .get().clone()

* cloned

* Review comments

* moderation_notes everywhere
This commit is contained in:
François-Xavier Talbot
2026-05-16 16:30:36 +00:00
committed by GitHub
parent cee942dcef
commit b72bc18a6b
17 changed files with 1119 additions and 14 deletions
@@ -0,0 +1,26 @@
{
"db_name": "PostgreSQL",
"query": "\n INSERT INTO moderation_notes (user_id, organization_id, last_author, version, notes, user_rating)\n SELECT\n $1, $2, $3, 1, COALESCE($4::text, ''), COALESCE($5::integer, 0)\n WHERE NOT EXISTS (\n SELECT 1 FROM moderation_notes\n WHERE\n ($1::bigint IS NOT NULL AND user_id = $1)\n OR ($2::bigint IS NOT NULL AND organization_id = $2)\n )\n ON CONFLICT DO NOTHING\n RETURNING version\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version",
"type_info": "Int4"
}
],
"parameters": {
"Left": [
"Int8",
"Int8",
"Int8",
"Text",
"Int4"
]
},
"nullable": [
false
]
},
"hash": "1ca9b7c343ccdc4b0ac66c67d1b456440d1a4d687235c28d71bec7aea7bff6e7"
}
@@ -0,0 +1,64 @@
{
"db_name": "PostgreSQL",
"query": "\n\t\t\tSELECT user_id, organization_id, last_modified, created_at, last_author, version, notes, user_rating\n\t\t\tFROM moderation_notes\n\t\t\tWHERE organization_id = ANY($1)\n\t\t\t",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "user_id",
"type_info": "Int8"
},
{
"ordinal": 1,
"name": "organization_id",
"type_info": "Int8"
},
{
"ordinal": 2,
"name": "last_modified",
"type_info": "Timestamptz"
},
{
"ordinal": 3,
"name": "created_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "last_author",
"type_info": "Int8"
},
{
"ordinal": 5,
"name": "version",
"type_info": "Int4"
},
{
"ordinal": 6,
"name": "notes",
"type_info": "Text"
},
{
"ordinal": 7,
"name": "user_rating",
"type_info": "Int4"
}
],
"parameters": {
"Left": [
"Int8Array"
]
},
"nullable": [
true,
true,
false,
false,
false,
false,
false,
false
]
},
"hash": "5894d30f04a5413a607f2417cd3b7a9710aeadd5f97e3c25521202e9e21e261e"
}
@@ -0,0 +1,27 @@
{
"db_name": "PostgreSQL",
"query": "\n UPDATE moderation_notes\n SET\n last_modified = NOW(),\n last_author = $1,\n version = version + 1,\n notes = COALESCE($2::text, notes),\n user_rating = COALESCE($3::integer, user_rating)\n WHERE (\n ($4::bigint IS NOT NULL AND user_id = $4) OR\n ($5::bigint IS NOT NULL AND organization_id = $5)\n )\n AND version = $6\n RETURNING version\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "version",
"type_info": "Int4"
}
],
"parameters": {
"Left": [
"Int8",
"Text",
"Int4",
"Int8",
"Int8",
"Int4"
]
},
"nullable": [
false
]
},
"hash": "5a86ade76259aafdd5b778e5b1909e1653c4442d9ace4105dd18aa5333c52aa2"
}
@@ -0,0 +1,64 @@
{
"db_name": "PostgreSQL",
"query": "\n\t\t\tSELECT user_id, organization_id, last_modified, created_at, last_author, version, notes, user_rating\n\t\t\tFROM moderation_notes\n\t\t\tWHERE user_id = ANY($1)\n\t\t\t",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "user_id",
"type_info": "Int8"
},
{
"ordinal": 1,
"name": "organization_id",
"type_info": "Int8"
},
{
"ordinal": 2,
"name": "last_modified",
"type_info": "Timestamptz"
},
{
"ordinal": 3,
"name": "created_at",
"type_info": "Timestamptz"
},
{
"ordinal": 4,
"name": "last_author",
"type_info": "Int8"
},
{
"ordinal": 5,
"name": "version",
"type_info": "Int4"
},
{
"ordinal": 6,
"name": "notes",
"type_info": "Text"
},
{
"ordinal": 7,
"name": "user_rating",
"type_info": "Int4"
}
],
"parameters": {
"Left": [
"Int8Array"
]
},
"nullable": [
true,
true,
false,
false,
false,
false,
false,
false
]
},
"hash": "ad49878323e942bdbaac87c351621e51871ec591bc0e7ff29119834e3ed8bf53"
}