From 26533c47e715275e470df6e8a5d8f03be92fd587 Mon Sep 17 00:00:00 2001
From: Geometrically <18202329+Geometrically@users.noreply.github.com>
Date: Fri, 27 Jan 2023 19:24:40 -0700
Subject: [PATCH] Add loaders + game versions param to mods (#528)
---
.idea/sqldialects.xml | 2 +-
migrations/20230127233123_loader-gv-mod.sql | 21 +
sqlx-data.json | 1821 ++++++++++---------
src/database/models/project_item.rs | 72 +-
src/database/models/version_item.rs | 23 +-
src/database/postgres_database.rs | 2 +-
src/models/projects.rs | 7 +
src/routes/project_creation.rs | 2 +
src/routes/updates.rs | 3 +
src/routes/users.rs | 2 +-
src/routes/v1/versions.rs | 3 +
src/routes/version_creation.rs | 8 +
src/routes/version_file.rs | 6 +
src/routes/versions.rs | 22 +-
14 files changed, 1114 insertions(+), 880 deletions(-)
create mode 100644 migrations/20230127233123_loader-gv-mod.sql
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 {