diff --git a/Cargo.lock b/Cargo.lock index a40ee4719..bdfa1fb25 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1056,9 +1056,9 @@ dependencies = [ [[package]] name = "deno_doc" -version = "0.205.0" +version = "0.206.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d80bf35d7150d36768fc1f4e6bb71444f39924263b71a343e1a7b4efa64b9d8" +checksum = "0a2af46876eb43b3334539f548c8c106f9ad86d330ca5661c04fcdb27fd8e463" dependencies = [ "anyhow", "cfg-if", diff --git a/api/.sqlx/query-650219f99e95565978f0fa07414e6c848b23bb98519edf7710a313bc5313916c.json b/api/.sqlx/query-06dab3d7d24a01618be3bbf9a87dc87bdcad9d348336a79cdd885c857383649e.json similarity index 80% rename from api/.sqlx/query-650219f99e95565978f0fa07414e6c848b23bb98519edf7710a313bc5313916c.json rename to api/.sqlx/query-06dab3d7d24a01618be3bbf9a87dc87bdcad9d348336a79cdd885c857383649e.json index 37642aa3b..2b832af9b 100644 --- a/api/.sqlx/query-650219f99e95565978f0fa07414e6c848b23bb98519edf7710a313bc5313916c.json +++ b/api/.sqlx/query-06dab3d7d24a01618be3bbf9a87dc87bdcad9d348336a79cdd885c857383649e.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "DELETE FROM users WHERE id = $1\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", + "query": "DELETE FROM users WHERE id = $1\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", "describe": { "columns": [ { @@ -96,5 +96,5 @@ null ] }, - "hash": "650219f99e95565978f0fa07414e6c848b23bb98519edf7710a313bc5313916c" + "hash": "06dab3d7d24a01618be3bbf9a87dc87bdcad9d348336a79cdd885c857383649e" } diff --git a/api/.sqlx/query-12e63d98e2f365c8534cc98ecdbe5441217624541e3ae1d5290508eaf5c8e137.json b/api/.sqlx/query-12e63d98e2f365c8534cc98ecdbe5441217624541e3ae1d5290508eaf5c8e137.json new file mode 100644 index 000000000..35328f451 --- /dev/null +++ b/api/.sqlx/query-12e63d98e2f365c8534cc98ecdbe5441217624541e3ae1d5290508eaf5c8e137.json @@ -0,0 +1,14 @@ +{ + "db_name": "PostgreSQL", + "query": "UPDATE tickets SET updated_at = now() WHERE id = $1", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Uuid" + ] + }, + "nullable": [] + }, + "hash": "12e63d98e2f365c8534cc98ecdbe5441217624541e3ae1d5290508eaf5c8e137" +} diff --git a/api/.sqlx/query-08ee5e443acf814f218f90e7cf5b8daccf74190f22d1f9e817a6bba429a12418.json b/api/.sqlx/query-1ddc7109f349bc0b4aa6a6d89ee7915fc67f35cd985bc36f07ee2e493d8fe256.json similarity index 82% rename from api/.sqlx/query-08ee5e443acf814f218f90e7cf5b8daccf74190f22d1f9e817a6bba429a12418.json rename to api/.sqlx/query-1ddc7109f349bc0b4aa6a6d89ee7915fc67f35cd985bc36f07ee2e493d8fe256.json index 1832d3833..c2bf2f771 100644 --- a/api/.sqlx/query-08ee5e443acf814f218f90e7cf5b8daccf74190f22d1f9e817a6bba429a12418.json +++ b/api/.sqlx/query-1ddc7109f349bc0b4aa6a6d89ee7915fc67f35cd985bc36f07ee2e493d8fe256.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE users SET scope_limit = $1 WHERE id = $2\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", + "query": "UPDATE users SET scope_limit = $1 WHERE id = $2\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", "describe": { "columns": [ { @@ -97,5 +97,5 @@ null ] }, - "hash": "08ee5e443acf814f218f90e7cf5b8daccf74190f22d1f9e817a6bba429a12418" + "hash": "1ddc7109f349bc0b4aa6a6d89ee7915fc67f35cd985bc36f07ee2e493d8fe256" } diff --git a/api/.sqlx/query-46104fe4115f8b7781202724a4b3100493d0f8aadac543daf23f1dd70ac223c5.json b/api/.sqlx/query-30b37ec2cd587664d22a42f78fab71db3e0c259e55bb283aca5e906f42226ff9.json similarity index 82% rename from api/.sqlx/query-46104fe4115f8b7781202724a4b3100493d0f8aadac543daf23f1dd70ac223c5.json rename to api/.sqlx/query-30b37ec2cd587664d22a42f78fab71db3e0c259e55bb283aca5e906f42226ff9.json index 933747628..990f715df 100644 --- a/api/.sqlx/query-46104fe4115f8b7781202724a4b3100493d0f8aadac543daf23f1dd70ac223c5.json +++ b/api/.sqlx/query-30b37ec2cd587664d22a42f78fab71db3e0c259e55bb283aca5e906f42226ff9.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO users (name, email, avatar_url, gitlab_id, is_blocked, is_staff)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT(gitlab_id) DO UPDATE\n SET name = $1, email = $2, avatar_url = $3\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", + "query": "INSERT INTO users (name, email, avatar_url, gitlab_id, is_blocked, is_staff)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT(gitlab_id) DO UPDATE\n SET name = $1, email = $2, avatar_url = $3\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", "describe": { "columns": [ { @@ -101,5 +101,5 @@ null ] }, - "hash": "46104fe4115f8b7781202724a4b3100493d0f8aadac543daf23f1dd70ac223c5" + "hash": "30b37ec2cd587664d22a42f78fab71db3e0c259e55bb283aca5e906f42226ff9" } diff --git a/api/.sqlx/query-e58894e9eb4fd14386b687179db0ab9740b143f4c3e13d3fc9c50a1c4159ad37.json b/api/.sqlx/query-32cf4c5aa5cd5edf30ea2c376d5cb378bc96d4dea56a77c6d9a5f296132c4e9d.json similarity index 80% rename from api/.sqlx/query-e58894e9eb4fd14386b687179db0ab9740b143f4c3e13d3fc9c50a1c4159ad37.json rename to api/.sqlx/query-32cf4c5aa5cd5edf30ea2c376d5cb378bc96d4dea56a77c6d9a5f296132c4e9d.json index e04822d26..35b5ceeee 100644 --- a/api/.sqlx/query-e58894e9eb4fd14386b687179db0ab9740b143f4c3e13d3fc9c50a1c4159ad37.json +++ b/api/.sqlx/query-32cf4c5aa5cd5edf30ea2c376d5cb378bc96d4dea56a77c6d9a5f296132c4e9d.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" FROM users WHERE id = $1", + "query": "SELECT id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" FROM users WHERE id = $1", "describe": { "columns": [ { @@ -96,5 +96,5 @@ null ] }, - "hash": "e58894e9eb4fd14386b687179db0ab9740b143f4c3e13d3fc9c50a1c4159ad37" + "hash": "32cf4c5aa5cd5edf30ea2c376d5cb378bc96d4dea56a77c6d9a5f296132c4e9d" } diff --git a/api/.sqlx/query-682a2784ecf25a930388608d47d724703cb027dc2906176522fac01e33713632.json b/api/.sqlx/query-6ce03466782da8f12d27850e8574244595b53e61c9b6893281a001f37290b183.json similarity index 82% rename from api/.sqlx/query-682a2784ecf25a930388608d47d724703cb027dc2906176522fac01e33713632.json rename to api/.sqlx/query-6ce03466782da8f12d27850e8574244595b53e61c9b6893281a001f37290b183.json index 84dda537b..23d6719b0 100644 --- a/api/.sqlx/query-682a2784ecf25a930388608d47d724703cb027dc2906176522fac01e33713632.json +++ b/api/.sqlx/query-6ce03466782da8f12d27850e8574244595b53e61c9b6893281a001f37290b183.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE users SET is_staff = $1 WHERE id = $2\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", + "query": "UPDATE users SET is_staff = $1 WHERE id = $2\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", "describe": { "columns": [ { @@ -97,5 +97,5 @@ null ] }, - "hash": "682a2784ecf25a930388608d47d724703cb027dc2906176522fac01e33713632" + "hash": "6ce03466782da8f12d27850e8574244595b53e61c9b6893281a001f37290b183" } diff --git a/api/.sqlx/query-00f364049696faac2c1f38339caa8178a728dd651caf54cc2b9c2b0dbf404269.json b/api/.sqlx/query-7d169e4ad7cc5fe7b09d5c3f62d623d526fab3ea4bb23cb3d2fb13047c32eb57.json similarity index 78% rename from api/.sqlx/query-00f364049696faac2c1f38339caa8178a728dd651caf54cc2b9c2b0dbf404269.json rename to api/.sqlx/query-7d169e4ad7cc5fe7b09d5c3f62d623d526fab3ea4bb23cb3d2fb13047c32eb57.json index 2a77ee45d..751c77d51 100644 --- a/api/.sqlx/query-00f364049696faac2c1f38339caa8178a728dd651caf54cc2b9c2b0dbf404269.json +++ b/api/.sqlx/query-7d169e4ad7cc5fe7b09d5c3f62d623d526fab3ea4bb23cb3d2fb13047c32eb57.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE tickets SET status = $2, updated_at = now()\n WHERE id = $1 AND status NOT IN ('closed', 'spam')", + "query": "UPDATE tickets SET status = $2, updated_at = now()\n WHERE id = $1 AND status NOT IN ('closed', 'spam')", "describe": { "columns": [], "parameters": { @@ -24,5 +24,5 @@ }, "nullable": [] }, - "hash": "00f364049696faac2c1f38339caa8178a728dd651caf54cc2b9c2b0dbf404269" + "hash": "7d169e4ad7cc5fe7b09d5c3f62d623d526fab3ea4bb23cb3d2fb13047c32eb57" } diff --git a/api/.sqlx/query-4d4db475da4257e609e8f91dd0246327deba3cef0e81588f6bf475de5ad82e08.json b/api/.sqlx/query-845b908b97658622ae136485449cb44a1db42731670786336d0ca71cdcb12eaa.json similarity index 72% rename from api/.sqlx/query-4d4db475da4257e609e8f91dd0246327deba3cef0e81588f6bf475de5ad82e08.json rename to api/.sqlx/query-845b908b97658622ae136485449cb44a1db42731670786336d0ca71cdcb12eaa.json index 57a674cdc..5d75fdd32 100644 --- a/api/.sqlx/query-4d4db475da4257e609e8f91dd0246327deba3cef0e81588f6bf475de5ad82e08.json +++ b/api/.sqlx/query-845b908b97658622ae136485449cb44a1db42731670786336d0ca71cdcb12eaa.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO ticket_messages (ticket_id, author, direction, message, email_message_id)\n VALUES ($1, $2, $3, $4, $5)\n RETURNING id", + "query": "INSERT INTO ticket_messages (ticket_id, author, direction, message, email_message_id, internal)\n VALUES ($1, $2, $3, $4, $5, $6)\n RETURNING id", "describe": { "columns": [ { @@ -25,12 +25,13 @@ } }, "Text", - "Text" + "Text", + "Bool" ] }, "nullable": [ false ] }, - "hash": "4d4db475da4257e609e8f91dd0246327deba3cef0e81588f6bf475de5ad82e08" + "hash": "845b908b97658622ae136485449cb44a1db42731670786336d0ca71cdcb12eaa" } diff --git a/api/.sqlx/query-1b07c6bcd5224f813241269bea23a2fce07d8c28c9e030d4b40fbbd8c6f0217b.json b/api/.sqlx/query-917ec41a2316a316e5a5bf04373866993dca4594d7d4352049bcaa9c1421e298.json similarity index 82% rename from api/.sqlx/query-1b07c6bcd5224f813241269bea23a2fce07d8c28c9e030d4b40fbbd8c6f0217b.json rename to api/.sqlx/query-917ec41a2316a316e5a5bf04373866993dca4594d7d4352049bcaa9c1421e298.json index f4aacf0e5..12eae0a1b 100644 --- a/api/.sqlx/query-1b07c6bcd5224f813241269bea23a2fce07d8c28c9e030d4b40fbbd8c6f0217b.json +++ b/api/.sqlx/query-917ec41a2316a316e5a5bf04373866993dca4594d7d4352049bcaa9c1421e298.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE users SET github_id = $1 WHERE id = $2\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", + "query": "UPDATE users SET github_id = $1 WHERE id = $2\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", "describe": { "columns": [ { @@ -97,5 +97,5 @@ null ] }, - "hash": "1b07c6bcd5224f813241269bea23a2fce07d8c28c9e030d4b40fbbd8c6f0217b" + "hash": "917ec41a2316a316e5a5bf04373866993dca4594d7d4352049bcaa9c1421e298" } diff --git a/api/.sqlx/query-10bfb547b81856d698c8d6d16679f196019d87cc47b7da6ee60ce298aeab471a.json b/api/.sqlx/query-9886bb6bf28d849671834a9f19619780563402a9766b21e0f96d4a4d02120f54.json similarity index 82% rename from api/.sqlx/query-10bfb547b81856d698c8d6d16679f196019d87cc47b7da6ee60ce298aeab471a.json rename to api/.sqlx/query-9886bb6bf28d849671834a9f19619780563402a9766b21e0f96d4a4d02120f54.json index 7b19d357d..4a240645d 100644 --- a/api/.sqlx/query-10bfb547b81856d698c8d6d16679f196019d87cc47b7da6ee60ce298aeab471a.json +++ b/api/.sqlx/query-9886bb6bf28d849671834a9f19619780563402a9766b21e0f96d4a4d02120f54.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE users SET is_blocked = $1 WHERE id = $2\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", + "query": "UPDATE users SET is_blocked = $1 WHERE id = $2\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", "describe": { "columns": [ { @@ -97,5 +97,5 @@ null ] }, - "hash": "10bfb547b81856d698c8d6d16679f196019d87cc47b7da6ee60ce298aeab471a" + "hash": "9886bb6bf28d849671834a9f19619780563402a9766b21e0f96d4a4d02120f54" } diff --git a/api/.sqlx/query-42451426dea855662dda75785a2d298bfb8ccd58c9719b47e644049625283306.json b/api/.sqlx/query-a3c353c6ed89238b4db3748a48b72fe89098de9e295e74df26d8f1d649297415.json similarity index 78% rename from api/.sqlx/query-42451426dea855662dda75785a2d298bfb8ccd58c9719b47e644049625283306.json rename to api/.sqlx/query-a3c353c6ed89238b4db3748a48b72fe89098de9e295e74df26d8f1d649297415.json index efe2534fe..15b407816 100644 --- a/api/.sqlx/query-42451426dea855662dda75785a2d298bfb8ccd58c9719b47e644049625283306.json +++ b/api/.sqlx/query-a3c353c6ed89238b4db3748a48b72fe89098de9e295e74df26d8f1d649297415.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n ticket_messages.id as \"message_id\", ticket_messages.ticket_id as \"message_ticket_id\", ticket_messages.author as \"message_author\", ticket_messages.author_email as \"message_author_email\", ticket_messages.author_name as \"message_author_name\", ticket_messages.author_email_verified as \"message_author_email_verified\", ticket_messages.direction as \"message_direction: TicketMessageDirection\", ticket_messages.email_message_id as \"message_email_message_id\", ticket_messages.message as \"message_message\", ticket_messages.updated_at as \"message_updated_at\", ticket_messages.created_at as \"message_created_at\",\n users.id as \"user_id?\", users.name as \"user_name?\", users.avatar_url as \"user_avatar_url?\", users.github_id as \"user_github_id?\", users.gitlab_id as \"user_gitlab_id?\", users.updated_at as \"user_updated_at?\", users.created_at as \"user_created_at?\"\n FROM ticket_messages\n LEFT JOIN users ON users.id = ticket_messages.author\n WHERE ticket_messages.ticket_id = $1\n ORDER BY ticket_messages.created_at", + "query": "SELECT\n ticket_messages.id as \"message_id\", ticket_messages.ticket_id as \"message_ticket_id\", ticket_messages.author as \"message_author\", ticket_messages.author_email as \"message_author_email\", ticket_messages.author_name as \"message_author_name\", ticket_messages.author_email_verified as \"message_author_email_verified\", ticket_messages.direction as \"message_direction: TicketMessageDirection\", ticket_messages.email_message_id as \"message_email_message_id\", ticket_messages.internal as \"message_internal\", ticket_messages.message as \"message_message\", ticket_messages.updated_at as \"message_updated_at\", ticket_messages.created_at as \"message_created_at\",\n users.id as \"user_id?\", users.name as \"user_name?\", users.avatar_url as \"user_avatar_url?\", users.github_id as \"user_github_id?\", users.gitlab_id as \"user_gitlab_id?\", users.updated_at as \"user_updated_at?\", users.created_at as \"user_created_at?\"\n FROM ticket_messages\n LEFT JOIN users ON users.id = ticket_messages.author\n WHERE ticket_messages.ticket_id = $1\n ORDER BY ticket_messages.created_at", "describe": { "columns": [ { @@ -55,51 +55,56 @@ }, { "ordinal": 8, + "name": "message_internal", + "type_info": "Bool" + }, + { + "ordinal": 9, "name": "message_message", "type_info": "Text" }, { - "ordinal": 9, + "ordinal": 10, "name": "message_updated_at", "type_info": "Timestamptz" }, { - "ordinal": 10, + "ordinal": 11, "name": "message_created_at", "type_info": "Timestamptz" }, { - "ordinal": 11, + "ordinal": 12, "name": "user_id?", "type_info": "Uuid" }, { - "ordinal": 12, + "ordinal": 13, "name": "user_name?", "type_info": "Text" }, { - "ordinal": 13, + "ordinal": 14, "name": "user_avatar_url?", "type_info": "Text" }, { - "ordinal": 14, + "ordinal": 15, "name": "user_github_id?", "type_info": "Int8" }, { - "ordinal": 15, + "ordinal": 16, "name": "user_gitlab_id?", "type_info": "Int8" }, { - "ordinal": 16, + "ordinal": 17, "name": "user_updated_at?", "type_info": "Timestamptz" }, { - "ordinal": 17, + "ordinal": 18, "name": "user_created_at?", "type_info": "Timestamptz" } @@ -124,11 +129,12 @@ false, false, false, + false, true, true, false, false ] }, - "hash": "42451426dea855662dda75785a2d298bfb8ccd58c9719b47e644049625283306" + "hash": "a3c353c6ed89238b4db3748a48b72fe89098de9e295e74df26d8f1d649297415" } diff --git a/api/.sqlx/query-1b11ef3226b26d622d249d85715e9b64d7902ddeee08596dbc6e8e9f0eb79c6e.json b/api/.sqlx/query-aabe59cf8c1ce9acf6fcf7e7e447bc7495df524296893c6b6c2c10ca3a957595.json similarity index 80% rename from api/.sqlx/query-1b11ef3226b26d622d249d85715e9b64d7902ddeee08596dbc6e8e9f0eb79c6e.json rename to api/.sqlx/query-aabe59cf8c1ce9acf6fcf7e7e447bc7495df524296893c6b6c2c10ca3a957595.json index 3fa524a20..c1529b3e3 100644 --- a/api/.sqlx/query-1b11ef3226b26d622d249d85715e9b64d7902ddeee08596dbc6e8e9f0eb79c6e.json +++ b/api/.sqlx/query-aabe59cf8c1ce9acf6fcf7e7e447bc7495df524296893c6b6c2c10ca3a957595.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" FROM users WHERE gitlab_id = $1", + "query": "SELECT id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" FROM users WHERE gitlab_id = $1", "describe": { "columns": [ { @@ -96,5 +96,5 @@ null ] }, - "hash": "1b11ef3226b26d622d249d85715e9b64d7902ddeee08596dbc6e8e9f0eb79c6e" + "hash": "aabe59cf8c1ce9acf6fcf7e7e447bc7495df524296893c6b6c2c10ca3a957595" } diff --git a/api/.sqlx/query-946195554f59db594829b59fc44dd9086307eb3f86b55f1a099b1485815b5f07.json b/api/.sqlx/query-af50ebb9b7a0302ff345f2cc822168a8321ca644a6d59627e00bcc8d4db3d4ac.json similarity index 80% rename from api/.sqlx/query-946195554f59db594829b59fc44dd9086307eb3f86b55f1a099b1485815b5f07.json rename to api/.sqlx/query-af50ebb9b7a0302ff345f2cc822168a8321ca644a6d59627e00bcc8d4db3d4ac.json index 1dc29fd8c..1ca8cc898 100644 --- a/api/.sqlx/query-946195554f59db594829b59fc44dd9086307eb3f86b55f1a099b1485815b5f07.json +++ b/api/.sqlx/query-af50ebb9b7a0302ff345f2cc822168a8321ca644a6d59627e00bcc8d4db3d4ac.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" FROM users WHERE github_id = $1", + "query": "SELECT id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" FROM users WHERE github_id = $1", "describe": { "columns": [ { @@ -96,5 +96,5 @@ null ] }, - "hash": "946195554f59db594829b59fc44dd9086307eb3f86b55f1a099b1485815b5f07" + "hash": "af50ebb9b7a0302ff345f2cc822168a8321ca644a6d59627e00bcc8d4db3d4ac" } diff --git a/api/.sqlx/query-4742f927a546d964e8eee1f228a9f30bc57228198b68286ddde3e679ee213174.json b/api/.sqlx/query-c80f65a0a17b45a42580398f6f3b0cf6f2364a1e991c5e0a5b6d6bab4f90a52c.json similarity index 89% rename from api/.sqlx/query-4742f927a546d964e8eee1f228a9f30bc57228198b68286ddde3e679ee213174.json rename to api/.sqlx/query-c80f65a0a17b45a42580398f6f3b0cf6f2364a1e991c5e0a5b6d6bab4f90a52c.json index c628b46fe..b8ea56c01 100644 --- a/api/.sqlx/query-4742f927a546d964e8eee1f228a9f30bc57228198b68286ddde3e679ee213174.json +++ b/api/.sqlx/query-c80f65a0a17b45a42580398f6f3b0cf6f2364a1e991c5e0a5b6d6bab4f90a52c.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n tickets.id as \"ticket_id\", tickets.ticket_number as \"ticket_ticket_number\", tickets.kind as \"ticket_kind: TicketKind\", tickets.creator as \"ticket_creator\", tickets.reporter_email as \"ticket_reporter_email\", tickets.reporter_name as \"ticket_reporter_name\", tickets.subject as \"ticket_subject\", tickets.claim_token as \"ticket_claim_token\", tickets.meta as \"ticket_meta\", tickets.status as \"ticket_status: TicketStatus\", tickets.closed_at as \"ticket_closed_at\", tickets.updated_at as \"ticket_updated_at\", tickets.created_at as \"ticket_created_at\",\n users.id as \"user_id?\", users.name as \"user_name?\", users.email as \"user_email\", users.avatar_url as \"user_avatar_url?\", users.github_id as \"user_github_id\", users.gitlab_id as \"user_gitlab_id\", users.is_blocked as \"user_is_blocked?\", users.is_staff as \"user_is_staff?\", users.scope_limit as \"user_scope_limit?\", users.updated_at as \"user_updated_at?\", users.created_at as \"user_created_at?\",\n(SELECT COUNT(scope_invites.created_at) FROM scope_invites WHERE scope_invites.target_user_id = users.id) as \"user_invite_count\",\n(SELECT COUNT(scopes.created_at) FROM scopes WHERE scopes.creator = users.id) as \"user_scope_usage\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"user_newer_ticket_messages_count\"\n FROM tickets\n LEFT JOIN users ON users.id = tickets.creator\n WHERE tickets.id = $1", + "query": "SELECT\n tickets.id as \"ticket_id\", tickets.ticket_number as \"ticket_ticket_number\", tickets.kind as \"ticket_kind: TicketKind\", tickets.creator as \"ticket_creator\", tickets.reporter_email as \"ticket_reporter_email\", tickets.reporter_name as \"ticket_reporter_name\", tickets.subject as \"ticket_subject\", tickets.claim_token as \"ticket_claim_token\", tickets.meta as \"ticket_meta\", tickets.status as \"ticket_status: TicketStatus\", tickets.closed_at as \"ticket_closed_at\", tickets.updated_at as \"ticket_updated_at\", tickets.created_at as \"ticket_created_at\",\n users.id as \"user_id?\", users.name as \"user_name?\", users.email as \"user_email\", users.avatar_url as \"user_avatar_url?\", users.github_id as \"user_github_id\", users.gitlab_id as \"user_gitlab_id\", users.is_blocked as \"user_is_blocked?\", users.is_staff as \"user_is_staff?\", users.scope_limit as \"user_scope_limit?\", users.updated_at as \"user_updated_at?\", users.created_at as \"user_created_at?\",\n(SELECT COUNT(scope_invites.created_at) FROM scope_invites WHERE scope_invites.target_user_id = users.id) as \"user_invite_count\",\n(SELECT COUNT(scopes.created_at) FROM scopes WHERE scopes.creator = users.id) as \"user_scope_usage\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"user_newer_ticket_messages_count\"\n FROM tickets\n LEFT JOIN users ON users.id = tickets.creator\n WHERE tickets.id = $1", "describe": { "columns": [ { @@ -200,5 +200,5 @@ null ] }, - "hash": "4742f927a546d964e8eee1f228a9f30bc57228198b68286ddde3e679ee213174" + "hash": "c80f65a0a17b45a42580398f6f3b0cf6f2364a1e991c5e0a5b6d6bab4f90a52c" } diff --git a/api/.sqlx/query-d24f58126801f799b2b89b74ccbae1e8a8892d6736ecc35681d24c7ea3cd9ab2.json b/api/.sqlx/query-c8233202c42f9d5c3f03592feedfe0be3528dec88bb11de0c569be7cc123d7f1.json similarity index 82% rename from api/.sqlx/query-d24f58126801f799b2b89b74ccbae1e8a8892d6736ecc35681d24c7ea3cd9ab2.json rename to api/.sqlx/query-c8233202c42f9d5c3f03592feedfe0be3528dec88bb11de0c569be7cc123d7f1.json index 532312447..29d885a36 100644 --- a/api/.sqlx/query-d24f58126801f799b2b89b74ccbae1e8a8892d6736ecc35681d24c7ea3cd9ab2.json +++ b/api/.sqlx/query-c8233202c42f9d5c3f03592feedfe0be3528dec88bb11de0c569be7cc123d7f1.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO users (name, email, avatar_url, github_id, gitlab_id, is_blocked, is_staff)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", + "query": "INSERT INTO users (name, email, avatar_url, github_id, gitlab_id, is_blocked, is_staff)\n VALUES ($1, $2, $3, $4, $5, $6, $7)\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", "describe": { "columns": [ { @@ -102,5 +102,5 @@ null ] }, - "hash": "d24f58126801f799b2b89b74ccbae1e8a8892d6736ecc35681d24c7ea3cd9ab2" + "hash": "c8233202c42f9d5c3f03592feedfe0be3528dec88bb11de0c569be7cc123d7f1" } diff --git a/api/.sqlx/query-ad2418b621f6507dca8d7b53ef0511233435e5271415e7fdb153103e92e96ac8.json b/api/.sqlx/query-e0d71d55b8aac7f6059b6e76fd614858a27171e79780830f72033eab6e0b3355.json similarity index 82% rename from api/.sqlx/query-ad2418b621f6507dca8d7b53ef0511233435e5271415e7fdb153103e92e96ac8.json rename to api/.sqlx/query-e0d71d55b8aac7f6059b6e76fd614858a27171e79780830f72033eab6e0b3355.json index 26f2d4961..fc04d892d 100644 --- a/api/.sqlx/query-ad2418b621f6507dca8d7b53ef0511233435e5271415e7fdb153103e92e96ac8.json +++ b/api/.sqlx/query-e0d71d55b8aac7f6059b6e76fd614858a27171e79780830f72033eab6e0b3355.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "INSERT INTO users (name, email, avatar_url, github_id, is_blocked, is_staff)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT(github_id) DO UPDATE\n SET name = $1, email = $2, avatar_url = $3\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", + "query": "INSERT INTO users (name, email, avatar_url, github_id, is_blocked, is_staff)\n VALUES ($1, $2, $3, $4, $5, $6)\n ON CONFLICT(github_id) DO UPDATE\n SET name = $1, email = $2, avatar_url = $3\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", "describe": { "columns": [ { @@ -101,5 +101,5 @@ null ] }, - "hash": "ad2418b621f6507dca8d7b53ef0511233435e5271415e7fdb153103e92e96ac8" + "hash": "e0d71d55b8aac7f6059b6e76fd614858a27171e79780830f72033eab6e0b3355" } diff --git a/api/.sqlx/query-6fb3d69cd7f0ed2b082d124345e4c73945ceb8bb29c0007d6f1625a6990ad979.json b/api/.sqlx/query-f9604d10f19c3f5779c21a03d8ac9e9d9d26f66580971ca1075d36dd0711f500.json similarity index 82% rename from api/.sqlx/query-6fb3d69cd7f0ed2b082d124345e4c73945ceb8bb29c0007d6f1625a6990ad979.json rename to api/.sqlx/query-f9604d10f19c3f5779c21a03d8ac9e9d9d26f66580971ca1075d36dd0711f500.json index d03263e5f..9fd4043a6 100644 --- a/api/.sqlx/query-6fb3d69cd7f0ed2b082d124345e4c73945ceb8bb29c0007d6f1625a6990ad979.json +++ b/api/.sqlx/query-f9604d10f19c3f5779c21a03d8ac9e9d9d26f66580971ca1075d36dd0711f500.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "UPDATE users SET gitlab_id = $1 WHERE id = $2\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", + "query": "UPDATE users SET gitlab_id = $1 WHERE id = $2\n RETURNING id, name, email, avatar_url, updated_at, created_at, github_id, gitlab_id, is_blocked, is_staff, scope_limit,\n(SELECT COUNT(created_at) FROM scope_invites WHERE target_user_id = id) as \"invite_count!\",\n(SELECT COUNT(created_at) FROM scopes WHERE creator = id) as \"scope_usage!\",\n(CASE WHEN users.is_staff THEN (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'inbound'\n) ELSE (\n SELECT COUNT(tickets.created_at) FROM tickets WHERE tickets.creator = users.id AND tickets.status NOT IN ('closed', 'spam') AND (\n SELECT tm.direction FROM ticket_messages as tm WHERE tm.ticket_id = tickets.id AND NOT tm.internal ORDER BY tm.created_at DESC LIMIT 1\n ) = 'outbound'\n) END) as \"newer_ticket_messages_count!\" ", "describe": { "columns": [ { @@ -97,5 +97,5 @@ null ] }, - "hash": "6fb3d69cd7f0ed2b082d124345e4c73945ceb8bb29c0007d6f1625a6990ad979" + "hash": "f9604d10f19c3f5779c21a03d8ac9e9d9d26f66580971ca1075d36dd0711f500" } diff --git a/api/Cargo.toml b/api/Cargo.toml index b68ef389f..ea384b16f 100644 --- a/api/Cargo.toml +++ b/api/Cargo.toml @@ -98,7 +98,7 @@ async-compression = { version = "0.4", features = ["futures-io", "gzip"] } deno_graph = "=0.110.2" deno_ast = { version = "0.53.0", features = ["view"] } # sync with frontend/deno.json -deno_doc = { version = "=0.205.0", features = ["comrak"] } +deno_doc = { version = "=0.206.0", features = ["comrak"] } deno_error = "0.7.0" comrak = { version = "0.29.0", default-features = false } ammonia = "4.0.0" diff --git a/api/migrations/20260825021500_ticket_internal_notes.sql b/api/migrations/20260825021500_ticket_internal_notes.sql new file mode 100644 index 000000000..4031e67fa --- /dev/null +++ b/api/migrations/20260825021500_ticket_internal_notes.sql @@ -0,0 +1,19 @@ +-- Staff notes on a ticket: written in the ticket, never emailed, never shown to +-- the person who opened it. +-- +-- Modelled as a flag on the existing messages rather than a table of its own so +-- that a note keeps its place in the conversation — the point of writing one is +-- that it sits next to the message it is about. + +ALTER TABLE ticket_messages ADD COLUMN internal bool NOT NULL DEFAULT false; + +-- A note is written in the JSR interface by a signed-in staff member, and is +-- never sent anywhere, so it can carry no email identity of its own. +ALTER TABLE ticket_messages ADD CONSTRAINT ticket_messages_internal_is_unsent_and_authored CHECK ( + internal = false OR (author IS NOT NULL AND direction = 'outbound' AND email_message_id IS NULL) +); + +-- The ticket page loads a whole conversation at a time, and every such read now +-- filters on this, so it belongs in the index that serves them. +DROP INDEX idx_ticket_messages_ticket_id; +CREATE INDEX idx_ticket_messages_ticket_id ON ticket_messages (ticket_id, created_at) INCLUDE (internal); diff --git a/api/src/analysis.rs b/api/src/analysis.rs index a34a85e40..4350f0bd2 100644 --- a/api/src/analysis.rs +++ b/api/src/analysis.rs @@ -234,7 +234,7 @@ async fn analyze_package_inner( .await .map_err(PublishError::NpmTarballError)?; - let (meta, readme_path) = { + let (mut meta, readme_path) = { let readme = files .iter() .find(|file| file.0.case_insensitive().is_readme()); @@ -273,9 +273,13 @@ async fn analyze_package_inner( workerd: None, bun: None, }, + // only the search index is taken from this ctx, so usage instructions + // don't matter here + false, registry_url.to_string(), None, ); + meta.symbol_count = Some(count_symbols(&ctx)); let search_index = deno_doc::html::generate_search_index(&ctx); let doc_search_json = if let serde_json::Value::Object(mut obj) = search_index { @@ -345,9 +349,41 @@ fn generate_score( ), all_fast_check, has_provenance: false, // Provenance score is updated after version publish + // filled in once the render context exists, see `count_symbols` + symbol_count: None, } } +/// Counts the symbols the generated docs actually list for a package: every +/// exported symbol of every entrypoint, plus namespace members, minus the ones +/// hidden from the listings (`@internal` and non-exported types). +/// +/// Deduplicated per `(file, qualified name)` the same way the search index is, +/// so a symbol re-exported from several entrypoints counts once per entrypoint +/// it is documented under, and never twice within one. Class/interface members +/// are not counted: they are part of their parent symbol, not separate entries +/// in the listings. +fn count_symbols(ctx: &deno_doc::html::GenerateCtx) -> u32 { + let mut seen = HashSet::new(); + + for (short_path, nodes) in &ctx.doc_nodes { + for node in deno_doc::html::partition::flatten_namespace( + ctx, + nodes.iter().map(std::borrow::Cow::Borrowed), + ) { + if node.is_internal(ctx) { + continue; + } + seen.insert(( + short_path.path.clone(), + node.get_qualified_name().to_string(), + )); + } + } + + seen.len() as u32 +} + /// Cap on how many undocumented entrypoints are recorded in /// `PackageVersionMeta`. The full list is unbounded (one entry per export) and /// `meta` is stored in the database and returned in API responses, so a diff --git a/api/src/api.yml b/api/src/api.yml index 6df968203..1fa2dbbe5 100644 --- a/api/src/api.yml +++ b/api/src/api.yml @@ -2583,6 +2583,14 @@ components: type: string enum: ["readme", "jsdoc"] description: The source of the package readme. + symbolCount: + type: integer + nullable: true + description: >- + The number of symbols documented by the latest version of the + package. Null for packages with no published version, and for + packages whose latest version was published before this count was + recorded. required: - scope - name @@ -2751,6 +2759,12 @@ components: type: string format: date-time description: The date and time when the package version was last updated. + symbolCount: + type: integer + nullable: true + description: >- + The number of symbols documented by this version. Null for versions + published before this count was recorded. required: - scope - package @@ -2812,6 +2826,12 @@ components: type: string format: date-time description: The date and time when the package version was last updated. + symbolCount: + type: integer + nullable: true + description: >- + The number of symbols documented by this version. Null for versions + published before this count was recorded. required: - scope - package diff --git a/api/src/api/admin.rs b/api/src/api/admin.rs index 8e7e7fc23..7aa57ae0e 100644 --- a/api/src/api/admin.rs +++ b/api/src/api/admin.rs @@ -357,7 +357,11 @@ pub async fn list_tickets(req: Request
) -> ApiResult