Compare commits

..
Author SHA1 Message Date
Brandon Thomas 1d68c1db25 remove comments 2026-05-20 10:46:57 -04:00
Brandon Thomas 38d3e1d129 module rename 2026-05-20 10:45:45 -04:00
Brandon Thomas b1d506807d rename "global" enums 2026-05-20 10:25:33 -04:00
Brandon Thomas 00b759c94e rename modules 2026-05-20 09:43:22 -04:00
Brandon Thomas a90b03c31d model rename 2026-05-20 09:34:46 -04:00
396 changed files with 14772 additions and 8214 deletions
-1
View File
@@ -16,7 +16,6 @@ env-secrets
pubkeys.txt
secrets.toml
secrets.yaml
secrets/
twitch_secrets.toml
# Old env secrets
@@ -0,0 +1,289 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w2l.token as template_token,\n w2l.template_type,\n w2l.creator_user_token,\n users.is_banned as creator_is_banned,\n users.username as creator_username,\n users.display_name as creator_display_name,\n users.email_gravatar_hash as creator_gravatar_hash,\n w2l.title,\n w2l.description_markdown,\n w2l.description_rendered_html,\n w2l.frame_width,\n w2l.frame_height,\n w2l.duration_millis,\n w2l.maybe_public_bucket_preview_image_object_name,\n w2l.maybe_public_bucket_preview_video_object_name,\n w2l.creator_set_visibility,\n w2l.is_public_listing_approved,\n w2l.is_locked_from_use,\n w2l.is_locked_from_user_modification,\n w2l.creator_ip_address_creation,\n w2l.creator_ip_address_last_update,\n w2l.created_at,\n w2l.updated_at,\n w2l.user_deleted_at,\n w2l.mod_deleted_at\nFROM w2l_templates as w2l\nJOIN users\n ON users.token = w2l.creator_user_token\nWHERE w2l.token = ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "template_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "template_type",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 2,
"name": "creator_user_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "creator_is_banned",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 4,
"name": "creator_username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 5,
"name": "creator_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 6,
"name": "creator_gravatar_hash",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "title",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 8,
"name": "description_markdown",
"type_info": {
"type": "Blob",
"flags": "NOT_NULL | BLOB | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 9,
"name": "description_rendered_html",
"type_info": {
"type": "Blob",
"flags": "NOT_NULL | BLOB | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 10,
"name": "frame_width",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 11,
"name": "frame_height",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 12,
"name": "duration_millis",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 13,
"name": "maybe_public_bucket_preview_image_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 14,
"name": "maybe_public_bucket_preview_video_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 15,
"name": "creator_set_visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 16,
"name": "is_public_listing_approved",
"type_info": {
"type": "Tiny",
"flags": "MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 17,
"name": "is_locked_from_use",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL | MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 18,
"name": "is_locked_from_user_modification",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL | MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 19,
"name": "creator_ip_address_creation",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 20,
"name": "creator_ip_address_last_update",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 21,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 22,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 23,
"name": "user_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 24,
"name": "mod_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true,
false,
true,
false,
false,
false,
false,
false,
false,
true,
true
]
},
"hash": "0033c76be0ea1c99069f1a8df1ce400c7064526feaf5dc88930da0718a885b19"
}
@@ -0,0 +1,36 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n id,\n status\nFROM w2l_inference_jobs\nWHERE id = ?\nFOR UPDATE\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | PRIMARY_KEY | AUTO_INCREMENT",
"char_set": 63,
"max_size": 20
}
},
{
"ordinal": 1,
"name": "status",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 64
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false
]
},
"hash": "02060ab9b8ca472a2bd4d4fa3120743e90148ccd6a4cb13bc491d00f36ed7a8f"
}
@@ -0,0 +1,168 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w2l.token as template_token,\n w2l.template_type,\n w2l.creator_user_token,\n users.username as creator_username,\n users.display_name as creator_display_name,\n w2l.title,\n w2l.frame_width,\n w2l.frame_height,\n w2l.duration_millis,\n w2l.maybe_public_bucket_preview_image_object_name,\n w2l.maybe_public_bucket_preview_video_object_name,\n w2l.is_public_listing_approved,\n w2l.created_at,\n w2l.updated_at\nFROM w2l_templates as w2l\nJOIN users\nON\n users.token = w2l.creator_user_token\nWHERE\n users.username = ?\n AND w2l.user_deleted_at IS NULL\n AND w2l.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "template_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "template_type",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 2,
"name": "creator_user_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "creator_username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 4,
"name": "creator_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 5,
"name": "title",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 6,
"name": "frame_width",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 7,
"name": "frame_height",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 8,
"name": "duration_millis",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 9,
"name": "maybe_public_bucket_preview_image_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 10,
"name": "maybe_public_bucket_preview_video_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 11,
"name": "is_public_listing_approved",
"type_info": {
"type": "Tiny",
"flags": "MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 12,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 13,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true,
true,
false,
false
]
},
"hash": "05c3ebf54cd8a5374d6f4bbe21b3c6027ce6314917af8acd0ed136d375d53342"
}
@@ -0,0 +1,289 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w2l.token as template_token,\n w2l.template_type,\n w2l.creator_user_token,\n users.is_banned as creator_is_banned,\n users.username as creator_username,\n users.display_name as creator_display_name,\n users.email_gravatar_hash as creator_gravatar_hash,\n w2l.title,\n w2l.description_markdown,\n w2l.description_rendered_html,\n w2l.frame_width,\n w2l.frame_height,\n w2l.duration_millis,\n w2l.maybe_public_bucket_preview_image_object_name,\n w2l.maybe_public_bucket_preview_video_object_name,\n w2l.creator_set_visibility,\n w2l.is_public_listing_approved,\n w2l.is_locked_from_use,\n w2l.is_locked_from_user_modification,\n w2l.creator_ip_address_creation,\n w2l.creator_ip_address_last_update,\n w2l.created_at,\n w2l.updated_at,\n w2l.user_deleted_at,\n w2l.mod_deleted_at\nFROM w2l_templates as w2l\nJOIN users\n ON users.token = w2l.creator_user_token\nWHERE\n w2l.token = ?\n AND w2l.user_deleted_at IS NULL\n AND w2l.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "template_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "template_type",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 2,
"name": "creator_user_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "creator_is_banned",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 4,
"name": "creator_username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 5,
"name": "creator_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 6,
"name": "creator_gravatar_hash",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "title",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 8,
"name": "description_markdown",
"type_info": {
"type": "Blob",
"flags": "NOT_NULL | BLOB | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 9,
"name": "description_rendered_html",
"type_info": {
"type": "Blob",
"flags": "NOT_NULL | BLOB | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 10,
"name": "frame_width",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 11,
"name": "frame_height",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 12,
"name": "duration_millis",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 13,
"name": "maybe_public_bucket_preview_image_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 14,
"name": "maybe_public_bucket_preview_video_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 15,
"name": "creator_set_visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 16,
"name": "is_public_listing_approved",
"type_info": {
"type": "Tiny",
"flags": "MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 17,
"name": "is_locked_from_use",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL | MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 18,
"name": "is_locked_from_user_modification",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL | MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 19,
"name": "creator_ip_address_creation",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 20,
"name": "creator_ip_address_last_update",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 21,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 22,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 23,
"name": "user_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 24,
"name": "mod_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true,
false,
true,
false,
false,
false,
false,
false,
false,
true,
true
]
},
"hash": "089986414149d2d189f4262f8aa7488d35f6a162a4e56f06c1b897092d37ea20"
}
@@ -0,0 +1,25 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n next_id\nFROM\n w2l_result_synthetic_ids\nWHERE\n user_token = ?\nLIMIT 1\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "next_id",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 20
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false
]
},
"hash": "1236640a30d0d5177e13c31b61b791874f7c70026003a58ba6e07e7af46c30c1"
}
@@ -1,12 +0,0 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n maybe_external_third_party = ?,\n maybe_external_third_party_id = ?,\n\n product_category = ?,\n inference_category = ?,\n\n maybe_model_type = ?,\n maybe_model_token = ?,\n\n maybe_input_source_token = ?,\n maybe_input_source_token_type = ?,\n\n maybe_download_url = ?,\n maybe_cover_image_media_file_token = ?,\n\n maybe_prompt_token = ?,\n maybe_wallet_ledger_entry_token = ?,\n\n maybe_raw_inference_text = ?,\n\n maybe_inference_args = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n priority_level = ?,\n is_keepalive_required = ?,\n max_duration_seconds = ?,\n is_debug_request = ?,\n\n maybe_routing_tag = ?,\n\n maybe_debug_log_event_token = ?,\n\n frontend_failure_category = ?,\n failure_reason = ?,\n\n status = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 30
},
"nullable": []
},
"hash": "161febbb30cf6c669a813fe036d405ef428422297440abd240482a6aae51f6f9"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_templates\nSET\n is_public_listing_approved = ?,\n is_locked_from_user_modification = ?,\n is_locked_from_use = ?,\n maybe_mod_comments = ?,\n maybe_mod_user_token = ?,\n version = version + 1\nWHERE token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 6
},
"nullable": []
},
"hash": "17c8d210d93ee9c0d8e8422eed605c9150f19f9bf72affcf111b15a67a5b9e70"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO w2l_template_upload_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n title = ?,\n template_type = ?,\n download_url = ?,\n status = \"pending\"\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 8
},
"nullable": []
},
"hash": "25e7858d370ac1359deb42ef5292e85ccd1fe7debf3a1ba73303e5882523a4d0"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_template_upload_jobs\nSET\n status = ?,\n failure_reason = ?,\n retry_at = NOW() + interval 2 minute\nWHERE id = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "294c089b17fdd87d7e579c05a9d90e9bfa5b7465cafa9a95af08d58709212440"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_inference_jobs\nSET\n status = ?,\n failure_reason = ?,\n retry_at = NOW() + interval 2 minute\nWHERE id = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "2b04dd7db52ef3a97a6f420a22a4dbee7416ae58697438df69e87ffd47bbf350"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_results\nSET\n creator_set_visibility = ?,\n maybe_mod_user_token = ?\nWHERE token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "33cd0c0b8eaaf494ef97232ac89775b8eb6a22d310824b7aa7db310dd4fd41b1"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO w2l_result_synthetic_ids\nSET\n user_token = ?,\n next_id = 1\nON DUPLICATE KEY UPDATE\n user_token = ?,\n next_id = next_id + 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "34642399c3e91960768cb659b6006db291574d9cd07a5bace3db573eff20c3fb"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO w2l_results\nSET\n token = ?,\n maybe_w2l_template_token = ?,\n maybe_creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n maybe_creator_synthetic_id = ?,\n\n public_bucket_video_path = ?,\n\n file_size_bytes = ?,\n mime_type = ?,\n frame_width = ?,\n frame_height = ?,\n duration_millis = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 12
},
"nullable": []
},
"hash": "369a7576edc128cf2b310648d6fc45a2191c1263d433fe6d1461d15dbf26690e"
}
@@ -0,0 +1,168 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w2l.token as template_token,\n w2l.template_type,\n w2l.creator_user_token,\n users.username as creator_username,\n users.display_name as creator_display_name,\n w2l.title,\n w2l.frame_width,\n w2l.frame_height,\n w2l.duration_millis,\n w2l.maybe_public_bucket_preview_image_object_name,\n w2l.maybe_public_bucket_preview_video_object_name,\n w2l.is_public_listing_approved,\n w2l.created_at,\n w2l.updated_at\nFROM w2l_templates as w2l\nJOIN users\n ON users.token = w2l.creator_user_token\nWHERE\n w2l.is_public_listing_approved IS TRUE\n AND w2l.user_deleted_at IS NULL\n AND w2l.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "template_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "template_type",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 2,
"name": "creator_user_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "creator_username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 4,
"name": "creator_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 5,
"name": "title",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 6,
"name": "frame_width",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 7,
"name": "frame_height",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 8,
"name": "duration_millis",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 9,
"name": "maybe_public_bucket_preview_image_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 10,
"name": "maybe_public_bucket_preview_video_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 11,
"name": "is_public_listing_approved",
"type_info": {
"type": "Tiny",
"flags": "MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 12,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 13,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true,
true,
false,
false
]
},
"hash": "417dd070beeaf6ccd86852b7e99bf7fda5c5b15da4a3bcc066a0e2bb90ca7df1"
}
@@ -0,0 +1,69 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n users.username,\n users.display_name,\n users.email_gravatar_hash as gravatar_hash,\n creator_user_token,\n count(*) as uploaded_count\nFROM w2l_templates\nJOIN users\nON\n users.token = creator_user_token\nWHERE\n is_public_listing_approved IS TRUE\n AND users.is_banned IS FALSE\n AND w2l_templates.user_deleted_at IS NULL\n AND w2l_templates.mod_deleted_at IS NULL\nGROUP BY creator_user_token\nORDER BY uploaded_count desc\nLIMIT 25;\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 1,
"name": "display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 2,
"name": "gravatar_hash",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "creator_user_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "uploaded_count",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | BINARY",
"char_set": 63,
"max_size": 21
}
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
false,
false,
false,
false
]
},
"hash": "4c7a92b6ac43e271096138f3594ca27b0ab6622b1e29a28f4a034c7732be9312"
}
@@ -0,0 +1,300 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w2l_results.token as w2l_result_token,\n w2l_results.maybe_tts_inference_result_token,\n\n w2l_results.public_bucket_video_path,\n\n w2l_templates.token as maybe_w2l_template_token,\n w2l_templates.template_type,\n w2l_templates.title as template_title,\n\n users.token as maybe_creator_user_token,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n users.is_banned as maybe_creator_is_banned,\n\n template_users.token as maybe_template_creator_user_token,\n template_users.username as maybe_template_creator_username,\n template_users.display_name as maybe_template_creator_display_name,\n template_users.email_gravatar_hash as maybe_template_creator_gravatar_hash,\n template_users.is_banned as maybe_template_creator_is_banned,\n\n w2l_results.creator_set_visibility,\n\n w2l_results.file_size_bytes,\n w2l_results.frame_width,\n w2l_results.frame_height,\n w2l_results.duration_millis,\n w2l_results.created_at,\n w2l_results.updated_at,\n\n w2l_results.creator_ip_address,\n w2l_results.user_deleted_at,\n w2l_results.mod_deleted_at\n\nFROM w2l_results\nLEFT OUTER JOIN w2l_templates\n ON w2l_results.maybe_w2l_template_token = w2l_templates.token\nLEFT OUTER JOIN users\n ON w2l_results.maybe_creator_user_token = users.token\nLEFT OUTER JOIN users as template_users\n ON w2l_templates.creator_user_token = template_users.token\nWHERE\n w2l_results.token = ?\n AND w2l_results.user_deleted_at IS NULL\n AND w2l_results.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "w2l_result_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "maybe_tts_inference_result_token",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "public_bucket_video_path",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 3,
"name": "maybe_w2l_template_token",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "template_type",
"type_info": {
"type": "String",
"flags": "MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 5,
"name": "template_title",
"type_info": {
"type": "String",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 6,
"name": "maybe_creator_user_token",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "maybe_creator_username",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 8,
"name": "maybe_creator_display_name",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 9,
"name": "maybe_creator_gravatar_hash",
"type_info": {
"type": "String",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 10,
"name": "maybe_creator_is_banned",
"type_info": {
"type": "Tiny",
"flags": "",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 11,
"name": "maybe_template_creator_user_token",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 12,
"name": "maybe_template_creator_username",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 13,
"name": "maybe_template_creator_display_name",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 14,
"name": "maybe_template_creator_gravatar_hash",
"type_info": {
"type": "String",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 15,
"name": "maybe_template_creator_is_banned",
"type_info": {
"type": "Tiny",
"flags": "",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 16,
"name": "creator_set_visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 17,
"name": "file_size_bytes",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 18,
"name": "frame_width",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 19,
"name": "frame_height",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 20,
"name": "duration_millis",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 21,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 22,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 23,
"name": "creator_ip_address",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 24,
"name": "user_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 25,
"name": "mod_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
true,
false,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true
]
},
"hash": "4ff1b1e0cc36f6c2f1a9b099f38751ae7f35666be939b4074bdfc98e031cd6ac"
}
@@ -0,0 +1,124 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n jobs.token as job_token,\n\n jobs.status,\n jobs.attempt_count,\n jobs.on_success_result_token as maybe_result_token,\n results.public_bucket_video_path as maybe_public_bucket_video_path,\n\n jobs.maybe_w2l_template_token,\n w2l.template_type as w2l_template_type,\n w2l.title,\n\n jobs.created_at,\n jobs.updated_at\n\nFROM w2l_inference_jobs as jobs\nJOIN w2l_templates as w2l\n ON w2l.token = jobs.maybe_w2l_template_token\nLEFT OUTER JOIN w2l_results as results\n ON jobs.on_success_result_token = results.token\n\nWHERE jobs.token = ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "job_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "status",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 2,
"name": "attempt_count",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 3
}
},
{
"ordinal": 3,
"name": "maybe_result_token",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "maybe_public_bucket_video_path",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 5,
"name": "maybe_w2l_template_token",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 6,
"name": "w2l_template_type",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 7,
"name": "title",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 8,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 9,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
true,
true,
true,
false,
false,
false,
false
]
},
"hash": "57928b1001a10a88ac5a07f43b1dd30f6dee6edbc0808be99fe1233f9e276c56"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_templates\nSET\n title = ?,\n description_markdown = ?,\n description_rendered_html = ?,\n creator_set_visibility = ?,\n maybe_mod_user_token = ?,\n version = version + 1\nWHERE token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 6
},
"nullable": []
},
"hash": "60c06a507349919addb5d26b1c4a283a04f66fce86e84ed0a51db6001c9fc2b5"
}
@@ -0,0 +1,135 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w2l_templates.token as template_token,\n w2l_templates.title,\n w2l_templates.template_type,\n w2l_templates.duration_millis,\n w2l_templates.frame_width,\n w2l_templates.frame_height,\n w2l_templates.creator_user_token,\n users.username AS creator_username,\n users.display_name AS creator_display_name,\n users.email_gravatar_hash AS creator_gravatar_hash,\n w2l_templates.created_at\nFROM\n w2l_templates\nJOIN\n users\nON\n users.token = w2l_templates.creator_user_token\nWHERE\n w2l_templates.is_public_listing_approved IS NULL\n AND w2l_templates.user_deleted_at IS NULL\n AND w2l_templates.mod_deleted_at IS NULL\n AND w2l_templates.is_locked_from_use IS FALSE\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "template_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "title",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 2,
"name": "template_type",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 3,
"name": "duration_millis",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 4,
"name": "frame_width",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 5,
"name": "frame_height",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 6,
"name": "creator_user_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "creator_username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 8,
"name": "creator_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 9,
"name": "creator_gravatar_hash",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 10,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
false
]
},
"hash": "619d18c87075a86c01f1e0ac26744774293ff8ca6b0011ce611b3f47d8a97a0e"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_template_upload_jobs\nSET\n status = 'started',\n attempt_count = attempt_count + 1,\n retry_at = NOW() + interval 2 minute\nWHERE id = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "641253d4c621f75037877651bba044a21033f50a5e3f8fed9b06ec967a508853"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_results\nSET\n mod_deleted_at = CURRENT_TIMESTAMP,\n maybe_mod_user_token = ?\nWHERE\n token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "663506988f146de6f559e5df4f4a2b607e9421a69bb57db1f656774bf8b375db"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_template_upload_jobs\nSET\n status = ?,\n on_success_result_token = ?,\n failure_reason = NULL,\n retry_at = NULL\nWHERE id = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "73558104936aab6add2d9c789b368b5f155f1fe01d32e7314f2f120422866f54"
}
@@ -0,0 +1,25 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n token as template_token\nFROM w2l_templates\nWHERE\n token = ?\n AND user_deleted_at IS NULL\n AND mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "template_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false
]
},
"hash": "7622292c05fe1b5832136762042780a12a02048166bb1b4492dfd627c48c8968"
}
@@ -0,0 +1,168 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w2l.token as template_token,\n w2l.template_type,\n w2l.creator_user_token,\n users.username as creator_username,\n users.display_name as creator_display_name,\n w2l.title,\n w2l.frame_width,\n w2l.frame_height,\n w2l.duration_millis,\n w2l.maybe_public_bucket_preview_image_object_name,\n w2l.maybe_public_bucket_preview_video_object_name,\n w2l.is_public_listing_approved,\n w2l.created_at,\n w2l.updated_at\nFROM w2l_templates as w2l\nJOIN users\n ON users.token = w2l.creator_user_token\nWHERE\n w2l.user_deleted_at IS NULL\n AND w2l.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "template_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "template_type",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 2,
"name": "creator_user_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "creator_username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 4,
"name": "creator_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 5,
"name": "title",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 6,
"name": "frame_width",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 7,
"name": "frame_height",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 8,
"name": "duration_millis",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 9,
"name": "maybe_public_bucket_preview_image_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 10,
"name": "maybe_public_bucket_preview_video_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 11,
"name": "is_public_listing_approved",
"type_info": {
"type": "Tiny",
"flags": "MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 12,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 13,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true,
true,
false,
false
]
},
"hash": "7cd0ad5d7b9a2c393f799beadc1e0a6bc85d952e07a1b82a52115b99be40ff6d"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n maybe_external_third_party = ?,\n maybe_external_third_party_id = ?,\n\n product_category = ?,\n inference_category = ?,\n\n maybe_model_type = NULL,\n maybe_model_token = NULL,\n\n maybe_input_source_token = NULL,\n maybe_input_source_token_type = NULL,\n\n maybe_download_url = NULL,\n maybe_cover_image_media_file_token = NULL,\n\n maybe_prompt_token = ?,\n\n maybe_wallet_ledger_entry_token = ?,\n\n maybe_raw_inference_text = NULL,\n\n maybe_inference_args = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n priority_level = 0,\n is_keepalive_required = FALSE,\n max_duration_seconds = 0,\n\n is_debug_request = FALSE,\n maybe_routing_tag = NULL,\n\n maybe_debug_log_event_token = ?,\n\n status = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 16
},
"nullable": []
},
"hash": "8f8b64c0af5383ff3baaa8aa2f2aa22cc760addd850d618ce543fe05816d11e0"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_templates\nSET\n creator_ip_address_last_update = ?,\n user_deleted_at = CURRENT_TIMESTAMP\nWHERE\n token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "8ff27fc5583db97f157f1b808f593a72c77dc5dcf5a633cd9c1162af6b97c011"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n maybe_external_third_party = ?,\n maybe_external_third_party_id = ?,\n\n product_category = ?,\n inference_category = ?,\n\n maybe_model_type = NULL,\n maybe_model_token = NULL,\n\n maybe_input_source_token = NULL,\n maybe_input_source_token_type = NULL,\n\n maybe_download_url = NULL,\n maybe_cover_image_media_file_token = NULL,\n\n maybe_prompt_token = ?,\n\n maybe_raw_inference_text = NULL,\n\n maybe_inference_args = NULL,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n priority_level = 0,\n is_keepalive_required = FALSE,\n max_duration_seconds = 0,\n\n is_debug_request = FALSE,\n maybe_routing_tag = NULL,\n\n maybe_debug_log_event_token = ?,\n\n frontend_failure_category = NULL,\n failure_reason = NULL,\n\n status = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 14
},
"nullable": []
},
"hash": "99dae5c5f3b3a8e9ce105bff9a9754c3aee92dbf217288c9a7eb925004e3d259"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO w2l_templates\nSET\n token = ?,\n template_type = ?,\n title = ?,\n description_markdown = '',\n description_rendered_html = '',\n creator_user_token = ?,\n creator_ip_address_creation = ?,\n creator_ip_address_last_update = ?,\n original_download_url = ?,\n private_bucket_hash = ?,\n private_bucket_object_name = ?,\n private_bucket_cached_faces_object_name = ?,\n maybe_public_bucket_preview_image_object_name = ?,\n maybe_public_bucket_preview_video_object_name = ?,\n file_size_bytes = ?,\n mime_type = ?,\n frame_width = ?,\n frame_height = ?,\n frame_count = ?,\n fps = ?,\n duration_millis = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 19
},
"nullable": []
},
"hash": "9a879f76345ef5682b995f99026fac8b2f4c64c8ec4bb078187d1e53effcfbaf"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_results\nSET\n creator_set_visibility = ?,\n creator_ip_address = ?\nWHERE token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "9cc5f697350814199344d3d9a0ff026e0d1e09e9097648400d4b63cfcbd31178"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO w2l_inference_jobs\nSET\n maybe_w2l_template_token = ?,\n maybe_tts_inference_result_token = ?,\n maybe_public_audio_bucket_location = NULL,\n maybe_public_image_bucket_location = NULL,\n maybe_creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n status = \"pending\"\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 5
},
"nullable": []
},
"hash": "9d4932baa4023accc2d28af98b58a47149d37c4937cd0171e6b955c09855c5f8"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_inference_jobs\nSET\n status = ?,\n on_success_result_token = ?,\n failure_reason = NULL,\n retry_at = NULL\nWHERE id = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "a125f183f7ae5627fc2118e7302cea73d967200ba1cbb12550f5880187b7db5e"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_template_upload_jobs\nSET\n status = \"dead\",\n failure_reason = ?,\n retry_at = NULL\nWHERE id = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "ab981965f518a8986aaaba41ed821fcb438db4c6156cbb26f639921225a88d59"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_results\nSET\n mod_deleted_at = NULL,\n maybe_mod_user_token = ?\nWHERE\n token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "adf2d5eb967fa2bc00fad1c8fcc2e1bf4384d39dc54e8240d78bb4ca6fcc3409"
}
@@ -0,0 +1,91 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n jobs.token as job_token,\n\n jobs.status,\n jobs.attempt_count,\n jobs.on_success_result_token as maybe_template_token,\n\n jobs.failure_reason as maybe_failure_reason,\n\n jobs.created_at,\n jobs.updated_at\n\nFROM w2l_template_upload_jobs as jobs\n\nWHERE jobs.token = ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "job_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "status",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 2,
"name": "attempt_count",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 3
}
},
{
"ordinal": 3,
"name": "maybe_template_token",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "maybe_failure_reason",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 2048
}
},
{
"ordinal": 5,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 6,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
true,
true,
false,
false
]
},
"hash": "ae04054c4d32e581dd183fd7ebb8e48fc7df856d2ffd8036d9ce6006bb7a296a"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n maybe_external_third_party = ?,\n maybe_external_third_party_id = ?,\n\n product_category = ?,\n inference_category = ?,\n\n maybe_model_type = NULL,\n maybe_model_token = NULL,\n\n maybe_input_source_token = NULL,\n maybe_input_source_token_type = NULL,\n\n maybe_download_url = NULL,\n maybe_cover_image_media_file_token = NULL,\n\n maybe_prompt_token = NULL,\n\n maybe_wallet_ledger_entry_token = NULL,\n\n maybe_raw_inference_text = NULL,\n\n maybe_inference_args = NULL,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n priority_level = 0,\n is_keepalive_required = FALSE,\n max_duration_seconds = 0,\n\n is_debug_request = FALSE,\n maybe_routing_tag = NULL,\n\n status = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 12
},
"nullable": []
},
"hash": "b0ba0fe63908df3d66b4820ca47cbb773786e480464c84a278fe63b1fa8913b4"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n product_category = ?,\n\n inference_category = ?,\n maybe_model_type = ?,\n maybe_model_token = ?,\n\n maybe_input_source_token = ?,\n maybe_input_source_token_type = ?,\n\n maybe_download_url = ?,\n maybe_cover_image_media_file_token = ?,\n\n maybe_raw_inference_text = ?,\n\n maybe_inference_args = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n\n creator_set_visibility = ?,\n\n priority_level = ?,\n is_keepalive_required = ?,\n max_duration_seconds = ?,\n\n is_debug_request = ?,\n maybe_routing_tag = ?,\n\n status = \"pending\"\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 22
},
"nullable": []
},
"hash": "b48e80845d80a6c07099918807d0495b8d70dca339cb1332e05bb3943fbb24c4"
}
@@ -0,0 +1,190 @@
{
"db_name": "MySQL",
"query": "\nSELECT *\nFROM w2l_template_upload_jobs\nWHERE\n (\n status IN (\"pending\", \"attempt_failed\")\n )\n AND\n (\n retry_at IS NULL\n OR\n retry_at < CURRENT_TIMESTAMP\n )\n LIMIT ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | PRIMARY_KEY | AUTO_INCREMENT",
"char_set": 63,
"max_size": 20
}
},
{
"ordinal": 1,
"name": "token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "uuid_idempotency_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 144
}
},
{
"ordinal": 3,
"name": "on_success_result_token",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "title",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 5,
"name": "template_type",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 6,
"name": "download_url",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 2048
}
},
{
"ordinal": 7,
"name": "creator_user_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 8,
"name": "creator_ip_address",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 9,
"name": "creator_set_visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 10,
"name": "status",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 11,
"name": "attempt_count",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 3
}
},
{
"ordinal": 12,
"name": "failure_reason",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 2048
}
},
{
"ordinal": 13,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 14,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 15,
"name": "retry_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
true,
false,
false,
true,
false,
false,
false,
false,
false,
true,
false,
false,
true
]
},
"hash": "b7535ecf2e63b7f02b5b96f833fd8cd28285b24473df6f89795ff360c1723215"
}
@@ -0,0 +1,300 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w2l_results.token as w2l_result_token,\n w2l_results.maybe_tts_inference_result_token,\n\n w2l_results.public_bucket_video_path,\n\n w2l_templates.token as maybe_w2l_template_token,\n w2l_templates.template_type,\n w2l_templates.title as template_title,\n\n users.token as maybe_creator_user_token,\n users.username as maybe_creator_username,\n users.display_name as maybe_creator_display_name,\n users.email_gravatar_hash as maybe_creator_gravatar_hash,\n users.is_banned as maybe_creator_is_banned,\n\n template_users.token as maybe_template_creator_user_token,\n template_users.username as maybe_template_creator_username,\n template_users.display_name as maybe_template_creator_display_name,\n template_users.email_gravatar_hash as maybe_template_creator_gravatar_hash,\n template_users.is_banned as maybe_template_creator_is_banned,\n\n w2l_results.creator_set_visibility,\n\n w2l_results.file_size_bytes,\n w2l_results.frame_width,\n w2l_results.frame_height,\n w2l_results.duration_millis,\n w2l_results.created_at,\n w2l_results.updated_at,\n\n w2l_results.creator_ip_address,\n w2l_results.user_deleted_at,\n w2l_results.mod_deleted_at\n\nFROM w2l_results\nLEFT OUTER JOIN w2l_templates\n ON w2l_results.maybe_w2l_template_token = w2l_templates.token\nLEFT OUTER JOIN users\n ON w2l_results.maybe_creator_user_token = users.token\nLEFT OUTER JOIN users as template_users\n ON w2l_templates.creator_user_token = template_users.token\nWHERE\n w2l_results.token = ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "w2l_result_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "maybe_tts_inference_result_token",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "public_bucket_video_path",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 3,
"name": "maybe_w2l_template_token",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "template_type",
"type_info": {
"type": "String",
"flags": "MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 5,
"name": "template_title",
"type_info": {
"type": "String",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 6,
"name": "maybe_creator_user_token",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "maybe_creator_username",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 8,
"name": "maybe_creator_display_name",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 9,
"name": "maybe_creator_gravatar_hash",
"type_info": {
"type": "String",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 10,
"name": "maybe_creator_is_banned",
"type_info": {
"type": "Tiny",
"flags": "",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 11,
"name": "maybe_template_creator_user_token",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 12,
"name": "maybe_template_creator_username",
"type_info": {
"type": "VarString",
"flags": "UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 13,
"name": "maybe_template_creator_display_name",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 14,
"name": "maybe_template_creator_gravatar_hash",
"type_info": {
"type": "String",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 15,
"name": "maybe_template_creator_is_banned",
"type_info": {
"type": "Tiny",
"flags": "",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 16,
"name": "creator_set_visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 17,
"name": "file_size_bytes",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 18,
"name": "frame_width",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 19,
"name": "frame_height",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 20,
"name": "duration_millis",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 21,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 22,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 23,
"name": "creator_ip_address",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 24,
"name": "user_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 25,
"name": "mod_deleted_at",
"type_info": {
"type": "Timestamp",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
true,
false,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
true,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true
]
},
"hash": "ba31fefd3e96fd238fc2bcdfab64f390a17293f2c0996ae891ed8821e57512cd"
}
@@ -0,0 +1,168 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w2l.token as template_token,\n w2l.template_type,\n w2l.creator_user_token,\n users.username as creator_username,\n users.display_name as creator_display_name,\n w2l.title,\n w2l.frame_width,\n w2l.frame_height,\n w2l.duration_millis,\n w2l.private_bucket_hash,\n w2l.maybe_public_bucket_preview_image_object_name,\n w2l.maybe_public_bucket_preview_video_object_name,\n w2l.created_at,\n w2l.updated_at\nFROM w2l_templates as w2l\nJOIN users\nON users.token = w2l.creator_user_token\nWHERE w2l.token = ?\nAND w2l.user_deleted_at IS NULL\nAND w2l.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "template_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "template_type",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 2,
"name": "creator_user_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "creator_username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 4,
"name": "creator_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 5,
"name": "title",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 6,
"name": "frame_width",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 7,
"name": "frame_height",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 8,
"name": "duration_millis",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 9,
"name": "private_bucket_hash",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 10,
"name": "maybe_public_bucket_preview_image_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 11,
"name": "maybe_public_bucket_preview_video_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 12,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 13,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true,
false,
false
]
},
"hash": "bc9c6b57b2578b8163956d11a5f6a9a77ddab6098d2c4207e1a70502db30c9d1"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_templates\nSET\n is_public_listing_approved = ?,\n maybe_mod_user_token = ?\nWHERE\n token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 3
},
"nullable": []
},
"hash": "bee13160674414391587f56e8fb0aa3629e3dfcead0afa5759bff1e161f1bb6e"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_templates\nSET\n maybe_mod_user_token = ?,\n mod_deleted_at = NULL\nWHERE\n token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "c4640a618e1d179fa95adce67a329818f8b1626ac88fa76dbb871b8788136191"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n maybe_external_third_party = ?,\n maybe_external_third_party_id = ?,\n\n product_category = ?,\n inference_category = ?,\n\n maybe_model_type = NULL,\n maybe_model_token = NULL,\n\n maybe_input_source_token = NULL,\n maybe_input_source_token_type = NULL,\n\n maybe_download_url = NULL,\n maybe_cover_image_media_file_token = NULL,\n\n maybe_prompt_token = ?,\n\n maybe_raw_inference_text = NULL,\n\n maybe_inference_args = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n priority_level = 0,\n is_keepalive_required = FALSE,\n max_duration_seconds = 0,\n\n is_debug_request = FALSE,\n maybe_routing_tag = NULL,\n\n maybe_debug_log_event_token = ?,\n\n frontend_failure_category = ?,\n failure_reason = ?,\n\n status = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 17
},
"nullable": []
},
"hash": "c73be10c5677f78f81bc1c29872fd5af889790c3b2a8de27eb8ab64383c638d6"
}
@@ -0,0 +1,256 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n id,\n token AS inference_job_token,\n uuid_idempotency_token,\n\n maybe_w2l_template_token,\n maybe_public_image_bucket_location,\n maybe_tts_inference_result_token,\n maybe_public_audio_bucket_hash,\n maybe_public_audio_bucket_location,\n\n maybe_original_audio_filename,\n maybe_original_audio_download_url,\n maybe_audio_mime_type,\n\n creator_ip_address,\n maybe_creator_user_token,\n\n creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n disable_end_bump,\n disable_watermark,\n\n status,\n attempt_count,\n failure_reason,\n created_at,\n updated_at,\n retry_at\nFROM w2l_inference_jobs\nWHERE\n (\n status IN (\"pending\", \"attempt_failed\")\n )\n AND\n (\n retry_at IS NULL\n OR\n retry_at < CURRENT_TIMESTAMP\n )\n LIMIT ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | PRIMARY_KEY | AUTO_INCREMENT",
"char_set": 63,
"max_size": 20
}
},
{
"ordinal": 1,
"name": "inference_job_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 2,
"name": "uuid_idempotency_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 144
}
},
{
"ordinal": 3,
"name": "maybe_w2l_template_token",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 4,
"name": "maybe_public_image_bucket_location",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 5,
"name": "maybe_tts_inference_result_token",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 6,
"name": "maybe_public_audio_bucket_hash",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 256
}
},
{
"ordinal": 7,
"name": "maybe_public_audio_bucket_location",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 8,
"name": "maybe_original_audio_filename",
"type_info": {
"type": "String",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 9,
"name": "maybe_original_audio_download_url",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 2048
}
},
{
"ordinal": 10,
"name": "maybe_audio_mime_type",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 11,
"name": "creator_ip_address",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 12,
"name": "maybe_creator_user_token",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 13,
"name": "creator_set_visibility: enums::common::visibility::Visibility",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 14,
"name": "disable_end_bump",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 15,
"name": "disable_watermark",
"type_info": {
"type": "Tiny",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 16,
"name": "status",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 17,
"name": "attempt_count",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 3
}
},
{
"ordinal": 18,
"name": "failure_reason",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 2048
}
},
{
"ordinal": 19,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 20,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 21,
"name": "retry_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
true,
true,
true,
true,
true,
true,
true,
true,
false,
true,
false,
false,
false,
false,
false,
true,
false,
false,
true
]
},
"hash": "ce8560e2ff8c879647c7b9f154a8987765272c53f95b9e6a8b8ee5c4ad7b1f17"
}
@@ -0,0 +1,36 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n id,\n status\nFROM w2l_template_upload_jobs\nWHERE id = ?\nFOR UPDATE\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | PRIMARY_KEY | AUTO_INCREMENT",
"char_set": 63,
"max_size": 20
}
},
{
"ordinal": 1,
"name": "status",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 64
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false
]
},
"hash": "d12757abef811cd6951e0e1427fdb496a8931b547519d320f5ade56007d3eb5d"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_templates\nSET\n title = ?,\n description_markdown = ?,\n description_rendered_html = ?,\n creator_set_visibility = ?,\n creator_ip_address_last_update = ?,\n version = version + 1\nWHERE token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 6
},
"nullable": []
},
"hash": "d2ef33027abc15b6ec00260f7d30a8c66a3190229ea103ecb571d4957af63525"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO w2l_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n maybe_w2l_template_token = ?,\n maybe_public_audio_bucket_hash = ?,\n maybe_public_audio_bucket_location = ?,\n\n maybe_original_audio_filename = ?,\n maybe_audio_mime_type = ?,\n\n maybe_creator_user_token = ?,\n creator_ip_address = ?,\n disable_end_bump = false,\n creator_set_visibility = ?,\n status = \"pending\"\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 10
},
"nullable": []
},
"hash": "d850784ca167e686b91fdd4d3cce20c7a00e4e38e4da629733114a1c55ba4ab3"
}
@@ -0,0 +1,36 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n NOW() - t2.created_at AS seconds_since_first,\n (\n SELECT\n count(t1.id) as pending_count\n FROM w2l_inference_jobs AS t1\n WHERE t1.status = \"pending\"\n ) as pending_count\nFROM w2l_inference_jobs AS t2\nWHERE t2.status = \"pending\"\nORDER BY t2.id ASC\nLIMIT 1\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "seconds_since_first",
"type_info": {
"type": "LongLong",
"flags": "NOT_NULL | BINARY",
"char_set": 63,
"max_size": 16
}
},
{
"ordinal": 1,
"name": "pending_count",
"type_info": {
"type": "LongLong",
"flags": "BINARY",
"char_set": 63,
"max_size": 21
}
}
],
"parameters": {
"Right": 0
},
"nullable": [
false,
true
]
},
"hash": "dfe818ab849c5f6e2a5931142aab640d249aa96cb85dc06bfffae4d7feef541e"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_templates\nSET\n creator_ip_address_last_update = ?,\n user_deleted_at = NULL\nWHERE\n token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "e0ad2a7fe4ae795e4f097f604d5cfcf9605298b58cde5ca23bdf9c8ec7383b00"
}
@@ -0,0 +1,168 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n w2l.token as template_token,\n w2l.template_type,\n w2l.creator_user_token,\n users.username as creator_username,\n users.display_name as creator_display_name,\n w2l.title,\n w2l.frame_width,\n w2l.frame_height,\n w2l.duration_millis,\n w2l.maybe_public_bucket_preview_image_object_name,\n w2l.maybe_public_bucket_preview_video_object_name,\n w2l.is_public_listing_approved,\n w2l.created_at,\n w2l.updated_at\nFROM w2l_templates as w2l\nJOIN users\nON\n users.token = w2l.creator_user_token\nWHERE\n users.username = ?\n AND w2l.is_public_listing_approved IS TRUE\n AND w2l.user_deleted_at IS NULL\n AND w2l.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "template_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "template_type",
"type_info": {
"type": "String",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | ENUM",
"char_set": 224,
"max_size": 28
}
},
{
"ordinal": 2,
"name": "creator_user_token",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "creator_username",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 4,
"name": "creator_display_name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 80
}
},
{
"ordinal": 5,
"name": "title",
"type_info": {
"type": "String",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 6,
"name": "frame_width",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 7,
"name": "frame_height",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 8,
"name": "duration_millis",
"type_info": {
"type": "Long",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
}
},
{
"ordinal": 9,
"name": "maybe_public_bucket_preview_image_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 10,
"name": "maybe_public_bucket_preview_video_object_name",
"type_info": {
"type": "VarString",
"flags": "BINARY",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 11,
"name": "is_public_listing_approved",
"type_info": {
"type": "Tiny",
"flags": "MULTIPLE_KEY",
"char_set": 63,
"max_size": 1
}
},
{
"ordinal": 12,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
},
{
"ordinal": 13,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
false,
false,
false,
false,
false,
true,
true,
true,
false,
false
]
},
"hash": "e3a0bd8073c3c0d84b9ab0e2e1ad8371f14b10801b7e4658b73c42ce1b27fa0b"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_templates\nSET\n maybe_mod_user_token = ?,\n mod_deleted_at = CURRENT_TIMESTAMP\nWHERE\n token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "e4e5be790f087b9aa6bee87e2315140bf621e4919362ebe72ab070163f18e9c8"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_results\nSET\n user_deleted_at = NULL\nWHERE\n token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "e9ec861d6eb135370f9baf3a866282ec5686d4b299fc4ec10900ab32ea8577d8"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_inference_jobs\nSET\n status = 'started',\n attempt_count = attempt_count + 1,\n retry_at = NOW() + interval 2 minute\nWHERE id = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "ee05f95e45f7aaa5811d70b1f00d3f40a361536dfc6451affcad97586dc3338f"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO generic_inference_jobs\nSET\n token = ?,\n uuid_idempotency_token = ?,\n\n job_type = ?,\n\n maybe_external_third_party = ?,\n maybe_external_third_party_id = ?,\n\n product_category = ?,\n inference_category = ?,\n\n maybe_model_type = NULL,\n maybe_model_token = NULL,\n\n maybe_input_source_token = NULL,\n maybe_input_source_token_type = NULL,\n\n maybe_download_url = NULL,\n maybe_cover_image_media_file_token = NULL,\n\n maybe_prompt_token = ?,\n\n maybe_wallet_ledger_entry_token = ?,\n\n maybe_raw_inference_text = NULL,\n\n maybe_inference_args = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n\n priority_level = 0,\n is_keepalive_required = FALSE,\n max_duration_seconds = 0,\n\n is_debug_request = FALSE,\n maybe_routing_tag = NULL,\n\n status = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 15
},
"nullable": []
},
"hash": "ee228ab4a079fde6b3683b6cde2a2384d3def27a5d09baa5caf00a521d5d2bcd"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nUPDATE w2l_results\nSET\n user_deleted_at = CURRENT_TIMESTAMP\nWHERE\n token = ?\nLIMIT 1\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "ffa85f7c65101a43653c724479ee080e0a74577d2ae37863b039f3a452493d1e"
}
Generated
+113 -394
View File
@@ -357,7 +357,7 @@ dependencies = [
"actix-rt",
"actix-web",
"log",
"server_environment",
"reusable_types",
"speculoos",
"url",
"workspace-build-acceleration",
@@ -420,23 +420,6 @@ dependencies = [
"cpufeatures",
]
[[package]]
name = "agent-notify-server"
version = "0.0.1"
dependencies = [
"actix-web",
"anyhow",
"env_logger 0.11.9",
"log",
"rand 0.9.2",
"rodio",
"serde",
"serde_derive",
"serde_yaml",
"tokio",
"workspace-build-acceleration",
]
[[package]]
name = "ahash"
version = "0.7.8"
@@ -509,18 +492,6 @@ dependencies = [
"nix 0.23.2",
]
[[package]]
name = "alsa"
version = "0.9.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ed7572b7ba83a31e20d1b48970ee402d2e3e0537dcfe0a3ff4d6eb7508617d43"
dependencies = [
"alsa-sys",
"bitflags 2.11.0",
"cfg-if",
"libc",
]
[[package]]
name = "alsa-sys"
version = "0.3.1"
@@ -631,7 +602,7 @@ checksum = "291e6a250ff86cd4a820112fb8898808a366d8f9f58ce16d1f538353ad55747d"
dependencies = [
"anstyle",
"once_cell_polyfill",
"windows-sys 0.61.2",
"windows-sys 0.60.2",
]
[[package]]
@@ -1492,7 +1463,6 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"server_environment",
"sqlx",
"tokens",
"tokio",
@@ -1523,7 +1493,6 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"server_environment",
"sqlx",
"tokio",
"url_config",
@@ -2641,17 +2610,6 @@ dependencies = [
"coreaudio-sys",
]
[[package]]
name = "coreaudio-rs"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "321077172d79c662f64f5071a03120748d5bb652f5231570141be24cfcd2bace"
dependencies = [
"bitflags 1.3.2",
"core-foundation-sys",
"coreaudio-sys",
]
[[package]]
name = "coreaudio-sys"
version = "0.2.17"
@@ -2667,9 +2625,9 @@ version = "0.13.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "74117836a5124f3629e4b474eed03e479abaf98988b4bb317e29f08cfe0e4116"
dependencies = [
"alsa 0.6.0",
"alsa",
"core-foundation-sys",
"coreaudio-rs 0.10.0",
"coreaudio-rs",
"jni 0.19.0",
"js-sys",
"lazy_static",
@@ -2678,7 +2636,7 @@ dependencies = [
"ndk 0.6.0",
"ndk-glue",
"nix 0.23.2",
"oboe 0.4.6",
"oboe",
"parking_lot 0.11.2",
"stdweb",
"thiserror 1.0.63",
@@ -2686,29 +2644,6 @@ dependencies = [
"winapi",
]
[[package]]
name = "cpal"
version = "0.15.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "873dab07c8f743075e57f524c583985fbaf745602acbe916a01539364369a779"
dependencies = [
"alsa 0.9.1",
"core-foundation-sys",
"coreaudio-rs 0.11.3",
"dasp_sample",
"jni 0.21.1",
"js-sys",
"libc",
"mach2",
"ndk 0.8.0",
"ndk-context",
"oboe 0.6.1",
"wasm-bindgen",
"wasm-bindgen-futures",
"web-sys",
"windows 0.54.0",
]
[[package]]
name = "cpufeatures"
version = "0.2.12"
@@ -3022,12 +2957,6 @@ dependencies = [
"parking_lot_core 0.9.12",
]
[[package]]
name = "dasp_sample"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c87e182de0887fd5361989c677c4e8f5000cd9491d6d563161a8f3a5519fc7f"
[[package]]
name = "data-encoding"
version = "2.5.0"
@@ -3040,22 +2969,6 @@ version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c297a1c74b71ae29df00c3e22dd9534821d60eb9af5a0192823fa2acea70c2a"
[[package]]
name = "datadog_client"
version = "0.0.1"
dependencies = [
"env",
"env_logger 0.11.9",
"log",
"reqwest 0.12.23",
"serde",
"serde_derive",
"serde_json",
"thiserror 2.0.18",
"tokio",
"workspace-build-acceleration",
]
[[package]]
name = "datetimes"
version = "0.0.1"
@@ -3378,7 +3291,7 @@ dependencies = [
"libc",
"option-ext",
"redox_users",
"windows-sys 0.61.2",
"windows-sys 0.59.0",
]
[[package]]
@@ -3612,10 +3525,10 @@ dependencies = [
"easyenv",
"errors",
"hostname 0.4.0",
"reusable_types",
"serde",
"serde_derive",
"serde_json",
"server_environment",
"workspace-build-acceleration",
]
@@ -4083,12 +3996,6 @@ dependencies = [
"zune-inflate",
]
[[package]]
name = "extended"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "af9673d8203fcb076b19dfd17e38b3d4ae9f44959416ea532ce72415a6020365"
[[package]]
name = "fal_client"
version = "0.0.1"
@@ -6465,7 +6372,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc2f4eb4bc735547cfed7c0a4922cbd04a4655978c09b54f1f7b228750664c34"
dependencies = [
"cfg-if",
"windows-targets 0.52.6",
"windows-targets 0.48.5",
]
[[package]]
@@ -6758,15 +6665,6 @@ dependencies = [
"libc",
]
[[package]]
name = "mach2"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d640282b302c0bb0a2a8e0233ead9035e3bed871f0b7e81fe4a1ec829765db44"
dependencies = [
"libc",
]
[[package]]
name = "magic-crypt"
version = "3.1.13"
@@ -6914,7 +6812,7 @@ version = "0.0.1"
dependencies = [
"errors",
"log",
"symphonia 0.5.0",
"symphonia",
"workspace-build-acceleration",
]
@@ -6968,16 +6866,6 @@ dependencies = [
"workspace-build-acceleration",
]
[[package]]
name = "metrics"
version = "0.0.1"
dependencies = [
"datadog_client",
"log",
"tokio",
"workspace-build-acceleration",
]
[[package]]
name = "midjourney_client"
version = "0.0.1"
@@ -7314,20 +7202,6 @@ dependencies = [
"thiserror 1.0.63",
]
[[package]]
name = "ndk"
version = "0.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2076a31b7010b17a38c01907c45b945e8f11495ee4dd588309718901b1f7a5b7"
dependencies = [
"bitflags 2.11.0",
"jni-sys",
"log",
"ndk-sys 0.5.0+25.2.9519653",
"num_enum 0.7.2",
"thiserror 1.0.63",
]
[[package]]
name = "ndk"
version = "0.9.0"
@@ -7386,15 +7260,6 @@ dependencies = [
"jni-sys",
]
[[package]]
name = "ndk-sys"
version = "0.5.0+25.2.9519653"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8c196769dd60fd4f363e11d948139556a344e79d451aeb2fa2fd040738ef7691"
dependencies = [
"jni-sys",
]
[[package]]
name = "ndk-sys"
version = "0.6.0+11769913"
@@ -7924,21 +7789,7 @@ dependencies = [
"ndk-context",
"num-derive 0.3.3",
"num-traits",
"oboe-sys 0.4.5",
]
[[package]]
name = "oboe"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e8b61bebd49e5d43f5f8cc7ee2891c16e0f41ec7954d36bcb6c14c5e0de867fb"
dependencies = [
"jni 0.21.1",
"ndk 0.8.0",
"ndk-context",
"num-derive 0.4.2",
"num-traits",
"oboe-sys 0.6.1",
"oboe-sys",
]
[[package]]
@@ -7950,15 +7801,6 @@ dependencies = [
"cc",
]
[[package]]
name = "oboe-sys"
version = "0.6.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6c8bb09a4a2b1d668170cfe0a7d5bc103f8999fb316c98099b6a9939c9f2e79d"
dependencies = [
"cc",
]
[[package]]
name = "once_cell"
version = "1.21.4"
@@ -9832,16 +9674,6 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "rodio"
version = "0.20.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7ceb6607dd738c99bc8cb28eff249b7cd5c8ec88b9db96c0608c1480d140fb1"
dependencies = [
"cpal 0.15.3",
"symphonia 0.5.5",
]
[[package]]
name = "rootly_client"
version = "0.0.1"
@@ -10055,7 +9887,7 @@ dependencies = [
"errno",
"libc",
"linux-raw-sys 0.12.1",
"windows-sys 0.61.2",
"windows-sys 0.59.0",
]
[[package]]
@@ -10172,7 +10004,7 @@ dependencies = [
"security-framework 3.7.0",
"security-framework-sys",
"webpki-root-certs",
"windows-sys 0.61.2",
"windows-sys 0.59.0",
]
[[package]]
@@ -11483,7 +11315,6 @@ dependencies = [
"composite_identifiers",
"config",
"crockford",
"datadog_client",
"datetimes",
"derive_more 0.99.17",
"diesel",
@@ -11516,7 +11347,6 @@ dependencies = [
"md-5 0.10.6",
"media",
"memory_caching",
"metrics",
"migration",
"mimetypes",
"mysql_queries",
@@ -11739,38 +11569,19 @@ name = "symphonia"
version = "0.5.0"
dependencies = [
"lazy_static",
"symphonia-bundle-flac 0.5.0",
"symphonia-bundle-mp3 0.5.0",
"symphonia-codec-aac 0.5.0",
"symphonia-bundle-flac",
"symphonia-bundle-mp3",
"symphonia-codec-aac",
"symphonia-codec-alac",
"symphonia-codec-opus",
"symphonia-codec-pcm 0.5.0",
"symphonia-codec-vorbis 0.5.0",
"symphonia-core 0.5.0",
"symphonia-format-isomp4 0.5.0",
"symphonia-codec-pcm",
"symphonia-codec-vorbis",
"symphonia-core",
"symphonia-format-isomp4",
"symphonia-format-mkv",
"symphonia-format-ogg",
"symphonia-format-wav",
"symphonia-metadata 0.5.0",
]
[[package]]
name = "symphonia"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5773a4c030a19d9bfaa090f49746ff35c75dfddfa700df7a5939d5e076a57039"
dependencies = [
"lazy_static",
"symphonia-bundle-flac 0.5.5",
"symphonia-bundle-mp3 0.5.5",
"symphonia-codec-aac 0.5.5",
"symphonia-codec-adpcm",
"symphonia-codec-pcm 0.5.5",
"symphonia-codec-vorbis 0.5.5",
"symphonia-core 0.5.5",
"symphonia-format-isomp4 0.5.5",
"symphonia-format-riff",
"symphonia-metadata 0.5.5",
"symphonia-metadata",
]
[[package]]
@@ -11778,21 +11589,9 @@ name = "symphonia-bundle-flac"
version = "0.5.0"
dependencies = [
"log",
"symphonia-core 0.5.0",
"symphonia-metadata 0.5.0",
"symphonia-utils-xiph 0.5.0",
]
[[package]]
name = "symphonia-bundle-flac"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c91565e180aea25d9b80a910c546802526ffd0072d0b8974e3ebe59b686c9976"
dependencies = [
"log",
"symphonia-core 0.5.5",
"symphonia-metadata 0.5.5",
"symphonia-utils-xiph 0.5.5",
"symphonia-core",
"symphonia-metadata",
"symphonia-utils-xiph",
]
[[package]]
@@ -11802,20 +11601,8 @@ dependencies = [
"bitflags 1.3.2",
"lazy_static",
"log",
"symphonia-core 0.5.0",
"symphonia-metadata 0.5.0",
]
[[package]]
name = "symphonia-bundle-mp3"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4872dd6bb56bf5eac799e3e957aa1981086c3e613b27e0ac23b176054f7c57ed"
dependencies = [
"lazy_static",
"log",
"symphonia-core 0.5.5",
"symphonia-metadata 0.5.5",
"symphonia-core",
"symphonia-metadata",
]
[[package]]
@@ -11824,28 +11611,7 @@ version = "0.5.0"
dependencies = [
"lazy_static",
"log",
"symphonia-core 0.5.0",
]
[[package]]
name = "symphonia-codec-aac"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4c263845aa86881416849c1729a54c7f55164f8b96111dba59de46849e73a790"
dependencies = [
"lazy_static",
"log",
"symphonia-core 0.5.5",
]
[[package]]
name = "symphonia-codec-adpcm"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2dddc50e2bbea4cfe027441eece77c46b9f319748605ab8f3443350129ddd07f"
dependencies = [
"log",
"symphonia-core 0.5.5",
"symphonia-core",
]
[[package]]
@@ -11853,7 +11619,7 @@ name = "symphonia-codec-alac"
version = "0.5.0"
dependencies = [
"log",
"symphonia-core 0.5.0",
"symphonia-core",
]
[[package]]
@@ -11861,7 +11627,7 @@ name = "symphonia-codec-opus"
version = "0.0.1"
dependencies = [
"log",
"symphonia-core 0.5.0",
"symphonia-core",
]
[[package]]
@@ -11869,17 +11635,7 @@ name = "symphonia-codec-pcm"
version = "0.5.0"
dependencies = [
"log",
"symphonia-core 0.5.0",
]
[[package]]
name = "symphonia-codec-pcm"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4e89d716c01541ad3ebe7c91ce4c8d38a7cf266a3f7b2f090b108fb0cb031d95"
dependencies = [
"log",
"symphonia-core 0.5.5",
"symphonia-core",
]
[[package]]
@@ -11887,19 +11643,8 @@ name = "symphonia-codec-vorbis"
version = "0.5.0"
dependencies = [
"log",
"symphonia-core 0.5.0",
"symphonia-utils-xiph 0.5.0",
]
[[package]]
name = "symphonia-codec-vorbis"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f025837c309cd69ffef572750b4a2257b59552c5399a5e49707cc5b1b85d1c73"
dependencies = [
"log",
"symphonia-core 0.5.5",
"symphonia-utils-xiph 0.5.5",
"symphonia-core",
"symphonia-utils-xiph",
]
[[package]]
@@ -11907,7 +11652,7 @@ name = "symphonia-codec-wavpack"
version = "0.0.1"
dependencies = [
"log",
"symphonia-core 0.5.0",
"symphonia-core",
]
[[package]]
@@ -11921,41 +11666,15 @@ dependencies = [
"log",
]
[[package]]
name = "symphonia-core"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ea00cc4f79b7f6bb7ff87eddc065a1066f3a43fe1875979056672c9ef948c2af"
dependencies = [
"arrayvec",
"bitflags 1.3.2",
"bytemuck",
"lazy_static",
"log",
]
[[package]]
name = "symphonia-format-isomp4"
version = "0.5.0"
dependencies = [
"encoding_rs",
"log",
"symphonia-core 0.5.0",
"symphonia-metadata 0.5.0",
"symphonia-utils-xiph 0.5.0",
]
[[package]]
name = "symphonia-format-isomp4"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "243739585d11f81daf8dac8d9f3d18cc7898f6c09a259675fc364b382c30e0a5"
dependencies = [
"encoding_rs",
"log",
"symphonia-core 0.5.5",
"symphonia-metadata 0.5.5",
"symphonia-utils-xiph 0.5.5",
"symphonia-core",
"symphonia-metadata",
"symphonia-utils-xiph",
]
[[package]]
@@ -11964,9 +11683,9 @@ version = "0.5.0"
dependencies = [
"lazy_static",
"log",
"symphonia-core 0.5.0",
"symphonia-metadata 0.5.0",
"symphonia-utils-xiph 0.5.0",
"symphonia-core",
"symphonia-metadata",
"symphonia-utils-xiph",
]
[[package]]
@@ -11974,21 +11693,9 @@ name = "symphonia-format-ogg"
version = "0.5.0"
dependencies = [
"log",
"symphonia-core 0.5.0",
"symphonia-metadata 0.5.0",
"symphonia-utils-xiph 0.5.0",
]
[[package]]
name = "symphonia-format-riff"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c2d7c3df0e7d94efb68401d81906eae73c02b40d5ec1a141962c592d0f11a96f"
dependencies = [
"extended",
"log",
"symphonia-core 0.5.5",
"symphonia-metadata 0.5.5",
"symphonia-core",
"symphonia-metadata",
"symphonia-utils-xiph",
]
[[package]]
@@ -11996,8 +11703,8 @@ name = "symphonia-format-wav"
version = "0.5.0"
dependencies = [
"log",
"symphonia-core 0.5.0",
"symphonia-metadata 0.5.0",
"symphonia-core",
"symphonia-metadata",
]
[[package]]
@@ -12007,19 +11714,7 @@ dependencies = [
"encoding_rs",
"lazy_static",
"log",
"symphonia-core 0.5.0",
]
[[package]]
name = "symphonia-metadata"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "36306ff42b9ffe6e5afc99d49e121e0bd62fe79b9db7b9681d48e29fa19e6b16"
dependencies = [
"encoding_rs",
"lazy_static",
"log",
"symphonia-core 0.5.5",
"symphonia-core",
]
[[package]]
@@ -12027,32 +11722,22 @@ name = "symphonia-play"
version = "0.5.0"
dependencies = [
"clap 3.2.25",
"cpal 0.13.5",
"cpal",
"lazy_static",
"libpulse-binding",
"libpulse-simple-binding",
"log",
"pretty_env_logger",
"rb",
"symphonia 0.5.0",
"symphonia",
]
[[package]]
name = "symphonia-utils-xiph"
version = "0.5.0"
dependencies = [
"symphonia-core 0.5.0",
"symphonia-metadata 0.5.0",
]
[[package]]
name = "symphonia-utils-xiph"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ee27c85ab799a338446b68eec77abf42e1a6f1bb490656e121c6e27bfbab9f16"
dependencies = [
"symphonia-core 0.5.5",
"symphonia-metadata 0.5.5",
"symphonia-core",
"symphonia-metadata",
]
[[package]]
@@ -12600,7 +12285,7 @@ dependencies = [
"getrandom 0.4.1",
"once_cell",
"rustix 1.1.4",
"windows-sys 0.61.2",
"windows-sys 0.59.0",
]
[[package]]
@@ -13541,7 +13226,7 @@ dependencies = [
"actix-web",
"actix_helpers",
"anyhow",
"server_environment",
"reusable_types",
"workspace-build-acceleration",
]
@@ -13822,6 +13507,69 @@ dependencies = [
"libc",
]
[[package]]
name = "w2l-download-job"
version = "0.0.1"
dependencies = [
"anyhow",
"bucket_paths",
"chrono",
"cloud_storage",
"config",
"dotenv",
"easyenv",
"errors",
"filesys",
"google_drive_downloader",
"hashing",
"hostname 0.4.0",
"hyper 1.6.0",
"jobs_common",
"log",
"mysql_queries",
"r2d2_redis",
"serde",
"serde_derive",
"serde_json",
"shared_env_var_config",
"sqlx",
"subprocess",
"tempdir",
"tokio",
"workspace-build-acceleration",
]
[[package]]
name = "w2l-inference-job"
version = "0.0.1"
dependencies = [
"anyhow",
"bucket_paths",
"chrono",
"cloud_storage",
"config",
"dotenv",
"easyenv",
"errors",
"filesys",
"google_drive_downloader",
"hostname 0.4.0",
"hyper 1.6.0",
"jobs_common",
"log",
"mysql_queries",
"r2d2_redis",
"serde",
"serde_derive",
"serde_json",
"shared_env_var_config",
"sqlx",
"subprocess",
"tempdir",
"tokio",
"workspace-build-acceleration",
]
[[package]]
name = "waker-fn"
version = "1.1.1"
@@ -14303,16 +14051,6 @@ dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "windows"
version = "0.54.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9252e5725dbed82865af151df558e754e4a3c2c30818359eb17465f1346a1b49"
dependencies = [
"windows-core 0.54.0",
"windows-targets 0.52.6",
]
[[package]]
name = "windows"
version = "0.58.0"
@@ -14363,16 +14101,6 @@ dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "windows-core"
version = "0.54.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12661b9c89351d684a50a8a643ce5f608e20243b9fb84687800163429f161d65"
dependencies = [
"windows-result 0.1.2",
"windows-targets 0.52.6",
]
[[package]]
name = "windows-core"
version = "0.58.0"
@@ -14487,15 +14215,6 @@ dependencies = [
"windows-strings 0.4.2",
]
[[package]]
name = "windows-result"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e383302e8ec8515204254685643de10811af0ed97ea37210dc26fb0032647f8"
dependencies = [
"windows-targets 0.52.6",
]
[[package]]
name = "windows-result"
version = "0.2.0"
+2 -8
View File
@@ -10,7 +10,6 @@ members = [
"crates/api_clients/artcraft/artcraft_client",
"crates/api_clients/artcraft/artcraft_router",
"crates/api_clients/cloud_storage",
"crates/api_clients/datadog_client",
"crates/api_clients/fal_client",
"crates/api_clients/google_drive_downloader",
"crates/api_clients/google_sign_in",
@@ -80,7 +79,6 @@ members = [
"crates/lib/jwt_signer",
"crates/lib/logging",
"crates/lib/markdown",
"crates/lib/metrics",
"crates/lib/pager",
"crates/lib/password",
"crates/lib/server_environment",
@@ -141,6 +139,8 @@ members = [
"crates/service/job/deprecated/inference_job",
"crates/service/job/deprecated/tts_download_job",
"crates/service/job/deprecated/tts_inference_job",
"crates/service/job/deprecated/w2l_download_job",
"crates/service/job/deprecated/w2l_inference_job",
# Service Plugins: complete subsystems that can be plugged into services (users, billing, etc.)
"crates/service/plugins/billing",
@@ -152,9 +152,6 @@ members = [
"crates/testing/test_data",
"crates/testing/test_utils",
# Standalone tool servers
"crates/tools/servers/agent_notify_server",
# Vendored code
"crates/vendor/limitation",
"crates/vendor/tauri-plugin-http",
@@ -242,7 +239,6 @@ component_traits = { path = "crates/service/plugins/component_traits" }
concurrency = { path = "crates/lib/concurrency" }
cookie_store = { path = "crates/lib/cookie_store" }
crockford = { path = "crates/lib/data/crockford" }
datadog_client = { path = "crates/api_clients/datadog_client" }
easyenv = { path = "crates/lib/easyenv" }
enums = { path = "crates/schema/public/enums" }
error_utils = { path = "crates/lib/error_utils" }
@@ -268,13 +264,11 @@ memory_store = { path = "crates/lib/caching/memory_store" }
midjourney_client = { path = "crates/api_clients/midjourney_client" }
mimetypes = { path = "crates/lib/files/mimetypes" }
muapi_client = { path = "crates/api_clients/muapi_client" }
metrics = { path = "crates/lib/metrics" }
mysql_queries = { path = "crates/schema/database/mysql_queries" }
pager = { path = "crates/lib/pager" }
openai_sora_client = { path = "crates/api_clients/openai_sora_client" }
primitives = { path = "crates/lib/data/primitives" }
seedance2pro_client = { path = "crates/api_clients/seedance2pro_client" }
server_environment = { path = "crates/lib/server_environment" }
shared_service_components = { path = "crates/lib/shared_service_components" }
sqlite_tasks = { path = "crates/schema/database/sqlite_tasks" }
subprocess_common = { path = "crates/lib/deprecated/subprocess_common" }
@@ -1,532 +0,0 @@
{
"title": "Storyteller-web \u2014 HTTP overview",
"description": "Per-request HTTP metrics emitted by the storyteller-web metrics middleware (`http.server.request.count` counter, `http.server.request.duration_ms` distribution). Filter by `env` / `service` / `route` using the template variables at the top.\n\nMetrics emitted from `crates/lib/metrics` + `crates/service/web/storyteller_web/src/http_server/middleware/metrics_middleware/`. Source of truth for this dashboard JSON is `_metrics/datadog/dashboards/storyteller_web_http_overview.json` in the storyteller monorepo. Apply changes with `script/metrics/apply_dashboards.sh`.",
"layout_type": "ordered",
"notify_list": [],
"template_variables": [
{
"name": "env",
"prefix": "env",
"available_values": [],
"default": "*"
},
{
"name": "service",
"prefix": "service",
"available_values": [],
"default": "storyteller-web"
},
{
"name": "route",
"prefix": "route",
"available_values": [],
"default": "*"
}
],
"reflow_type": "fixed",
"widgets": [
{
"definition": {
"type": "group",
"layout_type": "ordered",
"title": "Top-line health",
"show_title": true,
"widgets": [
{
"definition": {
"type": "query_value",
"title": "Request rate (req/s)",
"title_size": "16",
"title_align": "left",
"precision": 1,
"autoscale": true,
"requests": [
{
"q": "sum:http.server.request.count{$env,$service,$route}.as_rate()",
"aggregator": "avg"
}
]
},
"layout": {
"x": 0,
"y": 0,
"width": 3,
"height": 2
}
},
{
"definition": {
"type": "query_value",
"title": "5xx error rate (%)",
"title_size": "16",
"title_align": "left",
"precision": 2,
"autoscale": false,
"custom_unit": "%",
"requests": [
{
"q": "(sum:http.server.request.count{$env,$service,$route,status_class:5xx}.as_count() / sum:http.server.request.count{$env,$service,$route}.as_count()) * 100",
"aggregator": "avg",
"conditional_formats": [
{
"comparator": ">",
"value": 5.0,
"palette": "white_on_red"
},
{
"comparator": ">",
"value": 1.0,
"palette": "white_on_yellow"
},
{
"comparator": "<=",
"value": 1.0,
"palette": "white_on_green"
}
]
}
]
},
"layout": {
"x": 3,
"y": 0,
"width": 3,
"height": 2
}
},
{
"definition": {
"type": "query_value",
"title": "Latency p95 (ms)",
"title_size": "16",
"title_align": "left",
"precision": 0,
"autoscale": true,
"custom_unit": "ms",
"requests": [
{
"q": "p95:http.server.request.duration_ms{$env,$service,$route}",
"aggregator": "avg",
"conditional_formats": [
{
"comparator": ">",
"value": 1000,
"palette": "white_on_red"
},
{
"comparator": ">",
"value": 250,
"palette": "white_on_yellow"
},
{
"comparator": "<=",
"value": 250,
"palette": "white_on_green"
}
]
}
]
},
"layout": {
"x": 6,
"y": 0,
"width": 3,
"height": 2
}
},
{
"definition": {
"type": "query_value",
"title": "Latency p99 (ms)",
"title_size": "16",
"title_align": "left",
"precision": 0,
"autoscale": true,
"custom_unit": "ms",
"requests": [
{
"q": "p99:http.server.request.duration_ms{$env,$service,$route}",
"aggregator": "avg"
}
]
},
"layout": {
"x": 9,
"y": 0,
"width": 3,
"height": 2
}
}
]
},
"layout": {
"x": 0,
"y": 0,
"width": 12,
"height": 3
}
},
{
"definition": {
"type": "group",
"layout_type": "ordered",
"title": "Traffic shape",
"show_title": true,
"widgets": [
{
"definition": {
"type": "timeseries",
"title": "Requests/sec by status class (stacked)",
"title_size": "16",
"title_align": "left",
"show_legend": true,
"legend_layout": "horizontal",
"legend_columns": [
"avg",
"max",
"value",
"sum"
],
"requests": [
{
"q": "sum:http.server.request.count{$env,$service,$route} by {status_class}.as_rate()",
"display_type": "bars",
"style": {
"palette": "semantic",
"line_type": "solid",
"line_width": "normal"
}
}
],
"yaxis": {
"scale": "linear",
"include_zero": true
}
},
"layout": {
"x": 0,
"y": 0,
"width": 6,
"height": 4
}
},
{
"definition": {
"type": "timeseries",
"title": "Latency percentiles over time",
"title_size": "16",
"title_align": "left",
"show_legend": true,
"legend_layout": "horizontal",
"requests": [
{
"q": "p50:http.server.request.duration_ms{$env,$service,$route}",
"display_type": "line",
"style": {
"palette": "cool",
"line_type": "solid",
"line_width": "normal"
}
},
{
"q": "p95:http.server.request.duration_ms{$env,$service,$route}",
"display_type": "line",
"style": {
"palette": "warm",
"line_type": "solid",
"line_width": "normal"
}
},
{
"q": "p99:http.server.request.duration_ms{$env,$service,$route}",
"display_type": "line",
"style": {
"palette": "warm",
"line_type": "dashed",
"line_width": "normal"
}
}
],
"yaxis": {
"scale": "linear",
"include_zero": true,
"label": "ms"
}
},
"layout": {
"x": 6,
"y": 0,
"width": 6,
"height": 4
}
}
]
},
"layout": {
"x": 0,
"y": 3,
"width": 12,
"height": 5
}
},
{
"definition": {
"type": "group",
"layout_type": "ordered",
"title": "Per-route breakdown",
"show_title": true,
"widgets": [
{
"definition": {
"type": "toplist",
"title": "Top 10 routes by request volume",
"title_size": "16",
"title_align": "left",
"requests": [
{
"q": "top(sum:http.server.request.count{$env,$service,$route} by {route}.as_count(), 10, 'sum', 'desc')"
}
]
},
"layout": {
"x": 0,
"y": 0,
"width": 6,
"height": 4
}
},
{
"definition": {
"type": "toplist",
"title": "Top 10 routes by p95 latency",
"title_size": "16",
"title_align": "left",
"requests": [
{
"q": "top(p95:http.server.request.duration_ms{$env,$service,$route} by {route}, 10, 'mean', 'desc')"
}
]
},
"layout": {
"x": 6,
"y": 0,
"width": 6,
"height": 4
}
},
{
"definition": {
"type": "timeseries",
"title": "5xx error count by route",
"title_size": "16",
"title_align": "left",
"show_legend": true,
"legend_layout": "horizontal",
"requests": [
{
"q": "sum:http.server.request.count{$env,$service,$route,status_class:5xx} by {route}.as_count()",
"display_type": "bars"
}
],
"yaxis": {
"scale": "linear",
"include_zero": true
}
},
"layout": {
"x": 0,
"y": 4,
"width": 12,
"height": 4
}
},
{
"definition": {
"type": "timeseries",
"title": "4xx error count by route",
"title_size": "16",
"title_align": "left",
"show_legend": true,
"legend_layout": "horizontal",
"requests": [
{
"q": "sum:http.server.request.count{$env,$service,$route,status_class:4xx} by {route}.as_count()",
"display_type": "bars"
}
],
"yaxis": {
"scale": "linear",
"include_zero": true
}
},
"layout": {
"x": 0,
"y": 8,
"width": 12,
"height": 4
}
}
]
},
"layout": {
"x": 0,
"y": 8,
"width": 12,
"height": 13
}
},
{
"definition": {
"type": "group",
"layout_type": "ordered",
"title": "Methods and status codes",
"show_title": true,
"widgets": [
{
"definition": {
"type": "timeseries",
"title": "Requests/sec by HTTP method",
"title_size": "16",
"title_align": "left",
"show_legend": true,
"legend_layout": "horizontal",
"requests": [
{
"q": "sum:http.server.request.count{$env,$service,$route} by {method}.as_rate()",
"display_type": "bars"
}
]
},
"layout": {
"x": 0,
"y": 0,
"width": 6,
"height": 4
}
},
{
"definition": {
"type": "toplist",
"title": "Status code distribution",
"title_size": "16",
"title_align": "left",
"requests": [
{
"q": "top(sum:http.server.request.count{$env,$service,$route} by {status_code}.as_count(), 25, 'sum', 'desc')"
}
]
},
"layout": {
"x": 6,
"y": 0,
"width": 6,
"height": 4
}
}
]
},
"layout": {
"x": 0,
"y": 21,
"width": 12,
"height": 5
}
},
{
"definition": {
"type": "group",
"layout_type": "ordered",
"title": "Metrics worker health",
"show_title": true,
"widgets": [
{
"definition": {
"type": "query_value",
"title": "Startup pings (last 30m)",
"title_size": "16",
"title_align": "left",
"precision": 0,
"autoscale": true,
"requests": [
{
"q": "sum:metrics.startup.ping{$env,$service}.as_count()",
"aggregator": "sum",
"conditional_formats": [
{
"comparator": "<=",
"value": 0,
"palette": "white_on_red"
},
{
"comparator": ">",
"value": 0,
"palette": "white_on_green"
}
]
}
]
},
"layout": {
"x": 0,
"y": 0,
"width": 4,
"height": 2
}
},
{
"definition": {
"type": "toplist",
"title": "Hosts with recent startup pings",
"title_size": "16",
"title_align": "left",
"requests": [
{
"q": "top(sum:metrics.startup.ping{$env,$service} by {host}.as_count(), 25, 'sum', 'desc')"
}
]
},
"layout": {
"x": 4,
"y": 0,
"width": 4,
"height": 4
}
},
{
"definition": {
"type": "timeseries",
"title": "Startup pings over time (one bar per host restart)",
"title_size": "16",
"title_align": "left",
"show_legend": true,
"legend_layout": "horizontal",
"requests": [
{
"q": "sum:metrics.startup.ping{$env,$service} by {host}.as_count()",
"display_type": "bars"
}
],
"yaxis": {
"scale": "linear",
"include_zero": true
}
},
"layout": {
"x": 8,
"y": 0,
"width": 4,
"height": 4
}
}
]
},
"layout": {
"x": 0,
"y": 26,
"width": 12,
"height": 4
}
}
],
"id": "thp-c27-vnv"
}
@@ -1,27 +0,0 @@
{
"name": "[storyteller-web] HTTP 5xx error rate is elevated",
"type": "query alert",
"tags": [
"service:storyteller-web",
"team:backend",
"metric:http_5xx"
],
"priority": 2,
"message": "5xx error rate on storyteller-web is elevated.\n\nDashboard: https://app.datadoghq.com/dashboard/thp-c27-vnv/storyteller-web--http-overview\n\nMetric: `http.server.request.count{status_class:5xx} / http.server.request.count` over the last 5 minutes.\n\nFirst response steps:\n- Open the dashboard linked above. Check the **5xx error count by route** widget to identify which routes are failing.\n- Check the **Latency percentiles over time** widget — a latency spike often co-occurs with a 5xx spike (e.g. DB or upstream-provider stall).\n- Tail the production logs for `WARN`/`ERROR` lines from the affected route(s).\n\nThis monitor's source-of-truth JSON is at `_metrics/datadog/monitors/storyteller_web_5xx_error_rate.json`. Update with `script/metrics/apply_monitors.sh`.\n\n{{#is_alert}}🔥 5xx error rate is **{{value}}%**, above the **5%** critical threshold.{{/is_alert}}\n{{#is_warning}}⚠️ 5xx error rate is **{{value}}%**, above the **1%** warning threshold.{{/is_warning}}\n{{#is_recovery}}✅ 5xx error rate recovered to **{{value}}%**.{{/is_recovery}}\n\n@slack-storyteller-pages",
"query": "sum(last_5m):(sum:http.server.request.count{service:storyteller-web,status_class:5xx,env:production}.as_count() / sum:http.server.request.count{service:storyteller-web,env:production}.as_count()) * 100 > 5",
"options": {
"thresholds": {
"critical": 5,
"warning": 1
},
"notify_audit": false,
"require_full_window": false,
"notify_no_data": false,
"renotify_interval": 30,
"evaluation_delay": 60,
"new_host_delay": 60,
"include_tags": true,
"escalation_message": "5xx error rate on storyteller-web is **still elevated** — please ack or fix."
},
"id": 286427558
}
@@ -1,29 +0,0 @@
[package]
name = "datadog_client"
edition = "2024"
version = "0.0.1"
publish = false
[package.metadata.cargo-udeps.ignore]
normal = ["workspace-build-acceleration"]
[lib]
name = "datadog_client"
path = "src/lib.rs"
[dependencies]
# Workspace hack (faster compile times)
workspace-build-acceleration.workspace = true
# External
log.workspace = true
reqwest.workspace = true
serde.workspace = true
serde_derive.workspace = true
serde_json.workspace = true
thiserror.workspace = true
[dev-dependencies]
env.workspace = true
env_logger.workspace = true
tokio = { workspace = true, features = ["macros", "rt", "rt-multi-thread", "time"] }
@@ -1,251 +0,0 @@
use log::debug;
use serde_derive::Serialize;
use crate::creds::DatadogApiKey;
use crate::error::DatadogError;
pub const DEFAULT_BASE_URL: &str = "https://api.datadoghq.com";
/// Cheap-to-clone HTTP client for the Datadog metrics API.
#[derive(Clone)]
pub struct DatadogClient {
base_url: String,
api_key: DatadogApiKey,
http: reqwest::Client,
}
impl DatadogClient {
pub fn new(api_key: DatadogApiKey) -> Self {
Self::with_base_url(api_key, DEFAULT_BASE_URL.to_string())
}
pub fn with_base_url(api_key: DatadogApiKey, base_url: String) -> Self {
Self {
base_url,
api_key,
http: reqwest::Client::new(),
}
}
/// POST `/api/v1/distribution_points`. Each `DistributionSeries.points`
/// entry contains a list of *raw* observation values; Datadog computes
/// percentiles server-side, so no t-digest plumbing here.
pub async fn submit_distribution_points(
&self,
series: Vec<DistributionSeries>,
) -> Result<(), DatadogError> {
if series.is_empty() {
return Ok(());
}
let body = DistributionsBody { series };
let url = format!("{}/api/v1/distribution_points", self.base_url);
debug!("submitting {} distribution series to {}", body.series.len(), url);
let response = self.http
.post(&url)
.header("DD-API-KEY", self.api_key.as_str())
.json(&body)
.send()
.await?;
expect_2xx(response).await
}
/// POST `/api/v1/series`. For pre-aggregated counts/gauges/rates.
pub async fn submit_series(
&self,
series: Vec<MetricSeries>,
) -> Result<(), DatadogError> {
if series.is_empty() {
return Ok(());
}
let body = SeriesBody { series };
let url = format!("{}/api/v1/series", self.base_url);
debug!("submitting {} metric series to {}", body.series.len(), url);
let response = self.http
.post(&url)
.header("DD-API-KEY", self.api_key.as_str())
.json(&body)
.send()
.await?;
expect_2xx(response).await
}
}
async fn expect_2xx(response: reqwest::Response) -> Result<(), DatadogError> {
let status = response.status();
if status.is_success() {
return Ok(());
}
let body = response.text().await.unwrap_or_default();
Err(DatadogError::Api { status: status.as_u16(), body })
}
// ==================== Wire-format types ====================
#[derive(Serialize)]
struct DistributionsBody {
series: Vec<DistributionSeries>,
}
#[derive(Clone, Debug, Serialize)]
pub struct DistributionSeries {
pub metric: String,
/// Each point is `[unix_timestamp_secs, [v1, v2, ...]]`.
pub points: Vec<DistributionPoint>,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub host: Option<String>,
}
/// Tuple-style serialization: serializes as `[timestamp, [values]]`.
#[derive(Clone, Debug, Serialize)]
pub struct DistributionPoint(pub i64, pub Vec<f64>);
#[derive(Serialize)]
struct SeriesBody {
series: Vec<MetricSeries>,
}
#[derive(Clone, Debug, Serialize)]
pub struct MetricSeries {
pub metric: String,
/// Each point is `[unix_timestamp_secs, value]`.
pub points: Vec<MetricPoint>,
/// `"count"`, `"gauge"`, or `"rate"`.
#[serde(rename = "type")]
pub metric_type: String,
#[serde(skip_serializing_if = "Vec::is_empty")]
pub tags: Vec<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub host: Option<String>,
/// Seconds. Required by Datadog for `count`/`rate`.
#[serde(skip_serializing_if = "Option::is_none")]
pub interval: Option<i64>,
}
/// Tuple-style serialization: serializes as `[timestamp, value]`.
#[derive(Clone, Debug, Serialize)]
pub struct MetricPoint(pub i64, pub f64);
// ==================== Tests ====================
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn distribution_point_serializes_as_tuple() {
let point = DistributionPoint(1_700_000_000, vec![1.0, 2.5, 3.0]);
let json = serde_json::to_string(&point).unwrap();
assert_eq!(json, "[1700000000,[1.0,2.5,3.0]]");
}
#[test]
fn metric_point_serializes_as_tuple() {
let point = MetricPoint(1_700_000_000, 42.0);
let json = serde_json::to_string(&point).unwrap();
assert_eq!(json, "[1700000000,42.0]");
}
#[test]
fn metric_series_uses_type_key() {
let s = MetricSeries {
metric: "x".to_string(),
points: vec![MetricPoint(1, 1.0)],
metric_type: "count".to_string(),
tags: vec!["a:b".to_string()],
host: Some("h".to_string()),
interval: Some(10),
};
let json = serde_json::to_string(&s).unwrap();
assert!(json.contains(r#""type":"count""#), "got: {}", json);
assert!(json.contains(r#""interval":10"#), "got: {}", json);
}
#[test]
fn empty_tags_omitted() {
let s = MetricSeries {
metric: "x".to_string(),
points: vec![MetricPoint(1, 1.0)],
metric_type: "gauge".to_string(),
tags: vec![],
host: None,
interval: None,
};
let json = serde_json::to_string(&s).unwrap();
assert!(!json.contains("tags"));
assert!(!json.contains("host"));
assert!(!json.contains("interval"));
}
#[test]
fn api_key_debug_is_redacted() {
let key = crate::creds::DatadogApiKey::new("supersecret123");
let debug = format!("{:?}", key);
assert!(!debug.contains("supersecret123"));
assert!(debug.contains("***"));
}
// ==================== Real-API smoke tests ====================
//
// These are marked `#[ignore]` because they hit api.datadoghq.com with a
// real API key from `datadog_key.txt` at the workspace root and submit a
// tiny named metric (`datadog_client.smoke_test`).
//
// Run explicitly with:
// cargo test -p datadog_client -- --ignored
//
// After running, look for the metric in Datadog within ~1 minute.
mod real_api_smoke {
use super::*;
use crate::creds::DatadogApiKey;
use crate::test_utils::get_test_api_key::get_test_api_key;
use std::time::{SystemTime, UNIX_EPOCH};
fn now_secs() -> i64 {
SystemTime::now().duration_since(UNIX_EPOCH).map(|d| d.as_secs() as i64).unwrap_or(0)
}
fn smoke_tags() -> Vec<String> {
vec![
"source:datadog_client_smoke_test".to_string(),
"env:test".to_string(),
]
}
#[ignore] // hits the real Datadog API
#[tokio::test]
async fn submit_distribution_points_real_api() {
let _ = env_logger::builder().is_test(true).try_init();
let key = get_test_api_key().expect("could not load datadog_key.txt");
let client = DatadogClient::new(DatadogApiKey::new(key));
let series = vec![DistributionSeries {
metric: "datadog_client.smoke_test.duration".to_string(),
points: vec![DistributionPoint(now_secs(), vec![1.0, 2.5, 7.0])],
tags: smoke_tags(),
host: Some("smoke-test-host".to_string()),
}];
client.submit_distribution_points(series).await
.expect("distribution submission should succeed");
}
#[ignore] // hits the real Datadog API
#[tokio::test]
async fn submit_series_real_api() {
let _ = env_logger::builder().is_test(true).try_init();
let key = get_test_api_key().expect("could not load datadog_key.txt");
let client = DatadogClient::new(DatadogApiKey::new(key));
let series = vec![MetricSeries {
metric: "datadog_client.smoke_test.count".to_string(),
points: vec![MetricPoint(now_secs(), 1.0)],
metric_type: "count".to_string(),
tags: smoke_tags(),
host: Some("smoke-test-host".to_string()),
interval: Some(10),
}];
client.submit_series(series).await
.expect("series submission should succeed");
}
}
}
@@ -1,20 +0,0 @@
/// Opaque wrapper around a Datadog API key. `Debug` is implemented manually
/// so the secret never leaks to logs.
#[derive(Clone)]
pub struct DatadogApiKey(String);
impl DatadogApiKey {
pub fn new(key: impl Into<String>) -> Self {
Self(key.into())
}
pub fn as_str(&self) -> &str {
&self.0
}
}
impl std::fmt::Debug for DatadogApiKey {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.write_str("DatadogApiKey(***)")
}
}
@@ -1,13 +0,0 @@
use thiserror::Error;
#[derive(Debug, Error)]
pub enum DatadogError {
#[error("HTTP transport error: {0}")]
Transport(#[from] reqwest::Error),
#[error("Datadog API returned non-2xx: status={status} body={body}")]
Api { status: u16, body: String },
#[error("Serialization error: {0}")]
Serialization(#[from] serde_json::Error),
}
@@ -1,19 +0,0 @@
//! Minimal Datadog HTTP API client.
//!
//! This is a *transport* crate — it knows how to talk to the Datadog metrics
//! API and nothing else. Buffering, aggregation, and the actix middleware
//! that feeds it live in the `metrics` library. Mirrors the
//! `rootly_client` + `pager` split.
//!
//! Supports two endpoints:
//!
//! - `POST /api/v1/distribution_points` — submit raw observation lists.
//! Datadog computes p50/p75/p90/p95/p99/avg/min/max/count server-side.
//! - `POST /api/v1/series` — submit pre-aggregated counts/gauges/rates.
pub mod client;
pub mod creds;
pub mod error;
#[cfg(test)]
mod test_utils;
@@ -1,45 +0,0 @@
#![cfg(test)]
use std::fs::read_to_string;
use std::path::{Path, PathBuf};
/// Reads the Datadog API key from `secrets/datadog_key.txt` (relative to
/// the workspace root). Used only by `#[ignore]`d smoke tests that hit the
/// real API.
pub(crate) fn get_test_api_key() -> Result<String, String> {
let candidates = candidate_paths();
for path in &candidates {
if let Ok(contents) = read_to_string(path) {
let trimmed = contents.trim().to_string();
if trimmed.is_empty() {
return Err(format!("{} is empty", path.display()));
}
return Ok(trimmed);
}
}
Err(format!(
"Could not locate Datadog API key. Tried: {}",
candidates.iter().map(|p| p.display().to_string()).collect::<Vec<_>>().join(", "),
))
}
/// Walk upward from the test's CWD looking for the key. Tests run from
/// the crate dir (`crates/api_clients/datadog_client`), so we need to
/// climb a few levels to reach the workspace root. We try the new
/// `secrets/datadog_key.txt` location first and fall back to the older
/// root-level `datadog_key.txt` for any stale checkouts.
fn candidate_paths() -> Vec<PathBuf> {
let mut out = Vec::new();
let mut current: PathBuf = std::env::current_dir().unwrap_or_else(|_| PathBuf::from("."));
for _ in 0..6 {
out.push(current.join("secrets/datadog_key.txt"));
out.push(current.join("datadog_key.txt"));
if !current.pop() {
break;
}
}
// Last-resort hardcoded paths matching this repo's known layout.
out.push(Path::new("/Users/bt/dev/storyteller/artcraft/secrets/datadog_key.txt").to_path_buf());
out.push(Path::new("/Users/bt/dev/storyteller/artcraft/datadog_key.txt").to_path_buf());
out
}
@@ -1,3 +0,0 @@
#![cfg(test)]
pub(crate) mod get_test_api_key;
@@ -40,13 +40,13 @@ pub async fn seed_media_files(mysql_pool: &Pool<MySql>, maybe_bucket_clients: Op
(HANASHI_USER_TOKEN, "m_8n5epqfvs2vh60khap0s3ezem4epkc", MediaFileType::Audio, "media/audio/voice-samples/trump.wav"),
(HANASHI_USER_TOKEN, "m_g6dpwcpq51e6kvmpbbkdvgxfan9k1k", MediaFileType::Audio, "media/audio/voice-samples/trump_tts.wav"),
// Images
(HANASHI_USER_TOKEN, "m_cn5t6ywm9k1ge9qzzxst5krc5tm08m", MediaFileType::Jpg, "media/image/face-animator-inputs/bill.jpg"),
(HANASHI_USER_TOKEN, "m_nf9xebrr8hd1bxkfy7src5k8nv2dzy", MediaFileType::Jpg, "media/image/face-animator-inputs/elon.jpg"),
(HANASHI_USER_TOKEN, "m_t17zh2r3ahs485b8m7c9q502cs6jqh", MediaFileType::Jpg, "media/image/face-animator-inputs/ernest.jpg"),
(HANASHI_USER_TOKEN, "m_vms09sby8tyw742y2s66a4w8f0w278", MediaFileType::Jpg, "media/image/face-animator-inputs/link.jpg"),
(HANASHI_USER_TOKEN, "m_s1z9krfzrscy92jgq3sxhpx1n4vxvc", MediaFileType::Jpg, "media/image/face-animator-inputs/ripley.jpg"),
(HANASHI_USER_TOKEN, "m_we7mnzbd76g4yn19dm6m53er0pjvew", MediaFileType::Png, "media/image/face-animator-inputs/san.png"),
(HANASHI_USER_TOKEN, "m_wahwz92nxxfg0x42dw9fdrhwq30yk0", MediaFileType::Jpg, "media/image/face-animator-inputs/zelda.jpg"),
(HANASHI_USER_TOKEN, "m_cn5t6ywm9k1ge9qzzxst5krc5tm08m", MediaFileType::Image, "media/image/face-animator-inputs/bill.jpg"),
(HANASHI_USER_TOKEN, "m_nf9xebrr8hd1bxkfy7src5k8nv2dzy", MediaFileType::Image, "media/image/face-animator-inputs/elon.jpg"),
(HANASHI_USER_TOKEN, "m_t17zh2r3ahs485b8m7c9q502cs6jqh", MediaFileType::Image, "media/image/face-animator-inputs/ernest.jpg"),
(HANASHI_USER_TOKEN, "m_vms09sby8tyw742y2s66a4w8f0w278", MediaFileType::Image, "media/image/face-animator-inputs/link.jpg"),
(HANASHI_USER_TOKEN, "m_s1z9krfzrscy92jgq3sxhpx1n4vxvc", MediaFileType::Image, "media/image/face-animator-inputs/ripley.jpg"),
(HANASHI_USER_TOKEN, "m_we7mnzbd76g4yn19dm6m53er0pjvew", MediaFileType::Image, "media/image/face-animator-inputs/san.png"),
(HANASHI_USER_TOKEN, "m_wahwz92nxxfg0x42dw9fdrhwq30yk0", MediaFileType::Image, "media/image/face-animator-inputs/zelda.jpg"),
// Video
(HANASHI_USER_TOKEN, "m_gedarcfdkxx3zv8zz2wmwsnc1r8jbp", MediaFileType::Video, "media/video/storyteller-studio-renders/girl-rotating-room.mp4"),
(HANASHI_USER_TOKEN, "m_3s74yyd4jwrjdp17yx1694n29jv5gr", MediaFileType::Video, "media/video/storyteller-studio-renders/hanashi-run.mp4"),
@@ -86,13 +86,13 @@ pub async fn main() -> AnyhowResult<()> {
maybe_public_bucket_extension = Some(".mp4");
}
Some("image/jpeg") => {
media_file_type = MediaFileType::Jpg;
media_file_type = MediaFileType::Image;
maybe_mime_type = mimetype;
maybe_public_bucket_prefix = Some("dev_upload_");
maybe_public_bucket_extension = Some(".jpg");
}
Some("image/png") => {
media_file_type = MediaFileType::Png;
media_file_type = MediaFileType::Image;
maybe_mime_type = mimetype;
maybe_public_bucket_prefix = Some("dev_upload_");
maybe_public_bucket_extension = Some(".png");
@@ -238,13 +238,11 @@ impl From<ArtcraftRouterError> for GenerateError {
ProviderError::Muapi(_) => BillingProvider::Muapi,
ProviderError::Seedance2Pro(_) => BillingProvider::Kinovi,
ProviderError::Storyteller(_) => BillingProvider::Artcraft,
ProviderError::GmiCloud(_) => BillingProvider::Artcraft,
};
Self::BillingIssue(BillingIssueReason { provider })
},
ArtcraftRouterError::Provider(ProviderError::Storyteller(e)) => Self::ProviderFailure(ProviderFailureReason::StorytellerError(e)),
ArtcraftRouterError::Provider(ProviderError::Fal(_)) => Self::FalNoLongerSupported,
ArtcraftRouterError::Provider(ProviderError::GmiCloud(_)) => Self::ArtcraftRouterNotYetSupportedProvider("gmicloud"),
ArtcraftRouterError::Provider(ProviderError::Muapi(_)) => Self::ArtcraftRouterNotYetSupportedProvider("muapi"),
ArtcraftRouterError::Provider(ProviderError::Seedance2Pro(_)) => Self::ArtcraftRouterNotYetSupportedProvider("seedance2pro"),
ArtcraftRouterError::UnsupportedModel(model) => Self::NotYetImplemented(format!("Unsupported model: {}", model)),
@@ -66,7 +66,6 @@ fn provider_to_generation_provider(provider: Provider) -> GenerationProvider {
// Unused providers -> ArtCraft
Provider::Muapi => GenerationProvider::Artcraft,
Provider::Seedance2Pro => GenerationProvider::Artcraft ,
Provider::GmiCloud => GenerationProvider::Artcraft,
}
}
@@ -68,12 +68,6 @@ fn video_model_to_common_model_type(model: CommonVideoModel) -> Option<CommonMod
CommonVideoModel::Veo3Fast => Some(CommonModelType::Veo3Fast),
CommonVideoModel::Veo3p1 => Some(CommonModelType::Veo3p1),
CommonVideoModel::Veo3p1Fast => Some(CommonModelType::Veo3p1Fast),
CommonVideoModel::Seedance2p0BytePlus => Some(CommonModelType::Seedance2p0BytePlus),
CommonVideoModel::Seedance2p0BytePlusFast => Some(CommonModelType::Seedance2p0BytePlusFast),
CommonVideoModel::Seedance2p0Ultra => Some(CommonModelType::Seedance2p0Ultra),
CommonVideoModel::Seedance2p0UltraFast => Some(CommonModelType::Seedance2p0UltraFast),
CommonVideoModel::PreviewModel => Some(CommonModelType::PreviewModel),
CommonVideoModel::PreviewModelFast => Some(CommonModelType::PreviewModelFast),
}
}
@@ -84,7 +78,6 @@ fn provider_to_generation_provider(provider: Provider) -> GenerationProvider {
// Unused providers -> ArtCraft
Provider::Muapi => GenerationProvider::Artcraft,
Provider::Seedance2Pro => GenerationProvider::Artcraft ,
Provider::GmiCloud => GenerationProvider::Artcraft,
}
}
+1 -1
View File
@@ -20,7 +20,7 @@ normal = ["workspace-build-acceleration"]
workspace-build-acceleration = { workspace = true }
# Internal
server_environment.workspace = true
reusable_types = { path = "../../schema/public/reusable_types" }
# External
log = { workspace = true }
@@ -71,7 +71,7 @@ pub fn add_fakeyou_dev_proxy(cors: Cors, _is_production: bool) -> Cors {
#[cfg(test)]
mod tests {
use server_environment::ServerEnvironment;
use reusable_types::server_environment::ServerEnvironment;
use crate::cors::build_cors_config;
use crate::testing::assert_origin_invalid;
@@ -59,7 +59,7 @@ pub fn add_storyteller_dev_proxy(cors: Cors, _is_production: bool) -> Cors {
#[cfg(test)]
mod tests {
use server_environment::ServerEnvironment;
use reusable_types::server_environment::ServerEnvironment;
use crate::cors::build_cors_config;
use crate::testing::assert_origin_invalid;
@@ -18,7 +18,7 @@ pub fn add_storyteller_board(cors: Cors, _is_production: bool) -> Cors {
#[cfg(test)]
mod tests {
use server_environment::ServerEnvironment;
use reusable_types::server_environment::ServerEnvironment;
use crate::cors::build_cors_config;
use crate::testing::assert_origin_invalid;
@@ -14,7 +14,7 @@ pub fn add_storyteller_render(cors: Cors, _is_production: bool) -> Cors {
#[cfg(test)]
mod tests {
use server_environment::ServerEnvironment;
use reusable_types::server_environment::ServerEnvironment;
use crate::cors::build_cors_config;
use crate::testing::assert_origin_invalid;
@@ -18,7 +18,7 @@ pub fn add_storyteller_studio(cors: Cors, _is_production: bool) -> Cors {
#[cfg(test)]
mod tests {
use server_environment::ServerEnvironment;
use reusable_types::server_environment::ServerEnvironment;
use crate::cors::build_cors_config;
use crate::testing::assert_origin_invalid;
+2 -2
View File
@@ -14,7 +14,7 @@ use crate::configs::storyteller_board::add_storyteller_board;
use crate::configs::storyteller_render::add_storyteller_render;
use crate::configs::storyteller_studio::add_storyteller_studio;
use crate::configs::tauri::add_tauri;
use server_environment::ServerEnvironment;
use reusable_types::server_environment::ServerEnvironment;
/// Return cors config for FakeYou / Vocodes / OBS / local development
pub fn build_cors_config(server_environment: ServerEnvironment) -> Cors {
@@ -80,7 +80,7 @@ fn do_build_cors_config(is_production: bool) -> Cors {
#[cfg(test)]
mod tests {
use server_environment::ServerEnvironment;
use reusable_types::server_environment::ServerEnvironment;
use crate::testing::assert_origin_invalid;
use crate::testing::assert_origin_ok;
-23
View File
@@ -1,23 +0,0 @@
[package]
name = "metrics"
edition = "2024"
version = "0.0.1"
publish = false
[package.metadata.cargo-udeps.ignore]
normal = ["workspace-build-acceleration"]
[lib]
name = "metrics"
path = "src/lib.rs"
[dependencies]
# Workspace hack (faster compile times)
workspace-build-acceleration.workspace = true
# Internal
datadog_client.workspace = true
# External
log.workspace = true
tokio = { workspace = true, features = ["macros", "rt", "time", "sync"] }
-113
View File
@@ -1,113 +0,0 @@
use std::sync::Arc;
use std::sync::atomic::AtomicBool;
use std::time::Duration;
use datadog_client::client::DatadogClient;
use crate::collector::MetricsCollector;
use crate::queue::SampleQueue;
use crate::worker::{MetricsWorker, MetricsWorkerConfig};
pub const DEFAULT_FLUSH_INTERVAL_SECS: u64 = 10;
pub const DEFAULT_DURATION_METRIC: &str = "http.server.request.duration_ms";
pub const DEFAULT_COUNT_METRIC: &str = "http.server.request.count";
pub struct MetricsBuilder {
client: Option<DatadogClient>,
flush_interval: Duration,
duration_metric_name: String,
count_metric_name: String,
host: Option<String>,
env: Option<String>,
service_name: Option<String>,
max_buffered_samples: Option<usize>,
}
impl MetricsBuilder {
pub fn new() -> Self {
Self {
client: None,
flush_interval: Duration::from_secs(DEFAULT_FLUSH_INTERVAL_SECS),
duration_metric_name: DEFAULT_DURATION_METRIC.to_string(),
count_metric_name: DEFAULT_COUNT_METRIC.to_string(),
host: None,
env: None,
service_name: None,
max_buffered_samples: None,
}
}
pub fn datadog_client(mut self, client: DatadogClient) -> Self {
self.client = Some(client); self
}
pub fn flush_interval(mut self, interval: Duration) -> Self {
self.flush_interval = interval; self
}
pub fn duration_metric_name(mut self, name: impl Into<String>) -> Self {
self.duration_metric_name = name.into(); self
}
pub fn count_metric_name(mut self, name: impl Into<String>) -> Self {
self.count_metric_name = name.into(); self
}
pub fn host(mut self, host: impl Into<String>) -> Self {
self.host = Some(host.into()); self
}
pub fn env(mut self, env: impl Into<String>) -> Self {
self.env = Some(env.into()); self
}
pub fn service_name(mut self, name: impl Into<String>) -> Self {
self.service_name = Some(name.into()); self
}
pub fn max_buffered_samples(mut self, n: usize) -> Self {
self.max_buffered_samples = Some(n); self
}
/// Build the (collector, worker) pair plus a shutdown flag. Spawn
/// `worker.run()` on a long-lived tokio task; clone `collector` into
/// middleware/handlers; call `shutdown.store(true, Ordering::Relaxed)`
/// to drain the worker on graceful shutdown.
///
/// Returns `Err` only if no Datadog client was provided. Callers that
/// want to disable metrics should use [`MetricsCollector::noop`] instead.
pub fn build(self) -> Result<BuildOutput, String> {
let client = self.client
.ok_or_else(|| "MetricsBuilder: datadog_client is required".to_string())?;
let queue = match self.max_buffered_samples {
Some(n) => SampleQueue::with_capacity(n),
None => SampleQueue::new(),
};
let shutdown = Arc::new(AtomicBool::new(false));
let config = MetricsWorkerConfig {
flush_interval: self.flush_interval,
duration_metric_name: self.duration_metric_name,
count_metric_name: self.count_metric_name,
host: self.host,
env: self.env.unwrap_or_else(|| "unknown".to_string()),
service_name: self.service_name.unwrap_or_else(|| "unknown".to_string()),
};
let collector = MetricsCollector::new(queue.clone());
let worker = MetricsWorker::new(queue, client, config, shutdown.clone());
Ok(BuildOutput { collector, worker, shutdown })
}
}
impl Default for MetricsBuilder {
fn default() -> Self { Self::new() }
}
pub struct BuildOutput {
pub collector: MetricsCollector,
pub worker: MetricsWorker,
pub shutdown: Arc<AtomicBool>,
}
-196
View File
@@ -1,196 +0,0 @@
use std::time::SystemTime;
use crate::queue::SampleQueue;
use crate::sample::{CounterSample, ObservationSample, RequestSample, Sample};
/// Cheap-to-clone handle that records metric observations. All `record_*`
/// methods are non-blocking: they grab a short-lived mutex on the in-memory
/// queue and never do I/O.
///
/// Built via [`crate::builder::MetricsBuilder`]. Use [`Self::noop()`] when
/// metrics should be disabled (no Datadog API key configured, dev env, …).
#[derive(Clone)]
pub struct MetricsCollector {
queue: SampleQueue,
enabled: bool,
}
impl MetricsCollector {
pub(crate) fn new(queue: SampleQueue) -> Self {
Self { queue, enabled: true }
}
/// Collector that swallows every recording call. Use when no API key is
/// configured, so callers can wire the collector unconditionally.
pub fn noop() -> Self {
Self { queue: SampleQueue::new(), enabled: false }
}
pub fn is_enabled(&self) -> bool { self.enabled }
// ==================== Request observations ====================
/// Record one HTTP request observation. Called by the actix middleware.
pub fn record_request(
&self,
route: impl Into<String>,
method: impl Into<String>,
status_code: u16,
duration_ms: f64,
) {
if !self.enabled {
return;
}
self.queue.push(Sample::Request(RequestSample {
route: route.into(),
method: method.into(),
status_code,
duration_ms,
timestamp_secs: now_secs(),
}));
}
// ==================== Custom counters ====================
/// Increment a custom counter metric by 1. Emitted to Datadog as `count`
/// (with the worker's `flush_interval` as the rollup interval). Tags are
/// shipped verbatim — keep their cardinality bounded.
pub fn increment(&self, metric: impl Into<String>, tags: Vec<String>) {
self.add(metric, 1, tags);
}
/// Add `value` to a custom counter metric. Use [`Self::increment`] for the
/// common +1 case.
pub fn add(&self, metric: impl Into<String>, value: u64, tags: Vec<String>) {
if !self.enabled || value == 0 {
return;
}
let metric = metric.into();
let timestamp_secs = now_secs();
// We model `add(n)` as n increments of the same `(metric, tags)`
// bucket. The worker counts entries per group; emitting n separate
// samples keeps the aggregation logic uniform.
for _ in 0..value {
self.queue.push(Sample::Counter(CounterSample {
metric: metric.clone(),
tags: tags.clone(),
timestamp_secs,
}));
}
}
// ==================== Custom observations ====================
/// Record a single observation (`f64`) for a distribution metric. Datadog
/// will compute p50/p75/p90/p95/p99/avg/min/max/count server-side.
pub fn observe(&self, metric: impl Into<String>, value: f64, tags: Vec<String>) {
if !self.enabled {
return;
}
self.queue.push(Sample::Observation(ObservationSample {
metric: metric.into(),
value,
tags,
timestamp_secs: now_secs(),
}));
}
}
fn now_secs() -> i64 {
SystemTime::now()
.duration_since(SystemTime::UNIX_EPOCH)
.map(|d| d.as_secs() as i64)
.unwrap_or(0)
}
#[cfg(test)]
mod tests {
use super::*;
mod request_path {
use super::*;
#[test]
fn noop_records_nothing() {
let c = MetricsCollector::noop();
c.record_request("/x", "GET", 200, 1.0);
assert!(!c.is_enabled());
}
#[test]
fn enabled_pushes_to_shared_queue() {
let q = SampleQueue::new();
let c = MetricsCollector::new(q.clone());
c.record_request("/x", "POST", 201, 2.5);
assert_eq!(q.len(), 1);
}
}
mod counter_path {
use super::*;
#[test]
fn increment_pushes_one_counter_sample() {
let q = SampleQueue::new();
let c = MetricsCollector::new(q.clone());
c.increment("my.metric", vec!["a:b".to_string()]);
assert_eq!(q.len(), 1);
match &q.drain()[0] {
Sample::Counter(c) => {
assert_eq!(c.metric, "my.metric");
assert_eq!(c.tags, vec!["a:b".to_string()]);
}
other => panic!("expected Counter, got {:?}", other),
}
}
#[test]
fn add_emits_n_samples() {
let q = SampleQueue::new();
let c = MetricsCollector::new(q.clone());
c.add("my.metric", 5, vec![]);
assert_eq!(q.len(), 5);
}
#[test]
fn add_zero_is_noop() {
let q = SampleQueue::new();
let c = MetricsCollector::new(q.clone());
c.add("my.metric", 0, vec![]);
assert_eq!(q.len(), 0);
}
#[test]
fn noop_collector_ignores_counters() {
let c = MetricsCollector::noop();
c.increment("x", vec![]);
c.add("x", 5, vec![]);
}
}
mod observation_path {
use super::*;
#[test]
fn observe_pushes_observation_sample() {
let q = SampleQueue::new();
let c = MetricsCollector::new(q.clone());
c.observe("my.dist", 3.14, vec!["k:v".to_string()]);
assert_eq!(q.len(), 1);
match &q.drain()[0] {
Sample::Observation(o) => {
assert_eq!(o.metric, "my.dist");
assert_eq!(o.value, 3.14);
assert_eq!(o.tags, vec!["k:v".to_string()]);
}
other => panic!("expected Observation, got {:?}", other),
}
}
#[test]
fn noop_collector_ignores_observations() {
let c = MetricsCollector::noop();
c.observe("x", 1.0, vec![]);
}
}
}
-22
View File
@@ -1,22 +0,0 @@
//! Per-request metrics for HTTP services, backed by Datadog.
//!
//! Three pieces:
//!
//! - [`collector::MetricsCollector`] — cheap-to-clone handle that
//! middleware/handlers call to record a request observation. Pushes the
//! sample onto a shared in-memory buffer; never blocks on I/O.
//! - [`queue::SampleQueue`] — the buffer itself (bounded, oldest dropped).
//! - [`worker::MetricsWorker`] — a long-lived tokio task that drains the
//! queue every `flush_interval`, groups samples by (route, method,
//! status_code), and submits one distribution-points POST plus one
//! series POST to Datadog. Submission failures are logged, not
//! propagated.
//!
//! Mirrors the `pager` library's collector/worker split. Build with
//! [`builder::MetricsBuilder`].
pub mod builder;
pub mod collector;
pub mod queue;
pub mod sample;
pub mod worker;
-107
View File
@@ -1,107 +0,0 @@
use std::sync::{Arc, Mutex};
use log::warn;
use crate::sample::Sample;
/// Soft cap on buffered samples. The worker drains every few seconds, so
/// hitting this would mean the Datadog API is unreachable AND we're seeing
/// >10k req/s sustained. Hitting it drops oldest-first.
pub const DEFAULT_MAX_SAMPLES: usize = 100_000;
/// Thread-safe bounded buffer of samples. Cheap to clone (Arc inside).
#[derive(Clone)]
pub struct SampleQueue {
inner: Arc<Mutex<Vec<Sample>>>,
max_samples: usize,
}
impl SampleQueue {
pub fn new() -> Self {
Self::with_capacity(DEFAULT_MAX_SAMPLES)
}
pub fn with_capacity(max_samples: usize) -> Self {
Self {
inner: Arc::new(Mutex::new(Vec::with_capacity(1024))),
max_samples,
}
}
/// Non-blocking push. Drops the *oldest* sample if the buffer is full so
/// the worker still gets a freshness-biased view if Datadog is down.
pub fn push(&self, sample: Sample) {
let mut guard = match self.inner.lock() {
Ok(g) => g,
Err(poison) => poison.into_inner(),
};
if guard.len() >= self.max_samples {
// Drop oldest. `swap_remove(0)` is O(1) but reorders; we don't care
// about insertion order since aggregation groups by tuple key.
let _ = guard.swap_remove(0);
}
guard.push(sample);
}
/// Atomically take all currently-buffered samples.
pub fn drain(&self) -> Vec<Sample> {
let mut guard = match self.inner.lock() {
Ok(g) => g,
Err(poison) => {
warn!("metrics SampleQueue lock poisoned on drain; recovering");
poison.into_inner()
}
};
std::mem::take(&mut *guard)
}
pub fn len(&self) -> usize {
self.inner.lock().map(|g| g.len()).unwrap_or(0)
}
}
impl Default for SampleQueue {
fn default() -> Self { Self::new() }
}
#[cfg(test)]
mod tests {
use super::*;
use crate::sample::RequestSample;
fn request_sample(route: &str) -> Sample {
Sample::Request(RequestSample {
route: route.to_string(),
method: "GET".to_string(),
status_code: 200,
duration_ms: 1.0,
timestamp_secs: 1,
})
}
#[test]
fn drain_returns_pushed_samples_and_empties() {
let q = SampleQueue::new();
q.push(request_sample("/a"));
q.push(request_sample("/b"));
let drained = q.drain();
assert_eq!(drained.len(), 2);
assert_eq!(q.drain().len(), 0);
}
#[test]
fn full_queue_drops_oldest() {
let q = SampleQueue::with_capacity(3);
q.push(request_sample("/old"));
q.push(request_sample("/older"));
q.push(request_sample("/oldest"));
q.push(request_sample("/new"));
let drained = q.drain();
assert_eq!(drained.len(), 3);
let routes: Vec<_> = drained.iter().filter_map(|s| match s {
Sample::Request(r) => Some(r.route.clone()),
_ => None,
}).collect();
assert!(routes.contains(&"/new".to_string()));
}
}
-42
View File
@@ -1,42 +0,0 @@
/// A request observation captured by the HTTP middleware. Aggregated into
/// two metrics per `(route, method, status_code)` group: a distribution
/// over `duration_ms` values, and a count.
#[derive(Clone, Debug)]
pub struct RequestSample {
/// Low-cardinality route pattern from actix (`req.match_pattern()`), e.g.
/// `/v1/users/{user_token}/profile`. Falls back to `"unmatched"` when
/// the request hit no route.
pub route: String,
pub method: String,
pub status_code: u16,
pub duration_ms: f64,
pub timestamp_secs: i64,
}
/// A single hit on a domain counter. Aggregated into a `count` metric per
/// `(metric, tags_set)` group.
#[derive(Clone, Debug)]
pub struct CounterSample {
pub metric: String,
pub tags: Vec<String>,
pub timestamp_secs: i64,
}
/// A single observation of a domain value. Aggregated into a `distribution`
/// metric per `(metric, tags_set)` group so Datadog can compute percentiles
/// server-side.
#[derive(Clone, Debug)]
pub struct ObservationSample {
pub metric: String,
pub value: f64,
pub tags: Vec<String>,
pub timestamp_secs: i64,
}
/// Wire-level sample union pushed onto the queue.
#[derive(Clone, Debug)]
pub enum Sample {
Request(RequestSample),
Counter(CounterSample),
Observation(ObservationSample),
}
-522
View File
@@ -1,522 +0,0 @@
use std::collections::HashMap;
use std::sync::Arc;
use std::sync::atomic::{AtomicBool, Ordering};
use std::time::Duration;
use std::time::{SystemTime, UNIX_EPOCH};
use log::{error, info, warn};
use datadog_client::client::{
DatadogClient, DistributionPoint, DistributionSeries, MetricPoint, MetricSeries,
};
use crate::queue::SampleQueue;
use crate::sample::{CounterSample, ObservationSample, RequestSample, Sample};
#[derive(Clone)]
pub struct MetricsWorkerConfig {
pub flush_interval: Duration,
pub duration_metric_name: String,
pub count_metric_name: String,
pub host: Option<String>,
pub env: String,
pub service_name: String,
}
/// Long-lived async loop: every `flush_interval`, drain the queue, aggregate
/// each sample kind, and POST to Datadog. Stops when the shared `shutdown`
/// flag is set and flushes one final batch on the way out.
pub struct MetricsWorker {
queue: SampleQueue,
client: DatadogClient,
config: MetricsWorkerConfig,
shutdown: Arc<AtomicBool>,
}
impl MetricsWorker {
pub(crate) fn new(
queue: SampleQueue,
client: DatadogClient,
config: MetricsWorkerConfig,
shutdown: Arc<AtomicBool>,
) -> Self {
Self { queue, client, config, shutdown }
}
pub fn shutdown_handle(&self) -> Arc<AtomicBool> {
self.shutdown.clone()
}
pub async fn run(&self) {
info!(
"Metrics worker started (flush every {:?}, service={}, env={}, host={})",
self.config.flush_interval,
self.config.service_name,
self.config.env,
self.config.host.as_deref().unwrap_or("<unset>"),
);
// Startup connectivity ping: submit one tiny counter so logs immediately
// reveal misconfigured API keys / blocked egress / etc., rather than
// staying silent until the first batch with real data flushes.
self.startup_ping().await;
let mut ticker = tokio::time::interval(self.config.flush_interval);
// `tokio::time::interval` fires immediately on the first tick; skip it
// so we don't flush a half-empty bucket the moment we boot.
ticker.tick().await;
while !self.shutdown.load(Ordering::Relaxed) {
ticker.tick().await;
if self.shutdown.load(Ordering::Relaxed) { break; }
self.flush_once().await;
}
info!("Metrics worker draining final batch on shutdown");
self.flush_once().await;
info!("Metrics worker stopped");
}
/// One-shot at worker startup. Submits a single `metrics.startup.ping`
/// counter so failures (bad API key, no egress, wrong DD site) surface
/// in the logs within seconds of boot.
async fn startup_ping(&self) {
let now = SystemTime::now()
.duration_since(UNIX_EPOCH)
.map(|d| d.as_secs() as i64)
.unwrap_or(0);
let ping = MetricSeries {
metric: "metrics.startup.ping".to_string(),
points: vec![MetricPoint(now, 1.0)],
metric_type: "count".to_string(),
tags: vec![
format!("env:{}", self.config.env),
format!("service:{}", self.config.service_name),
],
host: self.config.host.clone(),
interval: Some(60),
};
match self.client.submit_series(vec![ping]).await {
Ok(()) => info!(
"metrics: startup ping submitted successfully (service={}, env={})",
self.config.service_name, self.config.env,
),
Err(e) => error!(
"metrics: startup ping FAILED ({}). The worker will keep trying, but \
this almost always means a misconfigured DATADOG_API_KEY, a wrong \
Datadog site host, or blocked egress to api.datadoghq.com.",
e,
),
}
}
async fn flush_once(&self) {
let samples = self.queue.drain();
if samples.is_empty() {
return;
}
let sample_count = samples.len();
let MetricsBuild { distributions, counts } = self.build_metrics(samples);
let dist_count = distributions.len();
let count_count = counts.len();
let dist_result = self.client.submit_distribution_points(distributions).await;
let series_result = self.client.submit_series(counts).await;
match (&dist_result, &series_result) {
(Ok(()), Ok(())) => {
info!(
"metrics flush ok: {} samples → {} distribution series, {} count series",
sample_count, dist_count, count_count,
);
}
_ => {
if let Err(e) = dist_result {
warn!(
"metrics: distribution submission FAILED ({} series, {} samples): {}",
dist_count, sample_count, e,
);
}
if let Err(e) = series_result {
warn!(
"metrics: series submission FAILED ({} series, {} samples): {}",
count_count, sample_count, e,
);
}
}
}
}
/// Partition samples by kind and aggregate each:
/// - Request samples → per `(route, method, status_code)`: distribution of
/// duration_ms + count.
/// - Counter samples → per `(metric, sorted_tags)`: count (entry count
/// in that group).
/// - Observation samples → per `(metric, sorted_tags)`: distribution of
/// values.
fn build_metrics(&self, samples: Vec<Sample>) -> MetricsBuild {
let mut requests = Vec::new();
let mut counters = Vec::new();
let mut observations = Vec::new();
for s in samples {
match s {
Sample::Request(r) => requests.push(r),
Sample::Counter(c) => counters.push(c),
Sample::Observation(o) => observations.push(o),
}
}
let interval = self.config.flush_interval.as_secs() as i64;
let mut distributions = Vec::new();
let mut counts = Vec::new();
self.build_request_metrics(requests, interval, &mut distributions, &mut counts);
self.build_counter_metrics(counters, interval, &mut counts);
self.build_observation_metrics(observations, &mut distributions);
MetricsBuild { distributions, counts }
}
fn build_request_metrics(
&self,
samples: Vec<RequestSample>,
interval: i64,
distributions: &mut Vec<DistributionSeries>,
counts: &mut Vec<MetricSeries>,
) {
let mut by_key: HashMap<RequestKey, RequestBucket> = HashMap::new();
for s in samples {
let key = RequestKey { route: s.route, method: s.method, status_code: s.status_code };
let bucket = by_key.entry(key).or_insert_with(|| RequestBucket {
durations_ms: Vec::new(),
last_timestamp_secs: s.timestamp_secs,
});
bucket.durations_ms.push(s.duration_ms);
if s.timestamp_secs > bucket.last_timestamp_secs {
bucket.last_timestamp_secs = s.timestamp_secs;
}
}
for (key, bucket) in by_key {
let tags = self.build_request_tags(&key);
let count = bucket.durations_ms.len() as f64;
distributions.push(DistributionSeries {
metric: self.config.duration_metric_name.clone(),
points: vec![DistributionPoint(bucket.last_timestamp_secs, bucket.durations_ms)],
tags: tags.clone(),
host: self.config.host.clone(),
});
counts.push(MetricSeries {
metric: self.config.count_metric_name.clone(),
points: vec![MetricPoint(bucket.last_timestamp_secs, count)],
metric_type: "count".to_string(),
tags,
host: self.config.host.clone(),
interval: Some(interval),
});
}
}
fn build_counter_metrics(
&self,
samples: Vec<CounterSample>,
interval: i64,
counts: &mut Vec<MetricSeries>,
) {
let mut by_key: HashMap<(String, Vec<String>), CounterBucket> = HashMap::new();
for s in samples {
let tags = sort_tags(s.tags);
let entry = by_key.entry((s.metric, tags)).or_insert_with(|| CounterBucket {
value: 0.0,
last_timestamp_secs: s.timestamp_secs,
});
entry.value += 1.0;
if s.timestamp_secs > entry.last_timestamp_secs {
entry.last_timestamp_secs = s.timestamp_secs;
}
}
for ((metric, tags), bucket) in by_key {
counts.push(MetricSeries {
metric,
points: vec![MetricPoint(bucket.last_timestamp_secs, bucket.value)],
metric_type: "count".to_string(),
tags: with_service_env_tags(tags, &self.config),
host: self.config.host.clone(),
interval: Some(interval),
});
}
}
fn build_observation_metrics(
&self,
samples: Vec<ObservationSample>,
distributions: &mut Vec<DistributionSeries>,
) {
let mut by_key: HashMap<(String, Vec<String>), ObservationBucket> = HashMap::new();
for s in samples {
let tags = sort_tags(s.tags);
let entry = by_key.entry((s.metric, tags)).or_insert_with(|| ObservationBucket {
values: Vec::new(),
last_timestamp_secs: s.timestamp_secs,
});
entry.values.push(s.value);
if s.timestamp_secs > entry.last_timestamp_secs {
entry.last_timestamp_secs = s.timestamp_secs;
}
}
for ((metric, tags), bucket) in by_key {
distributions.push(DistributionSeries {
metric,
points: vec![DistributionPoint(bucket.last_timestamp_secs, bucket.values)],
tags: with_service_env_tags(tags, &self.config),
host: self.config.host.clone(),
});
}
}
fn build_request_tags(&self, key: &RequestKey) -> Vec<String> {
let class = status_class(key.status_code);
vec![
format!("route:{}", key.route),
format!("method:{}", key.method),
format!("status_code:{}", key.status_code),
format!("status_class:{}", class),
format!("env:{}", self.config.env),
format!("service:{}", self.config.service_name),
]
}
}
#[derive(Eq, Hash, PartialEq)]
struct RequestKey {
route: String,
method: String,
status_code: u16,
}
struct RequestBucket {
durations_ms: Vec<f64>,
last_timestamp_secs: i64,
}
struct CounterBucket {
value: f64,
last_timestamp_secs: i64,
}
struct ObservationBucket {
values: Vec<f64>,
last_timestamp_secs: i64,
}
struct MetricsBuild {
distributions: Vec<DistributionSeries>,
counts: Vec<MetricSeries>,
}
fn status_class(status: u16) -> &'static str {
match status {
100..=199 => "1xx",
200..=299 => "2xx",
300..=399 => "3xx",
400..=499 => "4xx",
_ => "5xx",
}
}
/// Sort so `(metric, tags)` keys hash the same regardless of caller ordering.
fn sort_tags(mut tags: Vec<String>) -> Vec<String> {
tags.sort();
tags.dedup();
tags
}
/// Append the service/env tags to a custom-metric tag list (after dedup),
/// matching what request metrics get for free.
fn with_service_env_tags(mut tags: Vec<String>, config: &MetricsWorkerConfig) -> Vec<String> {
tags.push(format!("env:{}", config.env));
tags.push(format!("service:{}", config.service_name));
tags
}
#[cfg(test)]
mod tests {
use super::*;
fn make_worker() -> MetricsWorker {
let queue = SampleQueue::new();
let client = DatadogClient::new(datadog_client::creds::DatadogApiKey::new("test"));
let config = MetricsWorkerConfig {
flush_interval: Duration::from_secs(10),
duration_metric_name: "test.duration_ms".to_string(),
count_metric_name: "test.count".to_string(),
host: Some("test-host".to_string()),
env: "test".to_string(),
service_name: "test-service".to_string(),
};
MetricsWorker::new(queue, client, config, Arc::new(AtomicBool::new(false)))
}
mod status_class_tests {
use super::*;
#[test]
fn classifies_each_range() {
assert_eq!(status_class(100), "1xx");
assert_eq!(status_class(200), "2xx");
assert_eq!(status_class(299), "2xx");
assert_eq!(status_class(301), "3xx");
assert_eq!(status_class(404), "4xx");
assert_eq!(status_class(500), "5xx");
assert_eq!(status_class(0), "5xx");
}
}
mod request_aggregation {
use super::*;
fn sample(route: &str, method: &str, status: u16, dur: f64, ts: i64) -> Sample {
Sample::Request(RequestSample {
route: route.to_string(),
method: method.to_string(),
status_code: status,
duration_ms: dur,
timestamp_secs: ts,
})
}
#[test]
fn groups_by_route_method_status() {
let w = make_worker();
let samples = vec![
sample("/a", "GET", 200, 1.0, 100),
sample("/a", "GET", 200, 2.0, 110),
sample("/a", "GET", 500, 9.0, 120),
sample("/b", "POST", 201, 5.0, 130),
];
let build = w.build_metrics(samples);
assert_eq!(build.distributions.len(), 3);
assert_eq!(build.counts.len(), 3);
let a_200 = build.distributions.iter()
.find(|d| d.tags.iter().any(|t| t == "route:/a")
&& d.tags.iter().any(|t| t == "status_code:200"))
.expect("missing /a 200 series");
assert_eq!(a_200.points[0].1, vec![1.0, 2.0]);
}
#[test]
fn tags_include_class_env_service() {
let w = make_worker();
let samples = vec![sample("/x", "GET", 500, 1.0, 1)];
let build = w.build_metrics(samples);
let tags = &build.distributions[0].tags;
assert!(tags.contains(&"status_class:5xx".to_string()));
assert!(tags.contains(&"env:test".to_string()));
assert!(tags.contains(&"service:test-service".to_string()));
}
#[test]
fn count_series_uses_count_type_and_interval() {
let w = make_worker();
let samples = vec![sample("/x", "GET", 200, 1.0, 1)];
let build = w.build_metrics(samples);
assert_eq!(build.counts[0].metric_type, "count");
assert_eq!(build.counts[0].interval, Some(10));
assert_eq!(build.counts[0].points[0].1, 1.0);
}
}
mod counter_aggregation {
use super::*;
fn counter(metric: &str, tags: Vec<&str>, ts: i64) -> Sample {
Sample::Counter(CounterSample {
metric: metric.to_string(),
tags: tags.into_iter().map(|s| s.to_string()).collect(),
timestamp_secs: ts,
})
}
#[test]
fn groups_by_metric_and_tag_set() {
let w = make_worker();
let samples = vec![
counter("orders.placed", vec!["region:us"], 1),
counter("orders.placed", vec!["region:us"], 2),
counter("orders.placed", vec!["region:eu"], 3),
counter("orders.failed", vec!["region:us"], 4),
];
let build = w.build_metrics(samples);
assert_eq!(build.distributions.len(), 0);
assert_eq!(build.counts.len(), 3);
let us_placed = build.counts.iter().find(|m| {
m.metric == "orders.placed"
&& m.tags.iter().any(|t| t == "region:us")
}).expect("missing orders.placed/us");
assert_eq!(us_placed.points[0].1, 2.0);
}
#[test]
fn tag_order_does_not_split_groups() {
let w = make_worker();
let samples = vec![
counter("x", vec!["a:1", "b:2"], 1),
counter("x", vec!["b:2", "a:1"], 2),
];
let build = w.build_metrics(samples);
assert_eq!(build.counts.len(), 1);
assert_eq!(build.counts[0].points[0].1, 2.0);
}
#[test]
fn service_and_env_tags_appended() {
let w = make_worker();
let samples = vec![counter("foo", vec![], 1)];
let build = w.build_metrics(samples);
let tags = &build.counts[0].tags;
assert!(tags.contains(&"env:test".to_string()));
assert!(tags.contains(&"service:test-service".to_string()));
}
}
mod observation_aggregation {
use super::*;
fn obs(metric: &str, value: f64, tags: Vec<&str>, ts: i64) -> Sample {
Sample::Observation(ObservationSample {
metric: metric.to_string(),
value,
tags: tags.into_iter().map(|s| s.to_string()).collect(),
timestamp_secs: ts,
})
}
#[test]
fn groups_into_distributions() {
let w = make_worker();
let samples = vec![
obs("queue.depth", 10.0, vec!["queue:a"], 1),
obs("queue.depth", 20.0, vec!["queue:a"], 2),
obs("queue.depth", 30.0, vec!["queue:b"], 3),
];
let build = w.build_metrics(samples);
assert_eq!(build.distributions.len(), 2);
assert_eq!(build.counts.len(), 0);
let a = build.distributions.iter()
.find(|d| d.tags.iter().any(|t| t == "queue:a"))
.expect("missing queue:a series");
assert_eq!(a.points[0].1, vec![10.0, 20.0]);
}
#[test]
fn service_and_env_tags_appended() {
let w = make_worker();
let samples = vec![obs("foo", 1.0, vec![], 1)];
let build = w.build_metrics(samples);
let tags = &build.distributions[0].tags;
assert!(tags.contains(&"env:test".to_string()));
assert!(tags.contains(&"service:test-service".to_string()));
}
}
}
+1 -1
View File
@@ -21,7 +21,7 @@ workspace-build-acceleration = { workspace = true }
# Internal
actix_helpers = { path = "../actix_helpers" }
server_environment.workspace = true
reusable_types = { path = "../../schema/public/reusable_types" }
# External
actix-web = { workspace = true }
@@ -5,7 +5,7 @@ use actix_web::HttpRequest;
use anyhow::anyhow;
use actix_helpers::extractors::get_request_host::get_request_host;
use server_environment::ServerEnvironment;
use reusable_types::server_environment::ServerEnvironment;
/// Multi-environment configuration for 3rd party redirects, eg. Stripe checkout flow and
/// Twitch OAuth flow.
@@ -82,7 +82,7 @@ mod tests {
use actix_web::HttpRequest;
use actix_web::test::TestRequest;
use server_environment::ServerEnvironment;
use reusable_types::server_environment::ServerEnvironment;
use crate::third_party_url_redirector::ThirdPartyUrlRedirector;
@@ -1,5 +1,4 @@
pub mod logging;
pub mod metrics;
pub mod mysql;
pub mod paging;
pub mod redis;
@@ -1,16 +0,0 @@
// ----- Environment Variable Names -----
const ENV_DATADOG_API_KEY: &str = "DATADOG_API_KEY";
const ENV_ENABLE_METRICS: &str = "ENABLE_METRICS";
// ----- Read Environment Variables -----
pub fn env_optional_datadog_api_key() -> Option<String> {
easyenv::get_env_string_optional(ENV_DATADOG_API_KEY)
}
/// Independent of API key presence — lets ops kill metrics at runtime
/// without removing the secret.
pub fn env_enable_metrics_default_false() -> bool {
easyenv::get_env_bool_or_default(ENV_ENABLE_METRICS, false)
}
@@ -1,141 +0,0 @@
//! Provider-flavored wrapper around the inner-most record insert.
//!
//! All provider-side inserts (Fal, Beeble, GmiCloud, Seedance2Pro,
//! Worldlabs, …) share the same shape:
//!
//! - `maybe_external_third_party*` is always present (the external API was
//! called and gave us back an id).
//! - Web-only fields (`maybe_model_type`, `maybe_input_source_token`,
//! `maybe_download_url`, `maybe_cover_image_media_file_token`,
//! `maybe_raw_inference_text`, `maybe_routing_tag`, `priority_level`,
//! `requires_keepalive`, `max_duration_seconds`, `is_debug_request`) are
//! hard-coded to None / 0 / false here.
//! - `maybe_inference_args` is passed as-is and serialized in the root.
//! `None` writes DB `NULL`.
//!
//! Visibility is `pub(crate)`: external callers must use a leaf function.
use sqlx::{Executor, MySql};
use std::marker::PhantomData;
use enums::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory;
use enums::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty;
use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory;
use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums::by_table::generic_inference_jobs::inference_model_type::InferenceModelType;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::job_status_plus::JobStatusPlus;
use enums::common::visibility::Visibility;
use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken;
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken;
use tokens::tokens::prompts::PromptToken;
use tokens::tokens::users::UserToken;
use tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken;
use crate::errors::database_query_error::DatabaseQueryError;
use crate::payloads::generic_inference_args::generic_inference_args::GenericInferenceArgs;
use crate::queries::generic_inference::common::insert_full_generic_inference_job_record::{
insert_full_generic_inference_job_record,
InsertFullGenericInferenceJobRecordArgs,
};
pub(crate) struct InsertGenericInferenceJobForProviderArgs<'e, 'c, E>
where E: 'e + Executor<'c, Database = MySql>
{
pub apriori_job_token: &'e InferenceJobToken,
pub uuid_idempotency_token: &'e str,
pub job_type: InferenceJobType,
pub external_third_party: InferenceJobExternalThirdParty,
pub external_third_party_id: &'e str,
pub product_category: InferenceJobProductCategory,
pub inference_category: InferenceCategory,
/// Optional model identifier. Converted to the legacy
/// [`InferenceModelType`] (which is a superset of `CommonModelType`) at
/// the call site of the root insert.
pub maybe_model_type: Option<CommonModelType>,
pub maybe_prompt_token: Option<&'e PromptToken>,
pub maybe_wallet_ledger_entry_token: Option<&'e WalletLedgerEntryToken>,
/// Forwarded to the root, which serializes to JSON. `None` writes DB NULL.
pub maybe_inference_args: Option<GenericInferenceArgs>,
pub maybe_creator_user_token: Option<&'e UserToken>,
pub maybe_avt_token: Option<&'e AnonymousVisitorTrackingToken>,
pub creator_ip_address: &'e str,
pub creator_set_visibility: Visibility,
pub maybe_debug_log_event_token: Option<&'e DebugLogEventToken>,
pub maybe_frontend_failure_category: Option<FrontendFailureCategory>,
pub maybe_failure_reason: Option<&'e str>,
pub status: JobStatusPlus,
pub mysql_executor: E,
pub phantom: PhantomData<&'c E>,
}
pub(crate) async fn insert_generic_inference_job_for_provider<'e, 'c: 'e, E>(
args: InsertGenericInferenceJobForProviderArgs<'e, 'c, E>,
) -> Result<u64, DatabaseQueryError>
where E: 'e + Executor<'c, Database = MySql>
{
insert_full_generic_inference_job_record(InsertFullGenericInferenceJobRecordArgs {
token: args.apriori_job_token,
uuid_idempotency_token: args.uuid_idempotency_token,
job_type: args.job_type,
maybe_external_third_party: Some(args.external_third_party),
maybe_external_third_party_id: Some(args.external_third_party_id),
maybe_product_category: Some(args.product_category),
inference_category: args.inference_category,
// Convert from the canonical CommonModelType to the table-scoped
// InferenceModelType so the database column gets the right value.
maybe_model_type: args.maybe_model_type.map(InferenceModelType::from_common_model_type),
maybe_prompt_token: args.maybe_prompt_token,
maybe_wallet_ledger_entry_token: args.maybe_wallet_ledger_entry_token,
maybe_inference_args: args.maybe_inference_args,
maybe_creator_user_token: args.maybe_creator_user_token,
maybe_avt_token: args.maybe_avt_token,
creator_ip_address: args.creator_ip_address,
creator_set_visibility: args.creator_set_visibility,
maybe_debug_log_event_token: args.maybe_debug_log_event_token,
maybe_frontend_failure_category: args.maybe_frontend_failure_category,
maybe_failure_reason: args.maybe_failure_reason,
status: args.status,
mysql_executor: args.mysql_executor,
phantom: args.phantom,
// Web-only fields — providers never set these.
maybe_model_token: None,
maybe_input_source_token: None,
maybe_input_source_token_type: None,
maybe_download_url: None,
maybe_cover_image_media_file_token: None,
maybe_raw_inference_text: None,
maybe_routing_tag: None,
priority_level: 0,
requires_keepalive: false,
max_duration_seconds: 0,
is_debug_request: false,
}).await
}
@@ -1 +0,0 @@
pub(crate) mod insert_generic_inference_job_for_provider;
@@ -1,6 +0,0 @@
pub mod beeble;
pub(crate) mod common;
pub mod fal;
pub mod gmicloud;
pub mod seedance2pro;
pub mod worldlabs;
@@ -1,77 +0,0 @@
use log::info;
use sqlx::{Executor, MySql};
use std::marker::PhantomData;
use enums::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty;
use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory;
use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::job_status_plus::JobStatusPlus;
use enums::common::visibility::Visibility;
use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken;
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
use tokens::tokens::users::UserToken;
use crate::errors::database_query_error::DatabaseQueryError;
use crate::queries::generic_inference::api_providers::common::insert_generic_inference_job_for_provider::{
insert_generic_inference_job_for_provider,
InsertGenericInferenceJobForProviderArgs,
};
pub struct InsertGenericInferenceForSeedance2ProCharacterWithAprioriJobTokenArgs<'e, 'c, E>
where E: 'e + Executor<'c, Database = MySql>
{
pub uuid_idempotency_token: &'e str,
/// Pre-generated job token.
pub apriori_job_token: &'e InferenceJobToken,
/// The Kinovi character_id returned by generate_character().
pub kinovi_character_id: &'e str,
pub maybe_model_type: Option<CommonModelType>,
pub maybe_creator_user_token: Option<&'e UserToken>,
pub maybe_avt_token: Option<&'e AnonymousVisitorTrackingToken>,
pub creator_ip_address: &'e str,
pub creator_set_visibility: Visibility,
pub mysql_executor: E,
pub phantom: PhantomData<&'c E>,
}
pub async fn insert_generic_inference_job_for_seedance2pro_character_with_apriori_job_token<'e, 'c : 'e, E>(
args: InsertGenericInferenceForSeedance2ProCharacterWithAprioriJobTokenArgs<'e, 'c, E>
) -> Result<InferenceJobToken, DatabaseQueryError>
where E: 'e + Executor<'c, Database = MySql>
{
let record_id = insert_generic_inference_job_for_provider(InsertGenericInferenceJobForProviderArgs {
apriori_job_token: args.apriori_job_token,
uuid_idempotency_token: args.uuid_idempotency_token,
job_type: InferenceJobType::Seedance2ProCharacter,
external_third_party: InferenceJobExternalThirdParty::Seedance2Pro,
external_third_party_id: args.kinovi_character_id,
product_category: InferenceJobProductCategory::Seedance2ProCharacter,
inference_category: InferenceCategory::CharacterGeneration,
maybe_model_type: args.maybe_model_type,
maybe_prompt_token: None,
maybe_wallet_ledger_entry_token: None,
maybe_inference_args: None,
maybe_creator_user_token: args.maybe_creator_user_token,
maybe_avt_token: args.maybe_avt_token,
creator_ip_address: args.creator_ip_address,
creator_set_visibility: args.creator_set_visibility,
maybe_debug_log_event_token: None,
maybe_frontend_failure_category: None,
maybe_failure_reason: None,
status: JobStatusPlus::Pending,
mysql_executor: args.mysql_executor,
phantom: args.phantom,
}).await?;
info!("Insert generic inference job for Seedance2Pro character: {} with record ID {}", args.apriori_job_token, record_id);
Ok(args.apriori_job_token.clone())
}
@@ -1,106 +0,0 @@
use log::info;
use sqlx::{Executor, MySql};
use std::marker::PhantomData;
use enums::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty;
use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory;
use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::job_status_plus::JobStatusPlus;
use enums::common::visibility::Visibility;
use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken;
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken;
use tokens::tokens::prompts::PromptToken;
use tokens::tokens::users::UserToken;
use tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken;
use crate::errors::database_query_error::DatabaseQueryError;
use crate::payloads::generic_inference_args::generic_inference_args::GenericInferenceArgs;
use crate::queries::generic_inference::api_providers::common::insert_generic_inference_job_for_provider::{
insert_generic_inference_job_for_provider,
InsertGenericInferenceJobForProviderArgs,
};
pub struct InsertGenericInferenceForSeedance2ProWithAprioriJobTokenArgs<'e, 'c, E>
where E: 'e + Executor<'c, Database = MySql>
{
/// Which kinovi queue to use: standard or alternate
pub use_alternate_kinovi: bool,
pub uuid_idempotency_token: &'e str,
// NOTE: We'll generate this ahead of time so we can save it with billing info!
pub apriori_job_token: &'e InferenceJobToken,
/// The external order_id returned by the seedance2pro generate_video call.
pub maybe_external_third_party_id: &'e str,
pub maybe_model_type: Option<CommonModelType>,
pub maybe_inference_args: Option<GenericInferenceArgs>,
pub maybe_prompt_token: Option<&'e PromptToken>,
pub maybe_wallet_ledger_entry_token: Option<&'e WalletLedgerEntryToken>,
pub maybe_creator_user_token: Option<&'e UserToken>,
pub maybe_avt_token: Option<&'e AnonymousVisitorTrackingToken>,
pub creator_ip_address: &'e str,
pub creator_set_visibility: Visibility,
pub maybe_debug_log_event_token: Option<&'e DebugLogEventToken>,
pub mysql_executor: E,
pub phantom: PhantomData<&'c E>,
}
pub async fn insert_generic_inference_job_for_seedance2pro_queue_with_apriori_job_token<'e, 'c : 'e, E>(
args: InsertGenericInferenceForSeedance2ProWithAprioriJobTokenArgs<'e, 'c, E>
) -> Result<InferenceJobToken, DatabaseQueryError>
where E: 'e + Executor<'c, Database = MySql>
{
let (job_type, external_third_party, product_category) = if args.use_alternate_kinovi {
(
InferenceJobType::Seedance2ProAltQueue,
InferenceJobExternalThirdParty::Seedance2ProAlt,
InferenceJobProductCategory::Seedance2ProVideoAlt,
)
} else {
(
InferenceJobType::Seedance2ProQueue,
InferenceJobExternalThirdParty::Seedance2Pro,
InferenceJobProductCategory::Seedance2ProVideo,
)
};
let record_id = insert_generic_inference_job_for_provider(InsertGenericInferenceJobForProviderArgs {
apriori_job_token: args.apriori_job_token,
uuid_idempotency_token: args.uuid_idempotency_token,
job_type,
external_third_party,
external_third_party_id: args.maybe_external_third_party_id,
product_category,
inference_category: InferenceCategory::VideoGeneration,
maybe_model_type: args.maybe_model_type,
maybe_prompt_token: args.maybe_prompt_token,
maybe_wallet_ledger_entry_token: args.maybe_wallet_ledger_entry_token,
maybe_inference_args: args.maybe_inference_args,
maybe_creator_user_token: args.maybe_creator_user_token,
maybe_avt_token: args.maybe_avt_token,
creator_ip_address: args.creator_ip_address,
creator_set_visibility: args.creator_set_visibility,
maybe_debug_log_event_token: args.maybe_debug_log_event_token,
maybe_frontend_failure_category: None,
maybe_failure_reason: None,
status: JobStatusPlus::Pending,
mysql_executor: args.mysql_executor,
phantom: args.phantom,
}).await?;
info!("Insert generic inference job for Seedance 2 Pro queue: {} with record ID {}", args.apriori_job_token, record_id);
Ok(args.apriori_job_token.clone())
}
@@ -1,85 +0,0 @@
use log::info;
use sqlx::{Executor, MySql};
use std::marker::PhantomData;
use enums::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty;
use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory;
use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::job_status_plus::JobStatusPlus;
use enums::common::visibility::Visibility;
use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken;
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
use tokens::tokens::prompts::PromptToken;
use tokens::tokens::users::UserToken;
use tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken;
use crate::errors::database_query_error::DatabaseQueryError;
use crate::payloads::generic_inference_args::generic_inference_args::GenericInferenceArgs;
use crate::queries::generic_inference::api_providers::common::insert_generic_inference_job_for_provider::{
insert_generic_inference_job_for_provider,
InsertGenericInferenceJobForProviderArgs,
};
pub struct InsertGenericInferenceForWorldlabsWithAprioriJobTokenArgs<'e, 'c, E>
where E: 'e + Executor<'c, Database = MySql>
{
pub uuid_idempotency_token: &'e str,
pub apriori_job_token: &'e InferenceJobToken,
/// The external operation_id returned by World Labs generate_world call.
pub maybe_external_third_party_id: &'e str,
pub maybe_model_type: Option<CommonModelType>,
pub maybe_inference_args: Option<GenericInferenceArgs>,
pub maybe_prompt_token: Option<&'e PromptToken>,
pub maybe_wallet_ledger_entry_token: Option<&'e WalletLedgerEntryToken>,
pub maybe_creator_user_token: Option<&'e UserToken>,
pub maybe_avt_token: Option<&'e AnonymousVisitorTrackingToken>,
pub creator_ip_address: &'e str,
pub creator_set_visibility: Visibility,
pub mysql_executor: E,
pub phantom: PhantomData<&'c E>,
}
pub async fn insert_generic_inference_job_for_worldlabs_queue_with_apriori_job_token<'e, 'c : 'e, E>(
args: InsertGenericInferenceForWorldlabsWithAprioriJobTokenArgs<'e, 'c, E>
) -> Result<InferenceJobToken, DatabaseQueryError>
where E: 'e + Executor<'c, Database = MySql>
{
let record_id = insert_generic_inference_job_for_provider(InsertGenericInferenceJobForProviderArgs {
apriori_job_token: args.apriori_job_token,
uuid_idempotency_token: args.uuid_idempotency_token,
job_type: InferenceJobType::WorldlabsQueue,
external_third_party: InferenceJobExternalThirdParty::Worldlabs,
external_third_party_id: args.maybe_external_third_party_id,
product_category: InferenceJobProductCategory::WorldlabsSplat,
inference_category: InferenceCategory::SplatGeneration,
maybe_model_type: args.maybe_model_type,
maybe_prompt_token: args.maybe_prompt_token,
maybe_wallet_ledger_entry_token: args.maybe_wallet_ledger_entry_token,
maybe_inference_args: args.maybe_inference_args,
maybe_creator_user_token: args.maybe_creator_user_token,
maybe_avt_token: args.maybe_avt_token,
creator_ip_address: args.creator_ip_address,
creator_set_visibility: args.creator_set_visibility,
maybe_debug_log_event_token: None,
maybe_frontend_failure_category: None,
maybe_failure_reason: None,
status: JobStatusPlus::Pending,
mysql_executor: args.mysql_executor,
phantom: args.phantom,
}).await?;
info!("Insert generic inference job for World Labs queue: {} with record ID {}", args.apriori_job_token, record_id);
Ok(args.apriori_job_token.clone())
}
@@ -1,3 +1,4 @@
use anyhow::anyhow;
use log::info;
use sqlx::{Executor, MySql};
use std::marker::PhantomData;
@@ -7,7 +8,6 @@ use enums::by_table::generic_inference_jobs::inference_category::InferenceCatego
use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty;
use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory;
use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums::common::generation::common_model_type::CommonModelType;
use enums::common::job_status_plus::JobStatusPlus;
use enums::common::visibility::Visibility;
use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken;
@@ -18,10 +18,6 @@ use tokens::tokens::users::UserToken;
use crate::errors::database_query_error::DatabaseQueryError;
use crate::payloads::generic_inference_args::generic_inference_args::GenericInferenceArgs;
use crate::queries::generic_inference::api_providers::common::insert_generic_inference_job_for_provider::{
insert_generic_inference_job_for_provider,
InsertGenericInferenceJobForProviderArgs,
};
pub struct InsertGenericInferenceForBeebleWithAprioriJobTokenArgs<'e, 'c, E>
@@ -35,8 +31,6 @@ pub struct InsertGenericInferenceForBeebleWithAprioriJobTokenArgs<'e, 'c, E>
/// The external primary key identifier for the job.
pub maybe_external_third_party_id: &'e str,
pub maybe_model_type: Option<CommonModelType>,
pub maybe_inference_args: Option<GenericInferenceArgs>,
pub maybe_prompt_token: Option<&'e PromptToken>,
@@ -67,29 +61,106 @@ pub async fn insert_generic_inference_job_for_beeble_queue_with_apriori_job_toke
) -> Result<InferenceJobToken, DatabaseQueryError>
where E: 'e + Executor<'c, Database = MySql>
{
let record_id = insert_generic_inference_job_for_provider(InsertGenericInferenceJobForProviderArgs {
apriori_job_token: args.apriori_job_token,
uuid_idempotency_token: args.uuid_idempotency_token,
job_type: InferenceJobType::BeebleQueue,
external_third_party: InferenceJobExternalThirdParty::Beeble,
external_third_party_id: args.maybe_external_third_party_id,
product_category: InferenceJobProductCategory::BeebleVideo,
inference_category: InferenceCategory::VideoGeneration,
maybe_model_type: args.maybe_model_type,
maybe_prompt_token: args.maybe_prompt_token,
maybe_wallet_ledger_entry_token: None,
maybe_inference_args: args.maybe_inference_args,
maybe_creator_user_token: args.maybe_creator_user_token,
maybe_avt_token: args.maybe_avt_token,
creator_ip_address: args.creator_ip_address,
creator_set_visibility: args.creator_set_visibility,
maybe_debug_log_event_token: args.maybe_debug_log_event_token,
maybe_frontend_failure_category: args.maybe_frontend_failure_category,
maybe_failure_reason: args.maybe_failure_reason,
status: args.starting_job_status_override.unwrap_or(JobStatusPlus::Pending),
mysql_executor: args.mysql_executor,
phantom: args.phantom,
}).await?;
let serialized_args_payload = serde_json::ser::to_string(&args.maybe_inference_args)
.map_err(|_e| anyhow!("could not encode inference args"))?;
const JOB_TYPE: InferenceJobType = InferenceJobType::BeebleQueue;
const INFERENCE_CATEGORY: InferenceCategory = InferenceCategory::VideoGeneration;
const PRODUCT_CATEGORY: InferenceJobProductCategory = InferenceJobProductCategory::BeebleVideo;
const EXTERNAL_THIRD_PARTY: InferenceJobExternalThirdParty = InferenceJobExternalThirdParty::Beeble;
let status = args.starting_job_status_override.unwrap_or(JobStatusPlus::Pending);
let maybe_frontend_failure_category_str = args.maybe_frontend_failure_category
.map(|c| c.to_str());
let maybe_truncated_failure_reason = args.maybe_failure_reason
.map(|s| if s.len() > 255 { &s[..255] } else { s });
let query = sqlx::query!(
r#"
INSERT INTO generic_inference_jobs
SET
token = ?,
uuid_idempotency_token = ?,
job_type = ?,
maybe_external_third_party = ?,
maybe_external_third_party_id = ?,
product_category = ?,
inference_category = ?,
maybe_model_type = NULL,
maybe_model_token = NULL,
maybe_input_source_token = NULL,
maybe_input_source_token_type = NULL,
maybe_download_url = NULL,
maybe_cover_image_media_file_token = NULL,
maybe_prompt_token = ?,
maybe_raw_inference_text = NULL,
maybe_inference_args = ?,
maybe_creator_user_token = ?,
maybe_creator_anonymous_visitor_token = ?,
creator_ip_address = ?,
creator_set_visibility = ?,
priority_level = 0,
is_keepalive_required = FALSE,
max_duration_seconds = 0,
is_debug_request = FALSE,
maybe_routing_tag = NULL,
maybe_debug_log_event_token = ?,
frontend_failure_category = ?,
failure_reason = ?,
status = ?
"#,
args.apriori_job_token.as_str(),
args.uuid_idempotency_token,
JOB_TYPE.to_str(),
EXTERNAL_THIRD_PARTY.to_str(),
args.maybe_external_third_party_id,
PRODUCT_CATEGORY.to_str(),
INFERENCE_CATEGORY.to_str(),
args.maybe_prompt_token.map(|t| t.to_string()),
serialized_args_payload,
args.maybe_creator_user_token.map(|t| t.to_string()),
args.maybe_avt_token.map(|t| t.to_string()),
args.creator_ip_address,
args.creator_set_visibility.to_str(),
args.maybe_debug_log_event_token.map(|t| t.as_str()),
maybe_frontend_failure_category_str,
maybe_truncated_failure_reason,
status.to_str(),
);
let query_result = query.execute(args.mysql_executor)
.await;
let record_id = match query_result {
Err(err) => return Err(DatabaseQueryError::from(err)),
Ok(res) => res.last_insert_id(),
};
info!("Insert generic inference job for Beeble queue: {} with record ID {}", args.apriori_job_token, record_id);
@@ -1,226 +0,0 @@
//! Inner-most insert for the `generic_inference_jobs` table.
//!
//! This is the *only* place in the crate that owns the raw `INSERT` query.
//! Every other "insert" function — provider-specific leaves and the
//! web-flavored convenience function — must funnel through here so that
//! the column list and all the marshaling logic (inference_args JSON,
//! routing_tag trim/truncate, failure_reason 255-char clamp) lives in
//! exactly one place.
//!
//! The args struct is a superset: web fields (model/input/download/etc.) and
//! provider fields (external_third_party, wallet_ledger_entry, debug log
//! event, failure category/reason) are all here as `Option`. Leaves pass
//! `None` for fields that don't apply, and `None` writes DB `NULL`.
//!
//! Visibility is `pub(crate)`: external callers must use a leaf function,
//! never this directly.
use anyhow::anyhow;
use sqlx::{Executor, MySql};
use std::marker::PhantomData;
use enums::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory;
use enums::by_table::generic_inference_jobs::inference_category::InferenceCategory;
use enums::by_table::generic_inference_jobs::inference_input_source_token_type::InferenceInputSourceTokenType;
use enums::by_table::generic_inference_jobs::inference_job_external_third_party::InferenceJobExternalThirdParty;
use enums::by_table::generic_inference_jobs::inference_job_product_category::InferenceJobProductCategory;
use enums::by_table::generic_inference_jobs::inference_job_type::InferenceJobType;
use enums::by_table::generic_inference_jobs::inference_model_type::InferenceModelType;
use enums::common::job_status_plus::JobStatusPlus;
use enums::common::visibility::Visibility;
use tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken;
use tokens::tokens::generic_inference_jobs::InferenceJobToken;
use tokens::tokens::media_files::MediaFileToken;
use tokens::tokens::non_unique::debug_logs_event_token::DebugLogEventToken;
use tokens::tokens::prompts::PromptToken;
use tokens::tokens::users::UserToken;
use tokens::tokens::wallet_ledger_entries::WalletLedgerEntryToken;
use crate::errors::database_query_error::DatabaseQueryError;
use crate::payloads::generic_inference_args::generic_inference_args::GenericInferenceArgs;
pub(crate) struct InsertFullGenericInferenceJobRecordArgs<'e, 'c, E>
where E: 'e + Executor<'c, Database = MySql>
{
pub token: &'e InferenceJobToken,
pub uuid_idempotency_token: &'e str,
pub job_type: InferenceJobType,
pub maybe_external_third_party: Option<InferenceJobExternalThirdParty>,
pub maybe_external_third_party_id: Option<&'e str>,
pub maybe_product_category: Option<InferenceJobProductCategory>,
pub inference_category: InferenceCategory,
pub maybe_model_type: Option<InferenceModelType>,
pub maybe_model_token: Option<&'e str>,
pub maybe_input_source_token: Option<&'e str>,
pub maybe_input_source_token_type: Option<InferenceInputSourceTokenType>,
pub maybe_download_url: Option<&'e str>,
pub maybe_cover_image_media_file_token: Option<&'e MediaFileToken>,
pub maybe_prompt_token: Option<&'e PromptToken>,
pub maybe_wallet_ledger_entry_token: Option<&'e WalletLedgerEntryToken>,
pub maybe_raw_inference_text: Option<&'e str>,
/// Serialized to JSON here and written to `maybe_inference_args`. `None`
/// writes DB `NULL` (never the four-character `"null"` literal).
pub maybe_inference_args: Option<GenericInferenceArgs>,
pub maybe_creator_user_token: Option<&'e UserToken>,
pub maybe_avt_token: Option<&'e AnonymousVisitorTrackingToken>,
pub creator_ip_address: &'e str,
pub creator_set_visibility: Visibility,
pub priority_level: u8,
pub requires_keepalive: bool,
pub max_duration_seconds: i32,
pub is_debug_request: bool,
pub maybe_routing_tag: Option<&'e str>,
pub maybe_debug_log_event_token: Option<&'e DebugLogEventToken>,
pub maybe_frontend_failure_category: Option<FrontendFailureCategory>,
pub maybe_failure_reason: Option<&'e str>,
pub status: JobStatusPlus,
pub mysql_executor: E,
pub phantom: PhantomData<&'c E>,
}
pub(crate) async fn insert_full_generic_inference_job_record<'e, 'c: 'e, E>(
args: InsertFullGenericInferenceJobRecordArgs<'e, 'c, E>,
) -> Result<u64, DatabaseQueryError>
where E: 'e + Executor<'c, Database = MySql>
{
// VARCHAR(32) historically, but the web insert was truncating to 64 and
// trimming — preserve exactly so the refactor is behavior-neutral.
let maybe_routing_tag = args.maybe_routing_tag
.map(|tag| {
let mut tag = tag.trim().to_string();
tag.truncate(64);
tag
});
let maybe_truncated_failure_reason = args.maybe_failure_reason
.map(|s| if s.len() > 255 { &s[..255] } else { s });
// Serialize Some(args) → JSON string; None → DB NULL.
let maybe_inference_args_json = match args.maybe_inference_args.as_ref() {
Some(payload) => Some(
serde_json::ser::to_string(payload)
.map_err(|_e| anyhow!("could not encode inference args"))?
),
None => None,
};
let query = sqlx::query!(
r#"
INSERT INTO generic_inference_jobs
SET
token = ?,
uuid_idempotency_token = ?,
job_type = ?,
maybe_external_third_party = ?,
maybe_external_third_party_id = ?,
product_category = ?,
inference_category = ?,
maybe_model_type = ?,
maybe_model_token = ?,
maybe_input_source_token = ?,
maybe_input_source_token_type = ?,
maybe_download_url = ?,
maybe_cover_image_media_file_token = ?,
maybe_prompt_token = ?,
maybe_wallet_ledger_entry_token = ?,
maybe_raw_inference_text = ?,
maybe_inference_args = ?,
maybe_creator_user_token = ?,
maybe_creator_anonymous_visitor_token = ?,
creator_ip_address = ?,
creator_set_visibility = ?,
priority_level = ?,
is_keepalive_required = ?,
max_duration_seconds = ?,
is_debug_request = ?,
maybe_routing_tag = ?,
maybe_debug_log_event_token = ?,
frontend_failure_category = ?,
failure_reason = ?,
status = ?
"#,
args.token.as_str(),
args.uuid_idempotency_token,
args.job_type.to_str(),
args.maybe_external_third_party.map(|e| e.to_str()),
args.maybe_external_third_party_id,
args.maybe_product_category.map(|c| c.to_str()),
args.inference_category.to_str(),
args.maybe_model_type.map(|t| t.to_str()),
args.maybe_model_token,
args.maybe_input_source_token,
args.maybe_input_source_token_type.map(|t| t.to_str()),
args.maybe_download_url,
args.maybe_cover_image_media_file_token.map(|t| t.as_str()),
args.maybe_prompt_token.map(|t| t.to_string()),
args.maybe_wallet_ledger_entry_token.map(|t| t.to_string()),
args.maybe_raw_inference_text,
maybe_inference_args_json,
args.maybe_creator_user_token.map(|t| t.to_string()),
args.maybe_avt_token.map(|t| t.to_string()),
args.creator_ip_address,
args.creator_set_visibility.to_str(),
args.priority_level,
args.requires_keepalive,
args.max_duration_seconds,
args.is_debug_request,
maybe_routing_tag,
args.maybe_debug_log_event_token.map(|t| t.as_str()),
args.maybe_frontend_failure_category.map(|c| c.to_str()),
maybe_truncated_failure_reason,
args.status.to_str(),
);
let record_id = query.execute(args.mysql_executor)
.await?
.last_insert_id();
Ok(record_id)
}
@@ -1 +0,0 @@
pub(crate) mod insert_full_generic_inference_job_record;

Some files were not shown because too many files have changed in this diff Show More