Compare commits

...
Author SHA1 Message Date
arensc 7e52fbd2a5 Comfy dep update 2024-03-12 19:29:35 -04:00
Brandon Thomas 9fd9cf5cc9 add watermark to comfy 2024-03-01 05:25:29 -05:00
Brandon Thomas 889aebea09 more logging 2024-03-01 03:41:45 -05:00
Brandon Thomas 51666827ac allow deleted SD + lora in comfy 2024-03-01 03:32:04 -05:00
Brandon Thomas 51dfddf789 more error logging 2024-03-01 03:31:21 -05:00
Brandon Thomas 26f37629ca more error logging 2024-03-01 03:23:08 -05:00
Brandon Thomas 2972d54077 debugging errors 2024-03-01 03:14:24 -05:00
Brandon Thomas 23f7f0a539 codegen mysql 2024-03-01 02:43:37 -05:00
Brandon Thomas 422c92f392 more logging for comfyui 2024-03-01 02:42:37 -05:00
Brandon Thomas e023a27c18 fix logging 2024-02-29 23:19:55 -05:00
Brandon Thomas ea4887a41c name file based on type 2024-02-29 23:06:56 -05:00
Brandon Thomas b45a80142a optional env vars 2024-02-29 19:46:05 -05:00
Brandon Thomas e428f0ae9d logging for debug (why is r2d2 breaking?) 2024-02-29 19:34:29 -05:00
salt 44f6226088 add dino as a comfyui dependency 2024-02-28 17:53:58 -08:00
ArEnSc 5ee73d3feb Merge pull request #312 from storytold/feature/premium-timing
Editor added self by accident removing
2024-02-28 17:45:52 -05:00
arensc dcb2765b07 Editor added self by accident removing 2024-02-28 17:43:33 -05:00
ArEnSc 5e80eab10f Merge pull request #311 from storytold/feature/premium-timing
Premium V2V gating
2024-02-28 17:33:16 -05:00
arensc 66930695cd Premium V2V gating 2024-02-28 17:32:24 -05:00
salt 54f08192ed remove cropping arg from comfyui 2024-02-28 14:11:47 -08:00
Brandon Thomas 061cae7378 enroll gateway 2024-02-28 12:28:13 -05:00
Brandon Thomas af1b87c2c8 user access queries 2024-02-27 19:56:29 -05:00
salt f4800f7aaf process video for comfyui 2024-02-27 06:58:25 -08:00
Brandon Thomas e049c22fdd migrate mocapnet type 2024-02-26 20:47:30 -05:00
Brandon Thomas 45e54da9c1 add video upload handler to docs 2024-02-26 18:29:24 -05:00
Brandon Thomas f9fad82134 fix api docs 2024-02-26 18:18:08 -05:00
Brandon Thomas 5a64fced89 fix storyteller-web 2024-02-26 18:11:18 -05:00
Brandon Thomas 368a2a823e Merge pull request #310 from storytold/brandon-framerate-1
Framerate on video files
2024-02-26 18:01:05 -05:00
Brandon Thomas 207ef544ee Framerate on video files 2024-02-26 18:00:05 -05:00
ArEnSc bef677175b Merge pull request #309 from storytold/feature/comfyui-ffmeg
Comfy ui enqueue updates with trimming
2024-02-26 17:28:29 -05:00
arensc 1e64f2f01b Comfy ui enqueue updates with trimming 2024-02-26 17:24:59 -05:00
Brandon Thomas a444c84e12 enroll staff as admins query 2024-02-26 14:13:26 -05:00
Brandon Thomas 00102793dc comma-separated query param for media type selector 2024-02-26 01:02:41 -05:00
salt 9a7d369828 remove redundant check 2024-02-25 21:58:08 -08:00
salt c932b26b29 new comfyUI dependency 2024-02-25 16:32:41 -08:00
Brandon Thomas 3b13603f1f scope user media files by *multiple* types 2024-02-25 18:02:36 -05:00
salt 6b054d3b37 download lora to correct folder 2024-02-24 23:20:54 -08:00
Brandon Thomas 55db590e73 rename package 2024-02-24 02:33:10 -05:00
Brandon Thomas 2dd02272f9 tool to soft delete anonymous user images
- We'll need to go back and clean up the buckets for some of these
- Some of these are probably just for face animator and could help with
  training a better face detection model
