From f6897c30ac729722c0edf458f384303541a86a65 Mon Sep 17 00:00:00 2001 From: BloxerHD018 Date: Wed, 25 Feb 2026 18:38:32 +0000 Subject: [PATCH] Allow using Multiple Boss App IDs for WUP Files --- ...7aa2d024212b69e7bb5e1a88ad71fd2fb9fa.json} | 8 +++--- ...3fff9163933840cc9c5cbb5dd2b4ac933473d.json | 28 ------------------- ...8735a64bab16b7c5c08d7667faf673bbaf5c8.json | 28 +++++++++++++++++++ ...352614d0685d98e97d2e4c0cd20425a74632.json} | 6 ++-- db-setup.sql | 2 +- src/api/upload_file_wup.rs | 16 ++++++----- src/database.rs | 8 ++++-- src/models/file_wup.rs | 2 +- src/services/npdi.rs | 2 +- 9 files changed, 52 insertions(+), 48 deletions(-) rename .sqlx/{query-3cc1241465c9bb03d570502f8ef4d8492b868f5ea0936d5e820057d7e3d3db06.json => query-3f94c60b037a9d97159ac0eecf6a7aa2d024212b69e7bb5e1a88ad71fd2fb9fa.json} (79%) delete mode 100644 .sqlx/query-42f96f5890db3be1b4fafd30cfc3fff9163933840cc9c5cbb5dd2b4ac933473d.json create mode 100644 .sqlx/query-696db3dcba46ed502e8714b71c78735a64bab16b7c5c08d7667faf673bbaf5c8.json rename .sqlx/{query-84520448fbf405540d5ea250c97ff57963a3164b200c42955f1d787de8f62161.json => query-a9144c26b98e762fa510d8202648352614d0685d98e97d2e4c0cd20425a74632.json} (63%) diff --git a/.sqlx/query-3cc1241465c9bb03d570502f8ef4d8492b868f5ea0936d5e820057d7e3d3db06.json b/.sqlx/query-3f94c60b037a9d97159ac0eecf6a7aa2d024212b69e7bb5e1a88ad71fd2fb9fa.json similarity index 79% rename from .sqlx/query-3cc1241465c9bb03d570502f8ef4d8492b868f5ea0936d5e820057d7e3d3db06.json rename to .sqlx/query-3f94c60b037a9d97159ac0eecf6a7aa2d024212b69e7bb5e1a88ad71fd2fb9fa.json index 0c9610a..0800caf 100644 --- a/.sqlx/query-3cc1241465c9bb03d570502f8ef4d8492b868f5ea0936d5e820057d7e3d3db06.json +++ b/.sqlx/query-3f94c60b037a9d97159ac0eecf6a7aa2d024212b69e7bb5e1a88ad71fd2fb9fa.json @@ -1,6 +1,6 @@ { "db_name": "PostgreSQL", - "query": "SELECT\n deleted,\n file_key,\n data_id,\n task_id,\n boss_app_id,\n supported_countries,\n supported_languages,\n attributes AS \"attributes!: Json\",\n creator_user,\n name,\n type,\n hash,\n size,\n notify_on_new,\n notify_led,\n condition_played,\n auto_delete,\n created,\n updated\n FROM files_wup WHERE data_id = $1 AND deleted = false;", + "query": "SELECT\n deleted,\n file_key,\n data_id,\n task_id,\n boss_app_ids,\n supported_countries,\n supported_languages,\n attributes AS \"attributes!: Json\",\n creator_user,\n name,\n type,\n hash,\n size,\n notify_on_new,\n notify_led,\n condition_played,\n auto_delete,\n created,\n updated\n FROM files_wup WHERE data_id = $1 AND deleted = false;", "describe": { "columns": [ { @@ -25,8 +25,8 @@ }, { "ordinal": 4, - "name": "boss_app_id", - "type_info": "Text" + "name": "boss_app_ids", + "type_info": "TextArray" }, { "ordinal": 5, @@ -126,5 +126,5 @@ false ] }, - "hash": "3cc1241465c9bb03d570502f8ef4d8492b868f5ea0936d5e820057d7e3d3db06" + "hash": "3f94c60b037a9d97159ac0eecf6a7aa2d024212b69e7bb5e1a88ad71fd2fb9fa" } diff --git a/.sqlx/query-42f96f5890db3be1b4fafd30cfc3fff9163933840cc9c5cbb5dd2b4ac933473d.json b/.sqlx/query-42f96f5890db3be1b4fafd30cfc3fff9163933840cc9c5cbb5dd2b4ac933473d.json deleted file mode 100644 index 52dee75..0000000 --- a/.sqlx/query-42f96f5890db3be1b4fafd30cfc3fff9163933840cc9c5cbb5dd2b4ac933473d.json +++ /dev/null @@ -1,28 +0,0 @@ -{ - "db_name": "PostgreSQL", - "query": "\n INSERT INTO files_wup (\n file_key,\n task_id,\n boss_app_id,\n supported_countries,\n supported_languages,\n attributes,\n creator_user,\n name,\n type,\n hash,\n size,\n notify_on_new,\n notify_led,\n condition_played,\n auto_delete,\n created,\n updated\n )\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15,\n NOW() AT TIME ZONE 'UTC',\n NOW() AT TIME ZONE 'UTC'\n )\n ", - "describe": { - "columns": [], - "parameters": { - "Left": [ - "Text", - "Text", - "Text", - "TextArray", - "TextArray", - "Jsonb", - "Text", - "Text", - "Text", - "Text", - "Int8", - "TextArray", - "Bool", - "Int8", - "Bool" - ] - }, - "nullable": [] - }, - "hash": "42f96f5890db3be1b4fafd30cfc3fff9163933840cc9c5cbb5dd2b4ac933473d" -} diff --git a/.sqlx/query-696db3dcba46ed502e8714b71c78735a64bab16b7c5c08d7667faf673bbaf5c8.json b/.sqlx/query-696db3dcba46ed502e8714b71c78735a64bab16b7c5c08d7667faf673bbaf5c8.json new file mode 100644 index 0000000..839ccb3 --- /dev/null +++ b/.sqlx/query-696db3dcba46ed502e8714b71c78735a64bab16b7c5c08d7667faf673bbaf5c8.json @@ -0,0 +1,28 @@ +{ + "db_name": "PostgreSQL", + "query": "\n INSERT INTO files_wup (\n file_key,\n task_id,\n boss_app_ids,\n supported_countries,\n supported_languages,\n attributes,\n creator_user,\n name,\n type,\n hash,\n size,\n notify_on_new,\n notify_led,\n condition_played,\n auto_delete,\n created,\n updated\n )\n VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15,\n NOW() AT TIME ZONE 'UTC',\n NOW() AT TIME ZONE 'UTC'\n )\n ", + "describe": { + "columns": [], + "parameters": { + "Left": [ + "Text", + "Text", + "TextArray", + "TextArray", + "TextArray", + "Jsonb", + "Text", + "Text", + "Text", + "Text", + "Int8", + "TextArray", + "Bool", + "Int8", + "Bool" + ] + }, + "nullable": [] + }, + "hash": "696db3dcba46ed502e8714b71c78735a64bab16b7c5c08d7667faf673bbaf5c8" +} diff --git a/.sqlx/query-84520448fbf405540d5ea250c97ff57963a3164b200c42955f1d787de8f62161.json b/.sqlx/query-a9144c26b98e762fa510d8202648352614d0685d98e97d2e4c0cd20425a74632.json similarity index 63% rename from .sqlx/query-84520448fbf405540d5ea250c97ff57963a3164b200c42955f1d787de8f62161.json rename to .sqlx/query-a9144c26b98e762fa510d8202648352614d0685d98e97d2e4c0cd20425a74632.json index 3ab78f5..766f966 100644 --- a/.sqlx/query-84520448fbf405540d5ea250c97ff57963a3164b200c42955f1d787de8f62161.json +++ b/.sqlx/query-a9144c26b98e762fa510d8202648352614d0685d98e97d2e4c0cd20425a74632.json @@ -1,16 +1,16 @@ { "db_name": "PostgreSQL", - "query": "\n UPDATE files_wup\n SET deleted = TRUE,\n updated = NOW() AT TIME ZONE 'UTC'\n WHERE boss_app_id = $1 AND task_id = $2 AND name = $3;\n ", + "query": "\n UPDATE files_wup\n SET deleted = TRUE,\n updated = NOW() AT TIME ZONE 'UTC'\n WHERE boss_app_ids = $1 AND task_id = $2 AND name = $3;\n ", "describe": { "columns": [], "parameters": { "Left": [ - "Text", + "TextArray", "Text", "Text" ] }, "nullable": [] }, - "hash": "84520448fbf405540d5ea250c97ff57963a3164b200c42955f1d787de8f62161" + "hash": "a9144c26b98e762fa510d8202648352614d0685d98e97d2e4c0cd20425a74632" } diff --git a/db-setup.sql b/db-setup.sql index 8fdbb5f..a2576da 100644 --- a/db-setup.sql +++ b/db-setup.sql @@ -26,7 +26,7 @@ CREATE TABLE files_wup ( data_id BIGINT PRIMARY KEY DEFAULT nextval('files_wup_data_id_seq'), file_key TEXT NOT NULL, task_id TEXT NOT NULL, - boss_app_id TEXT NOT NULL, + boss_app_ids TEXT[] NOT NULL, supported_countries TEXT[] NOT NULL, supported_languages TEXT[] NOT NULL, attributes JSONB NOT NULL, diff --git a/src/api/upload_file_wup.rs b/src/api/upload_file_wup.rs index 19339d8..79301ff 100644 --- a/src/api/upload_file_wup.rs +++ b/src/api/upload_file_wup.rs @@ -12,7 +12,7 @@ use crate::{crypto::wiiu::encrypt_wiiu, models::file_wup::FileWUPAttributes}; #[derive(Deserialize)] pub struct UploadedWUP { task_id: String, - boss_app_id: String, + boss_app_ids: Vec, supported_countries: Vec, supported_languages: Vec, name: Option, @@ -54,7 +54,8 @@ pub async fn upload_file_wup(pool: &State, input: Json, auth: if data.name == None && !data.name_equals_data_id { return Err(Status::BadRequest) }; let name = data.name.clone().unwrap(); - if data.boss_app_id.len() != 16 { return Err(Status::BadRequest) }; + for id in &data.boss_app_ids { if id.len() != 16 { return Err(Status::BadRequest); }; }; + //if data.boss_app_id.len() != 16 { return Err(Status::BadRequest) }; if !is_valid_countries(&data.supported_countries) { return Err(Status::BadRequest) }; if !is_valid_languages(&data.supported_languages) { return Err(Status::BadRequest) }; @@ -94,7 +95,8 @@ pub async fn upload_file_wup(pool: &State, input: Json, auth: let hash_bytes = &hasher.finalize()[..]; let hash = hex::encode(hash_bytes); - let file_key = format!("{}/{}/{}", data.boss_app_id, data.task_id, hash); + //let file_key = format!("{}/{}/{}", data.boss_app_id, data.task_id, hash); + let file_key = format!("{}/{}", data.task_id, hash); let _ = sqlx::query!( r#" @@ -117,9 +119,9 @@ pub async fn upload_file_wup(pool: &State, input: Json, auth: UPDATE files_wup SET deleted = TRUE, updated = NOW() AT TIME ZONE 'UTC' - WHERE boss_app_id = $1 AND task_id = $2 AND name = $3; + WHERE boss_app_ids = $1 AND task_id = $2 AND name = $3; "#, - &data.boss_app_id, + &data.boss_app_ids, &data.task_id, name ) @@ -142,7 +144,7 @@ pub async fn upload_file_wup(pool: &State, input: Json, auth: INSERT INTO files_wup ( file_key, task_id, - boss_app_id, + boss_app_ids, supported_countries, supported_languages, attributes, @@ -165,7 +167,7 @@ pub async fn upload_file_wup(pool: &State, input: Json, auth: "#, file_key, data.task_id, - data.boss_app_id, + &data.boss_app_ids, &data.supported_countries, &data.supported_languages, attributes, diff --git a/src/database.rs b/src/database.rs index 7959974..4aaf8b1 100644 --- a/src/database.rs +++ b/src/database.rs @@ -59,8 +59,9 @@ pub async fn get_wup_task_files( if !allow_deleted { qb.push(" AND deleted = false"); }; - qb.push(" AND boss_app_id = "); + qb.push(" AND boss_app_ids @> ARRAY["); qb.push_bind(boss_app_id); + qb.push("]"); qb.push(" AND task_id = "); qb.push_bind(task_id); @@ -110,8 +111,9 @@ pub async fn get_wup_task_file( if !allow_deleted { qb.push(" AND deleted = false"); }; - qb.push(" AND boss_app_id = "); + qb.push(" AND boss_app_ids @> ARRAY["); qb.push_bind(boss_app_id); + qb.push("]"); qb.push(" AND task_id = "); qb.push_bind(&task_id[..7]); @@ -150,7 +152,7 @@ pub async fn get_wup_task_file_by_data_id(pool: &Pool, data_id: i64) -> Option", diff --git a/src/models/file_wup.rs b/src/models/file_wup.rs index ad27f5d..466b08c 100644 --- a/src/models/file_wup.rs +++ b/src/models/file_wup.rs @@ -77,7 +77,7 @@ pub struct FileWUP { pub file_key: String, pub data_id: Option, pub task_id: String, - pub boss_app_id: String, + pub boss_app_ids: Vec, pub supported_countries: Vec, pub supported_languages: Vec, pub attributes: Json, diff --git a/src/services/npdi.rs b/src/services/npdi.rs index 23db7d9..105fa46 100644 --- a/src/services/npdi.rs +++ b/src/services/npdi.rs @@ -37,7 +37,7 @@ pub async fn data(pool: &State, boss_app_id: String, data_id: i64, file_ha None => return Err(Status::NotFound), }; - if file_wup.hash != file_hash || file_wup.boss_app_id != boss_app_id { return Err(Status::NotFound); } + if file_wup.hash != file_hash || !file_wup.boss_app_ids.contains(&boss_app_id) { return Err(Status::NotFound); } let file = sqlx::query_scalar!( "SELECT data FROM files WHERE key = $1",