You've already forked AstralRinth
forked from didirus/AstralRinth
Fix plugin validator, fix version urls, clippy lints, additional categories (#421)
This commit is contained in:
55
Cargo.lock
generated
55
Cargo.lock
generated
@@ -343,12 +343,6 @@ dependencies = [
|
|||||||
"syn",
|
"syn",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "async_once"
|
|
||||||
version = "0.2.6"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "2ce4f10ea3abcd6617873bae9f91d1c5332b4a778bd9ce34d0cd517474c1de82"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "atoi"
|
name = "atoi"
|
||||||
version = "1.0.0"
|
version = "1.0.0"
|
||||||
@@ -527,42 +521,6 @@ version = "1.2.0"
|
|||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c"
|
checksum = "c1db59621ec70f09c5e9b597b220c7a2b43611f4710dc03ceb8748637775692c"
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cached"
|
|
||||||
version = "0.34.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "aadf76ddea74bab35ebeb8f1eb115b9bc04eaee42d8acc0d5f477dee6b176c9a"
|
|
||||||
dependencies = [
|
|
||||||
"async-trait",
|
|
||||||
"async_once",
|
|
||||||
"cached_proc_macro",
|
|
||||||
"cached_proc_macro_types",
|
|
||||||
"futures",
|
|
||||||
"hashbrown 0.12.1",
|
|
||||||
"lazy_static",
|
|
||||||
"once_cell",
|
|
||||||
"thiserror",
|
|
||||||
"tokio",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cached_proc_macro"
|
|
||||||
version = "0.12.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "bce0f37f9b77c6b93cdf3f060c89adca303d2ab052cacb3c3d1ab543e8cecd2f"
|
|
||||||
dependencies = [
|
|
||||||
"cached_proc_macro_types",
|
|
||||||
"darling",
|
|
||||||
"quote",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "cached_proc_macro_types"
|
|
||||||
version = "0.1.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "3a4f925191b4367301851c6d99b09890311d74b0d43f274c0b34c86d308a3663"
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "castaway"
|
name = "castaway"
|
||||||
version = "0.1.2"
|
version = "0.1.2"
|
||||||
@@ -1460,7 +1418,6 @@ dependencies = [
|
|||||||
"base64",
|
"base64",
|
||||||
"bitflags",
|
"bitflags",
|
||||||
"bytes",
|
"bytes",
|
||||||
"cached",
|
|
||||||
"censor",
|
"censor",
|
||||||
"chrono",
|
"chrono",
|
||||||
"dashmap",
|
"dashmap",
|
||||||
@@ -2730,21 +2687,9 @@ dependencies = [
|
|||||||
"pin-project-lite",
|
"pin-project-lite",
|
||||||
"signal-hook-registry",
|
"signal-hook-registry",
|
||||||
"socket2",
|
"socket2",
|
||||||
"tokio-macros",
|
|
||||||
"winapi",
|
"winapi",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
|
||||||
name = "tokio-macros"
|
|
||||||
version = "1.8.0"
|
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
|
||||||
checksum = "9724f9a975fb987ef7a3cd9be0350edcbe130698af5b8f7a631e23d42d052484"
|
|
||||||
dependencies = [
|
|
||||||
"proc-macro2",
|
|
||||||
"quote",
|
|
||||||
"syn",
|
|
||||||
]
|
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tokio-native-tls"
|
name = "tokio-native-tls"
|
||||||
version = "0.3.0"
|
version = "0.3.0"
|
||||||
|
|||||||
@@ -62,6 +62,4 @@ bytes = "1.1.0"
|
|||||||
|
|
||||||
dashmap = "5.2.0"
|
dashmap = "5.2.0"
|
||||||
|
|
||||||
cached = "0.34.0"
|
|
||||||
|
|
||||||
censor = "0.2.0"
|
censor = "0.2.0"
|
||||||
963
sqlx-data.json
963
sqlx-data.json
@@ -207,6 +207,230 @@
|
|||||||
},
|
},
|
||||||
"query": "\n UPDATE versions\n SET name = $1\n WHERE (id = $2)\n "
|
"query": "\n UPDATE versions\n SET name = $1\n WHERE (id = $2)\n "
|
||||||
},
|
},
|
||||||
|
"0aa77d3833a3f0b2ed198b7928ef4170c6e3dffcf5144050c8b11fcb911e127f": {
|
||||||
|
"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": "body_url",
|
||||||
|
"ordinal": 8,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "published",
|
||||||
|
"ordinal": 9,
|
||||||
|
"type_info": "Timestamptz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "updated",
|
||||||
|
"ordinal": 10,
|
||||||
|
"type_info": "Timestamptz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "approved",
|
||||||
|
"ordinal": 11,
|
||||||
|
"type_info": "Timestamptz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "status",
|
||||||
|
"ordinal": 12,
|
||||||
|
"type_info": "Int4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": "Int4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": "status_name",
|
||||||
|
"ordinal": 25,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "client_side_type",
|
||||||
|
"ordinal": 26,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "server_side_type",
|
||||||
|
"ordinal": 27,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "short",
|
||||||
|
"ordinal": 28,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "license_name",
|
||||||
|
"ordinal": 29,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "project_type_name",
|
||||||
|
"ordinal": 30,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "categories",
|
||||||
|
"ordinal": 31,
|
||||||
|
"type_info": "TextArray"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "versions",
|
||||||
|
"ordinal": 32,
|
||||||
|
"type_info": "TextArray"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "gallery",
|
||||||
|
"ordinal": 33,
|
||||||
|
"type_info": "TextArray"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "donations",
|
||||||
|
"ordinal": 34,
|
||||||
|
"type_info": "TextArray"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"nullable": [
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
],
|
||||||
|
"parameters": {
|
||||||
|
"Left": [
|
||||||
|
"Int8Array"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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.body_url body_url, m.published published,\n m.updated updated, m.approved approved, m.status 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 s.status status_name, cs.name client_side_type, ss.name server_side_type, l.short short, l.name license_name, pt.name project_type_name,\n ARRAY_AGG(DISTINCT c.category || ' |||| ' || mc.is_additional) filter (where c.category is not null) categories,\n ARRAY_AGG(DISTINCT v.id || ' |||| ' || v.date_published) filter (where v.id is not null) versions,\n ARRAY_AGG(DISTINCT mg.image_url || ' |||| ' || mg.featured || ' |||| ' || mg.created || ' |||| ' || COALESCE(mg.title, ' ') || ' |||| ' || COALESCE(mg.description, ' ')) filter (where mg.image_url is not null) gallery,\n ARRAY_AGG(DISTINCT md.joining_platform_id || ' |||| ' || dp.short || ' |||| ' || dp.name || ' |||| ' || 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 statuses s ON s.id = m.status\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 INNER JOIN licenses l ON m.license = l.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\n LEFT JOIN mods_gallery mg ON mg.mod_id = m.id\n WHERE m.id = ANY($1)\n GROUP BY pt.id, s.id, cs.id, ss.id, l.id, m.id;\n "
|
||||||
|
},
|
||||||
"0ca11a32b2860e4f5c3d20892a5be3cb419e084f42ba0f98e09b9995027fcc4e": {
|
"0ca11a32b2860e4f5c3d20892a5be3cb419e084f42ba0f98e09b9995027fcc4e": {
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
@@ -3282,236 +3506,6 @@
|
|||||||
},
|
},
|
||||||
"query": "\n DELETE FROM team_members\n WHERE (team_id = $1 AND user_id = $2 AND NOT role = $3)\n "
|
"query": "\n DELETE FROM team_members\n WHERE (team_id = $1 AND user_id = $2 AND NOT role = $3)\n "
|
||||||
},
|
},
|
||||||
"8c733fda1bd2b010f0b625dc7d08f673252fc0c004ca96ba880918a3c7c40258": {
|
|
||||||
"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": "body_url",
|
|
||||||
"ordinal": 8,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "published",
|
|
||||||
"ordinal": 9,
|
|
||||||
"type_info": "Timestamptz"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "updated",
|
|
||||||
"ordinal": 10,
|
|
||||||
"type_info": "Timestamptz"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "approved",
|
|
||||||
"ordinal": 11,
|
|
||||||
"type_info": "Timestamptz"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "status",
|
|
||||||
"ordinal": 12,
|
|
||||||
"type_info": "Int4"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"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": "Int4"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"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": "status_name",
|
|
||||||
"ordinal": 25,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "client_side_type",
|
|
||||||
"ordinal": 26,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "server_side_type",
|
|
||||||
"ordinal": 27,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "short",
|
|
||||||
"ordinal": 28,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "license_name",
|
|
||||||
"ordinal": 29,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "project_type_name",
|
|
||||||
"ordinal": 30,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "categories",
|
|
||||||
"ordinal": 31,
|
|
||||||
"type_info": "VarcharArray"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "additional_categories",
|
|
||||||
"ordinal": 32,
|
|
||||||
"type_info": "VarcharArray"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "versions",
|
|
||||||
"ordinal": 33,
|
|
||||||
"type_info": "TextArray"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "gallery",
|
|
||||||
"ordinal": 34,
|
|
||||||
"type_info": "TextArray"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "donations",
|
|
||||||
"ordinal": 35,
|
|
||||||
"type_info": "TextArray"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"nullable": [
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Int8"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"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.body_url body_url, m.published published,\n m.updated updated, m.approved approved, m.status 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 s.status status_name, cs.name client_side_type, ss.name server_side_type, l.short short, l.name license_name, pt.name project_type_name,\n ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null) categories,\n ARRAY_AGG(DISTINCT ca.category) filter (where ca.category is not null) additional_categories,\n ARRAY_AGG(DISTINCT v.id || ' |||| ' || v.date_published) filter (where v.id is not null) versions,\n ARRAY_AGG(DISTINCT mg.image_url || ' |||| ' || mg.featured || ' |||| ' || mg.created || ' |||| ' || COALESCE(mg.title, ' ') || ' |||| ' || COALESCE(mg.description, ' ')) filter (where mg.image_url is not null) gallery,\n ARRAY_AGG(DISTINCT md.joining_platform_id || ' |||| ' || dp.short || ' |||| ' || dp.name || ' |||| ' || 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 statuses s ON s.id = m.status\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 INNER JOIN licenses l ON m.license = l.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 AND mc.is_additional = FALSE\n LEFT JOIN categories ca ON mc.joining_category_id = c.id AND mc.is_additional = TRUE\n LEFT JOIN versions v ON v.mod_id = m.id\n LEFT JOIN mods_gallery mg ON mg.mod_id = m.id\n WHERE m.id = $1\n GROUP BY pt.id, s.id, cs.id, ss.id, l.id, m.id;\n "
|
|
||||||
},
|
|
||||||
"8ced4b7a1c4f944b918d2d2eefc8007a3fb9565021ca8c44608caccbe1ab9674": {
|
"8ced4b7a1c4f944b918d2d2eefc8007a3fb9565021ca8c44608caccbe1ab9674": {
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
@@ -4407,236 +4401,6 @@
|
|||||||
},
|
},
|
||||||
"query": "\n DELETE FROM game_versions_versions gvv\n WHERE gvv.joining_version_id = $1\n "
|
"query": "\n DELETE FROM game_versions_versions gvv\n WHERE gvv.joining_version_id = $1\n "
|
||||||
},
|
},
|
||||||
"bee5860ccac3c22e1ce328cc4278c6f1586d45c1804332dc3a3e90c558bca144": {
|
|
||||||
"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": "body_url",
|
|
||||||
"ordinal": 8,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "published",
|
|
||||||
"ordinal": 9,
|
|
||||||
"type_info": "Timestamptz"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "updated",
|
|
||||||
"ordinal": 10,
|
|
||||||
"type_info": "Timestamptz"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "approved",
|
|
||||||
"ordinal": 11,
|
|
||||||
"type_info": "Timestamptz"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "status",
|
|
||||||
"ordinal": 12,
|
|
||||||
"type_info": "Int4"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"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": "Int4"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"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": "status_name",
|
|
||||||
"ordinal": 25,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "client_side_type",
|
|
||||||
"ordinal": 26,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "server_side_type",
|
|
||||||
"ordinal": 27,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "short",
|
|
||||||
"ordinal": 28,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "license_name",
|
|
||||||
"ordinal": 29,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "project_type_name",
|
|
||||||
"ordinal": 30,
|
|
||||||
"type_info": "Varchar"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "categories",
|
|
||||||
"ordinal": 31,
|
|
||||||
"type_info": "VarcharArray"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "additional_categories",
|
|
||||||
"ordinal": 32,
|
|
||||||
"type_info": "VarcharArray"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "versions",
|
|
||||||
"ordinal": 33,
|
|
||||||
"type_info": "TextArray"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "gallery",
|
|
||||||
"ordinal": 34,
|
|
||||||
"type_info": "TextArray"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "donations",
|
|
||||||
"ordinal": 35,
|
|
||||||
"type_info": "TextArray"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"nullable": [
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
true,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
false,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null,
|
|
||||||
null
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Int8Array"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"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.body_url body_url, m.published published,\n m.updated updated, m.approved approved, m.status 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 s.status status_name, cs.name client_side_type, ss.name server_side_type, l.short short, l.name license_name, pt.name project_type_name,\n ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null) categories,\n ARRAY_AGG(DISTINCT ca.category) filter (where ca.category is not null) additional_categories,\n ARRAY_AGG(DISTINCT v.id || ' |||| ' || v.date_published) filter (where v.id is not null) versions,\n ARRAY_AGG(DISTINCT mg.image_url || ' |||| ' || mg.featured || ' |||| ' || mg.created || ' |||| ' || COALESCE(mg.title, ' ') || ' |||| ' || COALESCE(mg.description, ' ')) filter (where mg.image_url is not null) gallery,\n ARRAY_AGG(DISTINCT md.joining_platform_id || ' |||| ' || dp.short || ' |||| ' || dp.name || ' |||| ' || 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 statuses s ON s.id = m.status\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 INNER JOIN licenses l ON m.license = l.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 AND mc.is_additional = FALSE\n LEFT JOIN categories ca ON mc.joining_category_id = c.id AND mc.is_additional = TRUE\n LEFT JOIN versions v ON v.mod_id = m.id\n LEFT JOIN mods_gallery mg ON mg.mod_id = m.id\n WHERE m.id = ANY($1)\n GROUP BY pt.id, s.id, cs.id, ss.id, l.id, m.id;\n "
|
|
||||||
},
|
|
||||||
"bf7f721664f5e0ed41adc41b5483037256635f28ff6c4e5d3cbcec4387f9c8ef": {
|
"bf7f721664f5e0ed41adc41b5483037256635f28ff6c4e5d3cbcec4387f9c8ef": {
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
@@ -4735,33 +4499,6 @@
|
|||||||
},
|
},
|
||||||
"query": "\n UPDATE versions\n SET version_type = $1\n WHERE (id = $2)\n "
|
"query": "\n UPDATE versions\n SET version_type = $1\n WHERE (id = $2)\n "
|
||||||
},
|
},
|
||||||
"c265db2e2cc1ba34ca1f30a9401018eb7760c8f0bafb1e3a7576e62bc9d3f83a": {
|
|
||||||
"describe": {
|
|
||||||
"columns": [
|
|
||||||
{
|
|
||||||
"name": "id",
|
|
||||||
"ordinal": 0,
|
|
||||||
"type_info": "Int8"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "mod_id",
|
|
||||||
"ordinal": 1,
|
|
||||||
"type_info": "Int8"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"nullable": [
|
|
||||||
false,
|
|
||||||
false
|
|
||||||
],
|
|
||||||
"parameters": {
|
|
||||||
"Left": [
|
|
||||||
"Text",
|
|
||||||
"Int8"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"query": "SELECT id, mod_id FROM versions\n WHERE (version_number = $1 AND mod_id = $2)"
|
|
||||||
},
|
|
||||||
"c3dcb5a8b798ea6c0922698a007dbc8ab549f5f85bad780da59163f4d6371238": {
|
"c3dcb5a8b798ea6c0922698a007dbc8ab549f5f85bad780da59163f4d6371238": {
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
@@ -4883,6 +4620,34 @@
|
|||||||
},
|
},
|
||||||
"query": "\n SELECT category FROM categories\n WHERE id = $1\n "
|
"query": "\n SELECT category FROM categories\n WHERE id = $1\n "
|
||||||
},
|
},
|
||||||
|
"c6830506451f89d8fa97c70a1edf723cedffae550e91dd0fa09fa04306fd56e8": {
|
||||||
|
"describe": {
|
||||||
|
"columns": [
|
||||||
|
{
|
||||||
|
"name": "id",
|
||||||
|
"ordinal": 0,
|
||||||
|
"type_info": "Int8"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "mod_id",
|
||||||
|
"ordinal": 1,
|
||||||
|
"type_info": "Int8"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"nullable": [
|
||||||
|
false,
|
||||||
|
false
|
||||||
|
],
|
||||||
|
"parameters": {
|
||||||
|
"Left": [
|
||||||
|
"Text",
|
||||||
|
"Int8",
|
||||||
|
"Int8"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"query": "SELECT id, mod_id FROM versions\n WHERE ((version_number = $1 OR id = $3) AND mod_id = $2)"
|
||||||
|
},
|
||||||
"c9d63ed46799db7c30a7e917d97a5d4b2b78b0234cce49e136fa57526b38c1ca": {
|
"c9d63ed46799db7c30a7e917d97a5d4b2b78b0234cce49e136fa57526b38c1ca": {
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
@@ -6052,6 +5817,230 @@
|
|||||||
},
|
},
|
||||||
"query": "\n SELECT name FROM project_types pt\n INNER JOIN mods ON mods.project_type = pt.id\n WHERE mods.id = $1\n "
|
"query": "\n SELECT name FROM project_types pt\n INNER JOIN mods ON mods.project_type = pt.id\n WHERE mods.id = $1\n "
|
||||||
},
|
},
|
||||||
|
"ef86b7759f479cb04d6aaf02688315bb5674e6eadade41cdd11947943356bea8": {
|
||||||
|
"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": "body_url",
|
||||||
|
"ordinal": 8,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "published",
|
||||||
|
"ordinal": 9,
|
||||||
|
"type_info": "Timestamptz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "updated",
|
||||||
|
"ordinal": 10,
|
||||||
|
"type_info": "Timestamptz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "approved",
|
||||||
|
"ordinal": 11,
|
||||||
|
"type_info": "Timestamptz"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "status",
|
||||||
|
"ordinal": 12,
|
||||||
|
"type_info": "Int4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": "Int4"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"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": "status_name",
|
||||||
|
"ordinal": 25,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "client_side_type",
|
||||||
|
"ordinal": 26,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "server_side_type",
|
||||||
|
"ordinal": 27,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "short",
|
||||||
|
"ordinal": 28,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "license_name",
|
||||||
|
"ordinal": 29,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "project_type_name",
|
||||||
|
"ordinal": 30,
|
||||||
|
"type_info": "Varchar"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "categories",
|
||||||
|
"ordinal": 31,
|
||||||
|
"type_info": "TextArray"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "versions",
|
||||||
|
"ordinal": 32,
|
||||||
|
"type_info": "TextArray"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "gallery",
|
||||||
|
"ordinal": 33,
|
||||||
|
"type_info": "TextArray"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "donations",
|
||||||
|
"ordinal": 34,
|
||||||
|
"type_info": "TextArray"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"nullable": [
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
true,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
false,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null,
|
||||||
|
null
|
||||||
|
],
|
||||||
|
"parameters": {
|
||||||
|
"Left": [
|
||||||
|
"Int8"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"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.body_url body_url, m.published published,\n m.updated updated, m.approved approved, m.status 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 s.status status_name, cs.name client_side_type, ss.name server_side_type, l.short short, l.name license_name, pt.name project_type_name,\n ARRAY_AGG(DISTINCT c.category || ' |||| ' || mc.is_additional) filter (where c.category is not null) categories,\n ARRAY_AGG(DISTINCT v.id || ' |||| ' || v.date_published) filter (where v.id is not null) versions,\n ARRAY_AGG(DISTINCT mg.image_url || ' |||| ' || mg.featured || ' |||| ' || mg.created || ' |||| ' || COALESCE(mg.title, ' ') || ' |||| ' || COALESCE(mg.description, ' ')) filter (where mg.image_url is not null) gallery,\n ARRAY_AGG(DISTINCT md.joining_platform_id || ' |||| ' || dp.short || ' |||| ' || dp.name || ' |||| ' || 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 statuses s ON s.id = m.status\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 INNER JOIN licenses l ON m.license = l.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\n LEFT JOIN mods_gallery mg ON mg.mod_id = m.id\n WHERE m.id = $1\n GROUP BY pt.id, s.id, cs.id, ss.id, l.id, m.id;\n "
|
||||||
|
},
|
||||||
"f0db9d8606ccc2196a9cfafe0e7090dab42bf790f25e0469b8947fac1cf043d5": {
|
"f0db9d8606ccc2196a9cfafe0e7090dab42bf790f25e0469b8947fac1cf043d5": {
|
||||||
"describe": {
|
"describe": {
|
||||||
"columns": [
|
"columns": [
|
||||||
|
|||||||
@@ -74,10 +74,9 @@ impl Category {
|
|||||||
where
|
where
|
||||||
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
||||||
{
|
{
|
||||||
if !name
|
if !name.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_')
|
}) {
|
||||||
{
|
|
||||||
return Err(DatabaseError::InvalidIdentifier(name.to_string()));
|
return Err(DatabaseError::InvalidIdentifier(name.to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -102,10 +101,9 @@ impl Category {
|
|||||||
where
|
where
|
||||||
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
||||||
{
|
{
|
||||||
if !name
|
if !name.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_')
|
}) {
|
||||||
{
|
|
||||||
return Err(DatabaseError::InvalidIdentifier(name.to_string()));
|
return Err(DatabaseError::InvalidIdentifier(name.to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -203,10 +201,9 @@ impl<'a> CategoryBuilder<'a> {
|
|||||||
self,
|
self,
|
||||||
name: &'a str,
|
name: &'a str,
|
||||||
) -> Result<CategoryBuilder<'a>, DatabaseError> {
|
) -> Result<CategoryBuilder<'a>, DatabaseError> {
|
||||||
if name
|
if name.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_')
|
}) {
|
||||||
{
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
name: Some(name),
|
name: Some(name),
|
||||||
..self
|
..self
|
||||||
@@ -296,10 +293,9 @@ impl Loader {
|
|||||||
where
|
where
|
||||||
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
||||||
{
|
{
|
||||||
if !name
|
if !name.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_')
|
}) {
|
||||||
{
|
|
||||||
return Err(DatabaseError::InvalidIdentifier(name.to_string()));
|
return Err(DatabaseError::InvalidIdentifier(name.to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -403,10 +399,9 @@ impl<'a> LoaderBuilder<'a> {
|
|||||||
self,
|
self,
|
||||||
name: &'a str,
|
name: &'a str,
|
||||||
) -> Result<LoaderBuilder<'a>, DatabaseError> {
|
) -> Result<LoaderBuilder<'a>, DatabaseError> {
|
||||||
if name
|
if name.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_')
|
}) {
|
||||||
{
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
name: Some(name),
|
name: Some(name),
|
||||||
..self
|
..self
|
||||||
@@ -501,10 +496,9 @@ impl GameVersion {
|
|||||||
where
|
where
|
||||||
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
||||||
{
|
{
|
||||||
if !version
|
if !version.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || "-_.".contains(c))
|
}) {
|
||||||
{
|
|
||||||
return Err(DatabaseError::InvalidIdentifier(version.to_string()));
|
return Err(DatabaseError::InvalidIdentifier(version.to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -676,7 +670,7 @@ impl<'a> GameVersionBuilder<'a> {
|
|||||||
) -> Result<GameVersionBuilder<'a>, DatabaseError> {
|
) -> Result<GameVersionBuilder<'a>, DatabaseError> {
|
||||||
if version
|
if version
|
||||||
.chars()
|
.chars()
|
||||||
.all(|c| c.is_ascii_alphanumeric() || "-_.".contains(c))
|
.all(|c| c.is_ascii_alphanumeric() || "-_.+".contains(c))
|
||||||
{
|
{
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
version: Some(version),
|
version: Some(version),
|
||||||
@@ -693,7 +687,7 @@ impl<'a> GameVersionBuilder<'a> {
|
|||||||
) -> Result<GameVersionBuilder<'a>, DatabaseError> {
|
) -> Result<GameVersionBuilder<'a>, DatabaseError> {
|
||||||
if version_type
|
if version_type
|
||||||
.chars()
|
.chars()
|
||||||
.all(|c| c.is_ascii_alphanumeric() || "-_.".contains(c))
|
.all(|c| c.is_ascii_alphanumeric() || "-_.+".contains(c))
|
||||||
{
|
{
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
version_type: Some(version_type),
|
version_type: Some(version_type),
|
||||||
@@ -851,10 +845,9 @@ impl<'a> LicenseBuilder<'a> {
|
|||||||
self,
|
self,
|
||||||
short: &'a str,
|
short: &'a str,
|
||||||
) -> Result<LicenseBuilder<'a>, DatabaseError> {
|
) -> Result<LicenseBuilder<'a>, DatabaseError> {
|
||||||
if short
|
if short.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || "-_.".contains(c))
|
}) {
|
||||||
{
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
short: Some(short),
|
short: Some(short),
|
||||||
..self
|
..self
|
||||||
@@ -1011,10 +1004,9 @@ impl<'a> DonationPlatformBuilder<'a> {
|
|||||||
self,
|
self,
|
||||||
short: &'a str,
|
short: &'a str,
|
||||||
) -> Result<DonationPlatformBuilder<'a>, DatabaseError> {
|
) -> Result<DonationPlatformBuilder<'a>, DatabaseError> {
|
||||||
if short
|
if short.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || "-_.".contains(c))
|
}) {
|
||||||
{
|
|
||||||
Ok(Self {
|
Ok(Self {
|
||||||
short: Some(short),
|
short: Some(short),
|
||||||
..self
|
..self
|
||||||
@@ -1075,10 +1067,9 @@ impl ReportType {
|
|||||||
where
|
where
|
||||||
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
||||||
{
|
{
|
||||||
if !name
|
if !name.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_')
|
}) {
|
||||||
{
|
|
||||||
return Err(DatabaseError::InvalidIdentifier(name.to_string()));
|
return Err(DatabaseError::InvalidIdentifier(name.to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1164,10 +1155,9 @@ impl<'a> ReportTypeBuilder<'a> {
|
|||||||
self,
|
self,
|
||||||
name: &'a str,
|
name: &'a str,
|
||||||
) -> Result<ReportTypeBuilder<'a>, DatabaseError> {
|
) -> Result<ReportTypeBuilder<'a>, DatabaseError> {
|
||||||
if name
|
if name.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_')
|
}) {
|
||||||
{
|
|
||||||
Ok(Self { name: Some(name) })
|
Ok(Self { name: Some(name) })
|
||||||
} else {
|
} else {
|
||||||
Err(DatabaseError::InvalidIdentifier(name.to_string()))
|
Err(DatabaseError::InvalidIdentifier(name.to_string()))
|
||||||
@@ -1213,10 +1203,9 @@ impl ProjectType {
|
|||||||
where
|
where
|
||||||
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
E: sqlx::Executor<'a, Database = sqlx::Postgres>,
|
||||||
{
|
{
|
||||||
if !name
|
if !name.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_')
|
}) {
|
||||||
{
|
|
||||||
return Err(DatabaseError::InvalidIdentifier(name.to_string()));
|
return Err(DatabaseError::InvalidIdentifier(name.to_string()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1330,10 +1319,9 @@ impl<'a> ProjectTypeBuilder<'a> {
|
|||||||
self,
|
self,
|
||||||
name: &'a str,
|
name: &'a str,
|
||||||
) -> Result<ProjectTypeBuilder<'a>, DatabaseError> {
|
) -> Result<ProjectTypeBuilder<'a>, DatabaseError> {
|
||||||
if name
|
if name.chars().all(|c| {
|
||||||
.chars()
|
c.is_ascii_alphanumeric() || c == '-' || c == '_' || c == '+'
|
||||||
.all(|c| c.is_ascii_alphanumeric() || c == '-' || c == '_')
|
}) {
|
||||||
{
|
|
||||||
Ok(Self { name: Some(name) })
|
Ok(Self { name: Some(name) })
|
||||||
} else {
|
} else {
|
||||||
Err(DatabaseError::InvalidIdentifier(name.to_string()))
|
Err(DatabaseError::InvalidIdentifier(name.to_string()))
|
||||||
|
|||||||
@@ -116,7 +116,7 @@ pub struct TeamId(pub i64);
|
|||||||
#[sqlx(transparent)]
|
#[sqlx(transparent)]
|
||||||
pub struct TeamMemberId(pub i64);
|
pub struct TeamMemberId(pub i64);
|
||||||
|
|
||||||
#[derive(Copy, Clone, Debug, Type, PartialEq)]
|
#[derive(Copy, Clone, Debug, Type, PartialEq, Eq)]
|
||||||
#[sqlx(transparent)]
|
#[sqlx(transparent)]
|
||||||
pub struct ProjectId(pub i64);
|
pub struct ProjectId(pub i64);
|
||||||
#[derive(Copy, Clone, Debug, Type)]
|
#[derive(Copy, Clone, Debug, Type)]
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ pub enum DatabaseError {
|
|||||||
RandomId,
|
RandomId,
|
||||||
#[error(
|
#[error(
|
||||||
"Invalid identifier: Category/version names must contain only ASCII \
|
"Invalid identifier: Category/version names must contain only ASCII \
|
||||||
alphanumeric characters or '_-'."
|
alphanumeric characters or '_-+'."
|
||||||
)]
|
)]
|
||||||
InvalidIdentifier(String),
|
InvalidIdentifier(String),
|
||||||
#[error("Invalid permissions bitflag!")]
|
#[error("Invalid permissions bitflag!")]
|
||||||
|
|||||||
@@ -629,8 +629,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.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,
|
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,
|
||||||
s.status status_name, cs.name client_side_type, ss.name server_side_type, l.short short, l.name license_name, pt.name project_type_name,
|
s.status status_name, cs.name client_side_type, ss.name server_side_type, l.short short, l.name license_name, pt.name project_type_name,
|
||||||
ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null) categories,
|
ARRAY_AGG(DISTINCT c.category || ' |||| ' || mc.is_additional) filter (where c.category is not null) categories,
|
||||||
ARRAY_AGG(DISTINCT ca.category) filter (where ca.category is not null) additional_categories,
|
|
||||||
ARRAY_AGG(DISTINCT v.id || ' |||| ' || v.date_published) filter (where v.id is not null) versions,
|
ARRAY_AGG(DISTINCT v.id || ' |||| ' || v.date_published) filter (where v.id is not null) versions,
|
||||||
ARRAY_AGG(DISTINCT mg.image_url || ' |||| ' || mg.featured || ' |||| ' || mg.created || ' |||| ' || COALESCE(mg.title, ' ') || ' |||| ' || COALESCE(mg.description, ' ')) filter (where mg.image_url is not null) gallery,
|
ARRAY_AGG(DISTINCT mg.image_url || ' |||| ' || mg.featured || ' |||| ' || mg.created || ' |||| ' || COALESCE(mg.title, ' ') || ' |||| ' || COALESCE(mg.description, ' ')) filter (where mg.image_url is not null) gallery,
|
||||||
ARRAY_AGG(DISTINCT md.joining_platform_id || ' |||| ' || dp.short || ' |||| ' || dp.name || ' |||| ' || md.url) filter (where md.joining_platform_id is not null) donations
|
ARRAY_AGG(DISTINCT md.joining_platform_id || ' |||| ' || dp.short || ' |||| ' || dp.name || ' |||| ' || md.url) filter (where md.joining_platform_id is not null) donations
|
||||||
@@ -643,8 +642,7 @@ impl Project {
|
|||||||
LEFT JOIN mods_donations md ON md.joining_mod_id = m.id
|
LEFT JOIN mods_donations md ON md.joining_mod_id = m.id
|
||||||
LEFT JOIN donation_platforms dp ON md.joining_platform_id = dp.id
|
LEFT JOIN donation_platforms dp ON md.joining_platform_id = dp.id
|
||||||
LEFT JOIN mods_categories mc ON mc.joining_mod_id = m.id
|
LEFT JOIN mods_categories mc ON mc.joining_mod_id = m.id
|
||||||
LEFT JOIN categories c ON mc.joining_category_id = c.id AND mc.is_additional = FALSE
|
LEFT JOIN categories c ON mc.joining_category_id = c.id
|
||||||
LEFT JOIN categories ca ON mc.joining_category_id = c.id AND mc.is_additional = TRUE
|
|
||||||
LEFT JOIN versions v ON v.mod_id = m.id
|
LEFT JOIN versions v ON v.mod_id = m.id
|
||||||
LEFT JOIN mods_gallery mg ON mg.mod_id = m.id
|
LEFT JOIN mods_gallery mg ON mg.mod_id = m.id
|
||||||
WHERE m.id = $1
|
WHERE m.id = $1
|
||||||
@@ -656,6 +654,23 @@ impl Project {
|
|||||||
.await?;
|
.await?;
|
||||||
|
|
||||||
if let Some(m) = result {
|
if let Some(m) = result {
|
||||||
|
let categories_raw = m.categories.unwrap_or_default();
|
||||||
|
|
||||||
|
let mut categories = Vec::new();
|
||||||
|
let mut additional_categories = Vec::new();
|
||||||
|
|
||||||
|
for category in categories_raw {
|
||||||
|
let category: Vec<&str> = category.split(" |||| ").collect();
|
||||||
|
|
||||||
|
if category.len() >= 2 {
|
||||||
|
if category[1].parse::<bool>().ok().unwrap_or_default() {
|
||||||
|
additional_categories.push(category[0].to_string());
|
||||||
|
} else {
|
||||||
|
categories.push(category[0].to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Ok(Some(QueryProject {
|
Ok(Some(QueryProject {
|
||||||
inner: Project {
|
inner: Project {
|
||||||
id: ProjectId(m.id),
|
id: ProjectId(m.id),
|
||||||
@@ -685,10 +700,8 @@ impl Project {
|
|||||||
approved: m.approved,
|
approved: m.approved,
|
||||||
},
|
},
|
||||||
project_type: m.project_type_name,
|
project_type: m.project_type_name,
|
||||||
categories: m.categories.unwrap_or_default(),
|
categories,
|
||||||
additional_categories: m
|
additional_categories,
|
||||||
.additional_categories
|
|
||||||
.unwrap_or_default(),
|
|
||||||
versions: {
|
versions: {
|
||||||
let versions = m.versions.unwrap_or_default();
|
let versions = m.versions.unwrap_or_default();
|
||||||
|
|
||||||
@@ -803,8 +816,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.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,
|
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,
|
||||||
s.status status_name, cs.name client_side_type, ss.name server_side_type, l.short short, l.name license_name, pt.name project_type_name,
|
s.status status_name, cs.name client_side_type, ss.name server_side_type, l.short short, l.name license_name, pt.name project_type_name,
|
||||||
ARRAY_AGG(DISTINCT c.category) filter (where c.category is not null) categories,
|
ARRAY_AGG(DISTINCT c.category || ' |||| ' || mc.is_additional) filter (where c.category is not null) categories,
|
||||||
ARRAY_AGG(DISTINCT ca.category) filter (where ca.category is not null) additional_categories,
|
|
||||||
ARRAY_AGG(DISTINCT v.id || ' |||| ' || v.date_published) filter (where v.id is not null) versions,
|
ARRAY_AGG(DISTINCT v.id || ' |||| ' || v.date_published) filter (where v.id is not null) versions,
|
||||||
ARRAY_AGG(DISTINCT mg.image_url || ' |||| ' || mg.featured || ' |||| ' || mg.created || ' |||| ' || COALESCE(mg.title, ' ') || ' |||| ' || COALESCE(mg.description, ' ')) filter (where mg.image_url is not null) gallery,
|
ARRAY_AGG(DISTINCT mg.image_url || ' |||| ' || mg.featured || ' |||| ' || mg.created || ' |||| ' || COALESCE(mg.title, ' ') || ' |||| ' || COALESCE(mg.description, ' ')) filter (where mg.image_url is not null) gallery,
|
||||||
ARRAY_AGG(DISTINCT md.joining_platform_id || ' |||| ' || dp.short || ' |||| ' || dp.name || ' |||| ' || md.url) filter (where md.joining_platform_id is not null) donations
|
ARRAY_AGG(DISTINCT md.joining_platform_id || ' |||| ' || dp.short || ' |||| ' || dp.name || ' |||| ' || md.url) filter (where md.joining_platform_id is not null) donations
|
||||||
@@ -817,8 +829,7 @@ impl Project {
|
|||||||
LEFT JOIN mods_donations md ON md.joining_mod_id = m.id
|
LEFT JOIN mods_donations md ON md.joining_mod_id = m.id
|
||||||
LEFT JOIN donation_platforms dp ON md.joining_platform_id = dp.id
|
LEFT JOIN donation_platforms dp ON md.joining_platform_id = dp.id
|
||||||
LEFT JOIN mods_categories mc ON mc.joining_mod_id = m.id
|
LEFT JOIN mods_categories mc ON mc.joining_mod_id = m.id
|
||||||
LEFT JOIN categories c ON mc.joining_category_id = c.id AND mc.is_additional = FALSE
|
LEFT JOIN categories c ON mc.joining_category_id = c.id
|
||||||
LEFT JOIN categories ca ON mc.joining_category_id = c.id AND mc.is_additional = TRUE
|
|
||||||
LEFT JOIN versions v ON v.mod_id = m.id
|
LEFT JOIN versions v ON v.mod_id = m.id
|
||||||
LEFT JOIN mods_gallery mg ON mg.mod_id = m.id
|
LEFT JOIN mods_gallery mg ON mg.mod_id = m.id
|
||||||
WHERE m.id = ANY($1)
|
WHERE m.id = ANY($1)
|
||||||
@@ -830,6 +841,25 @@ impl Project {
|
|||||||
.try_filter_map(|e| async {
|
.try_filter_map(|e| async {
|
||||||
Ok(e.right().map(|m| {
|
Ok(e.right().map(|m| {
|
||||||
let id = m.id;
|
let id = m.id;
|
||||||
|
|
||||||
|
let categories_raw = m.categories.unwrap_or_default();
|
||||||
|
|
||||||
|
let mut categories = Vec::new();
|
||||||
|
let mut additional_categories = Vec::new();
|
||||||
|
|
||||||
|
for category in categories_raw {
|
||||||
|
let category: Vec<&str> =
|
||||||
|
category.split(" |||| ").collect();
|
||||||
|
|
||||||
|
if category.len() >= 2 {
|
||||||
|
if category[1].parse::<bool>().ok().unwrap_or_default() {
|
||||||
|
additional_categories.push(category[0].to_string());
|
||||||
|
} else {
|
||||||
|
categories.push(category[0].to_string());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
QueryProject {
|
QueryProject {
|
||||||
inner: Project {
|
inner: Project {
|
||||||
id: ProjectId(id),
|
id: ProjectId(id),
|
||||||
@@ -859,8 +889,8 @@ impl Project {
|
|||||||
approved: m.approved
|
approved: m.approved
|
||||||
},
|
},
|
||||||
project_type: m.project_type_name,
|
project_type: m.project_type_name,
|
||||||
categories: m.categories.unwrap_or_default(),
|
categories,
|
||||||
additional_categories: m.additional_categories.unwrap_or_default(),
|
additional_categories,
|
||||||
versions: {
|
versions: {
|
||||||
let versions = m.versions.unwrap_or_default();
|
let versions = m.versions.unwrap_or_default();
|
||||||
|
|
||||||
|
|||||||
@@ -735,14 +735,14 @@ impl Version {
|
|||||||
|
|
||||||
if dependency.len() >= 4 {
|
if dependency.len() >= 4 {
|
||||||
Some(QueryDependency {
|
Some(QueryDependency {
|
||||||
project_id: match &*dependency[1] {
|
project_id: match dependency[1] {
|
||||||
"0" => None,
|
"0" => None,
|
||||||
_ => match dependency[1].parse() {
|
_ => match dependency[1].parse() {
|
||||||
Ok(x) => Some(ProjectId(x)),
|
Ok(x) => Some(ProjectId(x)),
|
||||||
Err(_) => None,
|
Err(_) => None,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
version_id: match &*dependency[0] {
|
version_id: match dependency[0] {
|
||||||
"0" => None,
|
"0" => None,
|
||||||
_ => match dependency[0].parse() {
|
_ => match dependency[0].parse() {
|
||||||
Ok(x) => Some(VersionId(x)),
|
Ok(x) => Some(VersionId(x)),
|
||||||
@@ -896,14 +896,14 @@ impl Version {
|
|||||||
|
|
||||||
if dependency.len() >= 4 {
|
if dependency.len() >= 4 {
|
||||||
Some(QueryDependency {
|
Some(QueryDependency {
|
||||||
project_id: match &*dependency[1] {
|
project_id: match dependency[1] {
|
||||||
"0" => None,
|
"0" => None,
|
||||||
_ => match dependency[1].parse() {
|
_ => match dependency[1].parse() {
|
||||||
Ok(x) => Some(ProjectId(x)),
|
Ok(x) => Some(ProjectId(x)),
|
||||||
Err(_) => None,
|
Err(_) => None,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
version_id: match &*dependency[0] {
|
version_id: match dependency[0] {
|
||||||
"0" => None,
|
"0" => None,
|
||||||
_ => match dependency[0].parse() {
|
_ => match dependency[0].parse() {
|
||||||
Ok(x) => Some(VersionId(x)),
|
Ok(x) => Some(VersionId(x)),
|
||||||
|
|||||||
@@ -219,7 +219,10 @@ pub struct License {
|
|||||||
pub struct DonationLink {
|
pub struct DonationLink {
|
||||||
pub id: String,
|
pub id: String,
|
||||||
pub platform: String,
|
pub platform: String,
|
||||||
#[validate(url)]
|
#[validate(
|
||||||
|
custom(function = "crate::util::validate::validate_url"),
|
||||||
|
length(max = 2048)
|
||||||
|
)]
|
||||||
pub url: String,
|
pub url: String,
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -482,7 +485,7 @@ impl DependencyType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// A specific version of Minecraft
|
/// A specific version of Minecraft
|
||||||
#[derive(Serialize, Deserialize, Clone, PartialEq)]
|
#[derive(Serialize, Deserialize, Clone, PartialEq, Eq)]
|
||||||
#[serde(transparent)]
|
#[serde(transparent)]
|
||||||
pub struct GameVersion(pub String);
|
pub struct GameVersion(pub String);
|
||||||
|
|
||||||
|
|||||||
@@ -25,11 +25,18 @@ pub async fn count_download(
|
|||||||
let project_id: crate::database::models::ids::ProjectId =
|
let project_id: crate::database::models::ids::ProjectId =
|
||||||
download_body.hash.into();
|
download_body.hash.into();
|
||||||
|
|
||||||
|
let id_option = crate::models::ids::base62_impl::parse_base62(
|
||||||
|
&download_body.version_name,
|
||||||
|
)
|
||||||
|
.ok()
|
||||||
|
.map(|x| x as i64);
|
||||||
|
|
||||||
let (version_id, project_id) = if let Some(version) = sqlx::query!(
|
let (version_id, project_id) = if let Some(version) = sqlx::query!(
|
||||||
"SELECT id, mod_id FROM versions
|
"SELECT id, mod_id FROM versions
|
||||||
WHERE (version_number = $1 AND mod_id = $2)",
|
WHERE ((version_number = $1 OR id = $3) AND mod_id = $2)",
|
||||||
download_body.version_name,
|
download_body.version_name,
|
||||||
project_id as crate::database::models::ids::ProjectId
|
project_id as crate::database::models::ids::ProjectId,
|
||||||
|
id_option
|
||||||
)
|
)
|
||||||
.fetch_optional(pool.as_ref())
|
.fetch_optional(pool.as_ref())
|
||||||
.await?
|
.await?
|
||||||
|
|||||||
@@ -118,7 +118,7 @@ pub async fn maven_metadata(
|
|||||||
.last()
|
.last()
|
||||||
.unwrap_or(&"release".to_string())
|
.unwrap_or(&"release".to_string())
|
||||||
.to_string(),
|
.to_string(),
|
||||||
release: latest_release.unwrap_or_default().to_string(),
|
release: latest_release.unwrap_or_default(),
|
||||||
versions: Versions {
|
versions: Versions {
|
||||||
versions: new_versions,
|
versions: new_versions,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -170,19 +170,34 @@ struct ProjectCreateData {
|
|||||||
/// A list of the categories that the project is in.
|
/// A list of the categories that the project is in.
|
||||||
pub additional_categories: Vec<String>,
|
pub additional_categories: Vec<String>,
|
||||||
|
|
||||||
#[validate(url, length(max = 2048))]
|
#[validate(
|
||||||
|
custom(function = "crate::util::validate::validate_url"),
|
||||||
|
length(max = 2048)
|
||||||
|
)]
|
||||||
/// An optional link to where to submit bugs or issues with the project.
|
/// An optional link to where to submit bugs or issues with the project.
|
||||||
pub issues_url: Option<String>,
|
pub issues_url: Option<String>,
|
||||||
#[validate(url, length(max = 2048))]
|
#[validate(
|
||||||
|
custom(function = "crate::util::validate::validate_url"),
|
||||||
|
length(max = 2048)
|
||||||
|
)]
|
||||||
/// An optional link to the source code for the project.
|
/// An optional link to the source code for the project.
|
||||||
pub source_url: Option<String>,
|
pub source_url: Option<String>,
|
||||||
#[validate(url, length(max = 2048))]
|
#[validate(
|
||||||
|
custom(function = "crate::util::validate::validate_url"),
|
||||||
|
length(max = 2048)
|
||||||
|
)]
|
||||||
/// An optional link to the project's wiki page or other relevant information.
|
/// An optional link to the project's wiki page or other relevant information.
|
||||||
pub wiki_url: Option<String>,
|
pub wiki_url: Option<String>,
|
||||||
#[validate(url, length(max = 2048))]
|
#[validate(
|
||||||
|
custom(function = "crate::util::validate::validate_url"),
|
||||||
|
length(max = 2048)
|
||||||
|
)]
|
||||||
/// An optional link to the project's license page
|
/// An optional link to the project's license page
|
||||||
pub license_url: Option<String>,
|
pub license_url: Option<String>,
|
||||||
#[validate(url, length(max = 2048))]
|
#[validate(
|
||||||
|
custom(function = "crate::util::validate::validate_url"),
|
||||||
|
length(max = 2048)
|
||||||
|
)]
|
||||||
/// An optional link to the project's discord.
|
/// An optional link to the project's discord.
|
||||||
pub discord_url: Option<String>,
|
pub discord_url: Option<String>,
|
||||||
/// An optional list of all donation links the project has\
|
/// An optional list of all donation links the project has\
|
||||||
@@ -550,7 +565,7 @@ pub async fn project_create_inner(
|
|||||||
&cdn_url,
|
&cdn_url,
|
||||||
&content_disposition,
|
&content_disposition,
|
||||||
project_id,
|
project_id,
|
||||||
&version_data.version_number,
|
created_version.version_id.into(),
|
||||||
&*project_create_data.project_type,
|
&*project_create_data.project_type,
|
||||||
version_data.loaders.clone(),
|
version_data.loaders.clone(),
|
||||||
version_data.game_versions.clone(),
|
version_data.game_versions.clone(),
|
||||||
|
|||||||
@@ -266,35 +266,50 @@ pub struct EditProject {
|
|||||||
skip_serializing_if = "Option::is_none",
|
skip_serializing_if = "Option::is_none",
|
||||||
with = "::serde_with::rust::double_option"
|
with = "::serde_with::rust::double_option"
|
||||||
)]
|
)]
|
||||||
#[validate(url, length(max = 2048))]
|
#[validate(
|
||||||
|
custom(function = "crate::util::validate::validate_url"),
|
||||||
|
length(max = 2048)
|
||||||
|
)]
|
||||||
pub issues_url: Option<Option<String>>,
|
pub issues_url: Option<Option<String>>,
|
||||||
#[serde(
|
#[serde(
|
||||||
default,
|
default,
|
||||||
skip_serializing_if = "Option::is_none",
|
skip_serializing_if = "Option::is_none",
|
||||||
with = "::serde_with::rust::double_option"
|
with = "::serde_with::rust::double_option"
|
||||||
)]
|
)]
|
||||||
#[validate(url, length(max = 2048))]
|
#[validate(
|
||||||
|
custom(function = "crate::util::validate::validate_url"),
|
||||||
|
length(max = 2048)
|
||||||
|
)]
|
||||||
pub source_url: Option<Option<String>>,
|
pub source_url: Option<Option<String>>,
|
||||||
#[serde(
|
#[serde(
|
||||||
default,
|
default,
|
||||||
skip_serializing_if = "Option::is_none",
|
skip_serializing_if = "Option::is_none",
|
||||||
with = "::serde_with::rust::double_option"
|
with = "::serde_with::rust::double_option"
|
||||||
)]
|
)]
|
||||||
#[validate(url, length(max = 2048))]
|
#[validate(
|
||||||
|
custom(function = "crate::util::validate::validate_url"),
|
||||||
|
length(max = 2048)
|
||||||
|
)]
|
||||||
pub wiki_url: Option<Option<String>>,
|
pub wiki_url: Option<Option<String>>,
|
||||||
#[serde(
|
#[serde(
|
||||||
default,
|
default,
|
||||||
skip_serializing_if = "Option::is_none",
|
skip_serializing_if = "Option::is_none",
|
||||||
with = "::serde_with::rust::double_option"
|
with = "::serde_with::rust::double_option"
|
||||||
)]
|
)]
|
||||||
#[validate(url, length(max = 2048))]
|
#[validate(
|
||||||
|
custom(function = "crate::util::validate::validate_url"),
|
||||||
|
length(max = 2048)
|
||||||
|
)]
|
||||||
pub license_url: Option<Option<String>>,
|
pub license_url: Option<Option<String>>,
|
||||||
#[serde(
|
#[serde(
|
||||||
default,
|
default,
|
||||||
skip_serializing_if = "Option::is_none",
|
skip_serializing_if = "Option::is_none",
|
||||||
with = "::serde_with::rust::double_option"
|
with = "::serde_with::rust::double_option"
|
||||||
)]
|
)]
|
||||||
#[validate(url, length(max = 2048))]
|
#[validate(
|
||||||
|
custom(function = "crate::util::validate::validate_url"),
|
||||||
|
length(max = 2048)
|
||||||
|
)]
|
||||||
pub discord_url: Option<Option<String>>,
|
pub discord_url: Option<Option<String>>,
|
||||||
#[validate]
|
#[validate]
|
||||||
pub donation_urls: Option<Vec<DonationLink>>,
|
pub donation_urls: Option<Vec<DonationLink>>,
|
||||||
|
|||||||
@@ -302,7 +302,7 @@ async fn version_create_inner(
|
|||||||
&cdn_url,
|
&cdn_url,
|
||||||
&content_disposition,
|
&content_disposition,
|
||||||
version.project_id.into(),
|
version.project_id.into(),
|
||||||
&version.version_number,
|
version.version_id.into(),
|
||||||
&*project_type,
|
&*project_type,
|
||||||
version_data.loaders,
|
version_data.loaders,
|
||||||
version_data.game_versions,
|
version_data.game_versions,
|
||||||
@@ -520,7 +520,6 @@ async fn upload_file_to_version_inner(
|
|||||||
}
|
}
|
||||||
|
|
||||||
let project_id = ProjectId(version.project_id.0 as u64);
|
let project_id = ProjectId(version.project_id.0 as u64);
|
||||||
let version_number = version.version_number;
|
|
||||||
|
|
||||||
let project_type = sqlx::query!(
|
let project_type = sqlx::query!(
|
||||||
"
|
"
|
||||||
@@ -567,7 +566,7 @@ async fn upload_file_to_version_inner(
|
|||||||
let mut dependencies = version
|
let mut dependencies = version
|
||||||
.dependencies
|
.dependencies
|
||||||
.iter()
|
.iter()
|
||||||
.map(|x| models::version_item::DependencyBuilder {
|
.map(|x| DependencyBuilder {
|
||||||
project_id: x.project_id,
|
project_id: x.project_id,
|
||||||
version_id: x.version_id,
|
version_id: x.version_id,
|
||||||
file_name: None,
|
file_name: None,
|
||||||
@@ -584,7 +583,7 @@ async fn upload_file_to_version_inner(
|
|||||||
&cdn_url,
|
&cdn_url,
|
||||||
&content_disposition,
|
&content_disposition,
|
||||||
project_id,
|
project_id,
|
||||||
&version_number,
|
version_id.into(),
|
||||||
&*project_type,
|
&*project_type,
|
||||||
version.loaders.clone().into_iter().map(Loader).collect(),
|
version.loaders.clone().into_iter().map(Loader).collect(),
|
||||||
version
|
version
|
||||||
@@ -626,7 +625,7 @@ pub async fn upload_file(
|
|||||||
cdn_url: &str,
|
cdn_url: &str,
|
||||||
content_disposition: &actix_web::http::header::ContentDisposition,
|
content_disposition: &actix_web::http::header::ContentDisposition,
|
||||||
project_id: ProjectId,
|
project_id: ProjectId,
|
||||||
version_number: &str,
|
version_id: VersionId,
|
||||||
project_type: &str,
|
project_type: &str,
|
||||||
loaders: Vec<Loader>,
|
loaders: Vec<Loader>,
|
||||||
game_versions: Vec<GameVersion>,
|
game_versions: Vec<GameVersion>,
|
||||||
@@ -748,13 +747,11 @@ pub async fn upload_file(
|
|||||||
let file_path_encode = format!(
|
let file_path_encode = format!(
|
||||||
"data/{}/versions/{}/{}",
|
"data/{}/versions/{}/{}",
|
||||||
project_id,
|
project_id,
|
||||||
version_number,
|
version_id,
|
||||||
urlencoding::encode(file_name)
|
urlencoding::encode(file_name)
|
||||||
);
|
);
|
||||||
let file_path = format!(
|
let file_path =
|
||||||
"data/{}/versions/{}/{}",
|
format!("data/{}/versions/{}/{}", project_id, version_id, &file_name);
|
||||||
project_id, version_number, &file_name
|
|
||||||
);
|
|
||||||
|
|
||||||
let upload_data = file_host
|
let upload_data = file_host
|
||||||
.upload_file(content_type, &file_path, data.freeze())
|
.upload_file(content_type, &file_path, data.freeze())
|
||||||
|
|||||||
@@ -8,6 +8,7 @@ use meilisearch_sdk::document::Document;
|
|||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
use std::borrow::Cow;
|
use std::borrow::Cow;
|
||||||
use std::cmp::min;
|
use std::cmp::min;
|
||||||
|
use std::fmt::Write;
|
||||||
use thiserror::Error;
|
use thiserror::Error;
|
||||||
|
|
||||||
pub mod indexing;
|
pub mod indexing;
|
||||||
@@ -20,6 +21,8 @@ pub enum SearchError {
|
|||||||
Serde(#[from] serde_json::Error),
|
Serde(#[from] serde_json::Error),
|
||||||
#[error("Error while parsing an integer: {0}")]
|
#[error("Error while parsing an integer: {0}")]
|
||||||
IntParsing(#[from] std::num::ParseIntError),
|
IntParsing(#[from] std::num::ParseIntError),
|
||||||
|
#[error("Error while formatting strings: {0}")]
|
||||||
|
FormatError(#[from] std::fmt::Error),
|
||||||
#[error("Environment Error")]
|
#[error("Environment Error")]
|
||||||
Env(#[from] dotenv::Error),
|
Env(#[from] dotenv::Error),
|
||||||
#[error("Invalid index to sort by: {0}")]
|
#[error("Invalid index to sort by: {0}")]
|
||||||
@@ -34,6 +37,7 @@ impl actix_web::ResponseError for SearchError {
|
|||||||
SearchError::Serde(..) => StatusCode::BAD_REQUEST,
|
SearchError::Serde(..) => StatusCode::BAD_REQUEST,
|
||||||
SearchError::IntParsing(..) => StatusCode::BAD_REQUEST,
|
SearchError::IntParsing(..) => StatusCode::BAD_REQUEST,
|
||||||
SearchError::InvalidIndex(..) => StatusCode::BAD_REQUEST,
|
SearchError::InvalidIndex(..) => StatusCode::BAD_REQUEST,
|
||||||
|
SearchError::FormatError(..) => StatusCode::BAD_REQUEST,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -45,6 +49,7 @@ impl actix_web::ResponseError for SearchError {
|
|||||||
SearchError::Serde(..) => "invalid_input",
|
SearchError::Serde(..) => "invalid_input",
|
||||||
SearchError::IntParsing(..) => "invalid_input",
|
SearchError::IntParsing(..) => "invalid_input",
|
||||||
SearchError::InvalidIndex(..) => "invalid_input",
|
SearchError::InvalidIndex(..) => "invalid_input",
|
||||||
|
SearchError::FormatError(..) => "invalid_input",
|
||||||
},
|
},
|
||||||
description: &self.to_string(),
|
description: &self.to_string(),
|
||||||
})
|
})
|
||||||
@@ -215,7 +220,7 @@ pub async fn search_for_project(
|
|||||||
filter_string.push(')');
|
filter_string.push(')');
|
||||||
|
|
||||||
if !filters.is_empty() {
|
if !filters.is_empty() {
|
||||||
filter_string.push_str(&format!(" AND ({})", filter_string))
|
write!(filter_string, " AND ({})", filters)?;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
filter_string.push_str(&*filters);
|
filter_string.push_str(&*filters);
|
||||||
|
|||||||
@@ -88,3 +88,15 @@ pub fn validate_deps(
|
|||||||
|
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn validate_url(value: &String) -> Result<(), validator::ValidationError> {
|
||||||
|
let url = url::Url::parse(value)
|
||||||
|
.ok()
|
||||||
|
.ok_or_else(|| validator::ValidationError::new("invalid URL"))?;
|
||||||
|
|
||||||
|
if url.scheme() != "https" {
|
||||||
|
return Err(validator::ValidationError::new("URL must be https"));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ok(())
|
||||||
|
}
|
||||||
|
|||||||
@@ -27,11 +27,11 @@ impl super::Validator for BukkitValidator {
|
|||||||
&self,
|
&self,
|
||||||
archive: &mut ZipArchive<Cursor<bytes::Bytes>>,
|
archive: &mut ZipArchive<Cursor<bytes::Bytes>>,
|
||||||
) -> Result<ValidationResult, ValidationError> {
|
) -> Result<ValidationResult, ValidationError> {
|
||||||
archive.by_name("plugin.yml").map_err(|_| {
|
if archive.by_name("plugin.yml").is_err() {
|
||||||
ValidationError::InvalidInput(
|
return Ok(ValidationResult::Warning(
|
||||||
"No plugin.yml present for plugin file.".into(),
|
"No plugin.yml present for plugin file.",
|
||||||
)
|
));
|
||||||
})?;
|
}
|
||||||
|
|
||||||
Ok(ValidationResult::Pass)
|
Ok(ValidationResult::Pass)
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user