diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml index 40779879..6df4889b 100644 --- a/.idea/sqldialects.xml +++ b/.idea/sqldialects.xml @@ -1,6 +1,6 @@ - + \ No newline at end of file diff --git a/migrations/20230127233123_loader-gv-mod.sql b/migrations/20230127233123_loader-gv-mod.sql new file mode 100644 index 00000000..85915c92 --- /dev/null +++ b/migrations/20230127233123_loader-gv-mod.sql @@ -0,0 +1,21 @@ +-- Add migration script here +ALTER TABLE mods ADD COLUMN loaders varchar(255)[] NOT NULL default array[]::varchar[]; +ALTER TABLE mods ADD COLUMN game_versions varchar(255)[] NOT NULL default array[]::varchar[]; + +UPDATE mods +SET loaders = ( + SELECT COALESCE(ARRAY_AGG(DISTINCT l.loader) filter (where l.loader is not null), array[]::varchar[]) + FROM versions v + INNER JOIN loaders_versions lv ON lv.version_id = v.id + INNER JOIN loaders l on lv.loader_id = l.id + WHERE v.mod_id = mods.id +); + +UPDATE mods +SET game_versions = ( + SELECT COALESCE(ARRAY_AGG(DISTINCT gv.version) filter (where gv.version is not null), array[]::varchar[]) + FROM versions v + INNER JOIN game_versions_versions gvv ON v.id = gvv.joining_version_id + INNER JOIN game_versions gv on gvv.game_version_id = gv.id + WHERE v.mod_id = mods.id +); diff --git a/sqlx-data.json b/sqlx-data.json index aa1d174a..f4b15fe4 100644 --- a/sqlx-data.json +++ b/sqlx-data.json @@ -1086,6 +1086,255 @@ }, "query": "\n SELECT id FROM side_types\n WHERE name = $1\n " }, + "1ed4227372b608bae9a621d4197bfa825249364cc37cc9dd812cbd72bdc4b1d8": { + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Int8" + }, + { + "name": "project_type", + "ordinal": 1, + "type_info": "Int4" + }, + { + "name": "title", + "ordinal": 2, + "type_info": "Varchar" + }, + { + "name": "description", + "ordinal": 3, + "type_info": "Varchar" + }, + { + "name": "downloads", + "ordinal": 4, + "type_info": "Int4" + }, + { + "name": "follows", + "ordinal": 5, + "type_info": "Int4" + }, + { + "name": "icon_url", + "ordinal": 6, + "type_info": "Varchar" + }, + { + "name": "body", + "ordinal": 7, + "type_info": "Varchar" + }, + { + "name": "published", + "ordinal": 8, + "type_info": "Timestamptz" + }, + { + "name": "updated", + "ordinal": 9, + "type_info": "Timestamptz" + }, + { + "name": "approved", + "ordinal": 10, + "type_info": "Timestamptz" + }, + { + "name": "status", + "ordinal": 11, + "type_info": "Varchar" + }, + { + "name": "requested_status", + "ordinal": 12, + "type_info": "Varchar" + }, + { + "name": "issues_url", + "ordinal": 13, + "type_info": "Varchar" + }, + { + "name": "source_url", + "ordinal": 14, + "type_info": "Varchar" + }, + { + "name": "wiki_url", + "ordinal": 15, + "type_info": "Varchar" + }, + { + "name": "discord_url", + "ordinal": 16, + "type_info": "Varchar" + }, + { + "name": "license_url", + "ordinal": 17, + "type_info": "Varchar" + }, + { + "name": "team_id", + "ordinal": 18, + "type_info": "Int8" + }, + { + "name": "client_side", + "ordinal": 19, + "type_info": "Int4" + }, + { + "name": "server_side", + "ordinal": 20, + "type_info": "Int4" + }, + { + "name": "license", + "ordinal": 21, + "type_info": "Varchar" + }, + { + "name": "slug", + "ordinal": 22, + "type_info": "Varchar" + }, + { + "name": "moderation_message", + "ordinal": 23, + "type_info": "Varchar" + }, + { + "name": "moderation_message_body", + "ordinal": 24, + "type_info": "Varchar" + }, + { + "name": "client_side_type", + "ordinal": 25, + "type_info": "Varchar" + }, + { + "name": "server_side_type", + "ordinal": 26, + "type_info": "Varchar" + }, + { + "name": "project_type_name", + "ordinal": 27, + "type_info": "Varchar" + }, + { + "name": "flame_anvil_project", + "ordinal": 28, + "type_info": "Int4" + }, + { + "name": "flame_anvil_user", + "ordinal": 29, + "type_info": "Int8" + }, + { + "name": "webhook_sent", + "ordinal": 30, + "type_info": "Bool" + }, + { + "name": "color", + "ordinal": 31, + "type_info": "Int4" + }, + { + "name": "loaders", + "ordinal": 32, + "type_info": "VarcharArray" + }, + { + "name": "game_versions", + "ordinal": 33, + "type_info": "VarcharArray" + }, + { + "name": "categories", + "ordinal": 34, + "type_info": "VarcharArray" + }, + { + "name": "additional_categories", + "ordinal": 35, + "type_info": "VarcharArray" + }, + { + "name": "versions", + "ordinal": 36, + "type_info": "Jsonb" + }, + { + "name": "gallery", + "ordinal": 37, + "type_info": "Jsonb" + }, + { + "name": "donations", + "ordinal": 38, + "type_info": "Jsonb" + } + ], + "nullable": [ + false, + false, + false, + false, + false, + false, + true, + false, + false, + false, + true, + false, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + true, + true, + true, + false, + false, + false, + true, + true, + false, + true, + false, + false, + null, + null, + null, + null, + null + ], + "parameters": { + "Left": [ + "Int8", + "TextArray" + ] + } + }, + "query": "\n SELECT m.id id, m.project_type project_type, m.title title, m.description description, m.downloads downloads, m.follows follows,\n m.icon_url icon_url, m.body body, m.published published,\n m.updated updated, m.approved approved, m.status status, m.requested_status requested_status,\n m.issues_url issues_url, m.source_url source_url, m.wiki_url wiki_url, m.discord_url discord_url, m.license_url license_url,\n m.team_id team_id, m.client_side client_side, m.server_side server_side, m.license license, m.slug slug, m.moderation_message moderation_message, m.moderation_message_body moderation_message_body,\n cs.name client_side_type, ss.name server_side_type, pt.name project_type_name, m.flame_anvil_project flame_anvil_project, m.flame_anvil_user flame_anvil_user, m.webhook_sent webhook_sent, m.color,\n m.loaders loaders, m.game_versions game_versions,\n ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is false) categories,\n ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is true) additional_categories,\n JSONB_AGG(DISTINCT jsonb_build_object('id', v.id, 'date_published', v.date_published)) filter (where v.id is not null) versions,\n JSONB_AGG(DISTINCT jsonb_build_object('image_url', mg.image_url, 'featured', mg.featured, 'title', mg.title, 'description', mg.description, 'created', mg.created, 'ordering', mg.ordering)) filter (where mg.image_url is not null) gallery,\n JSONB_AGG(DISTINCT jsonb_build_object('platform_id', md.joining_platform_id, 'platform_short', dp.short, 'platform_name', dp.name,'url', md.url)) filter (where md.joining_platform_id is not null) donations\n FROM mods m\n INNER JOIN project_types pt ON pt.id = m.project_type\n INNER JOIN side_types cs ON m.client_side = cs.id\n INNER JOIN side_types ss ON m.server_side = ss.id\n LEFT JOIN mods_donations md ON md.joining_mod_id = m.id\n LEFT JOIN donation_platforms dp ON md.joining_platform_id = dp.id\n LEFT JOIN mods_categories mc ON mc.joining_mod_id = m.id\n LEFT JOIN categories c ON mc.joining_category_id = c.id\n LEFT JOIN versions v ON v.mod_id = m.id AND v.status = ANY($2)\n LEFT JOIN mods_gallery mg ON mg.mod_id = m.id\n WHERE m.id = $1\n GROUP BY pt.id, cs.id, ss.id, m.id;\n " + }, "1ffce9b2d5c9fa6c8b9abce4bad9f9419c44ad6367b7463b979c91b9b5b4fea1": { "describe": { "columns": [ @@ -1284,6 +1533,255 @@ }, "query": "\n SELECT m.id id, tm.user_id user_id, tm.payouts_split payouts_split\n FROM mods m\n INNER JOIN team_members tm on m.team_id = tm.team_id AND tm.accepted = TRUE\n WHERE m.id = ANY($1)\n " }, + "258fcfa74540b5a9c65df294b74b5306234ece346ce72216eea68d93fff7f2e4": { + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Int8" + }, + { + "name": "project_type", + "ordinal": 1, + "type_info": "Int4" + }, + { + "name": "title", + "ordinal": 2, + "type_info": "Varchar" + }, + { + "name": "description", + "ordinal": 3, + "type_info": "Varchar" + }, + { + "name": "downloads", + "ordinal": 4, + "type_info": "Int4" + }, + { + "name": "follows", + "ordinal": 5, + "type_info": "Int4" + }, + { + "name": "icon_url", + "ordinal": 6, + "type_info": "Varchar" + }, + { + "name": "body", + "ordinal": 7, + "type_info": "Varchar" + }, + { + "name": "published", + "ordinal": 8, + "type_info": "Timestamptz" + }, + { + "name": "updated", + "ordinal": 9, + "type_info": "Timestamptz" + }, + { + "name": "approved", + "ordinal": 10, + "type_info": "Timestamptz" + }, + { + "name": "status", + "ordinal": 11, + "type_info": "Varchar" + }, + { + "name": "requested_status", + "ordinal": 12, + "type_info": "Varchar" + }, + { + "name": "issues_url", + "ordinal": 13, + "type_info": "Varchar" + }, + { + "name": "source_url", + "ordinal": 14, + "type_info": "Varchar" + }, + { + "name": "wiki_url", + "ordinal": 15, + "type_info": "Varchar" + }, + { + "name": "discord_url", + "ordinal": 16, + "type_info": "Varchar" + }, + { + "name": "license_url", + "ordinal": 17, + "type_info": "Varchar" + }, + { + "name": "team_id", + "ordinal": 18, + "type_info": "Int8" + }, + { + "name": "client_side", + "ordinal": 19, + "type_info": "Int4" + }, + { + "name": "server_side", + "ordinal": 20, + "type_info": "Int4" + }, + { + "name": "license", + "ordinal": 21, + "type_info": "Varchar" + }, + { + "name": "slug", + "ordinal": 22, + "type_info": "Varchar" + }, + { + "name": "moderation_message", + "ordinal": 23, + "type_info": "Varchar" + }, + { + "name": "moderation_message_body", + "ordinal": 24, + "type_info": "Varchar" + }, + { + "name": "client_side_type", + "ordinal": 25, + "type_info": "Varchar" + }, + { + "name": "server_side_type", + "ordinal": 26, + "type_info": "Varchar" + }, + { + "name": "project_type_name", + "ordinal": 27, + "type_info": "Varchar" + }, + { + "name": "flame_anvil_project", + "ordinal": 28, + "type_info": "Int4" + }, + { + "name": "flame_anvil_user", + "ordinal": 29, + "type_info": "Int8" + }, + { + "name": "webhook_sent", + "ordinal": 30, + "type_info": "Bool" + }, + { + "name": "color", + "ordinal": 31, + "type_info": "Int4" + }, + { + "name": "loaders", + "ordinal": 32, + "type_info": "VarcharArray" + }, + { + "name": "game_versions", + "ordinal": 33, + "type_info": "VarcharArray" + }, + { + "name": "categories", + "ordinal": 34, + "type_info": "VarcharArray" + }, + { + "name": "additional_categories", + "ordinal": 35, + "type_info": "VarcharArray" + }, + { + "name": "versions", + "ordinal": 36, + "type_info": "Jsonb" + }, + { + "name": "gallery", + "ordinal": 37, + "type_info": "Jsonb" + }, + { + "name": "donations", + "ordinal": 38, + "type_info": "Jsonb" + } + ], + "nullable": [ + false, + false, + false, + false, + false, + false, + true, + false, + false, + false, + true, + false, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + true, + true, + true, + false, + false, + false, + true, + true, + false, + true, + false, + false, + null, + null, + null, + null, + null + ], + "parameters": { + "Left": [ + "Int8Array", + "TextArray" + ] + } + }, + "query": "\n SELECT m.id id, m.project_type project_type, m.title title, m.description description, m.downloads downloads, m.follows follows,\n m.icon_url icon_url, m.body body, m.published published,\n m.updated updated, m.approved approved, m.status status, m.requested_status requested_status,\n m.issues_url issues_url, m.source_url source_url, m.wiki_url wiki_url, m.discord_url discord_url, m.license_url license_url,\n m.team_id team_id, m.client_side client_side, m.server_side server_side, m.license license, m.slug slug, m.moderation_message moderation_message, m.moderation_message_body moderation_message_body,\n cs.name client_side_type, ss.name server_side_type, pt.name project_type_name, m.flame_anvil_project flame_anvil_project, m.flame_anvil_user flame_anvil_user, m.webhook_sent, m.color,\n m.loaders loaders, m.game_versions game_versions,\n ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is false) categories,\n ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is true) additional_categories,\n JSONB_AGG(DISTINCT jsonb_build_object('id', v.id, 'date_published', v.date_published)) filter (where v.id is not null) versions,\n JSONB_AGG(DISTINCT jsonb_build_object('image_url', mg.image_url, 'featured', mg.featured, 'title', mg.title, 'description', mg.description, 'created', mg.created, 'ordering', mg.ordering)) filter (where mg.image_url is not null) gallery,\n JSONB_AGG(DISTINCT jsonb_build_object('platform_id', md.joining_platform_id, 'platform_short', dp.short, 'platform_name', dp.name,'url', md.url)) filter (where md.joining_platform_id is not null) donations\n FROM mods m\n INNER JOIN project_types pt ON pt.id = m.project_type\n INNER JOIN side_types cs ON m.client_side = cs.id\n INNER JOIN side_types ss ON m.server_side = ss.id\n LEFT JOIN mods_donations md ON md.joining_mod_id = m.id\n LEFT JOIN donation_platforms dp ON md.joining_platform_id = dp.id\n LEFT JOIN mods_categories mc ON mc.joining_mod_id = m.id\n LEFT JOIN categories c ON mc.joining_category_id = c.id\n LEFT JOIN versions v ON v.mod_id = m.id AND v.status = ANY($2)\n LEFT JOIN mods_gallery mg ON mg.mod_id = m.id\n WHERE m.id = ANY($1)\n GROUP BY pt.id, cs.id, ss.id, m.id;\n " + }, "27a35fca63dfc3801f95958604f0ac27afd81800e2dc981382d6f923c4415d32": { "describe": { "columns": [], @@ -1601,6 +2099,206 @@ }, "query": "\n SELECT COUNT(v.id)\n FROM versions v\n INNER JOIN mods m on v.mod_id = m.id AND m.status = ANY($1)\n WHERE v.status = ANY($2)\n " }, + "2e7d9e595d5187abcdddaccba20b3797baee649cfa52c5662953a72efcae4c73": { + "describe": { + "columns": [ + { + "name": "id", + "ordinal": 0, + "type_info": "Int8" + }, + { + "name": "project_type", + "ordinal": 1, + "type_info": "Int4" + }, + { + "name": "title", + "ordinal": 2, + "type_info": "Varchar" + }, + { + "name": "description", + "ordinal": 3, + "type_info": "Varchar" + }, + { + "name": "downloads", + "ordinal": 4, + "type_info": "Int4" + }, + { + "name": "follows", + "ordinal": 5, + "type_info": "Int4" + }, + { + "name": "icon_url", + "ordinal": 6, + "type_info": "Varchar" + }, + { + "name": "body", + "ordinal": 7, + "type_info": "Varchar" + }, + { + "name": "published", + "ordinal": 8, + "type_info": "Timestamptz" + }, + { + "name": "updated", + "ordinal": 9, + "type_info": "Timestamptz" + }, + { + "name": "approved", + "ordinal": 10, + "type_info": "Timestamptz" + }, + { + "name": "status", + "ordinal": 11, + "type_info": "Varchar" + }, + { + "name": "requested_status", + "ordinal": 12, + "type_info": "Varchar" + }, + { + "name": "issues_url", + "ordinal": 13, + "type_info": "Varchar" + }, + { + "name": "source_url", + "ordinal": 14, + "type_info": "Varchar" + }, + { + "name": "wiki_url", + "ordinal": 15, + "type_info": "Varchar" + }, + { + "name": "discord_url", + "ordinal": 16, + "type_info": "Varchar" + }, + { + "name": "license_url", + "ordinal": 17, + "type_info": "Varchar" + }, + { + "name": "team_id", + "ordinal": 18, + "type_info": "Int8" + }, + { + "name": "client_side", + "ordinal": 19, + "type_info": "Int4" + }, + { + "name": "server_side", + "ordinal": 20, + "type_info": "Int4" + }, + { + "name": "license", + "ordinal": 21, + "type_info": "Varchar" + }, + { + "name": "slug", + "ordinal": 22, + "type_info": "Varchar" + }, + { + "name": "moderation_message", + "ordinal": 23, + "type_info": "Varchar" + }, + { + "name": "moderation_message_body", + "ordinal": 24, + "type_info": "Varchar" + }, + { + "name": "flame_anvil_project", + "ordinal": 25, + "type_info": "Int4" + }, + { + "name": "flame_anvil_user", + "ordinal": 26, + "type_info": "Int8" + }, + { + "name": "webhook_sent", + "ordinal": 27, + "type_info": "Bool" + }, + { + "name": "color", + "ordinal": 28, + "type_info": "Int4" + }, + { + "name": "loaders", + "ordinal": 29, + "type_info": "VarcharArray" + }, + { + "name": "game_versions", + "ordinal": 30, + "type_info": "VarcharArray" + } + ], + "nullable": [ + false, + false, + false, + false, + false, + false, + true, + false, + false, + false, + true, + false, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + true, + true, + true, + true, + true, + false, + true, + false, + false + ], + "parameters": { + "Left": [ + "Int8Array" + ] + } + }, + "query": "\n SELECT id, project_type, title, description, downloads, follows,\n icon_url, body, published,\n updated, approved, status, requested_status,\n issues_url, source_url, wiki_url, discord_url, license_url,\n team_id, client_side, server_side, license, slug,\n moderation_message, moderation_message_body, flame_anvil_project,\n flame_anvil_user, webhook_sent, color, loaders, game_versions\n FROM mods\n WHERE id = ANY($1)\n " + }, "2f7c011654d15c85dbb614ac01ed5613a6872ea8c172ab38fdaa0eb38a7d6e4f": { "describe": { "columns": [], @@ -1943,188 +2641,6 @@ }, "query": "\n UPDATE users\n SET stripe_customer_id = NULL, midas_expires = NULL, is_overdue = NULL\n WHERE (stripe_customer_id = $1)\n " }, - "42d0a51c5a2eec6860a904b7753c4907b1b03fb5f081f07149367222bcdc62fb": { - "describe": { - "columns": [ - { - "name": "project_type", - "ordinal": 0, - "type_info": "Int4" - }, - { - "name": "title", - "ordinal": 1, - "type_info": "Varchar" - }, - { - "name": "description", - "ordinal": 2, - "type_info": "Varchar" - }, - { - "name": "downloads", - "ordinal": 3, - "type_info": "Int4" - }, - { - "name": "follows", - "ordinal": 4, - "type_info": "Int4" - }, - { - "name": "icon_url", - "ordinal": 5, - "type_info": "Varchar" - }, - { - "name": "body", - "ordinal": 6, - "type_info": "Varchar" - }, - { - "name": "published", - "ordinal": 7, - "type_info": "Timestamptz" - }, - { - "name": "updated", - "ordinal": 8, - "type_info": "Timestamptz" - }, - { - "name": "approved", - "ordinal": 9, - "type_info": "Timestamptz" - }, - { - "name": "status", - "ordinal": 10, - "type_info": "Varchar" - }, - { - "name": "requested_status", - "ordinal": 11, - "type_info": "Varchar" - }, - { - "name": "issues_url", - "ordinal": 12, - "type_info": "Varchar" - }, - { - "name": "source_url", - "ordinal": 13, - "type_info": "Varchar" - }, - { - "name": "wiki_url", - "ordinal": 14, - "type_info": "Varchar" - }, - { - "name": "discord_url", - "ordinal": 15, - "type_info": "Varchar" - }, - { - "name": "license_url", - "ordinal": 16, - "type_info": "Varchar" - }, - { - "name": "team_id", - "ordinal": 17, - "type_info": "Int8" - }, - { - "name": "client_side", - "ordinal": 18, - "type_info": "Int4" - }, - { - "name": "server_side", - "ordinal": 19, - "type_info": "Int4" - }, - { - "name": "license", - "ordinal": 20, - "type_info": "Varchar" - }, - { - "name": "slug", - "ordinal": 21, - "type_info": "Varchar" - }, - { - "name": "moderation_message", - "ordinal": 22, - "type_info": "Varchar" - }, - { - "name": "moderation_message_body", - "ordinal": 23, - "type_info": "Varchar" - }, - { - "name": "flame_anvil_project", - "ordinal": 24, - "type_info": "Int4" - }, - { - "name": "flame_anvil_user", - "ordinal": 25, - "type_info": "Int8" - }, - { - "name": "webhook_sent", - "ordinal": 26, - "type_info": "Bool" - }, - { - "name": "color", - "ordinal": 27, - "type_info": "Int4" - } - ], - "nullable": [ - false, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true, - true, - true, - true, - true, - true, - false, - false, - false, - false, - true, - true, - true, - true, - true, - false, - true - ], - "parameters": { - "Left": [ - "Int8" - ] - } - }, - "query": "\n SELECT project_type, title, description, downloads, follows,\n icon_url, body, published,\n updated, approved, status, requested_status,\n issues_url, source_url, wiki_url, discord_url, license_url,\n team_id, client_side, server_side, license, slug,\n moderation_message, moderation_message_body, flame_anvil_project,\n flame_anvil_user, webhook_sent, color\n FROM mods\n WHERE id = $1\n " - }, "447350097928db863d47d756354cd52668f52f7156dd7f3673a826f7b9aca2fd": { "describe": { "columns": [ @@ -2473,6 +2989,19 @@ }, "query": "\n SELECT l.id id, l.loader loader, l.icon icon,\n ARRAY_AGG(DISTINCT pt.name) filter (where pt.name is not null) project_types\n FROM loaders l\n LEFT OUTER JOIN loaders_project_types lpt ON joining_loader_id = l.id\n LEFT OUTER JOIN project_types pt ON lpt.joining_project_type_id = pt.id\n GROUP BY l.id;\n " }, + "529b02dc17d406ef66a4e2720cf9e50dff40c5a59a3521f348565cfb1ca6f5c9": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Left": [ + "Int8", + "TextArray" + ] + } + }, + "query": "\n UPDATE mods\n SET game_versions = (\n SELECT COALESCE(ARRAY_AGG(DISTINCT gv.version) filter (where gv.version is not null), array[]::varchar[])\n FROM versions v\n INNER JOIN game_versions_versions gvv ON v.id = gvv.joining_version_id\n INNER JOIN game_versions gv on gvv.game_version_id = gv.id\n WHERE v.mod_id = mods.id AND v.status != ANY($2)\n )\n WHERE id = $1\n " + }, "53a8966ac345cc334ad65ea907be81af74e90b1217696c7eedcf8a8e3fca736e": { "describe": { "columns": [], @@ -2518,34 +3047,6 @@ }, "query": "\n SELECT id FROM reports\n ORDER BY created ASC\n LIMIT $1;\n " }, - "57ff857e0d7f6deab7da6e806b83c61648809c8820cf1a46e833ff97583fe888": { - "describe": { - "columns": [ - { - "name": "version_id", - "ordinal": 0, - "type_info": "Int8" - }, - { - "name": "date_published", - "ordinal": 1, - "type_info": "Timestamptz" - } - ], - "nullable": [ - false, - false - ], - "parameters": { - "Left": [ - "Int8", - "VarcharArray", - "VarcharArray" - ] - } - }, - "query": "\n SELECT DISTINCT ON(v.date_published, v.id) version_id, v.date_published FROM versions v\n INNER JOIN game_versions_versions gvv ON gvv.joining_version_id = v.id\n INNER JOIN game_versions gv on gvv.game_version_id = gv.id AND (cardinality($2::varchar[]) = 0 OR gv.version = ANY($2::varchar[]))\n INNER JOIN loaders_versions lv ON lv.version_id = v.id\n INNER JOIN loaders l on lv.loader_id = l.id AND (cardinality($3::varchar[]) = 0 OR l.loader = ANY($3::varchar[]))\n WHERE v.mod_id = $1\n ORDER BY v.date_published, v.id ASC\n " - }, "5917ab5017e27be2c4c5231426b19c3b37fd171ff47f97a0cb4e2094a0234298": { "describe": { "columns": [ @@ -3502,194 +4003,6 @@ }, "query": "\n SELECT id FROM mods\n WHERE status = $1\n ORDER BY updated ASC\n LIMIT $2;\n " }, - "7c3ab073109e0fd0a01a0c02a9a2b04050d76874520c59c574d10b071c5e88ab": { - "describe": { - "columns": [ - { - "name": "id", - "ordinal": 0, - "type_info": "Int8" - }, - { - "name": "project_type", - "ordinal": 1, - "type_info": "Int4" - }, - { - "name": "title", - "ordinal": 2, - "type_info": "Varchar" - }, - { - "name": "description", - "ordinal": 3, - "type_info": "Varchar" - }, - { - "name": "downloads", - "ordinal": 4, - "type_info": "Int4" - }, - { - "name": "follows", - "ordinal": 5, - "type_info": "Int4" - }, - { - "name": "icon_url", - "ordinal": 6, - "type_info": "Varchar" - }, - { - "name": "body", - "ordinal": 7, - "type_info": "Varchar" - }, - { - "name": "published", - "ordinal": 8, - "type_info": "Timestamptz" - }, - { - "name": "updated", - "ordinal": 9, - "type_info": "Timestamptz" - }, - { - "name": "approved", - "ordinal": 10, - "type_info": "Timestamptz" - }, - { - "name": "status", - "ordinal": 11, - "type_info": "Varchar" - }, - { - "name": "requested_status", - "ordinal": 12, - "type_info": "Varchar" - }, - { - "name": "issues_url", - "ordinal": 13, - "type_info": "Varchar" - }, - { - "name": "source_url", - "ordinal": 14, - "type_info": "Varchar" - }, - { - "name": "wiki_url", - "ordinal": 15, - "type_info": "Varchar" - }, - { - "name": "discord_url", - "ordinal": 16, - "type_info": "Varchar" - }, - { - "name": "license_url", - "ordinal": 17, - "type_info": "Varchar" - }, - { - "name": "team_id", - "ordinal": 18, - "type_info": "Int8" - }, - { - "name": "client_side", - "ordinal": 19, - "type_info": "Int4" - }, - { - "name": "server_side", - "ordinal": 20, - "type_info": "Int4" - }, - { - "name": "license", - "ordinal": 21, - "type_info": "Varchar" - }, - { - "name": "slug", - "ordinal": 22, - "type_info": "Varchar" - }, - { - "name": "moderation_message", - "ordinal": 23, - "type_info": "Varchar" - }, - { - "name": "moderation_message_body", - "ordinal": 24, - "type_info": "Varchar" - }, - { - "name": "flame_anvil_project", - "ordinal": 25, - "type_info": "Int4" - }, - { - "name": "flame_anvil_user", - "ordinal": 26, - "type_info": "Int8" - }, - { - "name": "webhook_sent", - "ordinal": 27, - "type_info": "Bool" - }, - { - "name": "color", - "ordinal": 28, - "type_info": "Int4" - } - ], - "nullable": [ - false, - false, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true, - true, - true, - true, - true, - true, - false, - false, - false, - false, - true, - true, - true, - true, - true, - false, - true - ], - "parameters": { - "Left": [ - "Int8Array" - ] - } - }, - "query": "\n SELECT id, project_type, title, description, downloads, follows,\n icon_url, body, published,\n updated, approved, status, requested_status,\n issues_url, source_url, wiki_url, discord_url, license_url,\n team_id, client_side, server_side, license, slug,\n moderation_message, moderation_message_body, flame_anvil_project,\n flame_anvil_user, webhook_sent, color\n FROM mods\n WHERE id = ANY($1)\n " - }, "7c61fee015231f0a97c25d24f2c6be24821e39e330ab82344ad3b985d0d2aaea": { "describe": { "columns": [ @@ -3780,6 +4093,200 @@ }, "query": "\n SELECT id, user_id, role, permissions, accepted, payouts_split, ordering\n FROM team_members\n WHERE (team_id = $1 AND user_id = $2 AND accepted = TRUE)\n " }, + "7fefc62b251f7a912fa92a1056a831f9b8ade8aa6a76f344756f85efb23bcdfb": { + "describe": { + "columns": [ + { + "name": "project_type", + "ordinal": 0, + "type_info": "Int4" + }, + { + "name": "title", + "ordinal": 1, + "type_info": "Varchar" + }, + { + "name": "description", + "ordinal": 2, + "type_info": "Varchar" + }, + { + "name": "downloads", + "ordinal": 3, + "type_info": "Int4" + }, + { + "name": "follows", + "ordinal": 4, + "type_info": "Int4" + }, + { + "name": "icon_url", + "ordinal": 5, + "type_info": "Varchar" + }, + { + "name": "body", + "ordinal": 6, + "type_info": "Varchar" + }, + { + "name": "published", + "ordinal": 7, + "type_info": "Timestamptz" + }, + { + "name": "updated", + "ordinal": 8, + "type_info": "Timestamptz" + }, + { + "name": "approved", + "ordinal": 9, + "type_info": "Timestamptz" + }, + { + "name": "status", + "ordinal": 10, + "type_info": "Varchar" + }, + { + "name": "requested_status", + "ordinal": 11, + "type_info": "Varchar" + }, + { + "name": "issues_url", + "ordinal": 12, + "type_info": "Varchar" + }, + { + "name": "source_url", + "ordinal": 13, + "type_info": "Varchar" + }, + { + "name": "wiki_url", + "ordinal": 14, + "type_info": "Varchar" + }, + { + "name": "discord_url", + "ordinal": 15, + "type_info": "Varchar" + }, + { + "name": "license_url", + "ordinal": 16, + "type_info": "Varchar" + }, + { + "name": "team_id", + "ordinal": 17, + "type_info": "Int8" + }, + { + "name": "client_side", + "ordinal": 18, + "type_info": "Int4" + }, + { + "name": "server_side", + "ordinal": 19, + "type_info": "Int4" + }, + { + "name": "license", + "ordinal": 20, + "type_info": "Varchar" + }, + { + "name": "slug", + "ordinal": 21, + "type_info": "Varchar" + }, + { + "name": "moderation_message", + "ordinal": 22, + "type_info": "Varchar" + }, + { + "name": "moderation_message_body", + "ordinal": 23, + "type_info": "Varchar" + }, + { + "name": "flame_anvil_project", + "ordinal": 24, + "type_info": "Int4" + }, + { + "name": "flame_anvil_user", + "ordinal": 25, + "type_info": "Int8" + }, + { + "name": "webhook_sent", + "ordinal": 26, + "type_info": "Bool" + }, + { + "name": "color", + "ordinal": 27, + "type_info": "Int4" + }, + { + "name": "loaders", + "ordinal": 28, + "type_info": "VarcharArray" + }, + { + "name": "game_versions", + "ordinal": 29, + "type_info": "VarcharArray" + } + ], + "nullable": [ + false, + false, + false, + false, + false, + true, + false, + false, + false, + true, + false, + true, + true, + true, + true, + true, + true, + false, + false, + false, + false, + true, + true, + true, + true, + true, + false, + true, + false, + false + ], + "parameters": { + "Left": [ + "Int8" + ] + } + }, + "query": "\n SELECT project_type, title, description, downloads, follows,\n icon_url, body, published,\n updated, approved, status, requested_status,\n issues_url, source_url, wiki_url, discord_url, license_url,\n team_id, client_side, server_side, license, slug,\n moderation_message, moderation_message_body, flame_anvil_project,\n flame_anvil_user, webhook_sent, color, loaders, game_versions\n FROM mods\n WHERE id = $1\n " + }, "8129255d25bf0624d83f50558b668ed7b7f9c264e380d276522fc82bc871939b": { "describe": { "columns": [], @@ -4007,6 +4514,19 @@ }, "query": "\n UPDATE users\n SET username = $1\n WHERE (id = $2)\n " }, + "8795ba421d96b38384e38c8c880c66078b1fcd3c72b76a5bbc24253ebbad63fe": { + "describe": { + "columns": [], + "nullable": [], + "parameters": { + "Left": [ + "Int8", + "TextArray" + ] + } + }, + "query": "\n UPDATE mods\n SET loaders = (\n SELECT COALESCE(ARRAY_AGG(DISTINCT l.loader) filter (where l.loader is not null), array[]::varchar[])\n FROM versions v\n INNER JOIN loaders_versions lv ON lv.version_id = v.id\n INNER JOIN loaders l on lv.loader_id = l.id\n WHERE v.mod_id = mods.id AND v.status != ANY($2)\n )\n WHERE id = $1\n " + }, "87fd169e19ba231c6cf131ad2841d5c3b95adde53e5ed4000f8e7d54c0e87320": { "describe": { "columns": [], @@ -4175,6 +4695,37 @@ }, "query": "\n SELECT m.id id, tm.user_id user_id, tm.payouts_split payouts_split, pt.name project_type\n FROM mods m\n INNER JOIN team_members tm on m.team_id = tm.team_id AND tm.accepted = TRUE\n INNER JOIN project_types pt ON pt.id = m.project_type\n WHERE m.id = ANY($1)\n " }, + "9768966125ca0d148944fb03894b3f90d64563cb56adee48e1fb5f27158c43ce": { + "describe": { + "columns": [ + { + "name": "version_id", + "ordinal": 0, + "type_info": "Int8" + }, + { + "name": "date_published", + "ordinal": 1, + "type_info": "Timestamptz" + } + ], + "nullable": [ + false, + false + ], + "parameters": { + "Left": [ + "Int8", + "VarcharArray", + "VarcharArray", + "Text", + "Int8", + "Int8" + ] + } + }, + "query": "\n SELECT DISTINCT ON(v.date_published, v.id) version_id, v.date_published FROM versions v\n INNER JOIN game_versions_versions gvv ON gvv.joining_version_id = v.id\n INNER JOIN game_versions gv on gvv.game_version_id = gv.id AND (cardinality($2::varchar[]) = 0 OR gv.version = ANY($2::varchar[]))\n INNER JOIN loaders_versions lv ON lv.version_id = v.id\n INNER JOIN loaders l on lv.loader_id = l.id AND (cardinality($3::varchar[]) = 0 OR l.loader = ANY($3::varchar[]))\n WHERE v.mod_id = $1 AND ($4 = NULL OR v.version_type = $4)\n ORDER BY v.date_published, v.id ASC\n LIMIT $5 OFFSET $6\n " + }, "97690dda7edea8c985891cae5ad405f628ed81e333bc88df5493c928a4324d43": { "describe": { "columns": [ @@ -4527,243 +5078,6 @@ }, "query": "\n SELECT id FROM categories\n WHERE category = $1 AND project_type = $2\n " }, - "abdd57a514fc34bca239384c16c7a18f1faffcf1db9616ef0576fc2b1691a16e": { - "describe": { - "columns": [ - { - "name": "id", - "ordinal": 0, - "type_info": "Int8" - }, - { - "name": "project_type", - "ordinal": 1, - "type_info": "Int4" - }, - { - "name": "title", - "ordinal": 2, - "type_info": "Varchar" - }, - { - "name": "description", - "ordinal": 3, - "type_info": "Varchar" - }, - { - "name": "downloads", - "ordinal": 4, - "type_info": "Int4" - }, - { - "name": "follows", - "ordinal": 5, - "type_info": "Int4" - }, - { - "name": "icon_url", - "ordinal": 6, - "type_info": "Varchar" - }, - { - "name": "body", - "ordinal": 7, - "type_info": "Varchar" - }, - { - "name": "published", - "ordinal": 8, - "type_info": "Timestamptz" - }, - { - "name": "updated", - "ordinal": 9, - "type_info": "Timestamptz" - }, - { - "name": "approved", - "ordinal": 10, - "type_info": "Timestamptz" - }, - { - "name": "status", - "ordinal": 11, - "type_info": "Varchar" - }, - { - "name": "requested_status", - "ordinal": 12, - "type_info": "Varchar" - }, - { - "name": "issues_url", - "ordinal": 13, - "type_info": "Varchar" - }, - { - "name": "source_url", - "ordinal": 14, - "type_info": "Varchar" - }, - { - "name": "wiki_url", - "ordinal": 15, - "type_info": "Varchar" - }, - { - "name": "discord_url", - "ordinal": 16, - "type_info": "Varchar" - }, - { - "name": "license_url", - "ordinal": 17, - "type_info": "Varchar" - }, - { - "name": "team_id", - "ordinal": 18, - "type_info": "Int8" - }, - { - "name": "client_side", - "ordinal": 19, - "type_info": "Int4" - }, - { - "name": "server_side", - "ordinal": 20, - "type_info": "Int4" - }, - { - "name": "license", - "ordinal": 21, - "type_info": "Varchar" - }, - { - "name": "slug", - "ordinal": 22, - "type_info": "Varchar" - }, - { - "name": "moderation_message", - "ordinal": 23, - "type_info": "Varchar" - }, - { - "name": "moderation_message_body", - "ordinal": 24, - "type_info": "Varchar" - }, - { - "name": "client_side_type", - "ordinal": 25, - "type_info": "Varchar" - }, - { - "name": "server_side_type", - "ordinal": 26, - "type_info": "Varchar" - }, - { - "name": "project_type_name", - "ordinal": 27, - "type_info": "Varchar" - }, - { - "name": "flame_anvil_project", - "ordinal": 28, - "type_info": "Int4" - }, - { - "name": "flame_anvil_user", - "ordinal": 29, - "type_info": "Int8" - }, - { - "name": "webhook_sent", - "ordinal": 30, - "type_info": "Bool" - }, - { - "name": "color", - "ordinal": 31, - "type_info": "Int4" - }, - { - "name": "categories", - "ordinal": 32, - "type_info": "VarcharArray" - }, - { - "name": "additional_categories", - "ordinal": 33, - "type_info": "VarcharArray" - }, - { - "name": "versions", - "ordinal": 34, - "type_info": "Jsonb" - }, - { - "name": "gallery", - "ordinal": 35, - "type_info": "Jsonb" - }, - { - "name": "donations", - "ordinal": 36, - "type_info": "Jsonb" - } - ], - "nullable": [ - false, - false, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true, - true, - true, - true, - true, - true, - false, - false, - false, - false, - true, - true, - true, - false, - false, - false, - true, - true, - false, - true, - null, - null, - null, - null, - null - ], - "parameters": { - "Left": [ - "Int8Array", - "TextArray" - ] - } - }, - "query": "\n SELECT m.id id, m.project_type project_type, m.title title, m.description description, m.downloads downloads, m.follows follows,\n m.icon_url icon_url, m.body body, m.published published,\n m.updated updated, m.approved approved, m.status status, m.requested_status requested_status,\n m.issues_url issues_url, m.source_url source_url, m.wiki_url wiki_url, m.discord_url discord_url, m.license_url license_url,\n m.team_id team_id, m.client_side client_side, m.server_side server_side, m.license license, m.slug slug, m.moderation_message moderation_message, m.moderation_message_body moderation_message_body,\n cs.name client_side_type, ss.name server_side_type, pt.name project_type_name, m.flame_anvil_project flame_anvil_project, m.flame_anvil_user flame_anvil_user, m.webhook_sent, m.color,\n ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is false) categories,\n ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is true) additional_categories,\n JSONB_AGG(DISTINCT jsonb_build_object('id', v.id, 'date_published', v.date_published)) filter (where v.id is not null) versions,\n JSONB_AGG(DISTINCT jsonb_build_object('image_url', mg.image_url, 'featured', mg.featured, 'title', mg.title, 'description', mg.description, 'created', mg.created, 'ordering', mg.ordering)) filter (where mg.image_url is not null) gallery,\n JSONB_AGG(DISTINCT jsonb_build_object('platform_id', md.joining_platform_id, 'platform_short', dp.short, 'platform_name', dp.name,'url', md.url)) filter (where md.joining_platform_id is not null) donations\n FROM mods m\n INNER JOIN project_types pt ON pt.id = m.project_type\n INNER JOIN side_types cs ON m.client_side = cs.id\n INNER JOIN side_types ss ON m.server_side = ss.id\n LEFT JOIN mods_donations md ON md.joining_mod_id = m.id\n LEFT JOIN donation_platforms dp ON md.joining_platform_id = dp.id\n LEFT JOIN mods_categories mc ON mc.joining_mod_id = m.id\n LEFT JOIN categories c ON mc.joining_category_id = c.id\n LEFT JOIN versions v ON v.mod_id = m.id AND v.status = ANY($2)\n LEFT JOIN mods_gallery mg ON mg.mod_id = m.id\n WHERE m.id = ANY($1)\n GROUP BY pt.id, cs.id, ss.id, m.id;\n " - }, "ac2d17b7d7147b14f072c15ffa214c14f32f27ffa6a3c2b2a5f80f3ad49ca5e9": { "describe": { "columns": [ @@ -6482,243 +6796,6 @@ }, "query": "\n SELECT v.id id, v.mod_id mod_id, file_type FROM files f\n INNER JOIN versions v ON v.id = f.version_id\n WHERE f.url = $1\n " }, - "df35aee011aa176f5511729afd68b493ac70b997168cb502b5fd7e4224da27bb": { - "describe": { - "columns": [ - { - "name": "id", - "ordinal": 0, - "type_info": "Int8" - }, - { - "name": "project_type", - "ordinal": 1, - "type_info": "Int4" - }, - { - "name": "title", - "ordinal": 2, - "type_info": "Varchar" - }, - { - "name": "description", - "ordinal": 3, - "type_info": "Varchar" - }, - { - "name": "downloads", - "ordinal": 4, - "type_info": "Int4" - }, - { - "name": "follows", - "ordinal": 5, - "type_info": "Int4" - }, - { - "name": "icon_url", - "ordinal": 6, - "type_info": "Varchar" - }, - { - "name": "body", - "ordinal": 7, - "type_info": "Varchar" - }, - { - "name": "published", - "ordinal": 8, - "type_info": "Timestamptz" - }, - { - "name": "updated", - "ordinal": 9, - "type_info": "Timestamptz" - }, - { - "name": "approved", - "ordinal": 10, - "type_info": "Timestamptz" - }, - { - "name": "status", - "ordinal": 11, - "type_info": "Varchar" - }, - { - "name": "requested_status", - "ordinal": 12, - "type_info": "Varchar" - }, - { - "name": "issues_url", - "ordinal": 13, - "type_info": "Varchar" - }, - { - "name": "source_url", - "ordinal": 14, - "type_info": "Varchar" - }, - { - "name": "wiki_url", - "ordinal": 15, - "type_info": "Varchar" - }, - { - "name": "discord_url", - "ordinal": 16, - "type_info": "Varchar" - }, - { - "name": "license_url", - "ordinal": 17, - "type_info": "Varchar" - }, - { - "name": "team_id", - "ordinal": 18, - "type_info": "Int8" - }, - { - "name": "client_side", - "ordinal": 19, - "type_info": "Int4" - }, - { - "name": "server_side", - "ordinal": 20, - "type_info": "Int4" - }, - { - "name": "license", - "ordinal": 21, - "type_info": "Varchar" - }, - { - "name": "slug", - "ordinal": 22, - "type_info": "Varchar" - }, - { - "name": "moderation_message", - "ordinal": 23, - "type_info": "Varchar" - }, - { - "name": "moderation_message_body", - "ordinal": 24, - "type_info": "Varchar" - }, - { - "name": "client_side_type", - "ordinal": 25, - "type_info": "Varchar" - }, - { - "name": "server_side_type", - "ordinal": 26, - "type_info": "Varchar" - }, - { - "name": "project_type_name", - "ordinal": 27, - "type_info": "Varchar" - }, - { - "name": "flame_anvil_project", - "ordinal": 28, - "type_info": "Int4" - }, - { - "name": "flame_anvil_user", - "ordinal": 29, - "type_info": "Int8" - }, - { - "name": "webhook_sent", - "ordinal": 30, - "type_info": "Bool" - }, - { - "name": "color", - "ordinal": 31, - "type_info": "Int4" - }, - { - "name": "categories", - "ordinal": 32, - "type_info": "VarcharArray" - }, - { - "name": "additional_categories", - "ordinal": 33, - "type_info": "VarcharArray" - }, - { - "name": "versions", - "ordinal": 34, - "type_info": "Jsonb" - }, - { - "name": "gallery", - "ordinal": 35, - "type_info": "Jsonb" - }, - { - "name": "donations", - "ordinal": 36, - "type_info": "Jsonb" - } - ], - "nullable": [ - false, - false, - false, - false, - false, - false, - true, - false, - false, - false, - true, - false, - true, - true, - true, - true, - true, - true, - false, - false, - false, - false, - true, - true, - true, - false, - false, - false, - true, - true, - false, - true, - null, - null, - null, - null, - null - ], - "parameters": { - "Left": [ - "Int8", - "TextArray" - ] - } - }, - "query": "\n SELECT m.id id, m.project_type project_type, m.title title, m.description description, m.downloads downloads, m.follows follows,\n m.icon_url icon_url, m.body body, m.published published,\n m.updated updated, m.approved approved, m.status status, m.requested_status requested_status,\n m.issues_url issues_url, m.source_url source_url, m.wiki_url wiki_url, m.discord_url discord_url, m.license_url license_url,\n m.team_id team_id, m.client_side client_side, m.server_side server_side, m.license license, m.slug slug, m.moderation_message moderation_message, m.moderation_message_body moderation_message_body,\n cs.name client_side_type, ss.name server_side_type, pt.name project_type_name, m.flame_anvil_project flame_anvil_project, m.flame_anvil_user flame_anvil_user, m.webhook_sent webhook_sent, m.color,\n ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is false) categories,\n ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is true) additional_categories,\n JSONB_AGG(DISTINCT jsonb_build_object('id', v.id, 'date_published', v.date_published)) filter (where v.id is not null) versions,\n JSONB_AGG(DISTINCT jsonb_build_object('image_url', mg.image_url, 'featured', mg.featured, 'title', mg.title, 'description', mg.description, 'created', mg.created, 'ordering', mg.ordering)) filter (where mg.image_url is not null) gallery,\n JSONB_AGG(DISTINCT jsonb_build_object('platform_id', md.joining_platform_id, 'platform_short', dp.short, 'platform_name', dp.name,'url', md.url)) filter (where md.joining_platform_id is not null) donations\n FROM mods m\n INNER JOIN project_types pt ON pt.id = m.project_type\n INNER JOIN side_types cs ON m.client_side = cs.id\n INNER JOIN side_types ss ON m.server_side = ss.id\n LEFT JOIN mods_donations md ON md.joining_mod_id = m.id\n LEFT JOIN donation_platforms dp ON md.joining_platform_id = dp.id\n LEFT JOIN mods_categories mc ON mc.joining_mod_id = m.id\n LEFT JOIN categories c ON mc.joining_category_id = c.id\n LEFT JOIN versions v ON v.mod_id = m.id AND v.status = ANY($2)\n LEFT JOIN mods_gallery mg ON mg.mod_id = m.id\n WHERE m.id = $1\n GROUP BY pt.id, cs.id, ss.id, m.id;\n " - }, "df871bd959ba97f105ac575f34d8d2a39cbc44a07e0339750a0e477e6fd582ed": { "describe": { "columns": [], diff --git a/src/database/models/project_item.rs b/src/database/models/project_item.rs index 6e2e3b4a..8814f951 100644 --- a/src/database/models/project_item.rs +++ b/src/database/models/project_item.rs @@ -139,6 +139,8 @@ impl ProjectBuilder { flame_anvil_user: None, webhook_sent: false, color: self.color, + loaders: vec![], + game_versions: vec![], }; project_struct.insert(&mut *transaction).await?; @@ -181,6 +183,10 @@ impl ProjectBuilder { .await?; } + Project::update_game_versions(self.project_id, &mut *transaction) + .await?; + Project::update_loaders(self.project_id, &mut *transaction).await?; + Ok(self.project_id) } } @@ -216,6 +222,8 @@ pub struct Project { pub flame_anvil_user: Option, pub webhook_sent: bool, pub color: Option, + pub loaders: Vec, + pub game_versions: Vec, } impl Project { @@ -283,7 +291,7 @@ impl Project { issues_url, source_url, wiki_url, discord_url, license_url, team_id, client_side, server_side, license, slug, moderation_message, moderation_message_body, flame_anvil_project, - flame_anvil_user, webhook_sent, color + flame_anvil_user, webhook_sent, color, loaders, game_versions FROM mods WHERE id = $1 ", @@ -326,6 +334,8 @@ impl Project { flame_anvil_user: row.flame_anvil_user.map(UserId), webhook_sent: row.webhook_sent, color: row.color.map(|x| x as u32), + loaders: row.loaders, + game_versions: row.game_versions, })) } else { Ok(None) @@ -351,7 +361,7 @@ impl Project { issues_url, source_url, wiki_url, discord_url, license_url, team_id, client_side, server_side, license, slug, moderation_message, moderation_message_body, flame_anvil_project, - flame_anvil_user, webhook_sent, color + flame_anvil_user, webhook_sent, color, loaders, game_versions FROM mods WHERE id = ANY($1) ", @@ -394,6 +404,8 @@ impl Project { flame_anvil_user: m.flame_anvil_user.map(UserId), webhook_sent: m.webhook_sent, color: m.color.map(|x| x as u32), + loaders: m.loaders, + game_versions: m.game_versions, })) }) .try_collect::>() @@ -673,6 +685,7 @@ impl Project { m.issues_url issues_url, m.source_url source_url, m.wiki_url wiki_url, m.discord_url discord_url, m.license_url license_url, m.team_id team_id, m.client_side client_side, m.server_side server_side, m.license license, m.slug slug, m.moderation_message moderation_message, m.moderation_message_body moderation_message_body, cs.name client_side_type, ss.name server_side_type, pt.name project_type_name, m.flame_anvil_project flame_anvil_project, m.flame_anvil_user flame_anvil_user, m.webhook_sent webhook_sent, m.color, + m.loaders loaders, m.game_versions game_versions, ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is false) categories, ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is true) additional_categories, JSONB_AGG(DISTINCT jsonb_build_object('id', v.id, 'date_published', v.date_published)) filter (where v.id is not null) versions, @@ -732,6 +745,8 @@ impl Project { flame_anvil_user: m.flame_anvil_user.map(UserId), webhook_sent: m.webhook_sent, color: m.color.map(|x| x as u32), + loaders: m.loaders, + game_versions: m.game_versions, }, project_type: m.project_type_name, categories: m.categories.unwrap_or_default(), @@ -802,6 +817,7 @@ impl Project { m.issues_url issues_url, m.source_url source_url, m.wiki_url wiki_url, m.discord_url discord_url, m.license_url license_url, m.team_id team_id, m.client_side client_side, m.server_side server_side, m.license license, m.slug slug, m.moderation_message moderation_message, m.moderation_message_body moderation_message_body, cs.name client_side_type, ss.name server_side_type, pt.name project_type_name, m.flame_anvil_project flame_anvil_project, m.flame_anvil_user flame_anvil_user, m.webhook_sent, m.color, + m.loaders loaders, m.game_versions game_versions, ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is false) categories, ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null and mc.is_additional is true) additional_categories, JSONB_AGG(DISTINCT jsonb_build_object('id', v.id, 'date_published', v.date_published)) filter (where v.id is not null) versions, @@ -864,6 +880,8 @@ impl Project { flame_anvil_user: m.flame_anvil_user.map(UserId), webhook_sent: m.webhook_sent, color: m.color.map(|x| x as u32), + loaders: m.loaders, + game_versions: m.game_versions, }, project_type: m.project_type_name, categories: m.categories.unwrap_or_default(), @@ -904,6 +922,56 @@ impl Project { .try_collect::>() .await } + + pub async fn update_game_versions( + id: ProjectId, + transaction: &mut sqlx::Transaction<'_, sqlx::Postgres>, + ) -> Result<(), sqlx::error::Error> { + sqlx::query!( + " + UPDATE mods + SET game_versions = ( + SELECT COALESCE(ARRAY_AGG(DISTINCT gv.version) filter (where gv.version is not null), array[]::varchar[]) + FROM versions v + INNER JOIN game_versions_versions gvv ON v.id = gvv.joining_version_id + INNER JOIN game_versions gv on gvv.game_version_id = gv.id + WHERE v.mod_id = mods.id AND v.status != ANY($2) + ) + WHERE id = $1 + ", + id as ProjectId, + &*crate::models::projects::VersionStatus::iterator().filter(|x| x.is_hidden()).map(|x| x.to_string()).collect::>() + ) + .execute(&mut *transaction) + .await?; + + Ok(()) + } + + pub async fn update_loaders( + id: ProjectId, + transaction: &mut sqlx::Transaction<'_, sqlx::Postgres>, + ) -> Result<(), sqlx::error::Error> { + sqlx::query!( + " + UPDATE mods + SET loaders = ( + SELECT COALESCE(ARRAY_AGG(DISTINCT l.loader) filter (where l.loader is not null), array[]::varchar[]) + FROM versions v + INNER JOIN loaders_versions lv ON lv.version_id = v.id + INNER JOIN loaders l on lv.loader_id = l.id + WHERE v.mod_id = mods.id AND v.status != ANY($2) + ) + WHERE id = $1 + ", + id as ProjectId, + &*crate::models::projects::VersionStatus::iterator().filter(|x| x.is_hidden()).map(|x| x.to_string()).collect::>() + ) + .execute(&mut *transaction) + .await?; + + Ok(()) + } } #[derive(Clone, Debug)] diff --git a/src/database/models/version_item.rs b/src/database/models/version_item.rs index cc48ae0c..a80f183a 100644 --- a/src/database/models/version_item.rs +++ b/src/database/models/version_item.rs @@ -1,6 +1,6 @@ use super::ids::*; use super::DatabaseError; -use crate::models::projects::{FileType, VersionStatus}; +use crate::models::projects::{FileType, VersionStatus, VersionType}; use chrono::{DateTime, Utc}; use serde::Deserialize; use std::cmp::Ordering; @@ -462,6 +462,18 @@ impl Version { ) .execute(&mut *transaction) .await?; + + crate::database::models::Project::update_game_versions( + ProjectId(project_id.mod_id), + &mut *transaction, + ) + .await?; + crate::database::models::Project::update_loaders( + ProjectId(project_id.mod_id), + &mut *transaction, + ) + .await?; + Ok(Some(())) } @@ -469,6 +481,9 @@ impl Version { project_id: ProjectId, game_versions: Option>, loaders: Option>, + version_type: Option, + limit: Option, + offset: Option, exec: E, ) -> Result, sqlx::Error> where @@ -483,12 +498,16 @@ impl Version { INNER JOIN game_versions gv on gvv.game_version_id = gv.id AND (cardinality($2::varchar[]) = 0 OR gv.version = ANY($2::varchar[])) INNER JOIN loaders_versions lv ON lv.version_id = v.id INNER JOIN loaders l on lv.loader_id = l.id AND (cardinality($3::varchar[]) = 0 OR l.loader = ANY($3::varchar[])) - WHERE v.mod_id = $1 + WHERE v.mod_id = $1 AND ($4 = NULL OR v.version_type = $4) ORDER BY v.date_published, v.id ASC + LIMIT $5 OFFSET $6 ", project_id as ProjectId, &game_versions.unwrap_or_default(), &loaders.unwrap_or_default(), + version_type.map(|x| x.as_str()), + limit.map(|x| x as i64), + offset.map(|x| x as i64), ) .fetch_many(exec) .try_filter_map(|e| async { Ok(e.right().map(|v| VersionId(v.version_id))) }) diff --git a/src/database/postgres_database.rs b/src/database/postgres_database.rs index a50d61f7..65601bde 100644 --- a/src/database/postgres_database.rs +++ b/src/database/postgres_database.rs @@ -21,7 +21,7 @@ pub async fn connect() -> Result { .and_then(|x| x.parse().ok()) .unwrap_or(16), ) - .max_lifetime(Some(Duration::from_secs(60 * 60 * 6))) + .max_lifetime(Some(Duration::from_secs(60 * 60))) .connect(&database_url) .await?; diff --git a/src/models/projects.rs b/src/models/projects.rs index 0a0a829d..ce9a953e 100644 --- a/src/models/projects.rs +++ b/src/models/projects.rs @@ -75,6 +75,11 @@ pub struct Project { /// A list of the categories that the project is in. pub additional_categories: Vec, + /// A list of game versions this project supports + pub game_versions: Vec, + /// A list of loaders this project supports + pub loaders: Vec, + /// A list of ids for versions of the project. pub versions: Vec, /// The URL of the icon of the project @@ -154,6 +159,8 @@ impl From for Project { followers: m.follows as u32, categories: data.categories, additional_categories: data.additional_categories, + game_versions: m.game_versions, + loaders: m.loaders, versions: data.versions.into_iter().map(|v| v.into()).collect(), icon_url: m.icon_url, issues_url: m.issues_url, diff --git a/src/routes/project_creation.rs b/src/routes/project_creation.rs index 38582966..9abb0e2c 100644 --- a/src/routes/project_creation.rs +++ b/src/routes/project_creation.rs @@ -816,6 +816,8 @@ pub async fn project_create_inner( followers: 0, categories: project_create_data.categories, additional_categories: project_create_data.additional_categories, + game_versions: vec![], + loaders: vec![], versions: project_builder .initial_versions .iter() diff --git a/src/routes/updates.rs b/src/routes/updates.rs index c0a33c02..279506e7 100644 --- a/src/routes/updates.rs +++ b/src/routes/updates.rs @@ -38,6 +38,9 @@ pub async fn forge_updates( project.id, None, Some(vec!["forge".to_string()]), + None, + None, + None, &**pool, ) .await?; diff --git a/src/routes/users.rs b/src/routes/users.rs index 045ff4df..049d0af6 100644 --- a/src/routes/users.rs +++ b/src/routes/users.rs @@ -107,7 +107,7 @@ pub async fn projects_list( crate::database::Project::get_many_full(&project_data, &**pool) .await? .into_iter() - .filter(|x| can_view_private || x.inner.status.is_approved()) + .filter(|x| can_view_private || x.inner.status.is_searchable()) .map(Project::from) .collect(); diff --git a/src/routes/v1/versions.rs b/src/routes/v1/versions.rs index 156ce782..4bd07b9d 100644 --- a/src/routes/v1/versions.rs +++ b/src/routes/v1/versions.rs @@ -76,6 +76,9 @@ pub async fn version_list( .loaders .as_ref() .map(|x| serde_json::from_str(x).unwrap_or_default()), + filters.version_type, + filters.limit, + filters.offset, &**pool, ) .await?; diff --git a/src/routes/version_creation.rs b/src/routes/version_creation.rs index 0b4afaa2..f4fdf64f 100644 --- a/src/routes/version_creation.rs +++ b/src/routes/version_creation.rs @@ -422,6 +422,14 @@ async fn version_create_inner( .insert_many(users, &mut *transaction) .await?; + models::Project::update_game_versions( + builder.project_id, + &mut *transaction, + ) + .await?; + models::Project::update_loaders(builder.project_id, &mut *transaction) + .await?; + let response = Version { id: builder.version_id.into(), project_id: builder.project_id.into(), diff --git a/src/routes/version_file.rs b/src/routes/version_file.rs index 82694ce1..77a4c6f0 100644 --- a/src/routes/version_file.rs +++ b/src/routes/version_file.rs @@ -301,6 +301,9 @@ pub async fn get_update_from_hash( .map(|x| x.0) .collect(), ), + None, + None, + None, &**pool, ) .await?; @@ -493,6 +496,9 @@ pub async fn update_files( .map(|x| x.0.clone()) .collect(), ), + None, + None, + None, &**pool, ) .await?; diff --git a/src/routes/versions.rs b/src/routes/versions.rs index 791bca90..3ed8857e 100644 --- a/src/routes/versions.rs +++ b/src/routes/versions.rs @@ -1,7 +1,9 @@ use super::ApiError; use crate::database; use crate::models; -use crate::models::projects::{Dependency, FileType, Version, VersionStatus}; +use crate::models::projects::{ + Dependency, FileType, Version, VersionStatus, VersionType, +}; use crate::models::teams::Permissions; use crate::util::auth::{ get_user_from_headers, is_authorized, is_authorized_version, @@ -19,6 +21,9 @@ pub struct VersionListFilters { pub game_versions: Option, pub loaders: Option, pub featured: Option, + pub version_type: Option, + pub limit: Option, + pub offset: Option, } #[get("version")] @@ -54,6 +59,9 @@ pub async fn version_list( .loaders .as_ref() .map(|x| serde_json::from_str(x).unwrap_or_default()), + filters.version_type, + filters.limit, + filters.offset, &**pool, ) .await?; @@ -393,6 +401,12 @@ pub async fn version_edit( .execute(&mut *transaction) .await?; } + + database::models::Project::update_game_versions( + version_item.inner.project_id, + &mut transaction, + ) + .await?; } if let Some(loaders) = &new_version.loaders { @@ -430,6 +444,12 @@ pub async fn version_edit( .execute(&mut *transaction) .await?; } + + database::models::Project::update_loaders( + version_item.inner.project_id, + &mut transaction, + ) + .await?; } if let Some(featured) = &new_version.featured {