feat: use sea-orm migrations

This commit is contained in:
Suiranoil
2023-07-04 15:47:17 +03:00
parent 5cfcf7f454
commit a177b99cd3
14 changed files with 982 additions and 116 deletions

4
.gitignore vendored
View File

@@ -1,6 +1,4 @@
# Intellij Idea
.idea
mixer_discord_bot.iml
.env
# VSCode
.vscode

504
Cargo.lock generated
View File

@@ -14,6 +14,15 @@ version = "0.1.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c71b1793ee61086797f5c80b6efa2b8ffa6d5dd703f118545808a7f2e27f7046"
[[package]]
name = "addr2line"
version = "0.20.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f4fa78e18c64fce05e902adecd7a5eed15a5e0a3439f7b0e169f0252214865e3"
dependencies = [
"gimli",
]
[[package]]
name = "adler"
version = "1.0.2"
@@ -67,6 +76,113 @@ version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8da52d66c7071e2e3fa2a1e5c6d088fec47b593032b254f5e980de8ea54454d6"
[[package]]
name = "async-attributes"
version = "1.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3203e79f4dd9bdda415ed03cf14dae5a2bf775c683a00f94e9cd1faf0f596e5"
dependencies = [
"quote",
"syn 1.0.109",
]
[[package]]
name = "async-channel"
version = "1.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf46fee83e5ccffc220104713af3292ff9bc7c64c7de289f66dae8e38d826833"
dependencies = [
"concurrent-queue",
"event-listener",
"futures-core",
]
[[package]]
name = "async-executor"
version = "1.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6fa3dc5f2a8564f07759c008b9109dc0d39de92a88d5588b8a5036d286383afb"
dependencies = [
"async-lock",
"async-task",
"concurrent-queue",
"fastrand",
"futures-lite",
"slab",
]
[[package]]
name = "async-global-executor"
version = "2.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f1b6f5d7df27bd294849f8eec66ecfc63d11814df7a4f5d74168a2394467b776"
dependencies = [
"async-channel",
"async-executor",
"async-io",
"async-lock",
"blocking",
"futures-lite",
"once_cell",
"tokio",
]
[[package]]
name = "async-io"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fc5b45d93ef0529756f812ca52e44c221b35341892d3dcc34132ac02f3dd2af"
dependencies = [
"async-lock",
"autocfg",
"cfg-if",
"concurrent-queue",
"futures-lite",
"log",
"parking",
"polling",
"rustix",
"slab",
"socket2",
"waker-fn",
]
[[package]]
name = "async-lock"
version = "2.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fa24f727524730b077666307f2734b4a1a1c57acb79193127dcc8914d5242dd7"
dependencies = [
"event-listener",
]
[[package]]
name = "async-std"
version = "1.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62565bb4402e926b29953c785397c6dc0391b7b446e45008b0049eb43cec6f5d"
dependencies = [
"async-attributes",
"async-channel",
"async-global-executor",
"async-io",
"async-lock",
"crossbeam-utils",
"futures-channel",
"futures-core",
"futures-io",
"futures-lite",
"gloo-timers",
"kv-log-macro",
"log",
"memchr",
"once_cell",
"pin-project-lite",
"pin-utils",
"slab",
"wasm-bindgen-futures",
]
[[package]]
name = "async-stream"
version = "0.3.4"
@@ -89,6 +205,12 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "async-task"
version = "4.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ecc7ab41815b3c653ccd2978ec3255c81349336702dfdf62ee6f7069b12a3aae"
[[package]]
name = "async-trait"
version = "0.1.68"
@@ -125,6 +247,12 @@ dependencies = [
"num-traits",
]
[[package]]
name = "atomic-waker"
version = "1.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1181e1e0d1fce796a03db1ae795d67167da795f9cf4a39c37589e85ef57f26d3"
[[package]]
name = "autocfg"
version = "1.1.0"
@@ -176,6 +304,21 @@ dependencies = [
"tower-service",
]
[[package]]
name = "backtrace"
version = "0.3.68"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4319208da049c43661739c5fade2ba182f09d1dc2299b32298d3a31692b17e12"
dependencies = [
"addr2line",
"cc",
"cfg-if",
"libc",
"miniz_oxide 0.7.1",
"object",
"rustc-demangle",
]
[[package]]
name = "bae"
version = "0.1.7"
@@ -233,6 +376,21 @@ dependencies = [
"generic-array",
]
[[package]]
name = "blocking"
version = "1.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "77231a1c8f801696fc0123ec6150ce92cffb8e164a02afb9c8ddee0e9b65ad65"
dependencies = [
"async-channel",
"async-lock",
"async-task",
"atomic-waker",
"fastrand",
"futures-lite",
"log",
]
[[package]]
name = "borsh"
version = "0.10.3"
@@ -349,6 +507,42 @@ dependencies = [
"winapi",
]
[[package]]
name = "clap"
version = "3.2.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ea181bf566f71cb9a5d17a59e1871af638180a18fb0035c92ae62b705207123"
dependencies = [
"bitflags",
"clap_derive",
"clap_lex",
"indexmap",
"once_cell",
"textwrap",
]
[[package]]
name = "clap_derive"
version = "3.2.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ae6371b8bdc8b7d3959e9cf7b22d4435ef3e79e138688421ec654acf8c81b008"
dependencies = [
"heck 0.4.1",
"proc-macro-error",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "clap_lex"
version = "0.2.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2850f2f5a82cbf437dd5af4d49848fbdfc27c157c3d010345776f952765261c5"
dependencies = [
"os_str_bytes",
]
[[package]]
name = "codespan-reporting"
version = "0.11.1"
@@ -365,6 +559,15 @@ version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3d7b894f5411737b7867f4827955924d7c254fc9f4d91a6aad6b097804b1018b"
[[package]]
name = "concurrent-queue"
version = "2.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "62ec6771ecfa0762d24683ee5a32ad78487a3d3afdc0fb8cae19d2c5deb50b7c"
dependencies = [
"crossbeam-utils",
]
[[package]]
name = "conv"
version = "0.3.3"
@@ -482,6 +685,16 @@ dependencies = [
"typenum",
]
[[package]]
name = "ctor"
version = "0.1.26"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6d2301688392eb071b0bf1a37be05c469d3cc4dbbd95df672fe28ab021e6a096"
dependencies = [
"quote",
"syn 1.0.109",
]
[[package]]
name = "custom_derive"
version = "0.1.7"
@@ -604,6 +817,34 @@ dependencies = [
"cfg-if",
]
[[package]]
name = "entity"
version = "0.1.0"
dependencies = [
"sea-orm",
]
[[package]]
name = "errno"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4bcfec3a70f97c962c307b2d2c56e358cf1d00b558d74262b5f929ee8cc7e73a"
dependencies = [
"errno-dragonfly",
"libc",
"windows-sys 0.48.0",
]
[[package]]
name = "errno-dragonfly"
version = "0.1.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa68f1b12764fab894d2755d2518754e71b4fd80ecfb822714a1206c2aab39bf"
dependencies = [
"cc",
"libc",
]
[[package]]
name = "event-listener"
version = "2.5.3"
@@ -626,6 +867,15 @@ dependencies = [
"zune-inflate",
]
[[package]]
name = "fastrand"
version = "1.9.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e51093e27b0797c359783294ca4f0a911c270184cb10f85783b118614a1501be"
dependencies = [
"instant",
]
[[package]]
name = "fdeflate"
version = "0.3.0"
@@ -737,6 +987,21 @@ version = "0.3.27"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "89d422fa3cbe3b40dca574ab087abb5bc98258ea57eea3fd6f1fa7162c778b91"
[[package]]
name = "futures-lite"
version = "1.13.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49a9d51ce47660b1e808d3c990b4709f2f415d928835a17dfd16991515c46bce"
dependencies = [
"fastrand",
"futures-core",
"futures-io",
"memchr",
"parking",
"pin-project-lite",
"waker-fn",
]
[[package]]
name = "futures-macro"
version = "0.3.27"
@@ -822,6 +1087,24 @@ dependencies = [
"weezl",
]
[[package]]
name = "gimli"
version = "0.27.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6c80984affa11d98d1b88b66ac8853f143217b399d3c74116778ff8fdb4ed2e"
[[package]]
name = "gloo-timers"
version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b995a66bb87bebce9a0f4a95aed01daca4872c050bfcb21653361c03bc35e5c"
dependencies = [
"futures-channel",
"futures-core",
"js-sys",
"wasm-bindgen",
]
[[package]]
name = "h2"
version = "0.3.16"
@@ -920,6 +1203,12 @@ dependencies = [
"libc",
]
[[package]]
name = "hermit-abi"
version = "0.3.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "fed44880c466736ef9a5c5b5facefb5ed0785676d0c02d612db14e54f0d84286"
[[package]]
name = "hex"
version = "0.4.3"
@@ -946,11 +1235,11 @@ dependencies = [
[[package]]
name = "home"
version = "0.5.4"
version = "0.5.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "747309b4b440c06d57b0b25f2aee03ee9b5e5397d288c60e21fc709bb98a7408"
checksum = "5444c27eef6923071f7ebcc33e3444508466a76f7a2b93da00ed6e19f30c1ddb"
dependencies = [
"winapi",
"windows-sys 0.48.0",
]
[[package]]
@@ -1114,7 +1403,7 @@ dependencies = [
"approx",
"conv",
"image",
"itertools",
"itertools 0.10.5",
"nalgebra",
"num",
"rand 0.7.3",
@@ -1142,6 +1431,17 @@ dependencies = [
"cfg-if",
]
[[package]]
name = "io-lifetimes"
version = "1.0.11"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eae7b9aee968036d54dce06cebaefd919e4472e753296daccd6d344e3e2df0c2"
dependencies = [
"hermit-abi 0.3.1",
"libc",
"windows-sys 0.48.0",
]
[[package]]
name = "ipnet"
version = "2.7.2"
@@ -1157,6 +1457,15 @@ dependencies = [
"either",
]
[[package]]
name = "itertools"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b1c173a5686ce8bfa551b3563d0c2170bf24ca44da99c7ca4bfdab5418c3fe57"
dependencies = [
"either",
]
[[package]]
name = "itoa"
version = "1.0.6"
@@ -1195,6 +1504,15 @@ dependencies = [
"simple_asn1",
]
[[package]]
name = "kv-log-macro"
version = "1.0.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0de8b303297635ad57c9f5059fd9cee7a47f8e8daa09df0fcd07dd39fb22977f"
dependencies = [
"log",
]
[[package]]
name = "lazy_static"
version = "1.4.0"
@@ -1209,9 +1527,9 @@ checksum = "03087c2bad5e1034e8cace5926dec053fb3790248370865f5117a7d0213354c8"
[[package]]
name = "libc"
version = "0.2.141"
version = "0.2.147"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3304a64d199bb964be99741b7a14d26972741915b3649639149b2479bb46f4b5"
checksum = "b4668fb0ea861c1df094127ac5f1da3409a82116a4ba74fca2e58ef927159bb3"
[[package]]
name = "link-cplusplus"
@@ -1228,6 +1546,12 @@ version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0717cef1bc8b636c6e1c1bbdefc09e6322da8a9321966e8928ef80d20f7f770f"
[[package]]
name = "linux-raw-sys"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ef53942eb7bf7ff43a617b3e2c1c4a5ecf5944a7c1bc12d7ee39bbb15e5c1519"
[[package]]
name = "lock_api"
version = "0.4.9"
@@ -1245,6 +1569,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "abb12e687cfb44aa40f41fc3978ef76448f9b6038cad6aef4259d3c095a2382e"
dependencies = [
"cfg-if",
"value-bag",
]
[[package]]
@@ -1295,6 +1620,14 @@ dependencies = [
"autocfg",
]
[[package]]
name = "migration"
version = "0.1.0"
dependencies = [
"async-std",
"sea-orm-migration",
]
[[package]]
name = "mime"
version = "0.3.17"
@@ -1354,7 +1687,8 @@ version = "0.1.0"
dependencies = [
"image",
"imageproc",
"itertools",
"itertools 0.11.0",
"migration",
"rusttype",
"sea-orm",
"serenity",
@@ -1493,10 +1827,19 @@ version = "1.15.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0fac9e2da13b5eb447a6ce3d392f23a29d8694bff781bf03a16cd9ac8697593b"
dependencies = [
"hermit-abi",
"hermit-abi 0.2.6",
"libc",
]
[[package]]
name = "object"
version = "0.31.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8bda667d9f2b5051b8833f59f3bf748b28ef54f850f4fcb389a252aa383866d1"
dependencies = [
"memchr",
]
[[package]]
name = "once_cell"
version = "1.17.1"
@@ -1603,6 +1946,12 @@ dependencies = [
"num-traits",
]
[[package]]
name = "os_str_bytes"
version = "6.5.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4d5d9eb14b174ee9aa2ef96dc2b94637a2d4b6e7cb873c7e171f0c20c6cf3eac"
[[package]]
name = "ouroboros"
version = "0.15.6"
@@ -1641,6 +1990,12 @@ dependencies = [
"ttf-parser",
]
[[package]]
name = "parking"
version = "2.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "14f2252c834a40ed9bb5422029649578e63aa341ac401f74e719dd1afda8394e"
[[package]]
name = "parking_lot"
version = "0.11.2"
@@ -1755,6 +2110,22 @@ dependencies = [
"miniz_oxide 0.7.1",
]
[[package]]
name = "polling"
version = "2.8.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4b2d323e8ca7996b3e23126511a523f7e62924d93ecd5ae73b333815b0eb3dce"
dependencies = [
"autocfg",
"bitflags",
"cfg-if",
"concurrent-queue",
"libc",
"log",
"pin-project-lite",
"windows-sys 0.48.0",
]
[[package]]
name = "ppv-lite86"
version = "0.2.17"
@@ -1820,7 +2191,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4ea9b0f8cbe5e15a8a042d030bd96668db28ecb567ec37d691971ff5731d2b1b"
dependencies = [
"anyhow",
"itertools",
"itertools 0.10.5",
"proc-macro2",
"quote",
"syn 1.0.109",
@@ -2156,12 +2527,32 @@ dependencies = [
"serde_json",
]
[[package]]
name = "rustc-demangle"
version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]]
name = "rustc-hash"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "08d43f7aa6b08d49f382cde6a7982047c3426db949b1424bc4b7ec9ae12c6ce2"
[[package]]
name = "rustix"
version = "0.37.22"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8818fa822adcc98b18fedbb3632a6a33213c070556b5aa7c4c8cc21cff565c4c"
dependencies = [
"bitflags",
"errno",
"io-lifetimes",
"libc",
"linux-raw-sys",
"windows-sys 0.48.0",
]
[[package]]
name = "rustls"
version = "0.20.8"
@@ -2193,7 +2584,7 @@ dependencies = [
"bitflags",
"doc-comment",
"finl_unicode",
"itertools",
"itertools 0.10.5",
"lazy_static",
"rustc-hash",
"strsim",
@@ -2281,6 +2672,22 @@ dependencies = [
"uuid",
]
[[package]]
name = "sea-orm-cli"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "efbf34a2caf70c2e3be9bb1e674e9540f6dfd7c8f40f6f05daf3b9740e476005"
dependencies = [
"chrono",
"clap",
"dotenvy",
"regex",
"sea-schema",
"tracing",
"tracing-subscriber",
"url",
]
[[package]]
name = "sea-orm-macros"
version = "0.11.3"
@@ -2294,6 +2701,23 @@ dependencies = [
"syn 1.0.109",
]
[[package]]
name = "sea-orm-migration"
version = "0.11.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "278d3adfd0832b6ffc17d3cfbc574d3695a5c1b38814e0bc8ac238d33f3d87cf"
dependencies = [
"async-trait",
"clap",
"dotenvy",
"futures",
"sea-orm",
"sea-orm-cli",
"sea-schema",
"tracing",
"tracing-subscriber",
]
[[package]]
name = "sea-query"
version = "0.28.3"
@@ -2338,6 +2762,29 @@ dependencies = [
"thiserror",
]
[[package]]
name = "sea-schema"
version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eeb2940bb5a10bc6cd05b450ce6cd3993e27fddd7eface2becb97fc5af3a040e"
dependencies = [
"futures",
"sea-query",
"sea-schema-derive",
]
[[package]]
name = "sea-schema-derive"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56821b7076f5096b8f726e2791ad255a99c82498e08ec477a65a96c461ff1927"
dependencies = [
"heck 0.3.3",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "sea-strum"
version = "0.23.0"
@@ -2421,9 +2868,9 @@ dependencies = [
[[package]]
name = "serenity"
version = "0.11.5"
version = "0.11.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "82fd5e7b5858ad96e99d440138f34f5b98e1b959ebcd3a1036203b30e78eb788"
checksum = "d007dc45584ecc47e791f2a9a7cf17bf98ac386728106f111159c846d624be3f"
dependencies = [
"async-trait",
"async-tungstenite",
@@ -2725,7 +3172,7 @@ version = "0.2.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0c12bc9199d1db8234678b7051747c07f517cdcf019262d1847b94ec8b1aee3e"
dependencies = [
"itertools",
"itertools 0.10.5",
"nom",
"unicode_categories",
]
@@ -2917,6 +3364,12 @@ dependencies = [
"winapi-util",
]
[[package]]
name = "textwrap"
version = "0.16.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "222a222a5bfe1bba4a77b45ec488a741b3cb8872e5e499451fd7d0129c9c7c3d"
[[package]]
name = "thiserror"
version = "1.0.40"
@@ -3002,11 +3455,12 @@ checksum = "1f3ccbac311fea05f86f61904b462b55fb3df8837a366dfc601a0161d0532f20"
[[package]]
name = "tokio"
version = "1.28.2"
version = "1.29.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94d7b1cfd2aa4011f2de74c2c4c63665e27a71006b0a192dcd2710272e73dfa2"
checksum = "532826ff75199d5833b9d2c5fe410f29235e25704ee5f0ef599fb51c21f4a4da"
dependencies = [
"autocfg",
"backtrace",
"bytes",
"libc",
"mio",
@@ -3239,9 +3693,9 @@ dependencies = [
[[package]]
name = "tracing-subscriber"
version = "0.3.16"
version = "0.3.17"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a6176eae26dd70d0c919749377897b54a9276bd7061339665dd68777926b5a70"
checksum = "30a651bc37f915e81f087d86e62a18eec5f79550c7faff886f7090b4ea757c77"
dependencies = [
"matchers",
"nu-ansi-term",
@@ -3403,12 +3857,28 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "830b7e5d4d90034032940e4ace0d9a9a057e7a45cd94e6c007832e39edb82f6d"
[[package]]
name = "value-bag"
version = "1.0.0-alpha.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2209b78d1249f7e6f3293657c9779fe31ced465df091bbd433a1cf88e916ec55"
dependencies = [
"ctor",
"version_check",
]
[[package]]
name = "version_check"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49874b5167b65d7193b8aba1567f5c7d93d001cafc34600cee003eda787e483f"
[[package]]
name = "waker-fn"
version = "1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9d5b2c62b4012a3e1eca5a7e077d13b3bf498c4073e33ccd58626607748ceeca"
[[package]]
name = "want"
version = "0.3.0"

View File

@@ -1,5 +1,6 @@
[workspace]
members = [
"mixer-discord-bot"
"mixer-discord-bot",
"migration",
]
default-members = ["mixer-discord-bot"]

19
migration/Cargo.toml Normal file
View File

@@ -0,0 +1,19 @@
[package]
name = "migration"
version = "0.1.0"
edition = "2021"
publish = false
[lib]
name = "migration"
path = "src/lib.rs"
[dependencies]
async-std = { version = "1", features = ["attributes", "tokio1"] }
[dependencies.sea-orm-migration]
version = "0.11.3"
features = [
"runtime-tokio-rustls",
"sqlx-postgres",
]

41
migration/README.md Normal file
View File

@@ -0,0 +1,41 @@
# Running Migrator CLI
- Generate a new migration file
```sh
cargo run -- migrate generate MIGRATION_NAME
```
- Apply all pending migrations
```sh
cargo run
```
```sh
cargo run -- up
```
- Apply first 10 pending migrations
```sh
cargo run -- up -n 10
```
- Rollback last applied migrations
```sh
cargo run -- down
```
- Rollback last 10 applied migrations
```sh
cargo run -- down -n 10
```
- Drop all tables from the database, then reapply all migrations
```sh
cargo run -- fresh
```
- Rollback all applied migrations, then reapply all migrations
```sh
cargo run -- refresh
```
- Rollback all applied migrations
```sh
cargo run -- reset
```
- Check the status of all migrations
```sh
cargo run -- status
```

20
migration/src/lib.rs Normal file
View File

@@ -0,0 +1,20 @@
pub use sea_orm_migration::prelude::*;
mod m20230704_104934_create_guilds_table;
mod m20230704_111535_create_lobbies_table;
mod m20230704_112326_create_role_type;
mod m20230704_113006_create_players_table;
pub struct Migrator;
#[async_trait::async_trait]
impl MigratorTrait for Migrator {
fn migrations() -> Vec<Box<dyn MigrationTrait>> {
vec![
Box::new(m20230704_104934_create_guilds_table::Migration),
Box::new(m20230704_111535_create_lobbies_table::Migration),
Box::new(m20230704_112326_create_role_type::Migration),
Box::new(m20230704_113006_create_players_table::Migration),
]
}
}

View File

@@ -0,0 +1,75 @@
use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.create_table(
Table::create()
.table(Guilds::Table)
.if_not_exists()
.col(
ColumnDef::new(Guilds::Id)
.integer()
.not_null()
.auto_increment()
.primary_key(),
)
.col(
ColumnDef::new(Guilds::GuildId)
.big_unsigned()
.not_null()
.unique_key(),
)
.col(
ColumnDef::new(Guilds::Verified)
.boolean()
.not_null()
.default(false),
)
.to_owned(),
)
.await?;
manager
.create_index(
Index::create()
.if_not_exists()
.name("guilds_guild_id_idx")
.table(Guilds::Table)
.col(Guilds::GuildId)
.to_owned(),
)
.await?;
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_index(
Index::drop()
.table(Guilds::Table)
.name("guilds_guild_id_idx")
.to_owned(),
)
.await?;
manager
.drop_table(Table::drop().table(Guilds::Table).to_owned())
.await?;
Ok(())
}
}
#[derive(Iden)]
enum Guilds {
Table,
Id,
GuildId,
Verified,
}

View File

@@ -0,0 +1,140 @@
use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.create_table(
Table::create()
.table(Lobbies::Table)
.col(
ColumnDef::new(Lobbies::Id)
.integer()
.not_null()
.auto_increment()
.primary_key(),
)
.col(ColumnDef::new(Lobbies::GuildId).big_unsigned().not_null())
.col(
ColumnDef::new(Lobbies::MainVoiceId)
.big_unsigned()
.not_null(),
)
.col(
ColumnDef::new(Lobbies::RedTeamVoiceId)
.big_unsigned()
.not_null(),
)
.col(
ColumnDef::new(Lobbies::BlueTeamVoiceId)
.big_unsigned()
.not_null(),
)
.to_owned(),
)
.await?;
manager
.create_index(
Index::create()
.if_not_exists()
.name("lobbies_guild_id_idx")
.table(Lobbies::Table)
.col(Lobbies::GuildId)
.to_owned(),
)
.await?;
manager
.create_index(
Index::create()
.if_not_exists()
.name("lobbies_main_voice_id_idx")
.table(Lobbies::Table)
.col(Lobbies::MainVoiceId)
.to_owned(),
)
.await?;
manager
.create_index(
Index::create()
.if_not_exists()
.name("lobbies_red_team_voice_id_idx")
.table(Lobbies::Table)
.col(Lobbies::RedTeamVoiceId)
.to_owned(),
)
.await?;
manager
.create_index(
Index::create()
.if_not_exists()
.name("lobbies_blue_team_voice_id_idx")
.table(Lobbies::Table)
.col(Lobbies::BlueTeamVoiceId)
.to_owned(),
)
.await?;
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_index(
Index::drop()
.name("lobbies_guild_id_idx")
.table(Lobbies::Table)
.to_owned(),
)
.await?;
manager
.drop_index(
Index::drop()
.name("lobbies_main_voice_id_idx")
.table(Lobbies::Table)
.to_owned(),
)
.await?;
manager
.drop_index(
Index::drop()
.name("lobbies_red_team_voice_id_idx")
.table(Lobbies::Table)
.to_owned(),
)
.await?;
manager
.drop_index(
Index::drop()
.name("lobbies_blue_team_voice_id_idx")
.table(Lobbies::Table)
.to_owned(),
)
.await?;
manager
.drop_table(Table::drop().table(Lobbies::Table).to_owned())
.await?;
Ok(())
}
}
#[derive(Iden)]
enum Lobbies {
Table,
Id,
GuildId,
MainVoiceId,
RedTeamVoiceId,
BlueTeamVoiceId,
}

View File

@@ -0,0 +1,37 @@
use sea_orm::{EnumIter, Iterable};
use sea_orm_migration::{prelude::*, sea_query::extension::postgres::Type};
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.create_type(
Type::create()
.as_enum(Role::Table)
.values(Role::iter().skip(1))
.to_owned(),
)
.await?;
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_type(Type::drop().if_exists().name(Role::Table).to_owned())
.await?;
Ok(())
}
}
#[derive(Iden, EnumIter)]
enum Role {
Table,
Tank,
Dps,
Support,
}

View File

@@ -0,0 +1,147 @@
use sea_orm_migration::prelude::*;
#[derive(DeriveMigrationName)]
pub struct Migration;
#[async_trait::async_trait]
impl MigrationTrait for Migration {
async fn up(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.create_table(
Table::create()
.table(Players::Table)
.col(
ColumnDef::new(Players::Id)
.integer()
.not_null()
.auto_increment()
.primary_key(),
)
.col(
ColumnDef::new(Players::DiscordId)
.big_unsigned()
.not_null()
.unique_key(),
)
.col(ColumnDef::new(Players::BnName).string())
.col(ColumnDef::new(Players::BnTag).string())
.col(ColumnDef::new(Players::LastPlayed).timestamp())
.col(
ColumnDef::new(Players::TankRating)
.float()
.not_null()
.default(2500),
)
.col(
ColumnDef::new(Players::TankRd)
.float()
.not_null()
.default(300),
)
.col(
ColumnDef::new(Players::TankVolatility)
.float()
.not_null()
.default(0.06),
)
.col(
ColumnDef::new(Players::DpsRating)
.float()
.not_null()
.default(2500),
)
.col(
ColumnDef::new(Players::DpsRd)
.float()
.not_null()
.default(300),
)
.col(
ColumnDef::new(Players::DpsVolatility)
.float()
.not_null()
.default(0.06),
)
.col(
ColumnDef::new(Players::SupportRating)
.float()
.not_null()
.default(2500),
)
.col(
ColumnDef::new(Players::SupportRd)
.float()
.not_null()
.default(300),
)
.col(
ColumnDef::new(Players::SupportVolatility)
.float()
.not_null()
.default(0.06),
)
.col(
ColumnDef::new(Players::Flex)
.boolean()
.not_null()
.default(true),
)
.col(ColumnDef::new(Players::PrimaryRole).custom(Role))
.col(ColumnDef::new(Players::SecondaryRole).custom(Role))
.col(ColumnDef::new(Players::TertiaryRole).custom(Role))
.to_owned(),
)
.await?;
manager
.create_index(
Index::create()
.if_not_exists()
.name("players_discord_id_idx")
.table(Players::Table)
.col(Players::DiscordId)
.to_owned(),
)
.await?;
Ok(())
}
async fn down(&self, manager: &SchemaManager) -> Result<(), DbErr> {
manager
.drop_index(Index::drop().name("players_discord_id_idx").to_owned())
.await?;
manager
.drop_table(Table::drop().table(Players::Table).to_owned())
.await?;
Ok(())
}
}
#[derive(Iden)]
enum Players {
Table,
Id,
DiscordId,
BnName,
BnTag,
LastPlayed,
TankRating,
TankRd,
TankVolatility,
DpsRating,
DpsRd,
DpsVolatility,
SupportRating,
SupportRd,
SupportVolatility,
Flex,
PrimaryRole,
SecondaryRole,
TertiaryRole,
}
#[derive(Iden)]
struct Role;

6
migration/src/main.rs Normal file
View File

@@ -0,0 +1,6 @@
use sea_orm_migration::prelude::*;
#[async_std::main]
async fn main() {
cli::run_cli(migration::Migrator).await;
}

View File

@@ -4,7 +4,8 @@ version = "0.1.0"
edition = "2021"
[dependencies]
tokio = { version = "1.28.2", features = ["full"] }
migration = { path = "../migration" }
tracing = "0.1.37"
serenity = {version = "0.11.5", default-features = false, features = ["rustls_backend", "client", "gateway", "model", "cache", "collector", "utils"] }
sqlx = { version = "0.6.3", features = ["runtime-tokio-rustls", "postgres"] }

View File

@@ -1,91 +0,0 @@
-- DROP TABLE IF EXISTS players_test;
-- DROP FUNCTION IF EXISTS rating_not_null;
-- DROP TYPE rating;
-- DROP TYPE IF EXISTS role;
-- CREATE TYPE rating AS (
-- rating REAL,
-- rd REAL,
-- volatility REAL
-- );
-- CREATE OR REPLACE FUNCTION rating_not_null(r rating) RETURNS BOOLEAN AS $$
-- BEGIN
-- RETURN (r.rating IS NOT NULL) AND (r.rd IS NOT NULL) AND (r.volatility IS NOT NULL);
-- END;
-- $$ LANGUAGE plpgsql;
-- CREATE TABLE players_test (
-- id SERIAL PRIMARY KEY,
-- discord_id BIGINT NOT NULL,
-- bn_name TEXT DEFAULT '',
-- bn_tag TEXT DEFAULT '',
-- tank_rating rating NOT NULL DEFAULT (2500.0, 300.0, 0.06),
-- dps_rating rating NOT NULL DEFAULT (2500.0, 300.0, 0.06),
-- support_rating rating NOT NULL DEFAULT (2500.0, 300.0, 0.06),
-- flex BOOLEAN NOT NULL DEFAULT true,
-- primary_role role,
-- secondary_role role,
-- tertiary_role role,
-- UNIQUE (discord_id),
-- CHECK (
-- rating_not_null(tank_rating) AND
-- rating_not_null(dps_rating) AND
-- rating_not_null(support_rating)
-- )
-- );
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_type WHERE typname = 'role') THEN
CREATE TYPE role AS ENUM ('tank', 'dps', 'support');
END IF;
END$$;
CREATE TABLE IF NOT EXISTS players (
id SERIAL PRIMARY KEY,
discord_id BIGINT NOT NULL,
bn_name TEXT,
bn_tag TEXT,
last_played TIMESTAMP,
tank_rating REAL NOT NULL DEFAULT 2500.0,
tank_rd REAL NOT NULL DEFAULT 300,
tank_volatility REAL NOT NULL DEFAULT 0.06,
dps_rating REAL NOT NULL DEFAULT 2500.0,
dps_rd REAL NOT NULL DEFAULT 300,
dps_volatility REAL NOT NULL DEFAULT 0.06,
support_rating REAL NOT NULL DEFAULT 2500.0,
support_rd REAL NOT NULL DEFAULT 300,
support_volatility REAL NOT NULL DEFAULT 0.06,
flex BOOLEAN NOT NULL DEFAULT true,
primary_role role,
secondary_role role,
tertiary_role role,
UNIQUE (discord_id)
);
CREATE TABLE IF NOT EXISTS guilds (
id SERIAL PRIMARY KEY,
guild_id BIGINT NOT NULL,
verified BOOLEAN NOT NULL DEFAULT false,
UNIQUE (guild_id)
);
CREATE TABLE IF NOT EXISTS lobbies (
id SERIAL PRIMARY KEY,
guild_id BIGINT NOT NULL,
main_voice_id BIGINT NOT NULL,
red_team_voice_id BIGINT NOT NULL,
blue_team_voice_id BIGINT NOT NULL
);
CREATE INDEX IF NOT EXISTS players_discord_id_idx ON players (discord_id);
CREATE INDEX IF NOT EXISTS lobbies_guild_id_idx ON lobbies (guild_id);
CREATE INDEX IF NOT EXISTS lobbies_main_voice_id_idx ON lobbies (main_voice_id);
CREATE INDEX IF NOT EXISTS lobbies_red_team_voice_id_idx ON lobbies (red_team_voice_id);
CREATE INDEX IF NOT EXISTS lobbies_blue_team_voice_id_idx ON lobbies (blue_team_voice_id);
CREATE INDEX IF NOT EXISTS guilds_guild_id_idx ON guilds (guild_id);

View File

@@ -6,13 +6,14 @@ mod mixer;
use bot::commands::creator::CreatorCommand;
use image_manipulation::{ImageGenerator, ImageGeneratorContainer};
use migration::{Migrator, MigratorTrait};
use rusttype::Font;
use serenity::model::prelude::UserId;
use serenity::prelude::{GatewayIntents, TypeMapKey};
use serenity::Client;
use shuttle_runtime::Context;
use shuttle_secrets::SecretStore;
use sqlx::{Executor, PgPool};
use sqlx::PgPool;
use std::sync::Arc;
use tokio::sync::RwLock;
use tracing::log::info;
@@ -46,8 +47,6 @@ async fn serenity(
.get("DISCORD_APP_ID")
.context("'DISCORD_APP_ID' was not found")?;
pool.execute(include_str!("../schema.sql")).await.unwrap();
let mut bot = MixerBot::new();
bot.add_command(PingCommand);
@@ -67,6 +66,9 @@ async fn serenity(
let mut data = client.data.write().await;
let db = MixerDatabase::new(pool);
Migrator::up(db.connection(), None)
.await
.expect("Could not run migrations");
data.insert::<DatabaseContainer>(Arc::new(RwLock::new(db)));
let creator = UserId::from(