2024-02-24 02:26:25 -05:00
Brandon Thomas 6c6debe64b additional safety features 2024-02-24 00:35:26 -05:00
Brandon Thomas 814209949e fix storyteller engine cors 2024-02-23 22:21:39 -05:00
Brandon Thomas 4fbb8ef335 fix endpoint 2024-02-23 00:16:25 -05:00
Brandon Thomas 25b512c7d8 codegen db 2024-02-22 23:54:43 -05:00
Brandon Thomas d3ae68dc14 get prompt API 2024-02-22 23:53:02 -05:00
Brandon Thomas 203ae33adb actually, we don't need that table anymore 2024-02-22 23:12:08 -05:00
Brandon Thomas d543ac3a33 forgot to commit the transaction 🤦 2024-02-22 23:10:37 -05:00
Brandon Thomas cd132b694c codegen 2024-02-22 21:37:42 -05:00
Brandon Thomas be7315b28d insert prompt records in SD inference job 2024-02-22 21:36:43 -05:00
Brandon Thomas 14fbb2e29c Queries for insert and get prompt 2024-02-22 19:37:49 -05:00
Brandon Thomas ef2f827fed add extra localhost port to cors (storyteller studio) 2024-02-22 18:29:40 -05:00
Brandon Thomas 172de887b7 squashed migrations for docs 2024-02-22 18:15:22 -05:00
Brandon Thomas 896fae0ef5 Bevy-specific "create scene" upload endpoint 2024-02-22 16:58:30 -05:00
salt 7cad80ad05 dont crash if workflow doesnt exist 2024-02-22 13:31:07 -08:00
Brandon Thomas e1fd39d003 fix lints 2024-02-22 04:57:00 -05:00
Brandon Thomas ea3df73e0f prompt token in media_files, enums, tokens 2024-02-22 04:21:26 -05:00
ArEnSc 8b3c139704 Merge pull request #307 from storytold/feature/properties-prompt
Adding properties to prompts
2024-02-22 02:35:40 -05:00
Brandon Thomas a1c01a2f3c new tables for usages and prompts 2024-02-21 22:54:07 -05:00
arensc 29a137e4fe Adding properties to prompts 2024-02-21 20:40:48 -05:00
Brandon Thomas b8270b0235 fix lints 2024-02-21 17:48:14 -05:00
Brandon Thomas 7dbae4c166 fix build error 2024-02-21 17:30:47 -05:00
Brandon Thomas 170c0afef5 analytics query 2024-02-21 17:24:06 -05:00
saltacc 4af67113b2 Merge pull request #306 from storytold/feature/upload-workflow
Feature/upload workflow
2024-02-21 14:07:22 -08:00
salt 0cb11fbf7e move route 2024-02-21 14:06:53 -08:00
salt 83b21f8965 fix errors 2024-02-21 13:29:09 -08:00
arensc dc139a6199 renamed a function 2024-02-21 14:21:58 -05:00
Brandon Thomas c6555b88d5 one or two more terms 2024-02-21 05:14:32 -05:00
arensc c71a7de5be Ok download code should work 2024-02-21 03:08:42 -05:00
arensc 559a9e1f4d Ok builds now doing the actual download 2024-02-20 23:48:49 -05:00
Brandon Thomas ce4c9a1d42 doc 2024-02-20 23:36:04 -05:00
Brandon Thomas d85fe3fb3d CLI tool to delete users' files 2024-02-20 23:19:08 -05:00
Brandon Thomas d601164b5b rename two cli apps 2024-02-20 22:12:11 -05:00
Brandon Thomas 73b6b6585e refactor CLI tools 2024-02-20 22:10:18 -05:00
Brandon Thomas 368c216c07 rename CLI binary 2024-02-20 21:57:26 -05:00
Brandon Thomas d31eb74344 named number classifier 2024-02-20 21:46:35 -05:00
Brandon Thomas 2dab930226 additional test cases for italian 2024-02-20 21:40:08 -05:00
Brandon Thomas 9fc6e4adf6 split up tests 2024-02-20 21:28:23 -05:00
arensc ea8a911ba3 Need to save prompt now 2024-02-20 21:08:01 -05:00
arensc ce28899e4c Initial commit for storyteller web, going to work on inference job 2024-02-20 20:27:11 -05:00
Brandon Thomas 77c22336e6 codegen db 2024-02-20 20:27:09 -05:00
Brandon Thomas 4ae7e61b7e additional safety 2024-02-20 19:26:21 -05:00
Brandon Thomas 16a3f74105 "1girl" is a false positive and used frequently in safe contexts 2024-02-20 19:09:03 -05:00
Brandon Thomas 4ad90b31df stop racism too 2024-02-20 18:56:24 -05:00
Brandon Thomas 5cc90d1001 better classifier 2024-02-20 18:49:20 -05:00
Brandon Thomas c6a5f0694f spanish + tests 2024-02-20 18:43:12 -05:00
Brandon Thomas 688efffcb8 improve classifier 2024-02-20 18:37:01 -05:00
Brandon Thomas 767191871d improved filter 2024-02-20 18:28:21 -05:00
Brandon Thomas 7d963deb38 move text classification to own crate (about to build out more) 2024-02-20 16:14:47 -05:00
saltacc 501eb24cd8 Merge pull request #303 from storytold/feature/comfy-replication
save job args to file modification info
2024-02-20 08:32:51 -08:00
salt 07d8125de9 remove excess message 2024-02-20 07:42:27 -08:00
salt aa9e1c2fe4 new dependencies + download workflow from weight token 2024-02-20 07:41:05 -08:00
Kasisnu 3d64537e87 Merge pull request #305 from storytold/feb-19-mithoo
more labels on inference job metrics, thumbnails for face animator
2024-02-20 18:41:39 +05:30
Kasisnu 9c674b1579 send thumbnail task requests from face animator 2024-02-20 18:35:43 +05:30
Kasisnu c6c94cfe56 slightly better instrumentation w/labels 2024-02-20 18:35:41 +05:30
Brandon Thomas 835bbe35c6 generate 4 images in a batch minimum 2024-02-20 03:37:51 -05:00
Brandon Thomas 029e29bf9a last test cases for the night 2024-02-20 03:13:54 -05:00
Brandon Thomas 57956c8124 fix failing lints and tests 2024-02-20 02:44:43 -05:00
Brandon Thomas ea269459e6 more prompt tests 2024-02-20 01:49:03 -05:00
Brandon Thomas 716589f62c more safety + tests 2024-02-19 19:55:06 -05:00
Brandon Thomas 2d5188ba91 more dictionary terms and test cases 2024-02-19 19:37:03 -05:00
Brandon Thomas d5205e764e more prompt tests, better regex split 2024-02-19 18:54:13 -05:00
Brandon Thomas 3d8c01f8fe remove sex from non-sex prompts 2024-02-19 17:49:04 -05:00
Brandon Thomas f0a328c059 prompt engineering - replace bad prompts 2024-02-19 17:27:35 -05:00
Brandon Thomas c87b1ba20d filter more bad prompts 2024-02-19 12:55:01 -05:00
Kasisnu d8f8735eca Merge pull request #304 from storytold/feb-19-mithoo
add error handler for OTEL
2024-02-19 21:10:35 +05:30
Kasisnu a2098b52d1 add error handler for OTEL 2024-02-19 21:09:54 +05:30
Kasisnu b8ccb9f6e0 Merge pull request #302 from storytold/feb-16-mithoo
slightly tweakier instrumentation
2024-02-19 18:47:21 +05:30
Brandon Thomas 8dc3d29daf Block basic absuive SD prompts 2024-02-19 02:31:07 -05:00
Brandon Thomas 42dfa3aa51 don't require user account for sd inference 2024-02-18 23:12:00 -05:00
Brandon Thomas 9ca42b370e report sd queue stats 2024-02-18 03:46:48 -05:00
Brandon Thomas ef9cc7de72 codegen db 2024-02-18 03:21:27 -05:00
Brandon Thomas e7367bdfe7 return batch tokens in GET media file endpoint 2024-02-18 03:19:43 -05:00
Brandon Thomas 467d849121 list media files by batch token handler 2024-02-18 03:13:57 -05:00
Brandon Thomas e98091c406 Insert batch token in media_file records 2024-02-18 02:40:15 -05:00
Brandon Thomas c9c4fd59d9 stubs for engine persistence endpoints 2024-02-17 23:22:13 -05:00
salt 48b1f6306b save job args to file modification info 2024-02-17 06:21:51 -08:00
Brandon Thomas 98c087116b default to 3 images 2024-02-16 16:48:57 -05:00
Kasisnu f13458a4e7 slightly tweakier instrumentation 2024-02-16 14:38:35 +05:30
Kasisnu 9903a31530 Merge pull request #299 from storytold/integrate-thumbnails-comfyui
Integrate thumbnails for comfyui outputs
2024-02-16 12:53:02 +05:30
Kasisnu 130326e7de thumbnails builder for reuse 2024-02-16 12:51:54 +05:30
Brandon Thomas d7295d79a1 ES search size: 30 2024-02-15 23:12:26 -05:00
Brandon Thomas c00e0c59f3 fix cover image attachment 2024-02-15 22:45:20 -05:00
Brandon Thomas 3dc271bb84 accept cover image in API 2024-02-15 21:10:50 -05:00
Brandon Thomas 7bac45cad1 add migration for cover images in generic inference jobs (uploads) 2024-02-15 19:30:32 -05:00
Brandon Thomas 3cc0da13de transcripts on list endpoints 2024-02-15 10:39:33 -05:00
Brandon Thomas 1aa7914eee text transcripts on get media file 2024-02-15 10:29:08 -05:00
Brandon Thomas d4bda54911 Merge pull request #301 from storytold/feb-14-mithoo
bvh result type is video; mime type/extension is set correctly
2024-02-14 19:12:18 -05:00
Brandon Thomas 30cef2bc57 validate compositor http request 2024-02-14 18:52:45 -05:00
Brandon Thomas e462f0c08a Store download URL in top-level job info 2024-02-14 18:24:58 -05:00
Brandon Thomas 04c0e09d6f styletts include text transcript 2024-02-14 17:41:06 -05:00
Brandon Thomas 319a8f0ba8 add text transcripts to tts inference jobs 2024-02-14 17:34:04 -05:00
Brandon Thomas 4fa4a0a4e1 post-migration widening of file_size_bytes 2024-02-14 11:06:31 -05:00
Kasisnu 89099a4ef8 bvh result type is video; mime type/extension is set correctly 2024-02-14 15:57:32 +05:30
Brandon Thomas 53b2aedbb0 Five new schema migrations 2024-02-14 05:27:01 -05:00
Madhukar Mishra 5936ef87f4 fix - add gif to mimetype to ext 2024-02-14 12:15:35 +05:30
Brandon Thomas 00abb6230b inference status - get model_weights title 2024-02-13 20:48:15 -05:00
Brandon Thomas fa21d8251e document job status endpoints 2024-02-13 20:31:59 -05:00
Brandon Thomas 17b38a62cf add more staff accounts 2024-02-13 19:36:38 -05:00
Brandon Thomas 132230bbbe enums got mixed up. we should rename these 2024-02-13 15:30:53 -05:00
Madhukar Mishra be49dbd11e fix extension for thumbnail output 2024-02-13 23:21:33 +05:30
Kasisnu 1b97d638a8 Merge pull request #300 from storytold/feb-13-mithoo
return errors from conversion endpoints when media file isnt sent
2024-02-13 21:57:13 +05:30
Kasisnu bd653c70d8 return errors from conversion endpoints when media file isnt sent 2024-02-13 21:56:36 +05:30
Madhukar Mishra dc31723f63 fixup 2024-02-13 18:50:32 +05:30
Madhukar Mishra 6b03981ef9 generate thumbnails in comfyui workflow 2024-02-13 18:50:32 +05:30
Brandon Thomas d4a4ac4077 more users for the rollout 2024-02-12 12:34:51 -05:00
Brandon Thomas 32acf33eeb after sd job, return the first media file token 2024-02-12 05:19:14 -05:00
Brandon Thomas c9060d973f feature flag more endpoints; don't return certain results in user list 2024-02-12 04:38:56 -05:00
Brandon Thomas a64990230e cleanup sd enqueue endpoint, remove flag check 2024-02-12 04:23:49 -05:00
Brandon Thomas a3c6cc5b03 cache SD model weights in a cache directory 2024-02-11 07:19:41 -05:00
252 changed files with 8628 additions and 1067 deletions
+1
View File
@@ -9,6 +9,7 @@
<w>cheermote</w>
<w>cidrs</w>
<w>crockford</w>
<w>csam</w>
<w>culted</w>
<w>dalle</w>
<w>demuxer</w>
@@ -157,7 +157,7 @@
"ordinal": 15,
"name": "file_size_bytes",
"type_info": {
"type": "Long",
"type": "LongLong",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO prompts\nSET\n token = ?,\n prompt_type = ?,\n\n maybe_creator_user_token = ?,\n\n maybe_positive_prompt = ?,\n maybe_negative_prompt = ?,\n maybe_other_args = ?,\n\n creator_ip_address = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 7
},
"nullable": []
},
"hash": "13ca06bcbb4a576f8a2229a8554b7488d379baa381d8d5cb60972750e81b2173"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO model_weights\n SET\n token = ?,\n weights_type = ?,\n weights_category = ?,\n title = ?,\n maybe_cover_image_media_file_token = ?,\n maybe_description_markdown = ?,\n maybe_description_rendered_html = ?,\n creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n maybe_last_update_user_token = ?,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n public_bucket_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n version = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 19
},
"nullable": []
},
"hash": "178b4b8e5c51aedd1cd65581426d868ecd7912c6ee97140d1351115895106164"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO media_files\n SET\n token = ?,\n media_type = ?,\n\n origin_category = ?, \n origin_product_category = ?, \n maybe_origin_model_type = ?, \n maybe_origin_model_token = ?, \n maybe_origin_filename = ?,\n\n is_batch_generated = ?,\n maybe_batch_token = ?,\n\n maybe_mime_type = ?,\n file_size_bytes = ?,\n maybe_duration_millis = ?,\n maybe_audio_encoding = ?, \n maybe_video_encoding = ?, \n maybe_frame_width = ?, \n maybe_frame_height = ?,\n maybe_prompt_token = ?,\n checksum_sha2 = ?,\n\n public_bucket_directory_hash = ?, \n maybe_public_bucket_prefix = ?, \n maybe_public_bucket_extension = ?, \n extra_file_modification_info = ?, \n\n maybe_creator_user_token = ?, \n maybe_creator_anonymous_visitor_token = ?, \n\n creator_ip_address = ?, \n creator_set_visibility = ?, \n\n maybe_creator_file_synthetic_id = ?, \n maybe_creator_category_synthetic_id = ?,\n\n maybe_mod_user_token = ?, \n is_generated_on_prem = ?, \n generated_by_worker = ?, \n generated_by_cluster = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 32
},
"nullable": []
},
"hash": "23061975280d3357a453705c90824001ff5023031a69425b8ec9b6ccff57aa8c"
}
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\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\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nLEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"media_file\"\n AND entity_stats.entity_token = m.token\nWHERE\n m.token = ?\n ",
"query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\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\n m.maybe_batch_token as `maybe_batch_token: tokens::tokens::batch_generations::BatchGenerationToken`,\n\n m.maybe_text_transcript,\n\n m.maybe_prompt_token as `maybe_prompt_token: tokens::tokens::prompts::PromptToken`,\n\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nLEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"media_file\"\n AND entity_stats.entity_token = m.token\nWHERE\n m.token = ?\n AND m.user_deleted_at IS NULL\n AND m.mod_deleted_at IS NULL\n ",
"describe": {
"columns": [
{
@@ -65,6 +65,36 @@
},
{
"ordinal": 6,
"name": "maybe_batch_token: tokens::tokens::batch_generations::BatchGenerationToken",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "maybe_text_transcript",
"type_info": {
"type": "Blob",
"flags": "BLOB | BINARY",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 8,
"name": "maybe_prompt_token: tokens::tokens::prompts::PromptToken",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 9,
"name": "creator_set_visibility: enums::common::visibility::Visibility",
"type_info": {
"type": "String",
@@ -74,7 +104,7 @@
}
},
{
"ordinal": 7,
"ordinal": 10,
"name": "maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken",
"type_info": {
"type": "VarString",
@@ -84,7 +114,7 @@
}
},
{
"ordinal": 8,
"ordinal": 11,
"name": "maybe_model_weights_title",
"type_info": {
"type": "VarString",
@@ -94,7 +124,7 @@
}
},
{
"ordinal": 9,
"ordinal": 12,
"name": "maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
@@ -104,7 +134,7 @@
}
},
{
"ordinal": 10,
"ordinal": 13,
"name": "maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory",
"type_info": {
"type": "VarString",
@@ -114,7 +144,7 @@
}
},
{
"ordinal": 11,
"ordinal": 14,
"name": "maybe_model_cover_image_public_bucket_hash",
"type_info": {
"type": "VarString",
@@ -124,7 +154,7 @@
}
},
{
"ordinal": 12,
"ordinal": 15,
"name": "maybe_model_cover_image_public_bucket_prefix",
"type_info": {
"type": "VarString",
@@ -134,7 +164,7 @@
}
},
{
"ordinal": 13,
"ordinal": 16,
"name": "maybe_model_cover_image_public_bucket_extension",
"type_info": {
"type": "VarString",
@@ -144,7 +174,7 @@
}
},
{
"ordinal": 14,
"ordinal": 17,
"name": "maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
@@ -154,7 +184,7 @@
}
},
{
"ordinal": 15,
"ordinal": 18,
"name": "maybe_model_weight_creator_username",
"type_info": {
"type": "VarString",
@@ -164,7 +194,7 @@
}
},
{
"ordinal": 16,
"ordinal": 19,
"name": "maybe_model_weight_creator_display_name",
"type_info": {
"type": "VarString",
@@ -174,7 +204,7 @@
}
},
{
"ordinal": 17,
"ordinal": 20,
"name": "maybe_model_weight_creator_gravatar_hash",
"type_info": {
"type": "String",
@@ -184,7 +214,7 @@
}
},
{
"ordinal": 18,
"ordinal": 21,
"name": "public_bucket_directory_hash",
"type_info": {
"type": "VarString",
@@ -194,7 +224,7 @@
}
},
{
"ordinal": 19,
"ordinal": 22,
"name": "maybe_public_bucket_prefix",
"type_info": {
"type": "VarString",
@@ -204,7 +234,7 @@
}
},
{
"ordinal": 20,
"ordinal": 23,
"name": "maybe_public_bucket_extension",
"type_info": {
"type": "VarString",
@@ -214,7 +244,7 @@
}
},
{
"ordinal": 21,
"ordinal": 24,
"name": "maybe_ratings_positive_count",
"type_info": {
"type": "Long",
@@ -224,7 +254,7 @@
}
},
{
"ordinal": 22,
"ordinal": 25,
"name": "maybe_ratings_negative_count",
"type_info": {
"type": "Long",
@@ -234,7 +264,7 @@
}
},
{
"ordinal": 23,
"ordinal": 26,
"name": "maybe_bookmark_count",
"type_info": {
"type": "Long",
@@ -244,7 +274,7 @@
}
},
{
"ordinal": 24,
"ordinal": 27,
"name": "created_at",
"type_info": {
"type": "Timestamp",
@@ -254,7 +284,7 @@
}
},
{
"ordinal": 25,
"ordinal": 28,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
@@ -274,6 +304,9 @@
true,
true,
true,
true,
true,
true,
false,
true,
true,
@@ -296,5 +329,5 @@
false
]
},
"hash": "c2de3b6de37dbbb5b6afd91af08aae2739cda97ef8ebb8f9b4ee967969ce43be"
"hash": "2c5083331bf226ef10c419f6a2b6dee6ee776a3d41eea06de1eafd1d1bd41791"
}
@@ -1,12 +0,0 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO media_files\n SET\n token = ?,\n \n origin_category = ?,\n origin_product_category = ?,\n maybe_origin_model_type = ?,\n \n media_type = ?,\n maybe_mime_type = ?,\n file_size_bytes = ?,\n \n checksum_sha2 = ?,\n \n public_bucket_directory_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n \n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n \n creator_set_visibility = ?,\n \n maybe_creator_file_synthetic_id = ?,\n maybe_creator_category_synthetic_id = ?,\n \n is_generated_on_prem = ?,\n generated_by_worker = ?,\n generated_by_cluster = ?\n \n ",
"describe": {
"columns": [],
"parameters": {
"Right": 20
},
"nullable": []
},
"hash": "567937a5918833330b74f94724eb69628aae49705ec4f8028321c38625eaa60c"
}
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n jobs.token as `job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken`,\n\n jobs.status as `status: enums::common::job_status_plus::JobStatusPlus`,\n jobs.attempt_count,\n\n jobs.maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n jobs.maybe_creator_anonymous_visitor_token as `maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken`,\n jobs.creator_ip_address,\n\n jobs.inference_category as `inference_category: enums::by_table::generic_inference_jobs::inference_category::InferenceCategory`,\n jobs.maybe_model_type,\n jobs.maybe_model_token,\n jobs.maybe_raw_inference_text,\n\n jobs.frontend_failure_category as `maybe_frontend_failure_category: enums::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory`,\n\n jobs.on_success_result_entity_type as maybe_result_entity_type,\n jobs.on_success_result_entity_token as maybe_result_entity_token,\n\n tts_models.title as maybe_tts_model_title,\n voice_conversion_models.title as maybe_voice_conversion_model_title,\n\n tts_results.public_bucket_wav_audio_path as maybe_tts_public_bucket_path,\n voice_conversion_results.public_bucket_hash as maybe_voice_conversion_public_bucket_hash,\n\n media_files.public_bucket_directory_hash as maybe_media_file_public_bucket_directory_hash,\n media_files.maybe_public_bucket_prefix as maybe_media_file_public_bucket_prefix,\n media_files.maybe_public_bucket_extension as maybe_media_file_public_bucket_extension,\n\n jobs.assigned_worker as maybe_assigned_worker,\n jobs.assigned_cluster as maybe_assigned_cluster,\n\n jobs.is_keepalive_required,\n\n jobs.created_at,\n jobs.updated_at,\n\n jobs.first_started_at as maybe_first_started_at,\n jobs.successfully_completed_at as maybe_successfully_completed_at\n\nFROM generic_inference_jobs as jobs\n\nLEFT OUTER JOIN tts_models ON jobs.maybe_model_token = tts_models.token\nLEFT OUTER JOIN voice_conversion_models ON jobs.maybe_model_token = voice_conversion_models.token\n\nLEFT OUTER JOIN tts_results ON jobs.on_success_result_entity_token = tts_results.token\nLEFT OUTER JOIN voice_conversion_results ON jobs.on_success_result_entity_token = voice_conversion_results.token\nLEFT OUTER JOIN media_files ON jobs.on_success_result_entity_token = media_files.token\n\nWHERE jobs.token = ?\n ",
"query": "\nSELECT\n jobs.token as `job_token: tokens::tokens::generic_inference_jobs::InferenceJobToken`,\n\n jobs.status as `status: enums::common::job_status_plus::JobStatusPlus`,\n jobs.attempt_count,\n\n jobs.maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n jobs.maybe_creator_anonymous_visitor_token as `maybe_creator_anonymous_visitor_token: tokens::tokens::anonymous_visitor_tracking::AnonymousVisitorTrackingToken`,\n jobs.creator_ip_address,\n\n jobs.inference_category as `inference_category: enums::by_table::generic_inference_jobs::inference_category::InferenceCategory`,\n jobs.maybe_model_type,\n jobs.maybe_model_token,\n jobs.maybe_raw_inference_text,\n\n jobs.frontend_failure_category as `maybe_frontend_failure_category: enums::by_table::generic_inference_jobs::frontend_failure_category::FrontendFailureCategory`,\n\n jobs.on_success_result_entity_type as maybe_result_entity_type,\n jobs.on_success_result_entity_token as maybe_result_entity_token,\n\n model_weights.title as maybe_model_weights_title,\n tts_models.title as maybe_tts_model_title,\n voice_conversion_models.title as maybe_voice_conversion_model_title,\n\n tts_results.public_bucket_wav_audio_path as maybe_tts_public_bucket_path,\n voice_conversion_results.public_bucket_hash as maybe_voice_conversion_public_bucket_hash,\n\n media_files.public_bucket_directory_hash as maybe_media_file_public_bucket_directory_hash,\n media_files.maybe_public_bucket_prefix as maybe_media_file_public_bucket_prefix,\n media_files.maybe_public_bucket_extension as maybe_media_file_public_bucket_extension,\n\n jobs.assigned_worker as maybe_assigned_worker,\n jobs.assigned_cluster as maybe_assigned_cluster,\n\n jobs.is_keepalive_required,\n\n jobs.created_at,\n jobs.updated_at,\n\n jobs.first_started_at as maybe_first_started_at,\n jobs.successfully_completed_at as maybe_successfully_completed_at\n\nFROM generic_inference_jobs as jobs\n\nLEFT OUTER JOIN model_weights ON jobs.maybe_model_token = model_weights.token\nLEFT OUTER JOIN tts_models ON jobs.maybe_model_token = tts_models.token\nLEFT OUTER JOIN voice_conversion_models ON jobs.maybe_model_token = voice_conversion_models.token\n\nLEFT OUTER JOIN tts_results ON jobs.on_success_result_entity_token = tts_results.token\nLEFT OUTER JOIN voice_conversion_results ON jobs.on_success_result_entity_token = voice_conversion_results.token\nLEFT OUTER JOIN media_files ON jobs.on_success_result_entity_token = media_files.token\n\nWHERE jobs.token = ?\n ",
"describe": {
"columns": [
{
@@ -135,7 +135,7 @@
},
{
"ordinal": 13,
"name": "maybe_tts_model_title",
"name": "maybe_model_weights_title",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
@@ -145,7 +145,7 @@
},
{
"ordinal": 14,
"name": "maybe_voice_conversion_model_title",
"name": "maybe_tts_model_title",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
@@ -155,7 +155,7 @@
},
{
"ordinal": 15,
"name": "maybe_tts_public_bucket_path",
"name": "maybe_voice_conversion_model_title",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
@@ -165,6 +165,16 @@
},
{
"ordinal": 16,
"name": "maybe_tts_public_bucket_path",
"type_info": {
"type": "VarString",
"flags": "BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 1020
}
},
{
"ordinal": 17,
"name": "maybe_voice_conversion_public_bucket_hash",
"type_info": {
"type": "VarString",
@@ -174,7 +184,7 @@
}
},
{
"ordinal": 17,
"ordinal": 18,
"name": "maybe_media_file_public_bucket_directory_hash",
"type_info": {
"type": "VarString",
@@ -184,7 +194,7 @@
}
},
{
"ordinal": 18,
"ordinal": 19,
"name": "maybe_media_file_public_bucket_prefix",
"type_info": {
"type": "VarString",
@@ -194,7 +204,7 @@
}
},
{
"ordinal": 19,
"ordinal": 20,
"name": "maybe_media_file_public_bucket_extension",
"type_info": {
"type": "VarString",
@@ -204,7 +214,7 @@
}
},
{
"ordinal": 20,
"ordinal": 21,
"name": "maybe_assigned_worker",
"type_info": {
"type": "VarString",
@@ -214,7 +224,7 @@
}
},
{
"ordinal": 21,
"ordinal": 22,
"name": "maybe_assigned_cluster",
"type_info": {
"type": "VarString",
@@ -224,7 +234,7 @@
}
},
{
"ordinal": 22,
"ordinal": 23,
"name": "is_keepalive_required",
"type_info": {
"type": "Tiny",
@@ -234,7 +244,7 @@
}
},
{
"ordinal": 23,
"ordinal": 24,
"name": "created_at",
"type_info": {
"type": "Timestamp",
@@ -244,7 +254,7 @@
}
},
{
"ordinal": 24,
"ordinal": 25,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
@@ -254,7 +264,7 @@
}
},
{
"ordinal": 25,
"ordinal": 26,
"name": "maybe_first_started_at",
"type_info": {
"type": "Timestamp",
@@ -264,7 +274,7 @@
}
},
{
"ordinal": 26,
"ordinal": 27,
"name": "maybe_successfully_completed_at",
"type_info": {
"type": "Timestamp",
@@ -300,6 +310,7 @@
true,
true,
true,
true,
false,
false,
false,
@@ -307,5 +318,5 @@
true
]
},
"hash": "4932e975b3369b06fcc23f7797f3a53a54211236383385b8740959b824bd9744"
"hash": "5fcdce6dd4c2b24d9062fda7b0a080bda3f04da6933b4dba8d335f9b7aecacb3"
}
@@ -0,0 +1,102 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n p.token as `token: tokens::tokens::prompts::PromptToken`,\n\n p.prompt_type as `prompt_type: enums::by_table::prompts::prompt_type::PromptType`,\n\n p.maybe_creator_user_token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\n\n p.maybe_positive_prompt,\n p.maybe_negative_prompt,\n p.maybe_other_args,\n\n p.creator_ip_address,\n p.created_at\n\nFROM prompts as p\nWHERE\n p.token = ?\n ",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "token: tokens::tokens::prompts::PromptToken",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 1,
"name": "prompt_type: enums::by_table::prompts::prompt_type::PromptType",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 64
}
},
{
"ordinal": 2,
"name": "maybe_creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 3,
"name": "maybe_positive_prompt",
"type_info": {
"type": "Blob",
"flags": "BLOB | BINARY",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 4,
"name": "maybe_negative_prompt",
"type_info": {
"type": "Blob",
"flags": "BLOB | BINARY",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 5,
"name": "maybe_other_args",
"type_info": {
"type": "Blob",
"flags": "BLOB | BINARY",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 6,
"name": "creator_ip_address",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | BINARY | NO_DEFAULT_VALUE",
"char_set": 224,
"max_size": 160
}
},
{
"ordinal": 7,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | MULTIPLE_KEY | BINARY | TIMESTAMP",
"char_set": 63,
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
true,
true,
true,
true,
false,
false
]
},
"hash": "61744bbf83f7cf00348bcc21e868d9c506fec46da4a33ac50d63c6d9e00c0cec"
}
@@ -157,7 +157,7 @@
"ordinal": 15,
"name": "file_size_bytes",
"type_info": {
"type": "Long",
"type": "LongLong",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
@@ -1,6 +1,6 @@
{
"db_name": "MySQL",
"query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\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\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nLEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"media_file\"\n AND entity_stats.entity_token = m.token\nWHERE\n m.token = ?\n AND m.user_deleted_at IS NULL\n AND m.mod_deleted_at IS NULL\n ",
"query": "\nSELECT\n m.token as `token: tokens::tokens::media_files::MediaFileToken`,\n\n m.media_type as `media_type: enums::by_table::media_files::media_file_type::MediaFileType`,\n\n users.token as `maybe_creator_user_token: tokens::tokens::users::UserToken`,\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\n m.maybe_batch_token as `maybe_batch_token: tokens::tokens::batch_generations::BatchGenerationToken`,\n\n m.maybe_text_transcript,\n\n m.maybe_prompt_token as `maybe_prompt_token: tokens::tokens::prompts::PromptToken`,\n\n m.creator_set_visibility as `creator_set_visibility: enums::common::visibility::Visibility`,\n\n model_weights.token as `maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken`,\n model_weights.title as maybe_model_weights_title,\n model_weights.weights_type as `maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType`,\n model_weights.weights_category as `maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory`,\n\n cover_image.public_bucket_directory_hash as maybe_model_cover_image_public_bucket_hash,\n cover_image.maybe_public_bucket_prefix as maybe_model_cover_image_public_bucket_prefix,\n cover_image.maybe_public_bucket_extension as maybe_model_cover_image_public_bucket_extension,\n\n model_weight_creator.token as `maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken`,\n model_weight_creator.username as maybe_model_weight_creator_username,\n model_weight_creator.display_name as maybe_model_weight_creator_display_name,\n model_weight_creator.email_gravatar_hash as maybe_model_weight_creator_gravatar_hash,\n\n m.public_bucket_directory_hash,\n m.maybe_public_bucket_prefix,\n m.maybe_public_bucket_extension,\n\n entity_stats.ratings_positive_count as maybe_ratings_positive_count,\n entity_stats.ratings_negative_count as maybe_ratings_negative_count,\n entity_stats.bookmark_count as maybe_bookmark_count,\n\n m.created_at,\n m.updated_at\n\nFROM media_files AS m\nLEFT OUTER JOIN users\n ON m.maybe_creator_user_token = users.token\nLEFT OUTER JOIN model_weights\n ON m.maybe_origin_model_token = model_weights.token\nLEFT OUTER JOIN media_files as cover_image\n ON cover_image.token = model_weights.maybe_cover_image_media_file_token\nLEFT OUTER JOIN users as model_weight_creator\n ON model_weight_creator.token = model_weights.creator_user_token\nLEFT OUTER JOIN entity_stats\n ON entity_stats.entity_type = \"media_file\"\n AND entity_stats.entity_token = m.token\nWHERE\n m.token = ?\n ",
"describe": {
"columns": [
{
@@ -65,6 +65,36 @@
},
{
"ordinal": 6,
"name": "maybe_batch_token: tokens::tokens::batch_generations::BatchGenerationToken",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 7,
"name": "maybe_text_transcript",
"type_info": {
"type": "Blob",
"flags": "BLOB | BINARY",
"char_set": 224,
"max_size": 262140
}
},
{
"ordinal": 8,
"name": "maybe_prompt_token: tokens::tokens::prompts::PromptToken",
"type_info": {
"type": "VarString",
"flags": "MULTIPLE_KEY | BINARY",
"char_set": 224,
"max_size": 128
}
},
{
"ordinal": 9,
"name": "creator_set_visibility: enums::common::visibility::Visibility",
"type_info": {
"type": "String",
@@ -74,7 +104,7 @@
}
},
{
"ordinal": 7,
"ordinal": 10,
"name": "maybe_model_weights_token: tokens::tokens::model_weights::ModelWeightToken",
"type_info": {
"type": "VarString",
@@ -84,7 +114,7 @@
}
},
{
"ordinal": 8,
"ordinal": 11,
"name": "maybe_model_weights_title",
"type_info": {
"type": "VarString",
@@ -94,7 +124,7 @@
}
},
{
"ordinal": 9,
"ordinal": 12,
"name": "maybe_model_weights_type: enums::by_table::model_weights::weights_types::WeightsType",
"type_info": {
"type": "VarString",
@@ -104,7 +134,7 @@
}
},
{
"ordinal": 10,
"ordinal": 13,
"name": "maybe_model_weights_category: enums::by_table::model_weights::weights_category::WeightsCategory",
"type_info": {
"type": "VarString",
@@ -114,7 +144,7 @@
}
},
{
"ordinal": 11,
"ordinal": 14,
"name": "maybe_model_cover_image_public_bucket_hash",
"type_info": {
"type": "VarString",
@@ -124,7 +154,7 @@
}
},
{
"ordinal": 12,
"ordinal": 15,
"name": "maybe_model_cover_image_public_bucket_prefix",
"type_info": {
"type": "VarString",
@@ -134,7 +164,7 @@
}
},
{
"ordinal": 13,
"ordinal": 16,
"name": "maybe_model_cover_image_public_bucket_extension",
"type_info": {
"type": "VarString",
@@ -144,7 +174,7 @@
}
},
{
"ordinal": 14,
"ordinal": 17,
"name": "maybe_model_weight_creator_user_token: tokens::tokens::users::UserToken",
"type_info": {
"type": "VarString",
@@ -154,7 +184,7 @@
}
},
{
"ordinal": 15,
"ordinal": 18,
"name": "maybe_model_weight_creator_username",
"type_info": {
"type": "VarString",
@@ -164,7 +194,7 @@
}
},
{
"ordinal": 16,
"ordinal": 19,
"name": "maybe_model_weight_creator_display_name",
"type_info": {
"type": "VarString",
@@ -174,7 +204,7 @@
}
},
{
"ordinal": 17,
"ordinal": 20,
"name": "maybe_model_weight_creator_gravatar_hash",
"type_info": {
"type": "String",
@@ -184,7 +214,7 @@
}
},
{
"ordinal": 18,
"ordinal": 21,
"name": "public_bucket_directory_hash",
"type_info": {
"type": "VarString",
@@ -194,7 +224,7 @@
}
},
{
"ordinal": 19,
"ordinal": 22,
"name": "maybe_public_bucket_prefix",
"type_info": {
"type": "VarString",
@@ -204,7 +234,7 @@
}
},
{
"ordinal": 20,
"ordinal": 23,
"name": "maybe_public_bucket_extension",
"type_info": {
"type": "VarString",
@@ -214,7 +244,7 @@
}
},
{
"ordinal": 21,
"ordinal": 24,
"name": "maybe_ratings_positive_count",
"type_info": {
"type": "Long",
@@ -224,7 +254,7 @@
}
},
{
"ordinal": 22,
"ordinal": 25,
"name": "maybe_ratings_negative_count",
"type_info": {
"type": "Long",
@@ -234,7 +264,7 @@
}
},
{
"ordinal": 23,
"ordinal": 26,
"name": "maybe_bookmark_count",
"type_info": {
"type": "Long",
@@ -244,7 +274,7 @@
}
},
{
"ordinal": 24,
"ordinal": 27,
"name": "created_at",
"type_info": {
"type": "Timestamp",
@@ -254,7 +284,7 @@
}
},
{
"ordinal": 25,
"ordinal": 28,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
@@ -274,6 +304,9 @@
true,
true,
true,
true,
true,
true,
false,
true,
true,
@@ -296,5 +329,5 @@
false
]
},
"hash": "06e0c5e80803d072551bc4df40e7d273ba0772608d52b46b840249415c341945"
"hash": "726a6c62dc20e8372e950a10ecd5a438769448c7ce315bc8743b728e80179420"
}
@@ -1,12 +0,0 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO media_files\n SET\n token = ?,\n media_type = ?,\n\n origin_category = ?, \n origin_product_category = ?, \n maybe_origin_model_type = ?, \n maybe_origin_model_token = ?, \n maybe_origin_filename = ?,\n\n is_batch_generated = ?, \n\n maybe_mime_type = ?,\n file_size_bytes = ?,\n maybe_duration_millis = ?,\n maybe_audio_encoding = ?, \n maybe_video_encoding = ?, \n maybe_frame_width = ?, \n maybe_frame_height = ?, \n checksum_sha2 = ?,\n\n public_bucket_directory_hash = ?, \n maybe_public_bucket_prefix = ?, \n maybe_public_bucket_extension = ?, \n extra_file_modification_info = ?, \n\n maybe_creator_user_token = ?, \n maybe_creator_anonymous_visitor_token = ?, \n\n creator_ip_address = ?, \n creator_set_visibility = ?, \n\n maybe_creator_file_synthetic_id = ?, \n maybe_creator_category_synthetic_id = ?,\n\n maybe_mod_user_token = ?, \n is_generated_on_prem = ?, \n generated_by_worker = ?, \n generated_by_cluster = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 30
},
"nullable": []
},
"hash": "80900178668fb38ae51dfe19401c1be37f4ef97fda0198f83239507b8000d1ae"
}
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO media_files\nSET\n token = ?,\n\n origin_category = ?,\n origin_product_category = ?,\n\n maybe_origin_model_type = ?,\n maybe_origin_model_token = ?,\n\n maybe_text_transcript = ?,\n\n media_type = ?,\n maybe_mime_type = ?,\n file_size_bytes = ?,\n\n checksum_sha2 = ?,\n\n public_bucket_directory_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n\n creator_set_visibility = ?,\n\n maybe_creator_file_synthetic_id = ?,\n maybe_creator_category_synthetic_id = ?,\n\n is_generated_on_prem = ?,\n generated_by_worker = ?,\n generated_by_cluster = ?\n\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 22
},
"nullable": []
},
"hash": "8aad4a39b2e43743a2efc1b37c17860c15a2314145c61ab4a25e449a4cb22128"
}
@@ -157,7 +157,7 @@
"ordinal": 15,
"name": "file_size_bytes",
"type_info": {
"type": "Long",
"type": "LongLong",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
@@ -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 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": 21
},
"nullable": []
},
"hash": "9b4c6f0d0db1c92e4d3eed8d572fa92c885bad4adcc053ae490b3a76c6c116d4"
}
@@ -157,7 +157,7 @@
"ordinal": 15,
"name": "file_size_bytes",
"type_info": {
"type": "Long",
"type": "LongLong",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\nINSERT INTO media_files\nSET\n token = ?,\n\n origin_category = ?,\n origin_product_category = ?,\n maybe_origin_model_type = ?,\n\n media_type = ?,\n maybe_mime_type = ?,\n file_size_bytes = ?,\n\n checksum_sha2 = ?,\n\n maybe_prompt_token = ?,\n\n public_bucket_directory_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n\n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n\n creator_set_visibility = ?,\n extra_file_modification_info = ?,\n\n maybe_creator_file_synthetic_id = ?,\n maybe_creator_category_synthetic_id = ?,\n\n is_generated_on_prem = ?,\n generated_by_worker = ?,\n generated_by_cluster = ?\n\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 22
},
"nullable": []
},
"hash": "ca7db50451b04da0b5521ebc12416280d4fe6cbc1da47b7fa314d810b5f3a6fd"
}
@@ -1,12 +0,0 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO model_weights\n SET\n token = ?,\n weights_type = ?,\n weights_category = ?,\n title = ?,\n maybe_description_markdown = ?,\n maybe_description_rendered_html = ?,\n creator_user_token = ?,\n creator_ip_address = ?,\n creator_set_visibility = ?,\n maybe_last_update_user_token = ?,\n original_download_url = ?,\n original_filename = ?,\n file_size_bytes = ?,\n file_checksum_sha2 = ?,\n public_bucket_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n version = ?\n ",
"describe": {
"columns": [],
"parameters": {
"Right": 18
},
"nullable": []
},
"hash": "db59a239bac6f5ceaad4396dfe6c2c933a7189dbf8da5f555b94148db1b0667f"
}
@@ -157,7 +157,7 @@
"ordinal": 15,
"name": "file_size_bytes",
"type_info": {
"type": "Long",
"type": "LongLong",
"flags": "NOT_NULL",
"char_set": 63,
"max_size": 10
@@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "\n INSERT INTO media_files\n SET\n token = ?,\n \n origin_category = ?,\n origin_product_category = ?,\n\n maybe_origin_model_type = ?,\n\n maybe_text_transcript = ?,\n\n media_type = ?,\n maybe_mime_type = ?,\n file_size_bytes = ?,\n \n checksum_sha2 = ?,\n \n public_bucket_directory_hash = ?,\n maybe_public_bucket_prefix = ?,\n maybe_public_bucket_extension = ?,\n \n maybe_creator_user_token = ?,\n maybe_creator_anonymous_visitor_token = ?,\n creator_ip_address = ?,\n \n creator_set_visibility = ?,\n \n maybe_creator_file_synthetic_id = ?,\n maybe_creator_category_synthetic_id = ?,\n \n is_generated_on_prem = ?,\n generated_by_worker = ?,\n generated_by_cluster = ?\n \n ",
"describe": {
"columns": [],
"parameters": {
"Right": 21
},
"nullable": []
},
"hash": "e7f9bb387905704e9da3fd1657432a3d821d49462fcf82d8cca8dd2dcfb3df17"
}
@@ -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 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_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": 19
},
"nullable": []
},
"hash": "e97a0974ed643b8a20d4d319b4aa93aba979d5f8fc0bdc44b77ef4f945b03b35"
}
Generated
+186 -91
View File
@@ -128,7 +128,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e01ed3140b2f8d422c68afa1ed2e85d996ea619c988ac834d255db32138655cb"
dependencies = [
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -166,7 +166,7 @@ dependencies = [
"parse-size",
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -298,7 +298,7 @@ dependencies = [
"actix-router",
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -347,7 +347,7 @@ checksum = "9aa0b287c8de4a76b691f29dbb5451e8dd5b79d777eaf87350c9b0cbfdb5e968"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -358,7 +358,7 @@ checksum = "7c7db3d5a9718568e4cf4a537cfd7070e6e6ff7481510d0237fb529ac850f6d3"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -681,7 +681,7 @@ checksum = "fdf6721fb0140e4f897002dd086c06f6c27775df19cfe1fccb21181a48fd2c98"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -1210,7 +1210,7 @@ dependencies = [
"heck",
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -1579,7 +1579,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13b588ba4ac1a99f7f2964d24b3d896ddc6bf847ee3855dbd4366f058cfcd331"
dependencies = [
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -1672,7 +1672,7 @@ dependencies = [
"proc-macro2",
"quote",
"strsim",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -1705,7 +1705,7 @@ checksum = "836a9bbc7ad63342d6d6e7b815ccab164bc77a2d95d84bc3117a8c0d5c98e2d5"
dependencies = [
"darling_core 0.20.3",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -1727,34 +1727,6 @@ version = "2.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7e962a19be5cfc3f3bf6dd8f61eb50107f356ad6270fbb3ed41476571db78be5"
[[package]]
name = "database-backup"
version = "0.0.1"
dependencies = [
"anyhow",
"container_common",
"dotenv",
"easyenv",
"log",
"my-workspace-hack",
"serde",
"serde_derive",
]
[[package]]
name = "database-cleanup"
version = "0.0.1"
dependencies = [
"anyhow",
"container_common",
"dotenv",
"easyenv",
"log",
"my-workspace-hack",
"serde",
"serde_derive",
]
[[package]]
name = "datetimes"
version = "0.0.1"
@@ -1764,6 +1736,43 @@ dependencies = [
"once_cell",
]
[[package]]
name = "db-backup"
version = "0.0.1"
dependencies = [
"anyhow",
"container_common",
"dotenv",
"easyenv",
"log",
"my-workspace-hack",
"serde",
"serde_derive",
]
[[package]]
name = "db-cleanup"
version = "0.0.1"
dependencies = [
"buckets",
"clap",
"container_common",
"dotenv",
"easyenv",
"enums",
"errors",
"log",
"my-workspace-hack",
"mysql_queries",
"serde",
"serde_derive",
"serde_json",
"sqlx",
"storyteller_root",
"tokens",
"tokio",
]
[[package]]
name = "debug-helper"
version = "0.3.13"
@@ -1916,7 +1925,7 @@ dependencies = [
"diesel_table_macro_syntax",
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -1925,7 +1934,7 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fc5557efc453706fed5e4fa85006fe9817c224c3f480a34c7e5959fd700921c5"
dependencies = [
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -1992,7 +2001,7 @@ checksum = "487585f4d0c6655fe74905e2504d8ad6908e4db67f744eb140876906c2f3175d"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -2640,7 +2649,7 @@ checksum = "53b153fd91e4b0147f4aced87be237c98248656bb01050b96bf3ee89220a8ddb"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -2769,7 +2778,7 @@ dependencies = [
"futures-sink",
"futures-util",
"http",
"indexmap 2.1.0",
"indexmap 2.2.3",
"slab",
"tokio",
"tokio-util",
@@ -2978,7 +2987,7 @@ dependencies = [
"serde",
"serde_derive",
"serde_json",
"speculoos",
"speculoos 0.9.0",
]
[[package]]
@@ -3142,9 +3151,9 @@ dependencies = [
[[package]]
name = "indexmap"
version = "2.1.0"
version = "2.2.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f"
checksum = "233cf39063f058ea2caae4091bf4a3ef70a653afbc026f5c4a4135d114e3c177"
dependencies = [
"equivalent",
"hashbrown 0.14.2",
@@ -3227,6 +3236,7 @@ dependencies = [
"subprocess",
"subprocess_common",
"tempdir",
"thumbnail_generator",
"time 0.3.30",
"tokens",
"tokio",
@@ -3924,6 +3934,20 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "mp4"
version = "0.14.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c9ef834d5ed55e494a2ae350220314dc4aacd1c43a9498b00e320e0ea352a5c3"
dependencies = [
"byteorder",
"bytes 1.5.0",
"num-rational 0.4.1",
"serde",
"serde_json",
"thiserror",
]
[[package]]
name = "my-workspace-hack"
version = "0.1.0"
@@ -3960,7 +3984,7 @@ dependencies = [
"heck",
"hmac 0.12.1",
"hyper",
"indexmap 2.1.0",
"indexmap 2.2.3",
"lazy_static",
"libc",
"log",
@@ -3995,7 +4019,7 @@ dependencies = [
"sqlx-mysql",
"sqlx-sqlite",
"syn 1.0.109",
"syn 2.0.39",
"syn 2.0.49",
"time 0.3.30",
"time-macros",
"tokio",
@@ -4127,13 +4151,27 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4703ad64153382334aa8db57c637364c322d3372e097840c72000dabdcf6156e"
dependencies = [
"num-bigint 0.1.44",
"num-complex",
"num-complex 0.1.43",
"num-integer",
"num-iter",
"num-rational 0.1.42",
"num-traits",
]
[[package]]
name = "num"
version = "0.4.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b05180d69e3da0e530ba2a1dae5110317e49e3b7f3d41be227dc5f92e49ee7af"
dependencies = [
"num-bigint 0.4.4",
"num-complex 0.4.5",
"num-integer",
"num-iter",
"num-rational 0.4.1",
"num-traits",
]
[[package]]
name = "num-bigint"
version = "0.1.44"
@@ -4184,6 +4222,15 @@ dependencies = [
"rustc-serialize",
]
[[package]]
name = "num-complex"
version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23c6602fda94a57c990fe0df199a035d83576b496aa29f4e634a8ac6004e68a6"
dependencies = [
"num-traits",
]
[[package]]
name = "num-integer"
version = "0.1.45"
@@ -4224,8 +4271,10 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0638a1c9d0a3c0914158145bc76cff373a75a627e6ecbfb71cbe6f453a5a19b0"
dependencies = [
"autocfg",
"num-bigint 0.4.4",
"num-integer",
"num-traits",
"serde",
]
[[package]]
@@ -4292,7 +4341,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -4331,7 +4380,7 @@ checksum = "1e32339a5dc40459130b3bd269e9892439f55b33e772d2a9d402a789baaf4e8a"
dependencies = [
"futures-core",
"futures-sink",
"indexmap 2.1.0",
"indexmap 2.2.3",
"js-sys",
"once_cell",
"pin-project-lite",
@@ -4593,7 +4642,7 @@ dependencies = [
"phf_shared 0.11.2",
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -4631,7 +4680,7 @@ checksum = "4359fd9c9171ec6e8c62926d6faaf553a8dc3f64e1507e76da7911b4f6a04405"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -4760,13 +4809,24 @@ dependencies = [
[[package]]
name = "proc-macro2"
version = "1.0.69"
version = "1.0.78"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "134c189feb4956b20f6f547d2cf727d4c0fe06722b20a0eec87ed445a97f92da"
checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
dependencies = [
"unicode-ident",
]
[[package]]
name = "prompt_engineering"
version = "0.1.0"
dependencies = [
"errors",
"my-workspace-hack",
"once_cell",
"regex",
"speculoos 0.11.0",
]
[[package]]
name = "prost"
version = "0.11.9"
@@ -4842,9 +4902,9 @@ dependencies = [
[[package]]
name = "quote"
version = "1.0.33"
version = "1.0.35"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5267fca4496028628a95160fc423a33e8b2e6af8a5302579e322e4b520293cae"
checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef"
dependencies = [
"proc-macro2",
]
@@ -5152,9 +5212,9 @@ dependencies = [
[[package]]
name = "reqwest"
version = "0.11.22"
version = "0.11.24"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "046cd98826c46c2ac8ddecae268eb5c2e58628688a5fc7a2643704a73faba95b"
checksum = "c6920094eb85afde5e4a138be3f2de8bbdf28000f0029e72c45025a56b042251"
dependencies = [
"async-compression",
"base64 0.21.5",
@@ -5175,9 +5235,11 @@ dependencies = [
"once_cell",
"percent-encoding",
"pin-project-lite",
"rustls-pemfile",
"serde",
"serde_json",
"serde_urlencoded",
"sync_wrapper",
"system-configuration",
"tokio",
"tokio-native-tls",
@@ -5285,7 +5347,7 @@ dependencies = [
"quote",
"rust-embed-utils",
"shellexpand",
"syn 2.0.39",
"syn 2.0.49",
"walkdir",
]
@@ -5503,7 +5565,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94143f37725109f92c262ed2cf5e59bce7498c01bcc1502d7b9afe439a4e9f49"
[[package]]
name = "scrape_test"
name = "scrape-test"
version = "0.0.1"
dependencies = [
"clap",
@@ -5615,22 +5677,22 @@ checksum = "388a1df253eca08550bef6c72392cfe7c30914bf41df5269b68cbd6ff8f570a3"
[[package]]
name = "serde"
version = "1.0.193"
version = "1.0.196"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25dd9975e68d0cb5aa1120c288333fc98731bd1dd12f561e468ea4728c042b89"
checksum = "870026e60fa08c69f064aa766c10f10b1d62db9ccd4d0abb206472bee0ce3b32"
dependencies = [
"serde_derive",
]
[[package]]
name = "serde_derive"
version = "1.0.193"
version = "1.0.196"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "43576ca501357b9b071ac53cdc7da8ef0cbd9493d8df094cd821777ea6e894d3"
checksum = "33c85360c95e7d137454dc81d9a4ed2b8efd8fbe19cee57357b32b9771fccb67"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -5640,7 +5702,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "224e6a14f315852940f3ec103125aa6482f0e224732ed91ed3330ed633077c34"
dependencies = [
"form_urlencoded",
"indexmap 2.1.0",
"indexmap 2.2.3",
"itoa 1.0.9",
"ryu",
"serde",
@@ -5648,11 +5710,11 @@ dependencies = [
[[package]]
name = "serde_json"
version = "1.0.108"
version = "1.0.113"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d1c7e3eac408d115102c4c24ad393e0821bb3a5df4d506a80f85f7a742a526b"
checksum = "69801b70b1c3dac963ecb03a364ba0ceda9cf60c71cfe475e99864759c8b8a79"
dependencies = [
"indexmap 2.1.0",
"indexmap 2.2.3",
"itoa 1.0.9",
"ryu",
"serde",
@@ -5707,7 +5769,7 @@ checksum = "3081f5ffbb02284dda55132aa26daecedd7372a42417bbbab6f14ab7d6bb9145"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -5789,7 +5851,7 @@ checksum = "91d129178576168c589c9ec973feedf7d3126c01ac2bf08795109aa35b69fb8f"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -5800,7 +5862,7 @@ checksum = "b93fb4adc70021ac1b47f7d45e8cc4169baaa7ea58483bc5b721d19a26202212"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -6003,7 +6065,16 @@ version = "0.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bcff6a72e2ddfb09ce0064568857e70d3cf6f4342244ebb1f84fa6f89b16c26"
dependencies = [
"num",
"num 0.1.42",
]
[[package]]
name = "speculoos"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "65881c9270d6157f30a09233305da51bed97eef9192d0ea21e57b1c8f05c3620"
dependencies = [
"num 0.4.1",
]
[[package]]
@@ -6078,7 +6149,7 @@ dependencies = [
"futures-util",
"hashlink",
"hex",
"indexmap 2.1.0",
"indexmap 2.2.3",
"log",
"memchr",
"native-tls",
@@ -6304,6 +6375,7 @@ dependencies = [
"buckets",
"chrono",
"cloud_storage",
"collections",
"composite_identifiers",
"config",
"container_common",
@@ -6350,6 +6422,7 @@ dependencies = [
"native-tls",
"once_cell",
"pin-project-lite",
"prompt_engineering",
"pulldown-cmark",
"r2d2_redis",
"rand 0.8.5",
@@ -6365,7 +6438,7 @@ dependencies = [
"serde_json",
"server_environment",
"sha2 0.9.9",
"speculoos",
"speculoos 0.11.0",
"sqlx",
"strum",
"symphonia",
@@ -6383,6 +6456,7 @@ dependencies = [
"utoipa",
"utoipa-swagger-ui",
"uuid 0.8.2",
"videos",
]
[[package]]
@@ -6456,7 +6530,7 @@ dependencies = [
"proc-macro2",
"quote",
"rustversion",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -6668,9 +6742,9 @@ dependencies = [
[[package]]
name = "syn"
version = "2.0.39"
version = "2.0.49"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "23e78b90f2fcf45d3e842032ce32e3f2d1545ba6636271dcbf24fa306d87be7a"
checksum = "915aea9e586f80826ee59f8453c1101f9d1c4b3964cd2460185ee8e299ada496"
dependencies = [
"proc-macro2",
"quote",
@@ -6778,7 +6852,17 @@ checksum = "266b2e40bc00e5a6c09c3584011e08b06f123c00362c92b975ba9843aaaa14b8"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
name = "thumbnail_generator"
version = "0.1.0"
dependencies = [
"easyenv",
"log",
"reqwest",
"serde_json",
]
[[package]]
@@ -6944,7 +7028,7 @@ checksum = "5b8a1e28f2deaa14e508979454cb3a223b10b938b45af148bc0986de36f1923b"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -7107,7 +7191,7 @@ version = "0.19.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b5bb770da30e5cbfde35a2d7b9b8a2c4b8ef89548a7a6aeab5c9a576e3e7421"
dependencies = [
"indexmap 2.1.0",
"indexmap 2.2.3",
"serde",
"serde_spanned",
"toml_datetime",
@@ -7194,7 +7278,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -7626,7 +7710,7 @@ version = "4.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ff05e3bac2c9428f57ade702667753ca3f5cf085e2011fe697de5bfd49aa72d"
dependencies = [
"indexmap 2.1.0",
"indexmap 2.2.3",
"serde",
"serde_json",
"utoipa-gen",
@@ -7642,7 +7726,7 @@ dependencies = [
"proc-macro2",
"quote",
"regex",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
@@ -7692,7 +7776,7 @@ dependencies = [
"pulldown-cmark",
"regex",
"semver 1.0.20",
"syn 2.0.39",
"syn 2.0.49",
"toml 0.7.8",
"url",
]
@@ -7703,6 +7787,17 @@ version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]]
name = "videos"
version = "0.0.1"
dependencies = [
"errors",
"log",
"mp4",
"my-workspace-hack",
"testing",
]
[[package]]
name = "void"
version = "1.0.2"
@@ -7833,7 +7928,7 @@ dependencies = [
"once_cell",
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
"wasm-bindgen-shared",
]
@@ -7867,7 +7962,7 @@ checksum = "c5353b8dab669f5e10f5bd76df26a9360c748f054f862ff5f3f8aae0c7fb3907"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
"wasm-bindgen-backend",
"wasm-bindgen-shared",
]
@@ -7880,9 +7975,9 @@ checksum = "0d046c5d029ba91a1ed14da14dca44b68bf2f124cfbaf741c54151fdb3e0750b"
[[package]]
name = "wasm-streams"
version = "0.3.0"
version = "0.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b4609d447824375f43e1ffbc051b50ad8f4b3ae8219680c94452ea05eb240ac7"
checksum = "b65dc4c90b63b118468cf747d8bf3566c1913ef60be765b5730ead9e0a3ba129"
dependencies = [
"futures-util",
"js-sys",
@@ -8245,7 +8340,7 @@ checksum = "dd7e48ccf166952882ca8bd778a43502c64f33bf94c12ebe2a7f08e5a0f6689f"
dependencies = [
"proc-macro2",
"quote",
"syn 2.0.39",
"syn 2.0.49",
]
[[package]]
+12 -9
View File
@@ -11,20 +11,21 @@ members = [
"crates/_types/tokens",
# CLI tools for operations, etc.
"crates/cli/database-backup",
"crates/cli/database-cleanup",
"crates/cli/dev-database-seed",
"crates/cli/dev-upload-media-file",
"crates/cli/elasticsearch-cli",
"crates/cli/kubectl-pod-cleanup",
"crates/cli/lru-delete-models",
"crates/cli/migration-tool",
"crates/cli/scrape_test",
"crates/cli/devenv/dev-database-seed",
"crates/cli/devenv/dev-upload-media-file",
"crates/cli/devenv/scrape-test",
"crates/cli/production/db-backup",
"crates/cli/production/db-cleanup",
"crates/cli/production/elasticsearch-cli",
"crates/cli/production/kubectl-pod-cleanup",
"crates/cli/production/lru-delete-models",
"crates/cli/production/migration-tool",
# Shared libraries
"crates/lib/actix_helpers",
"crates/lib/api_clients/cloud_storage",
"crates/lib/api_clients/google_drive_common",
"crates/lib/api_clients/thumbnail_generator",
"crates/lib/api_clients/twitch_common",
"crates/lib/bootstrap",
"crates/lib/caching/memory_caching",
@@ -47,12 +48,14 @@ members = [
"crates/lib/files/images",
"crates/lib/files/media",
"crates/lib/files/mimetypes",
"crates/lib/files/videos",
"crates/lib/idempotency",
"crates/lib/jobs_common",
"crates/lib/logging",
"crates/lib/migration",
"crates/lib/mysql_queries",
"crates/lib/password",
"crates/lib/prompt_engineering",
"crates/lib/redis_common",
"crates/lib/server_environment",
"crates/lib/sqlx_mysql_helpers",
@@ -1,16 +0,0 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Staff
-- SELECT token, username FROM users WHERE username IN (
UPDATE users SET can_access_studio = true WHERE username IN (
'bflat',
'crossproduct1',
'echelon',
'fyscott',
'olivicmic',
'saltacc',
'wilwong',
'zzz_last_item'
);
@@ -0,0 +1,24 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Staff
-- teddanson is victor's alt
-- SELECT token, username FROM users WHERE username IN (
UPDATE users SET user_role_slug = "admin" WHERE username IN (
'bflat',
'brandon',
'crossproduct',
'crossproduct1',
'echelon',
'fyscott',
'mrvintage',
'olivicmic',
'saltacc',
'teddanson',
'vegito1089',
'wilwong',
'yae_ph',
'zzz_last_item'
);
@@ -33,3 +33,35 @@ where token IN (
);
-- Staff
-- teddanson is victor's alt
-- endtimes is @sugarbro (testing)
-- el_cid_93 is for testing
-- NB: 'echelon' is absent
-- SELECT token, username FROM users WHERE username IN (
UPDATE users SET maybe_loyalty_program_key = 'fakeyou_contributor' WHERE username IN (
'bflat',
'brandon',
'crossproduct',
'crossproduct1',
'el_cid_93',
'endtimes',
'fyscott',
'gateway',
'jags111',
'mrvintage',
'olivicmic',
'rewin123',
'saltacc',
'teddanson',
'vegito1089',
'wilwong',
'yae_ph',
'zzz_last_item'
);
UPDATE users SET maybe_loyalty_program_key = 'fakeyou_contributor' WHERE username IN (
'endtimes',
'tropicalfun',
'zzz_last_item'
);
@@ -0,0 +1,36 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Staff
-- teddanson is victor's alt
-- endtimes is @sugarbro (testing)
-- el_cid_93 is for testing
-- SELECT token, username FROM users WHERE username IN (
UPDATE users SET can_access_studio = true WHERE username IN (
'bflat',
'brandon',
'crossproduct',
'crossproduct1',
'echelon',
'el_cid_93',
'endtimes',
'fyscott',
'gateway',
'jags111',
'mrvintage',
'olivicmic',
'rewin123',
'saltacc',
'teddanson',
'vegito1089',
'wilwong',
'yae_ph',
'zzz_last_item'
);
UPDATE users SET can_access_studio = true WHERE username IN (
'endtimes',
'tropicalfun',
'zzz_last_item'
);
@@ -0,0 +1,22 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- This finds the top users of image generation within a given time range.
select
u.username,
u.email_address,
count(*) as use_count
from users as u
join
(
select maybe_creator_user_token as user_token
from generic_inference_jobs
where job_type = 'stable_diffusion'
AND created_at > NOW() - INTERVAL 24 HOUR
) as jobs
ON jobs.user_token = u.token
group by u.username, u.email_address
order by use_count desc
@@ -0,0 +1,6 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE model_weights
MODIFY COLUMN file_size_bytes INT(10) NOT NULL DEFAULT 0;
@@ -0,0 +1,6 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE model_weights
MODIFY COLUMN file_size_bytes BIGINT(10) NOT NULL DEFAULT 0;
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE media_files DROP COLUMN maybe_text_transcript;
@@ -0,0 +1,7 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE media_files
ADD COLUMN maybe_text_transcript TEXT DEFAULT NULL
AFTER maybe_frame_height;
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE media_files DROP COLUMN maybe_batch_token;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE media_files
ADD COLUMN maybe_batch_token VARCHAR(32) DEFAULT NULL
AFTER is_batch_generated;
ALTER TABLE media_files
ADD INDEX index_maybe_batch_token (maybe_batch_token);
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE generic_inference_jobs DROP COLUMN maybe_download_url;
@@ -0,0 +1,7 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE generic_inference_jobs
ADD COLUMN maybe_download_url VARCHAR(1024) DEFAULT NULL
AFTER maybe_raw_inference_text;
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE generic_inference_jobs DROP COLUMN on_success_result_batch_token;
@@ -0,0 +1,7 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE generic_inference_jobs
ADD COLUMN on_success_result_batch_token VARCHAR(32) DEFAULT NULL
AFTER on_success_result_entity_token;
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE generic_inference_jobs DROP COLUMN maybe_cover_image_media_file_token;
@@ -0,0 +1,7 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE generic_inference_jobs
ADD COLUMN maybe_cover_image_media_file_token VARCHAR(32) DEFAULT NULL
AFTER maybe_download_url;
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
DROP TABLE prompts;
@@ -0,0 +1,56 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Table to store prompts as a first class entity.
-- Duplication of the same prompt is totally fine.
CREATE TABLE prompts (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- ========== PRIMARY, FOREIGN KEYS, and POLYMORPHISM ==========
-- Effective "primary key" of the prompt
token VARCHAR(32) NOT NULL,
-- Original product to which the prompt applied.
-- Prompts may or may not be compatible across products.
-- Possible values:
-- * 'stable_diffusion'
-- * 'comfy_ui'
prompt_type VARCHAR(16) NOT NULL,
-- Whomever created the prompt
maybe_creator_user_token VARCHAR(32) DEFAULT NULL,
-- ========== PROMPT DETAILS ==========
-- The positive prompt (optional)
-- TEXT = 65,535 bytes (64 KiB), ~= 4 bytes per UTF-8 character, ~ 16383 characters.
maybe_positive_prompt TEXT DEFAULT NULL,
-- The negative prompt (optional)
-- TEXT = 65,535 bytes (64 KiB), ~= 4 bytes per UTF-8 character, ~ 16383 characters.
maybe_negative_prompt TEXT DEFAULT NULL,
-- Polymorphic arguments payload that depends on the type of inference job.
-- TEXT = 65,535 bytes (64 KiB), ~= 4 bytes per UTF-8 character, ~ 16383 characters.
maybe_other_args TEXT DEFAULT NULL,
-- ========== ABUSE TRACKING ==========
-- For abuse tracking.
-- Wide enough for IPv4/6
creator_ip_address VARCHAR(40) NOT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- INDICES --
PRIMARY KEY (id),
UNIQUE KEY (token),
KEY index_maybe_creator_user_token (maybe_creator_user_token),
KEY index_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
drop table usages;
@@ -0,0 +1,46 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Usages of models and assets to create things
-- This should work for inference as well as 3D object/scene creation,
-- so the inputs can be models OR files.
CREATE TABLE usages (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- ========== PRIMARY AND FOREIGN KEYS ==========
-- Type of the entity created
-- This only denotes which table to join against, not the type of the entity within the join table.
-- Possible values:
-- * 'model_weight'
-- * 'media_file'
-- * (maybe future types)
created_type VARCHAR(16) NOT NULL,
-- Token of the entity created
created_token VARCHAR(32) NOT NULL,
-- Type of the entity used
-- This only denotes which table to join against, not the type of the entity within the join table.
-- Possible values:
-- * 'model_weight'
-- * 'media_file'
-- * (maybe future types)
used_type VARCHAR(16) NOT NULL,
-- Token of the entity used
used_token VARCHAR(32) NOT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- INDICES --
PRIMARY KEY (id),
UNIQUE KEY (created_type, created_token, used_type, used_token),
KEY index_created_type_and_token (created_type, created_token),
KEY index_used_type_and_token (used_type, used_token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -0,0 +1,5 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE media_files DROP COLUMN maybe_prompt_token;
@@ -0,0 +1,10 @@
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
ALTER TABLE media_files
ADD COLUMN maybe_prompt_token VARCHAR(32) DEFAULT NULL
AFTER maybe_text_transcript;
ALTER TABLE media_files
ADD INDEX fk_maybe_prompt_token (maybe_prompt_token);
@@ -72,6 +72,16 @@ CREATE TABLE generic_inference_jobs (
-- TEXT = 65,535 bytes (64 KiB), ~= 4 bytes per UTF-8 character, ~ 16383 characters.
maybe_raw_inference_text TEXT DEFAULT NULL,
-- For download-related jobs, this is the URL
-- This is nullable because not all inference jobs have a download URL.
-- The length of 1024 is arbitrary, but we shouldn't need anything longer.
maybe_download_url VARCHAR(1024) DEFAULT NULL,
-- For download-related jobs, this is the cover image to set.
-- This is nullable because not all inference jobs have a download URL.
-- And furthermore, not all download URLs have a cover image.
maybe_cover_image_media_file_token VARCHAR(32) DEFAULT NULL,
-- ========== SUCCESS CASE ==========
-- The type of the object will vary based on the type of the upload,
@@ -82,6 +92,11 @@ CREATE TABLE generic_inference_jobs (
-- This is only populated on a successful result.
on_success_result_entity_token VARCHAR(32) DEFAULT NULL,
-- If the job completes successfully, this is the batch token (ie. when
-- several results are created).
-- Only populated if there are actual batches generated.
on_success_result_batch_token VARCHAR(32) DEFAULT NULL,
-- ========== CREATOR DETAILS AND PREFERENCES ==========
-- Foreign key to user
+12
View File
@@ -58,11 +58,15 @@ CREATE TABLE media_files (
-- The original filename of the media (if uploaded by a user)
maybe_origin_filename VARCHAR(255) DEFAULT NULL,
-- TODO: Remove after `maybe_batch_token` gains use.
-- Whether this media file was generated as part of a batch
-- If so, we can look up the batch in a separate query/call to the `batch_generations` table.
-- We won't hold the batch token in this table since it'll be very sparsely populated.
is_batch_generated BOOLEAN NOT NULL DEFAULT FALSE,
-- If the media file is generated as part of a batch, this designates the batch.
maybe_batch_token VARCHAR(32) DEFAULT NULL,
-- ========== METADATA ==========
-- We can store text transcripts, etc. in other tables and refer back via foreign key.
@@ -100,6 +104,12 @@ CREATE TABLE media_files (
-- For videos, the original frame height.
maybe_frame_height INT(5) DEFAULT NULL,
-- Optional text transcript for audio or video (especially TTS)
maybe_text_transcript TEXT DEFAULT NULL,
-- Optional pointer to the prompt that generated this media file, if relevant.
maybe_prompt_token VARCHAR(32) DEFAULT NULL,
-- Checksum of the original media
-- SHA1 hash [SHA2 = CHAR(64), SHA1 = CHAR(40), MD5 = CHAR(32)]
-- checksum_sha1 CHAR(40) NOT NULL,
@@ -212,7 +222,9 @@ CREATE TABLE media_files (
KEY index_maybe_origin_model_type (maybe_origin_model_type),
KEY fk_maybe_origin_model_token (maybe_origin_model_token),
KEY fk_maybe_origin_model_type_and_token (maybe_origin_model_type, maybe_origin_model_token),
KEY index_maybe_batch_token (maybe_batch_token),
KEY index_media_type (media_type),
KEY fk_maybe_prompt_token (maybe_prompt_token),
KEY index_checksum_sha2 (checksum_sha2),
KEY fk_maybe_creator_user_token (maybe_creator_user_token),
KEY fk_maybe_mod_user_token (maybe_mod_user_token),
@@ -95,9 +95,8 @@ CREATE TABLE model_weights (
-- The filename that was used at upload time (if available)
original_filename VARCHAR(255) DEFAULT NULL,
-- TODO: Make this a BIGINT so we can store more than 2GB.
-- File characteristics
file_size_bytes INT(10) NOT NULL DEFAULT 0,
-- File size. BIGINT to store more than 2GB size.
file_size_bytes BIGINT(10) NOT NULL DEFAULT 0,
-- Checksum of the original weights file
-- SHA2 hash [SHA2 = CHAR(64), SHA1 = CHAR(40), MD5 = CHAR(32)]
+59
View File
@@ -0,0 +1,59 @@
-- NB: This is a manually squashed view of all the CREATE and ALTER statements,
-- with comments attached to the fields for centralized documentation.
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Table to store prompts as a first class entity.
-- Duplication of the same prompt is totally fine.
CREATE TABLE prompts (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- ========== PRIMARY, FOREIGN KEYS, and POLYMORPHISM ==========
-- Effective "primary key" of the prompt
token VARCHAR(32) NOT NULL,
-- Original product to which the prompt applied.
-- Prompts may or may not be compatible across products.
-- Possible values:
-- * 'stable_diffusion'
-- * 'comfy_ui'
prompt_type VARCHAR(16) NOT NULL,
-- Whomever created the prompt
maybe_creator_user_token VARCHAR(32) DEFAULT NULL,
-- ========== PROMPT DETAILS ==========
-- The positive prompt (optional)
-- TEXT = 65,535 bytes (64 KiB), ~= 4 bytes per UTF-8 character, ~ 16383 characters.
maybe_positive_prompt TEXT DEFAULT NULL,
-- The negative prompt (optional)
-- TEXT = 65,535 bytes (64 KiB), ~= 4 bytes per UTF-8 character, ~ 16383 characters.
maybe_negative_prompt TEXT DEFAULT NULL,
-- Polymorphic arguments payload that depends on the type of inference job.
-- TEXT = 65,535 bytes (64 KiB), ~= 4 bytes per UTF-8 character, ~ 16383 characters.
maybe_other_args TEXT DEFAULT NULL,
-- ========== ABUSE TRACKING ==========
-- For abuse tracking.
-- Wide enough for IPv4/6
creator_ip_address VARCHAR(40) NOT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- INDICES --
PRIMARY KEY (id),
UNIQUE KEY (token),
KEY index_maybe_creator_user_token (maybe_creator_user_token),
KEY index_created_at (created_at)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
+49
View File
@@ -0,0 +1,49 @@
-- NB: This is a manually squashed view of all the CREATE and ALTER statements,
-- with comments attached to the fields for centralized documentation.
-- noinspection SqlDialectInspectionForFile
-- noinspection SqlNoDataSourceInspectionForFile
-- noinspection SqlResolveForFile
-- Usages of models and assets to create things
-- This should work for inference as well as 3D object/scene creation,
-- so the inputs can be models OR files.
CREATE TABLE usages (
-- Not used for anything except replication.
id BIGINT(20) NOT NULL AUTO_INCREMENT,
-- ========== PRIMARY AND FOREIGN KEYS ==========
-- Type of the entity created
-- This only denotes which table to join against, not the type of the entity within the join table.
-- Possible values:
-- * 'model_weight'
-- * 'media_file'
-- * (maybe future types)
created_type VARCHAR(16) NOT NULL,
-- Token of the entity created
created_token VARCHAR(32) NOT NULL,
-- Type of the entity used
-- This only denotes which table to join against, not the type of the entity within the join table.
-- Possible values:
-- * 'model_weight'
-- * 'media_file'
-- * (maybe future types)
used_type VARCHAR(16) NOT NULL,
-- Token of the entity used
used_token VARCHAR(32) NOT NULL,
-- ========== TIMESTAMPS ==========
created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,
-- INDICES --
PRIMARY KEY (id),
UNIQUE KEY (created_type, created_token, used_type, used_token),
KEY index_created_type_and_token (created_type, created_token),
KEY index_used_type_and_token (used_type, used_token)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;
@@ -148,7 +148,7 @@ mod tests {
fn all_variants() {
// Static check
let mut variants = InferenceCategory::all_variants();
assert_eq!(variants.len(), 8);
assert_eq!(variants.len(), 9);
assert_eq!(variants.pop_first(), Some(InferenceCategory::LipsyncAnimation));
assert_eq!(variants.pop_first(), Some(InferenceCategory::TextToSpeech));
assert_eq!(variants.pop_first(), Some(InferenceCategory::VoiceConversion));
@@ -175,7 +175,7 @@ mod tests {
fn all_variants() {
// Static check
let mut variants = InferenceModelType::all_variants();
assert_eq!(variants.len(), 12);
assert_eq!(variants.len(), 13);
assert_eq!(variants.pop_first(), Some(InferenceModelType::RvcV2));
assert_eq!(variants.pop_first(), Some(InferenceModelType::SadTalker));
assert_eq!(variants.pop_first(), Some(InferenceModelType::SoVitsSvc));
@@ -26,6 +26,9 @@ pub enum MediaFileOriginCategory {
/// User uploaded files recorded directly from their device (browser, mobile), typically using device APIs.
DeviceApi,
/// From Storyteller Studio Engine
StoryEngine,
}
// TODO(bt, 2022-12-21): This desperately needs MySQL integration tests!
@@ -41,6 +44,7 @@ impl MediaFileOriginCategory {
Self::Processed => "processed",
Self::Upload => "upload",
Self::DeviceApi => "device_api",
Self::StoryEngine => "story_engine",
}
}
@@ -50,6 +54,7 @@ impl MediaFileOriginCategory {
"processed" => Ok(Self::Processed),
"upload" => Ok(Self::Upload),
"device_api" => Ok(Self::DeviceApi),
"story_engine" => Ok(Self::StoryEngine),
_ => Err(format!("invalid value: {:?}", value)),
}
}
@@ -62,6 +67,7 @@ impl MediaFileOriginCategory {
Self::Processed,
Self::Upload,
Self::DeviceApi,
Self::StoryEngine,
])
}
}
@@ -80,6 +86,7 @@ mod tests {
assert_serialization(MediaFileOriginCategory::Processed, "processed");
assert_serialization(MediaFileOriginCategory::Upload, "upload");
assert_serialization(MediaFileOriginCategory::DeviceApi, "device_api");
assert_serialization(MediaFileOriginCategory::StoryEngine, "story_engine");
}
#[test]
@@ -87,7 +94,7 @@ mod tests {
assert_eq!(MediaFileOriginCategory::Inference.to_str(), "inference");
assert_eq!(MediaFileOriginCategory::Processed.to_str(), "processed");
assert_eq!(MediaFileOriginCategory::Upload.to_str(), "upload");
assert_eq!(MediaFileOriginCategory::DeviceApi.to_str(), "device_api");
assert_eq!(MediaFileOriginCategory::StoryEngine.to_str(), "story_engine");
}
#[test]
@@ -96,17 +103,19 @@ mod tests {
assert_eq!(MediaFileOriginCategory::from_str("processed").unwrap(), MediaFileOriginCategory::Processed);
assert_eq!(MediaFileOriginCategory::from_str("upload").unwrap(), MediaFileOriginCategory::Upload);
assert_eq!(MediaFileOriginCategory::from_str("device_api").unwrap(), MediaFileOriginCategory::DeviceApi);
assert_eq!(MediaFileOriginCategory::from_str("story_engine").unwrap(), MediaFileOriginCategory::StoryEngine);
assert!(MediaFileOriginCategory::from_str("foo").is_err());
}
#[test]
fn all_variants() {
let mut variants = MediaFileOriginCategory::all_variants();
assert_eq!(variants.len(), 4);
assert_eq!(variants.len(), 5);
assert_eq!(variants.pop_first(), Some(MediaFileOriginCategory::Inference));
assert_eq!(variants.pop_first(), Some(MediaFileOriginCategory::Processed));
assert_eq!(variants.pop_first(), Some(MediaFileOriginCategory::Upload));
assert_eq!(variants.pop_first(), Some(MediaFileOriginCategory::DeviceApi));
assert_eq!(variants.pop_first(), Some(MediaFileOriginCategory::StoryEngine));
assert_eq!(variants.pop_first(), None);
}
}
@@ -128,5 +137,15 @@ mod tests {
assert_eq!(variant, MediaFileOriginCategory::from_str(&format!("{:?}", variant)).unwrap());
}
}
#[test]
fn serialized_length_ok_for_database() {
const MAX_LENGTH : usize = 16;
for variant in MediaFileOriginCategory::all_variants() {
let serialized = variant.to_str();
assert!(serialized.len() > 0, "variant {:?} is too short", variant);
assert!(serialized.len() <= MAX_LENGTH, "variant {:?} is too long", variant);
}
}
}
}
@@ -10,8 +10,8 @@ use utoipa::ToSchema;
///
/// DO NOT CHANGE VALUES WITHOUT A MIGRATION STRATEGY.
#[cfg_attr(test, derive(EnumIter, EnumCount))]
#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Deserialize, Serialize, ToSchema)]
#[serde(rename_all = "lowercase")]
#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Hash, Deserialize, Serialize, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum MediaFileType {
/// Audio files: wav, mp3, etc.
Audio,
@@ -39,6 +39,10 @@ pub enum MediaFileType {
/// glTF files (for Bevy)
Gltf,
/// Bevy's scene files (in RON; Rusty Object Notation)
/// This will be replaced with another format in future versions of Bevy
SceneRon,
}
// TODO(bt, 2022-12-21): This desperately needs MySQL integration tests!
@@ -58,6 +62,7 @@ impl MediaFileType {
Self::Fbx => "fbx",
Self::Glb => "glb",
Self::Gltf => "gltf",
Self::SceneRon => "scene_ron",
}
}
@@ -71,6 +76,7 @@ impl MediaFileType {
"fbx" => Ok(Self::Fbx),
"glb" => Ok(Self::Glb),
"gltf" => Ok(Self::Gltf),
"scene_ron" => Ok(Self::SceneRon),
_ => Err(format!("invalid value: {:?}", value)),
}
}
@@ -87,6 +93,7 @@ impl MediaFileType {
Self::Fbx,
Self::Glb,
Self::Gltf,
Self::SceneRon,
])
}
}
@@ -109,6 +116,7 @@ mod tests {
assert_serialization(MediaFileType::Fbx, "fbx");
assert_serialization(MediaFileType::Glb, "glb");
assert_serialization(MediaFileType::Gltf, "gltf");
assert_serialization(MediaFileType::SceneRon, "scene_ron");
}
}
@@ -120,10 +128,12 @@ mod tests {
assert_eq!(MediaFileType::Audio.to_str(), "audio");
assert_eq!(MediaFileType::Image.to_str(), "image");
assert_eq!(MediaFileType::Video.to_str(), "video");
assert_eq!(MediaFileType::Mocap.to_str(), "mocap");
assert_eq!(MediaFileType::Bvh.to_str(), "bvh");
assert_eq!(MediaFileType::Fbx.to_str(), "fbx");
assert_eq!(MediaFileType::Glb.to_str(), "glb");
assert_eq!(MediaFileType::Gltf.to_str(), "gltf");
assert_eq!(MediaFileType::SceneRon.to_str(), "scene_ron");
}
#[test]
@@ -136,6 +146,7 @@ mod tests {
assert_eq!(MediaFileType::from_str("fbx").unwrap(), MediaFileType::Fbx);
assert_eq!(MediaFileType::from_str("glb").unwrap(), MediaFileType::Glb);
assert_eq!(MediaFileType::from_str("gltf").unwrap(), MediaFileType::Gltf);
assert_eq!(MediaFileType::from_str("scene_ron").unwrap(), MediaFileType::SceneRon);
assert!(MediaFileType::from_str("foo").is_err());
}
}
@@ -146,7 +157,7 @@ mod tests {
#[test]
fn all_variants() {
let mut variants = MediaFileType::all_variants();
assert_eq!(variants.len(), 8);
assert_eq!(variants.len(), 9);
assert_eq!(variants.pop_first(), Some(MediaFileType::Audio));
assert_eq!(variants.pop_first(), Some(MediaFileType::Image));
assert_eq!(variants.pop_first(), Some(MediaFileType::Video));
@@ -155,6 +166,7 @@ mod tests {
assert_eq!(variants.pop_first(), Some(MediaFileType::Fbx));
assert_eq!(variants.pop_first(), Some(MediaFileType::Glb));
assert_eq!(variants.pop_first(), Some(MediaFileType::Gltf));
assert_eq!(variants.pop_first(), Some(MediaFileType::SceneRon));
assert_eq!(variants.pop_first(), None);
}
}
+2
View File
@@ -11,8 +11,10 @@ pub mod media_files;
pub mod media_uploads;
pub mod model_categories;
pub mod model_weights;
pub mod prompts;
pub mod trending_model_analytics;
pub mod tts_models;
pub mod usages;
pub mod user_bookmarks;
pub mod user_ratings;
pub mod voice_conversion_models;
@@ -0,0 +1 @@
pub mod prompt_type;
@@ -0,0 +1,128 @@
use std::collections::BTreeSet;
#[cfg(test)]
use strum::EnumCount;
#[cfg(test)]
use strum::EnumIter;
use utoipa::ToSchema;
/// Used in the `prompts` table in a `VARCHAR(16)` field.
///
/// DO NOT CHANGE VALUES WITHOUT A MIGRATION STRATEGY.
#[cfg_attr(test, derive(EnumIter, EnumCount))]
#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Deserialize, Serialize, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum PromptType {
/// Stable diffusion
StableDiffusion,
/// Comfy UI
ComfyUi,
}
// TODO(bt, 2022-12-21): This desperately needs MySQL integration tests!
impl_enum_display_and_debug_using_to_str!(PromptType);
impl_mysql_enum_coders!(PromptType);
impl_mysql_from_row!(PromptType);
/// NB: Legacy API for older code.
impl PromptType {
pub fn to_str(&self) -> &'static str {
match self {
Self::StableDiffusion => "stable_diffusion",
Self::ComfyUi => "comfy_ui",
}
}
pub fn from_str(value: &str) -> Result<Self, String> {
match value {
"stable_diffusion" => Ok(Self::StableDiffusion),
"comfy_ui" => Ok(Self::ComfyUi),
_ => Err(format!("invalid value: {:?}", value)),
}
}
pub fn all_variants() -> BTreeSet<Self> {
// NB: BTreeSet is sorted
// NB: BTreeSet::from() isn't const, but not worth using LazyStatic, etc.
BTreeSet::from([
Self::StableDiffusion,
Self::ComfyUi,
])
}
}
#[cfg(test)]
mod tests {
use crate::by_table::prompts::prompt_type::PromptType;
use crate::test_helpers::assert_serialization;
mod serde {
use super::*;
#[test]
fn test_serialization() {
assert_serialization(PromptType::StableDiffusion, "stable_diffusion");
assert_serialization(PromptType::ComfyUi, "comfy_ui");
}
}
mod impl_methods {
use super::*;
#[test]
fn to_str() {
assert_eq!(PromptType::StableDiffusion.to_str(), "stable_diffusion");
assert_eq!(PromptType::ComfyUi.to_str(), "comfy_ui");
}
#[test]
fn from_str() {
assert_eq!(PromptType::from_str("stable_diffusion").unwrap(), PromptType::StableDiffusion);
assert_eq!(PromptType::from_str("comfy_ui").unwrap(), PromptType::ComfyUi);
assert!(PromptType::from_str("foo").is_err());
}
}
mod manual_variant_checks {
use super::*;
#[test]
fn all_variants() {
let mut variants = PromptType::all_variants();
assert_eq!(variants.len(), 2);
assert_eq!(variants.pop_first(), Some(PromptType::StableDiffusion));
assert_eq!(variants.pop_first(), Some(PromptType::ComfyUi));
assert_eq!(variants.pop_first(), None);
}
}
mod mechanical_checks {
use super::*;
#[test]
fn variant_length() {
use strum::IntoEnumIterator;
assert_eq!(PromptType::all_variants().len(), PromptType::iter().len());
}
#[test]
fn round_trip() {
for variant in PromptType::all_variants() {
assert_eq!(variant, PromptType::from_str(variant.to_str()).unwrap());
assert_eq!(variant, PromptType::from_str(&format!("{}", variant)).unwrap());
assert_eq!(variant, PromptType::from_str(&format!("{:?}", variant)).unwrap());
}
}
#[test]
fn serialized_length_ok_for_database() {
const MAX_LENGTH : usize = 16;
for variant in PromptType::all_variants() {
let serialized = variant.to_str();
assert!(serialized.len() > 0, "variant {:?} is too short", variant);
assert!(serialized.len() <= MAX_LENGTH, "variant {:?} is too long", variant);
}
}
}
}
@@ -0,0 +1 @@
pub mod usages_type;
@@ -0,0 +1,128 @@
use std::collections::BTreeSet;
#[cfg(test)]
use strum::EnumCount;
#[cfg(test)]
use strum::EnumIter;
use utoipa::ToSchema;
/// Used in the `usages` table in a `VARCHAR(16)` field. (Two fields!)
///
/// DO NOT CHANGE VALUES WITHOUT A MIGRATION STRATEGY.
#[cfg_attr(test, derive(EnumIter, EnumCount))]
#[derive(Clone, Copy, Eq, PartialEq, Ord, PartialOrd, Deserialize, Serialize, ToSchema)]
#[serde(rename_all = "snake_case")]
pub enum UsagesType {
/// Represents a foreign key link against a model_weights record
ModelWeight,
/// Represents a foreign key link against a media_files record
MediaFile,
}
// TODO(bt, 2022-12-21): This desperately needs MySQL integration tests!
impl_enum_display_and_debug_using_to_str!(UsagesType);
impl_mysql_enum_coders!(UsagesType);
impl_mysql_from_row!(UsagesType);
/// NB: Legacy API for older code.
impl UsagesType {
pub fn to_str(&self) -> &'static str {
match self {
Self::ModelWeight => "model_weight",
Self::MediaFile => "media_file",
}
}
pub fn from_str(value: &str) -> Result<Self, String> {
match value {
"model_weight" => Ok(Self::ModelWeight),
"media_file" => Ok(Self::MediaFile),
_ => Err(format!("invalid value: {:?}", value)),
}
}
pub fn all_variants() -> BTreeSet<Self> {
// NB: BTreeSet is sorted
// NB: BTreeSet::from() isn't const, but not worth using LazyStatic, etc.
BTreeSet::from([
Self::ModelWeight,
Self::MediaFile,
])
}
}
#[cfg(test)]
mod tests {
use crate::by_table::usages::usages_type::UsagesType;
use crate::test_helpers::assert_serialization;
mod serde {
use super::*;
#[test]
fn test_serialization() {
assert_serialization(UsagesType::ModelWeight, "model_weight");
assert_serialization(UsagesType::MediaFile, "media_file");
}
}
mod impl_methods {
use super::*;
#[test]
fn to_str() {
assert_eq!(UsagesType::ModelWeight.to_str(), "model_weight");
assert_eq!(UsagesType::MediaFile.to_str(), "media_file");
}
#[test]
fn from_str() {
assert_eq!(UsagesType::from_str("model_weight").unwrap(), UsagesType::ModelWeight);
assert_eq!(UsagesType::from_str("media_file").unwrap(), UsagesType::MediaFile);
assert!(UsagesType::from_str("foo").is_err());
}
}
mod manual_variant_checks {
use super::*;
#[test]
fn all_variants() {
let mut variants = UsagesType::all_variants();
assert_eq!(variants.len(), 2);
assert_eq!(variants.pop_first(), Some(UsagesType::ModelWeight));
assert_eq!(variants.pop_first(), Some(UsagesType::MediaFile));
assert_eq!(variants.pop_first(), None);
}
}
mod mechanical_checks {
use super::*;
#[test]
fn variant_length() {
use strum::IntoEnumIterator;
assert_eq!(UsagesType::all_variants().len(), UsagesType::iter().len());
}
#[test]
fn round_trip() {
for variant in UsagesType::all_variants() {
assert_eq!(variant, UsagesType::from_str(variant.to_str()).unwrap());
assert_eq!(variant, UsagesType::from_str(&format!("{}", variant)).unwrap());
assert_eq!(variant, UsagesType::from_str(&format!("{:?}", variant)).unwrap());
}
}
#[test]
fn serialized_length_ok_for_database() {
const MAX_LENGTH : usize = 16;
for variant in UsagesType::all_variants() {
let serialized = variant.to_str();
assert!(serialized.len() > 0, "variant {:?} is too short", variant);
assert!(serialized.len() <= MAX_LENGTH, "variant {:?} is too long", variant);
}
}
}
}
+2
View File
@@ -34,6 +34,7 @@ pub(crate) enum TokenPrefix {
ModelWeight,
NewsStory, // NB: aichatbot / sqlite
PasswordReset,
Prompt,
TtsRenderTask, // NB: aichatbot / sqlite
User,
UserBookmark,
@@ -101,6 +102,7 @@ impl PrefixGenerator for TokenPrefix {
Self::ModelWeight => "weight_",
Self::NewsStory => "news_story_",
Self::PasswordReset => "pw_reset_",
Self::Prompt => "prompt_",
Self::TtsRenderTask => "tts_task_",
Self::User => "user_", // NB: Previously "U:"
Self::UserBookmark => "ub_",
@@ -6,7 +6,7 @@ use utoipa::ToSchema;
use crate::prefixes::TokenPrefix;
/// The primary key for Audit Logs.
/// The primary key for Media Files
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, sqlx::Type, Debug, Serialize, Deserialize, ToSchema)]
#[sqlx(transparent)]
pub struct MediaFileToken(pub String);
+1
View File
@@ -13,6 +13,7 @@ pub mod media_uploads;
pub mod model_categories;
pub mod model_weights;
pub mod password_reset;
pub mod prompts;
pub mod sqlite;
pub mod tts_inference_jobs;
pub mod tts_model_upload_jobs;
@@ -0,0 +1,15 @@
use std::fmt::Debug;
use serde::Deserialize;
use serde::Serialize;
use utoipa::ToSchema;
use crate::prefixes::TokenPrefix;
/// The primary key for Prompts
#[derive(Clone, PartialEq, Eq, PartialOrd, Ord, Hash, sqlx::Type, Debug, Serialize, Deserialize, ToSchema)]
#[sqlx(transparent)]
pub struct PromptToken(pub String);
impl_string_token!(PromptToken);
impl_crockford_generator!(PromptToken, 32usize, TokenPrefix::Prompt, CrockfordLower);
-33
View File
@@ -1,33 +0,0 @@
[package]
name = "database-cleanup"
publish = false
edition = "2018"
version = "0.0.1"
authors = [
"Brandon Thomas <bt@brand.io>",
"Brandon Thomas <echelon@gmail.com>",
]
[[bin]]
name = "database-cleanup"
path = "src/main.rs"
[dependencies]
# Internal
container_common = { path = "../../lib/deprecated/container_common" }
easyenv = { path = "../../lib/easyenv" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
# External
anyhow = "1.0.75"
# TODO/NB: Commenting out clap4 as it prevents windows builds
# clap4 = { package = "clap", version = "4.0" } # TODO/NB: We're using an older version of clap elsewhere, hence the naming.
dotenv = "0.15.0"
log = "0.4.14"
# Serialization
serde = "1.0.125"
serde_derive = "1.0.125"
-12
View File
@@ -1,12 +0,0 @@
use easyenv::init_all_with_default_logging;
use log::info;
use container_common::anyhow_result::AnyhowResult;
fn main() -> AnyhowResult<()> {
init_all_with_default_logging(None);
info!("TODO...");
Ok(())
}
-47
View File
@@ -1,47 +0,0 @@
[package]
name = "dev-database-seed"
edition = "2018"
version = "0.0.1"
authors = [
"Brandon Thomas <bt@brand.io>",
"Brandon Thomas <echelon@gmail.com>",
]
publish = false
[[bin]]
name = "dev-database-seed"
path = "src/main.rs"
[dependencies]
# Internal
buckets = { path = "../../_types/buckets" }
cloud_storage = { path = "../../lib/api_clients/cloud_storage" }
config = { path = "../../lib/deprecated/config" }
easyenv = { path = "../../lib/easyenv" }
enums = { path = "../../_types/enums" }
errors = { path = "../../lib/errors" }
filesys = { path = "../../lib/files/filesys" }
hashing = { path = "../../lib/files/hashing" }
idempotency = { path = "../../lib/idempotency" }
mimetypes = { path = "../../lib/files/mimetypes" }
mysql_queries = { path = "../../lib/mysql_queries" }
storyteller_root = { path = "../../lib/storyteller_root" }
tokens = { path = "../../_types/tokens" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
# External
log = "0.4.14"
clap = "4.4.8"
rand = "0.8.5"
# Runtime
# NB: We switched to Tokio from `async-std` for broader ecosystem support.
tokio = { version = "1.34.0", features = ["macros"] }
sqlx = { version = "0.7.2", features = [ "mysql", "runtime-tokio", "tls-rustls", "chrono" ] }
elasticsearch = "8.5.0-alpha.1"
[dev-dependencies]
# None yet
@@ -0,0 +1,47 @@
[package]
name = "dev-database-seed"
edition = "2018"
version = "0.0.1"
authors = [
"Brandon Thomas <bt@brand.io>",
"Brandon Thomas <echelon@gmail.com>",
]
publish = false
[[bin]]
name = "dev-database-seed"
path = "src/main.rs"
[dependencies]
# Internal
buckets = { path = "../../../_types/buckets" }
cloud_storage = { path = "../../../lib/api_clients/cloud_storage" }
config = { path = "../../../lib/deprecated/config" }
easyenv = { path = "../../../lib/easyenv" }
enums = { path = "../../../_types/enums" }
errors = { path = "../../../lib/errors" }
filesys = { path = "../../../lib/files/filesys" }
hashing = { path = "../../../lib/files/hashing" }
idempotency = { path = "../../../lib/idempotency" }
mimetypes = { path = "../../../lib/files/mimetypes" }
mysql_queries = { path = "../../../lib/mysql_queries" }
storyteller_root = { path = "../../../lib/storyteller_root" }
tokens = { path = "../../../_types/tokens" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../../my-workspace-hack" }
# External
log = "0.4.14"
clap = "4.4.8"
rand = "0.8.5"
# Runtime
# NB: We switched to Tokio from `async-std` for broader ecosystem support.
tokio = { version = "1.34.0", features = ["macros"] }
sqlx = { version = "0.7.2", features = [ "mysql", "runtime-tokio", "tls-rustls", "chrono" ] }
elasticsearch = "8.5.0-alpha.1"
[dev-dependencies]
# None yet
@@ -5,10 +5,8 @@ use sqlx::mysql::MySqlPoolOptions;
use config::shared_constants::{DEFAULT_MYSQL_CONNECTION_STRING, DEFAULT_RUST_LOG};
use errors::AnyhowResult;
use crate::bucket_clients::get_bucket_clients;
use crate::cli_args::parse_cli_args;
use crate::seeding::model_weights::seed_weights;
use crate::seeding::users::seed_user_accounts;
pub mod bucket_clients;
pub mod cli_args;
@@ -28,18 +26,18 @@ pub async fn main() -> AnyhowResult<()> {
"MYSQL_URL",
DEFAULT_MYSQL_CONNECTION_STRING);
let pool = MySqlPoolOptions::new()
let _pool = MySqlPoolOptions::new()
.max_connections(easyenv::get_env_num("MYSQL_MAX_CONNECTIONS", 3)?)
.connect(&db_connection_string)
.await?;
let args = parse_cli_args()?;
let _args = parse_cli_args()?;
let mut maybe_bucket_clients = None;
//let mut maybe_bucket_clients = None;
if args.seed_cloud_bucket {
maybe_bucket_clients = Some(get_bucket_clients()?);
}
//if args.seed_cloud_bucket {
// maybe_bucket_clients = Some(get_bucket_clients()?);
//}
// let mut maybe_elasticsearch = None;
//
@@ -6,7 +6,7 @@ use sqlx::{MySql, Pool};
use cloud_storage::remote_file_manager::remote_cloud_bucket_details::RemoteCloudBucketDetails;
use cloud_storage::remote_file_manager::remote_cloud_file_manager::RemoteCloudFileClient;
use cloud_storage::remote_file_manager::weights_descriptor::{WeightsLoRADescriptor, WeightsSD15Descriptor, WeightsSD15CkptDescriptor, WeightsWorkflowDescriptor};
use cloud_storage::remote_file_manager::weights_descriptor::{WeightsLoRADescriptor, WeightsSD15Descriptor, WeightsWorkflowDescriptor};
use enums::by_table::model_weights::{
weights_category::WeightsCategory,
weights_types::WeightsType,
@@ -342,6 +342,7 @@ pub async fn seed_weights_for_paging(mysql_pool: &Pool<MySql>, user_token: UserT
weights_type: weights_types, // replace with actual WeightsType
weights_category, // replace with actual WeightsCategory
title,
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some(description),
maybe_description_rendered_html: Some(description_rendered_html.to_string()),
creator_user_token: Some(&user_token), // replace with actual UserToken
@@ -611,6 +612,7 @@ Noosphere by skumerz + dalcefoPainting + 饭特稀V08 by zhazhahui345 + GhostMix
weights_type: WeightsType::StableDiffusion15, // replace with actual WeightsType
weights_category: WeightsCategory::ImageGeneration, // replace with actual WeightsCategory
title: "Dragonfruit".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some(sd1_5_markdown_description.to_string()),
maybe_description_rendered_html: Some("<p>Description</p>".to_string()),
creator_user_token: Some(&user_token), // replace with actual UserToken
@@ -632,6 +634,7 @@ Noosphere by skumerz + dalcefoPainting + 饭特稀V08 by zhazhahui345 + GhostMix
token: &model_weight_token2, // replace with actual ModelWeightToken
weights_type: WeightsType::LoRA, // replace with actual WeightsType
weights_category: WeightsCategory::ImageGeneration, // replace with actual WeightsCategory
maybe_cover_image_media_file_token: None,
title: "MIHOYO Collection 米家全家桶 (Honkai Impact 3rd | Honkai Star Rail | Genshin Impact | Zenless Zone Zero)".to_string(),
maybe_description_markdown: Some(miyhoyo_description.to_string()),
maybe_description_rendered_html: Some(miyhoyo_description.to_string()),
@@ -655,6 +658,7 @@ Noosphere by skumerz + dalcefoPainting + 饭特稀V08 by zhazhahui345 + GhostMix
weights_type: WeightsType::StableDiffusion15, // replace with actual WeightsType
weights_category: WeightsCategory::ImageGeneration, // replace with actual WeightsCategory
title: "z-vae".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some(sd_vae_description.to_string()),
maybe_description_rendered_html: Some("<p>Description</p>".to_string()),
creator_user_token: Some(&user_token), // replace with actual UserToken
@@ -681,9 +685,9 @@ Noosphere by skumerz + dalcefoPainting + 饭特稀V08 by zhazhahui345 + GhostMix
pub async fn seed_workflows_for_testing_inference(mysql_pool: &Pool<MySql>, user_token: UserToken) -> AnyhowResult<()>{
let model_weight_token1 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weight_token2 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weight_token3 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
let model_weight_token4 = ModelWeightToken::new_from_str("weight_n8sz47gmfw2zx02snrbz88ns9");
//let model_weight_token2 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
//let model_weight_token3 = ModelWeightToken::generate_for_testing_and_dev_seeding_never_use_in_production_seriously();
//let model_weight_token4 = ModelWeightToken::new_from_str("weight_n8sz47gmfw2zx02snrbz88ns9");
let mut path_to_comfy = get_seed_tool_data_root();
path_to_comfy.push("models/workflows/comfyui/yae_video_prod.json");
@@ -711,6 +715,7 @@ pub async fn seed_workflows_for_testing_inference(mysql_pool: &Pool<MySql>, user
weights_type: WeightsType::ComfyUi, // replace with actual WeightsType
weights_category: WeightsCategory::WorkflowConfig, // replace with actual WeightsCategory
title: "yae-video-prod".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some("ComfyUI Workflow".to_string()),
maybe_description_rendered_html: Some("<p>Description</p>".to_string()),
creator_user_token: Some(&user_token), // replace with actual UserToken
@@ -821,6 +826,7 @@ pub async fn seed_weights_for_user_token(
weights_type: WeightsType::RvcV2, // replace with actual WeightsType
weights_category: WeightsCategory::VoiceConversion, // replace with actual WeightsCategory
title: "Title 1".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some("Description 1".to_string()),
maybe_description_rendered_html: Some("<p>Description 1</p>".to_string()),
creator_user_token: Some(&user_token), // replace with actual UserToken
@@ -846,6 +852,7 @@ pub async fn seed_weights_for_user_token(
weights_type: WeightsType::HifiganTacotron2, // replace with actual WeightsType
weights_category: WeightsCategory::TextToSpeech, // replace with actual WeightsCategory
title: "Title 2".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some("Description 2".to_string()),
maybe_description_rendered_html: Some("<p>Description 2</p>".to_string()),
creator_user_token: Some(&user_token), // replace with actual UserToken
@@ -871,6 +878,7 @@ pub async fn seed_weights_for_user_token(
weights_type: WeightsType::StableDiffusion15, // replace with actual WeightsType
weights_category: WeightsCategory::ImageGeneration, // replace with actual WeightsCategory
title: "Title 3".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some("Description 3".to_string()),
maybe_description_rendered_html: Some("<p>Description 3</p>".to_string()),
creator_user_token: Some(&user_token), // replace with actual UserToken
@@ -896,6 +904,7 @@ pub async fn seed_weights_for_user_token(
weights_type: WeightsType::LoRA, // replace with actual WeightsType
weights_category: WeightsCategory::ImageGeneration, // replace with actual WeightsCategory
title: "Title 4".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some("Description 4".to_string()),
maybe_description_rendered_html: Some("<p>Description 4</p>".to_string()),
creator_user_token: Some(&user_token), // replace with actual UserToken
@@ -921,6 +930,7 @@ pub async fn seed_weights_for_user_token(
weights_type: WeightsType::LoRA, // replace with actual WeightsType
weights_category: WeightsCategory::ImageGeneration, // replace with actual WeightsCategory
title: "Title 5".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some("Description 4".to_string()),
maybe_description_rendered_html: Some("<p>Description 4</p>".to_string()),
creator_user_token: Some(&user_token), // replace with actual UserToken
@@ -972,6 +982,7 @@ pub async fn original_seed_weights(mysql_pool: &Pool<MySql>, _user_token: UserTo
weights_type: WeightsType::RvcV2, // replace with actual WeightsType
weights_category: WeightsCategory::VoiceConversion, // replace with actual WeightsCategory
title: "Title 1".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some("Description 1".to_string()),
maybe_description_rendered_html: Some("<p>Description 1</p>".to_string()),
creator_user_token: Some(&creator_token1), // replace with actual UserToken
@@ -997,6 +1008,7 @@ pub async fn original_seed_weights(mysql_pool: &Pool<MySql>, _user_token: UserTo
weights_type: WeightsType::HifiganTacotron2, // replace with actual WeightsType
weights_category: WeightsCategory::TextToSpeech, // replace with actual WeightsCategory
title: "Title 2".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some("Description 2".to_string()),
maybe_description_rendered_html: Some("<p>Description 2</p>".to_string()),
creator_user_token: Some(&creator_token2), // replace with actual UserToken
@@ -1022,6 +1034,7 @@ pub async fn original_seed_weights(mysql_pool: &Pool<MySql>, _user_token: UserTo
weights_type: WeightsType::StableDiffusion15, // replace with actual WeightsType
weights_category: WeightsCategory::ImageGeneration, // replace with actual WeightsCategory
title: "Title 3".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some("Description 3".to_string()),
maybe_description_rendered_html: Some("<p>Description 3</p>".to_string()),
creator_user_token: Some(&creator_token3), // replace with actual UserToken
@@ -1047,6 +1060,7 @@ pub async fn original_seed_weights(mysql_pool: &Pool<MySql>, _user_token: UserTo
weights_type: WeightsType::LoRA, // replace with actual WeightsType
weights_category: WeightsCategory::ImageGeneration, // replace with actual WeightsCategory
title: "Title 4".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some("Description 4".to_string()),
maybe_description_rendered_html: Some("<p>Description 4</p>".to_string()),
creator_user_token: Some(&creator_token4), // replace with actual UserToken
@@ -1072,6 +1086,7 @@ pub async fn original_seed_weights(mysql_pool: &Pool<MySql>, _user_token: UserTo
weights_type: WeightsType::LoRA, // replace with actual WeightsType
weights_category: WeightsCategory::ImageGeneration, // replace with actual WeightsCategory
title: "Title 5".to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some("Description 5".to_string()),
maybe_description_rendered_html: Some("<p>Description 5</p>".to_string()),
creator_user_token: Some(&creator_token5), // replace with actual UserToken
@@ -1,4 +1,5 @@
use std::path::Path;
use std::result::Result::Ok;
use log::info;
use rand::Rng;
@@ -25,7 +26,7 @@ use tokens::tokens::users::UserToken;
use crate::bucket_clients::BucketClients;
use crate::seeding::users::HANASHI_USER_TOKEN;
use std::result::Result::Ok;
pub async fn seed_weights_files(
mysql_pool: &Pool<MySql>,
maybe_bucket_clients: Option<&BucketClients>
@@ -129,6 +130,7 @@ pub async fn seed_weights_files(
weights_type, // Assuming weights_type is defined elsewhere
weights_category, // Assuming weights_category is defined elsewhere
title: title.to_string(),
maybe_cover_image_media_file_token: None,
maybe_description_markdown: Some(description.to_string()),
maybe_description_rendered_html: Some(description_rendered_html.to_string()),
creator_user_token: Some(&user_token),
@@ -14,19 +14,19 @@ path = "src/main.rs"
[dependencies]
# Internal
buckets = { path = "../../_types/buckets" }
cloud_storage = { path = "../../lib/api_clients/cloud_storage" }
config = { path = "../../lib/deprecated/config" }
easyenv = { path = "../../lib/easyenv" }
enums = { path = "../../_types/enums" }
errors = { path = "../../lib/errors" }
filesys = { path = "../../lib/files/filesys" }
mimetypes = { path = "../../lib/files/mimetypes" }
mysql_queries = { path = "../../lib/mysql_queries" }
tokens = { path = "../../_types/tokens" }
buckets = { path = "../../../_types/buckets" }
cloud_storage = { path = "../../../lib/api_clients/cloud_storage" }
config = { path = "../../../lib/deprecated/config" }
easyenv = { path = "../../../lib/easyenv" }
enums = { path = "../../../_types/enums" }
errors = { path = "../../../lib/errors" }
filesys = { path = "../../../lib/files/filesys" }
mimetypes = { path = "../../../lib/files/mimetypes" }
mysql_queries = { path = "../../../lib/mysql_queries" }
tokens = { path = "../../../_types/tokens" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
my-workspace-hack = { version = "0.1", path = "../../../my-workspace-hack" }
# External
clap = "4.4.8"
@@ -1,5 +1,5 @@
[package]
name = "scrape_test"
name = "scrape-test"
publish = false
edition = "2021"
version = "0.0.1"
@@ -9,17 +9,17 @@ authors = [
]
[[bin]]
name = "scrape_test"
name = "scrape-test"
path = "src/main.rs"
[dependencies]
# Internal
errors = { path = "../../lib/errors" }
web_scrapers = { path = "../../lib/web_scrapers" }
errors = { path = "../../../lib/errors" }
web_scrapers = { path = "../../../lib/web_scrapers" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
my-workspace-hack = { version = "0.1", path = "../../../my-workspace-hack" }
# External
clap = "4.4.8"
@@ -4,7 +4,7 @@ use errors::AnyhowResult;
use web_scrapers::scrape_supported_webpage::scrape_supported_webpage;
#[derive(Parser, Debug)]
#[command(name = "scrape_test")]
#[command(name = "scrape-test")]
pub struct Args {
#[arg(name="url", short='u', long = "url", help = "URL of the page to scrape", required = true)]
url: String,
@@ -1,5 +1,5 @@
[package]
name = "database-backup"
name = "db-backup"
publish = false
edition = "2018"
version = "0.0.1"
@@ -9,17 +9,17 @@ authors = [
]
[[bin]]
name = "database-backup"
name = "db-backup"
path = "src/main.rs"
[dependencies]
# Internal
container_common = { path = "../../lib/deprecated/container_common" }
easyenv = { path = "../../lib/easyenv" }
container_common = { path = "../../../lib/deprecated/container_common" }
easyenv = { path = "../../../lib/easyenv" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
my-workspace-hack = { version = "0.1", path = "../../../my-workspace-hack" }
# External
anyhow = "1.0.75"
@@ -0,0 +1,44 @@
[package]
name = "db-cleanup"
publish = false
edition = "2018"
version = "0.0.1"
authors = [
"Brandon Thomas <bt@brand.io>",
"Brandon Thomas <echelon@gmail.com>",
]
[[bin]]
name = "db-cleanup"
path = "src/main.rs"
[dependencies]
# Internal
buckets = { path = "../../../_types/buckets" }
container_common = { path = "../../../lib/deprecated/container_common" }
easyenv = { path = "../../../lib/easyenv" }
enums = { path = "../../../_types/enums" }
errors = { path = "../../../lib/errors" }
mysql_queries = { path = "../../../lib/mysql_queries" }
storyteller_root = { path = "../../../lib/storyteller_root" }
tokens = { path = "../../../_types/tokens" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../../my-workspace-hack" }
# External
clap = "4.4.8"
dotenv = "0.15.0"
log = "0.4.14"
# Bigger pieces
tokio = { version = "1.34.0", features = ["macros"] }
sqlx = { version = "0.7.2", features = [ "mysql", "runtime-tokio", "tls-rustls", "chrono" ] }
# Serialization
serde = "1.0.125"
serde_derive = "1.0.125"
serde_json = "1.0.108"
[dev-dependencies]
# None yet
@@ -0,0 +1,37 @@
use clap::{Parser, ValueEnum};
use serde_derive::Deserialize;
use errors::AnyhowResult;
#[derive(Parser, Debug, Deserialize)]
#[command(name="db-cleanup")]
#[serde(rename_all = "snake_case")]
pub struct Args {
// The primary action to take
#[arg(name="action", long="action", help="the primary action to take", required=true)]
pub action: Action,
// Optional username for some actions
#[arg(name="username", long="username", help="optional username", required=false)]
pub username: Option<String>,
}
#[derive(Clone, Copy, Debug, Deserialize, ValueEnum)]
#[serde(rename_all = "snake_case")]
pub enum Action {
/// Delete all anonymous user images.
DeleteAllAnonymousUserImages,
/// Delete files for a particular user.
DeleteUserFiles,
}
pub fn parse_cli_args() -> AnyhowResult<Args> {
let mut args = Args::parse();
if let Some(username) = args.username.as_deref() {
args.username = Some(username.trim().to_string());
}
Ok(args)
}
@@ -0,0 +1,70 @@
use log::info;
use sqlx::{MySql, Pool};
use sqlx::mysql::MySqlPoolOptions;
use container_common::anyhow_result::AnyhowResult;
use easyenv::init_all_with_default_logging;
use crate::cli_args::Action;
use crate::operations::delete_all_anonymous_user_images::delete_all_anonymous_user_images::delete_all_anonymous_user_images;
use crate::operations::delete_user_files::delete_user_files::delete_user_files;
mod cli_args;
mod operations;
mod util;
/*
Users that have had files deleted:
- cheesetherat
- endtimes
- expandinggirl
- markiwrench
- regista2
- regista77
TODO:
- juanfra3567
- ceistin
- elfabro17
- sodoka
- fluffernater
*/
#[tokio::main]
async fn main() -> AnyhowResult<()> {
println!("db-cleanup: hard or soft delete database records");
init_all_with_default_logging(None);
// NB: This secrets file differs from the rest because we might want to delete from production.
// (Hopefully this isn't getting out of hand at this point.)
easyenv::from_filename(".env-db-cleanup-secrets")?;
let args = cli_args::parse_cli_args()?;
let mysql = get_mysql("MYSQL_PRODUCTION_URL").await?;
match args.action {
Action::DeleteAllAnonymousUserImages => {
delete_all_anonymous_user_images(&args, &mysql).await?;
}
Action::DeleteUserFiles => {
delete_user_files(&args, &mysql).await?;
}
}
Ok(())
}
async fn get_mysql(env_var_name: &str) -> errors::AnyhowResult<Pool<MySql>> {
info!("Connecting to MySQL {env_var_name}...");
let pool = MySqlPoolOptions::new()
.max_connections(easyenv::get_env_num("MYSQL_MAX_CONNECTIONS", 3)?)
.connect(&easyenv::get_env_string_required(env_var_name)?)
.await?;
Ok(pool)
}
@@ -0,0 +1,66 @@
use std::thread;
use std::time::Duration;
use log::info;
use sqlx::{MySql, Pool};
use enums::by_table::media_files::media_file_type::MediaFileType;
use enums::common::view_as::ViewAs;
use errors::{anyhow, AnyhowResult};
use mysql_queries::queries::media_files::delete_media_file::delete_media_file_as_mod;
use mysql_queries::queries::media_files::list::list_media_files::{list_media_files, ListMediaFilesArgs};
use mysql_queries::queries::media_files::list::list_media_files_for_user::{list_media_files_for_user, ListMediaFileForUserArgs};
use mysql_queries::queries::users::user_profiles::get_user_profile_by_username::get_user_profile_by_username;
use crate::cli_args::Args;
use crate::util::constants::ECHELON_USER_TOKEN;
pub async fn delete_all_anonymous_user_images(_args: &Args, mysql: &Pool<MySql>) -> AnyhowResult<()> {
info!("delete anonymous user images");
let mut page_index = 0;
let mut maybe_offset = None;
loop {
info!("Querying page {page_index} of files...");
let media_files = list_media_files(ListMediaFilesArgs {
limit: 100,
maybe_filter_media_type: Some(MediaFileType::Image),
maybe_offset,
cursor_is_reversed: false,
sort_ascending: false,
view_as: ViewAs::Moderator,
mysql_pool: &mysql,
}).await?;
if media_files.records.is_empty() {
break;
}
for file in media_files.records {
if file.maybe_creator_user_token.is_some() {
info!("Skipping file: {:?} , which has author: {:?}", &file.token, &file.maybe_creator_user_token);
continue;
}
match file.media_type {
MediaFileType::Image => {},
_ => {
info!("Skipping file: {:?} , which is not an image", &file.token);
continue;
}
}
info!("Deleting image file: {:?}", &file.token);
delete_media_file_as_mod(&file.token, ECHELON_USER_TOKEN, &mysql).await?;
}
page_index += 1;
maybe_offset = media_files.last_id.map(|id| id as usize);
thread::sleep(Duration::from_millis(1000));
}
Ok(())
}
@@ -0,0 +1 @@
pub mod delete_all_anonymous_user_images;
@@ -0,0 +1,68 @@
use std::thread;
use std::time::Duration;
use log::info;
use sqlx::{MySql, Pool};
use enums::common::view_as::ViewAs;
use errors::{anyhow, AnyhowResult};
use mysql_queries::queries::media_files::delete_media_file::delete_media_file_as_mod;
use mysql_queries::queries::media_files::list::list_media_files_for_user::{list_media_files_for_user, ListMediaFileForUserArgs};
use mysql_queries::queries::users::user_profiles::get_user_profile_by_username::get_user_profile_by_username;
use crate::cli_args::Args;
use crate::util::constants::ECHELON_USER_TOKEN;
pub async fn delete_user_files(args: &Args, mysql: &Pool<MySql>) -> AnyhowResult<()> {
info!("delete user files for username: {:?}", args.username);
let username = match args.username.as_deref() {
Some(username) => username,
None => return Err(anyhow!("username is required")),
};
let maybe_user_profile = get_user_profile_by_username(username, mysql).await?;
let user_profile = match maybe_user_profile {
Some(user_profile) => user_profile,
None => return Err(anyhow!("user not found")),
};
info!("user_profile: {:?}", &user_profile);
delete_all_files(username, mysql).await?;
Ok(())
}
pub async fn delete_all_files(username: &str, mysql: &Pool<MySql>) -> AnyhowResult<()> {
let mut page_index = 0;
loop {
info!("Querying page {page_index} of files...");
let media_files = list_media_files_for_user(ListMediaFileForUserArgs {
username,
maybe_filter_media_types: None,
page_size: 100,
page_index,
sort_ascending: false,
view_as: ViewAs::Moderator,
mysql_pool: &mysql,
}).await?;
if media_files.records.is_empty() {
break;
}
for file in media_files.records {
info!("Deleting file: {:?}", &file.token);
delete_media_file_as_mod(&file.token, ECHELON_USER_TOKEN, &mysql).await?;
}
page_index += 1;
thread::sleep(Duration::from_millis(1000));
}
Ok(())
}
@@ -0,0 +1 @@
pub mod delete_user_files;
@@ -0,0 +1,2 @@
pub mod delete_all_anonymous_user_images;
pub mod delete_user_files;
@@ -0,0 +1,3 @@
/// User token to use as the moderator field when deleting files.
pub (crate) const ECHELON_USER_TOKEN : &str = "U:937C1VN0S5G8H";
@@ -0,0 +1 @@
pub (crate) mod constants;
@@ -14,30 +14,27 @@ path = "src/main.rs"
[dependencies]
# Internal
buckets = { path = "../../_types/buckets" }
config = { path = "../../lib/deprecated/config" }
easyenv = { path = "../../lib/easyenv" }
elasticsearch_schema = { path = "../../lib/elasticsearch_schema" }
enums = { path = "../../_types/enums" }
errors = { path = "../../lib/errors" }
mysql_queries = { path = "../../lib/mysql_queries" }
storyteller_root = { path = "../../lib/storyteller_root" }
tokens = { path = "../../_types/tokens" }
buckets = { path = "../../../_types/buckets" }
config = { path = "../../../lib/deprecated/config" }
easyenv = { path = "../../../lib/easyenv" }
elasticsearch_schema = { path = "../../../lib/elasticsearch_schema" }
enums = { path = "../../../_types/enums" }
errors = { path = "../../../lib/errors" }
mysql_queries = { path = "../../../lib/mysql_queries" }
storyteller_root = { path = "../../../lib/storyteller_root" }
tokens = { path = "../../../_types/tokens" }
# Workspace hack (faster compile times)
my-workspace-hack = { version = "0.1", path = "../../my-workspace-hack" }
my-workspace-hack = { version = "0.1", path = "../../../my-workspace-hack" }
# External
log = "0.4.14"
clap = "4.4.8"
log = "0.4.14"
strum = { version = "0.25", features = ["derive"] }
# Runtime
# NB: We switched to Tokio from `async-std` for broader ecosystem support.
# Bigger pieces
tokio = { version = "1.34.0", features = ["macros"] }
sqlx = { version = "0.7.2", features = [ "mysql", "runtime-tokio", "tls-rustls", "chrono" ] }
elasticsearch = "8.5.0-alpha.1"
# Serialization

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