1
0

Simplify database field verification

This commit is contained in:
2025-01-31 20:34:24 +02:00
parent 883b87e593
commit ee794811c3
43 changed files with 1062 additions and 171 deletions

View File

@ -57,15 +57,6 @@ dependencies = [
"zerocopy",
]
[[package]]
name = "aho-corasick"
version = "1.1.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8e60d3430d3a69478ad0993f19238d2df97c507009a52b3c10addcd7f6bcb916"
dependencies = [
"memchr",
]
[[package]]
name = "aliasable"
version = "0.1.3"
@ -332,6 +323,7 @@ version = "0.1.0"
dependencies = [
"argon2",
"database",
"derive_more",
"garde",
"thiserror 2.0.11",
]
@ -915,9 +907,7 @@ version = "0.1.0"
dependencies = [
"chrono",
"derive_more",
"garde",
"sqlx",
"thiserror 2.0.11",
]
[[package]]
@ -1430,23 +1420,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6a989bd2fd12136080f7825ff410d9239ce84a2a639487fc9d924ee42e2fb84f"
dependencies = [
"compact_str",
"garde_derive",
"once_cell",
"regex",
"smallvec",
"url",
]
[[package]]
name = "garde_derive"
version = "0.22.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1f7f0545bbbba0a37d4d445890fa5759814e0716f02417b39f6fab292193df68"
dependencies = [
"proc-macro2",
"quote",
"regex",
"syn 2.0.96",
]
[[package]]
@ -3239,35 +3213,6 @@ dependencies = [
"thiserror 1.0.69",
]
[[package]]
name = "regex"
version = "1.11.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b544ef1b4eac5dc2db33ea63606ae9ffcfac26c1416a2806ae0bf5f56b201191"
dependencies = [
"aho-corasick",
"memchr",
"regex-automata",
"regex-syntax",
]
[[package]]
name = "regex-automata"
version = "0.4.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "809e8dc61f6de73b46c85f4c96486310fe304c434cfa43669d7b40f711150908"
dependencies = [
"aho-corasick",
"memchr",
"regex-syntax",
]
[[package]]
name = "regex-syntax"
version = "0.8.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2b15c43186be67a4fd63bee50d0303afffcef381492ebe2c5d87f324e1b8815c"
[[package]]
name = "renderdoc-sys"
version = "1.1.0"

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "INSERT INTO PackageBases (name, description, created_at, updated_at) VALUES (?, ?, ?, ?)",
"describe": {
"columns": [],
"parameters": {
"Right": 4
},
"nullable": []
},
"hash": "014cf2ec55142a17047ad7c469685df75ae8e3c95a1a7c6c21be7b5624a82ae1"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Packages SET created_at = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "063059de083c42956506d991bc04472929e6b2618ab13eb90e772ad9bd9c1984"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE PackageBases SET name = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "0af939868e37bad5eb9097badeaefca62c247c4b2265a9667c4b33885126c771"
}

View File

@ -0,0 +1,84 @@
{
"db_name": "MySQL",
"query": "SELECT * FROM Users WHERE email = ?",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | PRIMARY_KEY | UNSIGNED | AUTO_INCREMENT",
"max_size": 10
}
},
{
"ordinal": 1,
"name": "name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | NO_DEFAULT_VALUE",
"max_size": 124
}
},
{
"ordinal": 2,
"name": "email",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | NO_DEFAULT_VALUE",
"max_size": 1020
}
},
{
"ordinal": 3,
"name": "password",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | NO_DEFAULT_VALUE",
"max_size": 1020
}
},
{
"ordinal": 4,
"name": "last_used",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"max_size": 19
}
},
{
"ordinal": 5,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"max_size": 19
}
},
{
"ordinal": 6,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
true,
false,
false
]
},
"hash": "0bb7353d64231dc12416f5504d94513493670e3f2ae017d87a2f0c3eca045f60"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Packages SET version = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "346beb83d6351740a503b72133a190ac327ae79f6e555def8fec89fcc75fb015"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "DELETE FROM PackageBases WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "389e38e7e0a0b7d9ba667ac148a0a468da889a3455c47325938b819ab41ef4c8"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "DELETE FROM Users WHERE name = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "404747d44ee859e8c967695c29963594bb8273e66c053934ec20d5fc3db9d41e"
}

View File

@ -0,0 +1,84 @@
{
"db_name": "MySQL",
"query": "SELECT * FROM Users WHERE name = ?",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | PRIMARY_KEY | UNSIGNED | AUTO_INCREMENT",
"max_size": 10
}
},
{
"ordinal": 1,
"name": "name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | NO_DEFAULT_VALUE",
"max_size": 124
}
},
{
"ordinal": 2,
"name": "email",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | NO_DEFAULT_VALUE",
"max_size": 1020
}
},
{
"ordinal": 3,
"name": "password",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | NO_DEFAULT_VALUE",
"max_size": 1020
}
},
{
"ordinal": 4,
"name": "last_used",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"max_size": 19
}
},
{
"ordinal": 5,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"max_size": 19
}
},
{
"ordinal": 6,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
true,
false,
false
]
},
"hash": "68ed36ae997fff190b4b15b80bf24b553d8ac922da251d9e8b8f4e897bab46b0"
}

View File

@ -0,0 +1,104 @@
{
"db_name": "MySQL",
"query": "SELECT * FROM Packages WHERE id = ?",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | PRIMARY_KEY | UNSIGNED | AUTO_INCREMENT",
"max_size": 10
}
},
{
"ordinal": 1,
"name": "package_base",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | MULTIPLE_KEY | UNSIGNED | NO_DEFAULT_VALUE",
"max_size": 10
}
},
{
"ordinal": 2,
"name": "name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | NO_DEFAULT_VALUE",
"max_size": 508
}
},
{
"ordinal": 3,
"name": "version",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | NO_DEFAULT_VALUE",
"max_size": 508
}
},
{
"ordinal": 4,
"name": "description",
"type_info": {
"type": "VarString",
"flags": "",
"max_size": 1020
}
},
{
"ordinal": 5,
"name": "url",
"type_info": {
"type": "VarString",
"flags": "",
"max_size": 2040
}
},
{
"ordinal": 6,
"name": "flagged_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"max_size": 19
}
},
{
"ordinal": 7,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"max_size": 19
}
},
{
"ordinal": 8,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
true,
true,
true,
false,
false
]
},
"hash": "695f4b0a4286cf625dc60dc3dfc4a9cd92aaea3ea58ef8702903983cfc32ab47"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Packages SET updated_at = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "7cc4cf73572c0830d1da7b8e621a79a09f3e3d8cfd42d3946bd1fac93838b913"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE PackageBases SET description = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "7f06016e9892486c938a5e94c9e5f70903a38ed314235712c28ac5e14d9ac20f"
}

View File

@ -0,0 +1,64 @@
{
"db_name": "MySQL",
"query": "SELECT * FROM PackageBases WHERE id = ?",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | PRIMARY_KEY | UNSIGNED | AUTO_INCREMENT",
"max_size": 10
}
},
{
"ordinal": 1,
"name": "name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | NO_DEFAULT_VALUE",
"max_size": 508
}
},
{
"ordinal": 2,
"name": "description",
"type_info": {
"type": "VarString",
"flags": "",
"max_size": 2040
}
},
{
"ordinal": 3,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"max_size": 19
}
},
{
"ordinal": 4,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
true,
false,
false
]
},
"hash": "839cea68f9de889f35a0d0ad0b48b4a0dc1af49f0f0e7bb12238d22a9c37fbbc"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Users SET updated_at = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "8af7a0169e934cb82997a1cab04e921f719ed9466c13713fda8736c540d0fa78"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Users SET password = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "8be76176b46f645095dce3bcbed11134ec0f43504d3a820698282848fd67dbad"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Packages SET flagged_at = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "8bfaca937858ed1060da5a650f749849d29af3d6345d0e02474abf4d8c78b89d"
}

View File

@ -0,0 +1,84 @@
{
"db_name": "MySQL",
"query": "SELECT * FROM Users WHERE id = ?",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | PRIMARY_KEY | UNSIGNED | AUTO_INCREMENT",
"max_size": 10
}
},
{
"ordinal": 1,
"name": "name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | NO_DEFAULT_VALUE",
"max_size": 124
}
},
{
"ordinal": 2,
"name": "email",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | NO_DEFAULT_VALUE",
"max_size": 1020
}
},
{
"ordinal": 3,
"name": "password",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | NO_DEFAULT_VALUE",
"max_size": 1020
}
},
{
"ordinal": 4,
"name": "last_used",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"max_size": 19
}
},
{
"ordinal": 5,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"max_size": 19
}
},
{
"ordinal": 6,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
true,
false,
false
]
},
"hash": "8e3ffe0d11d3eb38cd805771cd133588c0679404a68a8041f414553226abeeb2"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE PackageBases SET created_at = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "93ec7d124c9bfa7329478d975614db874788ed297fe2d95275592becb186f942"
}

View File

@ -0,0 +1,104 @@
{
"db_name": "MySQL",
"query": "SELECT * FROM Packages WHERE name = ?",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | PRIMARY_KEY | UNSIGNED | AUTO_INCREMENT",
"max_size": 10
}
},
{
"ordinal": 1,
"name": "package_base",
"type_info": {
"type": "Long",
"flags": "NOT_NULL | MULTIPLE_KEY | UNSIGNED | NO_DEFAULT_VALUE",
"max_size": 10
}
},
{
"ordinal": 2,
"name": "name",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | UNIQUE_KEY | NO_DEFAULT_VALUE",
"max_size": 508
}
},
{
"ordinal": 3,
"name": "version",
"type_info": {
"type": "VarString",
"flags": "NOT_NULL | NO_DEFAULT_VALUE",
"max_size": 508
}
},
{
"ordinal": 4,
"name": "description",
"type_info": {
"type": "VarString",
"flags": "",
"max_size": 1020
}
},
{
"ordinal": 5,
"name": "url",
"type_info": {
"type": "VarString",
"flags": "",
"max_size": 2040
}
},
{
"ordinal": 6,
"name": "flagged_at",
"type_info": {
"type": "Timestamp",
"flags": "BINARY",
"max_size": 19
}
},
{
"ordinal": 7,
"name": "created_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP",
"max_size": 19
}
},
{
"ordinal": 8,
"name": "updated_at",
"type_info": {
"type": "Timestamp",
"flags": "NOT_NULL | BINARY | TIMESTAMP | ON_UPDATE_NOW",
"max_size": 19
}
}
],
"parameters": {
"Right": 1
},
"nullable": [
false,
false,
false,
false,
true,
true,
true,
false,
false
]
},
"hash": "944eb40633e943a75244dee639fe6efb16919aff7172189c81240cb12462ae58"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Users SET email = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "9be7f66630e64787e55946dff428d28035747b66e57260bc9cd4634a71a037a6"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "DELETE FROM Users WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "9fa86328c40ce0469f755efb4876010092b7bc9f240a5d43dc69f9d0b1b5b7ce"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Packages SET url = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "b5814b93236d587957a103e61726b0b9ae811ba6bff0617871e76de3ef0ff662"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Packages SET description = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "c1abf048d65d421717f20343bb0ef4fcd78f8571cfe2347c147124763bd17491"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "DELETE FROM Users WHERE email = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "c2b00adbcb3c35a6ffa6b2bce08a738a9b3cd1ca4aa4c843909c7e14f7ef3e06"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Packages SET package_base = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "c8de918b432ce82bc7bf1d09a378f9b092d74c2298ac126f7edbb7d59c536910"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Users SET last_used = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "cc8f7e13c6aedf6aa4d6d4fc39db7aa98b84baf911e7f779641c1dc514c676cd"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Users SET created_at = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "cf79e2f6038dddd055d535d2c41dd8dccd1a4e6a763963590c904c25abf33137"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE PackageBases SET updated_at = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "d289747c7c7fba86e2b66174e2d1546f10e8213d36b6b3cd25016f829e9d731b"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "DELETE FROM Packages WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "d474dd848d0ef8832afd4d1302fa562a3c4a4569032e8636d664043b5dc96661"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "INSERT INTO Users (name, email, password, last_used, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)",
"describe": {
"columns": [],
"parameters": {
"Right": 6
},
"nullable": []
},
"hash": "daf98e6f1013c4993f7329f6fa690e92bccd89d1ff90131719c40626088dabd1"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "INSERT INTO Packages (package_base, name, version, description, url, flagged_at, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
"describe": {
"columns": [],
"parameters": {
"Right": 8
},
"nullable": []
},
"hash": "dfc2574c39f3f5a9afc1bdb642d8bf8a5ce85e7f84fa0dadb53c88cce63e5634"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Packages SET name = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "e8ee44281a87c6e7147332dd5548971cb804a1ab1edcdae8bf009ac39059c2bb"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "DELETE FROM Packages WHERE name = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 1
},
"nullable": []
},
"hash": "f4963ad77bcbc0af4fc929f1f66b7ee842c26c44da32ae9bbbc06c466a908ccf"
}

View File

@ -0,0 +1,12 @@
{
"db_name": "MySQL",
"query": "UPDATE Users SET name = ? WHERE id = ?",
"describe": {
"columns": [],
"parameters": {
"Right": 2
},
"nullable": []
},
"hash": "f656bd1abb82c10af4e0e21b4a04a364988f5329356282f2ae0098dbfcaec671"
}

View File

@ -4,9 +4,7 @@ version = "0.1.0"
edition = "2024"
[dependencies]
thiserror = "2.0.11"
derive_more = { version = "1.0.0", features = ["deref", "deref_mut", "from", "into"] }
garde = { version = "0.22.0", features = ["email", "url", "derive"] }
derive_more = { version = "1.0.0", features = ["deref", "into"] }
chrono = { version = "0.4.39", default-features = false, features = [
"std",
@ -18,3 +16,6 @@ sqlx = { version = "0.8.3", default-features = false, features = [
"chrono",
"runtime-tokio",
] }
# thiserror = "2.0.11"
# garde = { version = "0.22.0", features = ["email", "url", "derive"] }

View File

@ -18,8 +18,8 @@ where
let created_at = Utc::now();
let id = sqlx::query!(
"INSERT INTO PackageBases (name, description, created_at, updated_at) VALUES (?, ?, ?, ?)",
data.name.0,
data.description.0,
data.name.as_str(),
data.description.as_ref(),
created_at, created_at,
)
.execute(&*connection)
@ -28,8 +28,8 @@ where
Ok(Self::Existing {
id,
name: data.name.into_inner().0,
description: data.description.into_inner().0,
name: data.name.into(),
description: data.description.into(),
created_at,
updated_at: created_at,
})
@ -52,14 +52,14 @@ where
Field::Name(name) => {
sqlx::query!(
"UPDATE PackageBases SET name = ? WHERE id = ?",
name.0,
name.as_str(),
existing.id
)
}
Field::Description(description) => {
sqlx::query!(
"UPDATE PackageBases SET description = ? WHERE id = ?",
description.0,
description.as_ref(),
existing.id
)
}
@ -78,8 +78,8 @@ where
.await?;
match data {
Field::Name(valid) => existing.name = valid.into_inner().0,
Field::Description(valid) => existing.description = valid.into_inner().0,
Field::Name(s) => existing.name = s.into(),
Field::Description(o) => existing.description = o.into(),
Field::CreatedAt(date_time) => existing.created_at = date_time,
Field::UpdatedAt(date_time) => existing.updated_at = date_time,
}

View File

@ -21,10 +21,10 @@ where
(package_base, name, version, description, url, flagged_at, created_at, updated_at) \
VALUES (?, ?, ?, ?, ?, ?, ?, ?)",
data.package_base.id,
data.name.0,
data.version.0,
data.description.0,
data.url.0,
data.name.as_str(),
data.version.as_str(),
data.description.as_ref(),
data.url.as_ref(),
data.flagged_at,
created_at,
created_at,
@ -36,10 +36,10 @@ where
Ok(Self::Existing {
id,
package_base: data.package_base.id,
name: data.name.into_inner().0,
version: data.version.into_inner().0,
description: data.description.into_inner().0,
url: data.url.into_inner().0,
name: data.name.into(),
version: data.version.into(),
description: data.description.into(),
url: data.url.into(),
flagged_at: data.flagged_at,
created_at,
updated_at: created_at,
@ -54,9 +54,13 @@ where
.await
}
Unique::Name(name) => {
sqlx::query_as!(Package, "SELECT * FROM Packages WHERE name = ?", name.0)
.fetch_optional(connection)
.await
sqlx::query_as!(
Package,
"SELECT * FROM Packages WHERE name = ?",
name.as_str()
)
.fetch_optional(connection)
.await
}
}?)
}
@ -70,7 +74,7 @@ where
Field::Name(name) => {
sqlx::query!(
"UPDATE Packages SET name = ? WHERE id = ?",
name.0,
name.as_str(),
existing.id
)
}
@ -84,21 +88,21 @@ where
Field::Version(version) => {
sqlx::query!(
"UPDATE Packages SET version = ? WHERE id = ?",
version.0,
version.as_str(),
existing.id
)
}
Field::Description(description) => {
sqlx::query!(
"UPDATE Packages SET description = ? WHERE id = ?",
description.0,
description.as_ref(),
existing.id
)
}
Field::URL(url) => {
sqlx::query!(
"UPDATE Packages SET url = ? WHERE id = ?",
url.0,
url.as_ref(),
existing.id
)
}
@ -122,11 +126,11 @@ where
.await?;
match data {
Field::Name(valid) => existing.name = valid.into_inner().0,
Field::PackageBase(base) => existing.package_base = base.id,
Field::Version(valid) => existing.version = valid.into_inner().0,
Field::Description(valid) => existing.description = valid.into_inner().0,
Field::URL(valid) => existing.url = valid.into_inner().0,
Field::Name(s) => existing.name = s.into(),
Field::PackageBase(s) => existing.package_base = s.id,
Field::Version(s) => existing.version = s.into(),
Field::Description(o) => existing.description = o.into(),
Field::URL(o) => existing.url = o.into(),
Field::FlaggedAt(date_time) => existing.flagged_at = date_time,
Field::CreatedAt(date_time) => existing.created_at = date_time,
Field::UpdatedAt(date_time) => existing.updated_at = date_time,
@ -139,7 +143,7 @@ where
match data {
Unique::Id(id) => sqlx::query!("DELETE FROM Packages WHERE id = ?", id),
Unique::Name(name) => {
sqlx::query!("DELETE FROM Packages WHERE name = ?", name.0)
sqlx::query!("DELETE FROM Packages WHERE name = ?", name.as_str())
}
}
.execute(&*connection)

View File

@ -18,9 +18,9 @@ where
let created_at = Utc::now();
let id = sqlx::query!(
"INSERT INTO Users (name, email, password, last_used, created_at, updated_at) VALUES (?, ?, ?, ?, ?, ?)",
data.name.0,
data.email.0,
data.password.0,
data.name.as_str(),
data.email.as_str(),
data.password.as_str(),
data.last_used,
created_at,
created_at,
@ -31,9 +31,9 @@ where
Ok(Self::Existing {
id,
name: data.name.into_inner().0,
email: data.email.into_inner().0,
password: data.password.into_inner().0,
name: data.name.into(),
email: data.email.into(),
password: data.password.into(),
last_used: data.last_used,
created_at,
updated_at: created_at,
@ -48,12 +48,12 @@ where
.await
}
Unique::Name(name) => {
sqlx::query_as!(User, "SELECT * FROM Users WHERE name = ?", name.0)
sqlx::query_as!(User, "SELECT * FROM Users WHERE name = ?", name.as_str())
.fetch_optional(connection)
.await
}
Unique::Email(email) => {
sqlx::query_as!(User, "SELECT * FROM Users WHERE email = ?", email.0)
sqlx::query_as!(User, "SELECT * FROM Users WHERE email = ?", email.as_str())
.fetch_optional(connection)
.await
}
@ -69,21 +69,21 @@ where
Field::Name(name) => {
sqlx::query!(
"UPDATE Users SET name = ? WHERE id = ?",
name.0,
name.as_str(),
existing.id
)
}
Field::Email(email) => {
sqlx::query!(
"UPDATE Users SET email = ? WHERE id = ?",
email.0,
email.as_str(),
existing.id
)
}
Field::Password(password) => {
sqlx::query!(
"UPDATE Users SET password = ? WHERE id = ?",
password.0,
password.as_str(),
existing.id
)
}
@ -109,9 +109,9 @@ where
.await?;
match data {
Field::Name(valid) => existing.name = valid.into_inner().0,
Field::Email(valid) => existing.email = valid.into_inner().0,
Field::Password(valid) => existing.password = valid.into_inner().0,
Field::Name(valid) => existing.name = valid.into(),
Field::Email(valid) => existing.email = valid.into(),
Field::Password(valid) => existing.password = valid.into(),
Field::LastUsed(date_time) => existing.last_used = date_time,
Field::CreatedAt(date_time) => existing.created_at = date_time,
Field::UpdatedAt(date_time) => existing.updated_at = date_time,
@ -124,10 +124,10 @@ where
match data {
Unique::Id(id) => sqlx::query!("DELETE FROM Users WHERE id = ?", id),
Unique::Name(name) => {
sqlx::query!("DELETE FROM Users WHERE name = ?", name.0)
sqlx::query!("DELETE FROM Users WHERE name = ?", name.as_str())
}
Unique::Email(email) => {
sqlx::query!("DELETE FROM Users WHERE email = ?", email.0)
sqlx::query!("DELETE FROM Users WHERE email = ?", email.as_str())
}
}
.execute(&*connection)

View File

@ -1,17 +1,18 @@
use garde::{Report, Unvalidated, Valid, Validate};
pub trait IntoValid: Validate {
fn into_valid(self) -> Result<Valid<Self>, Report>
where
Self: Sized,
<Self as Validate>::Context: Default,
{
Unvalidated::new(self).validate()
}
}
impl<T: garde::Validate> IntoValid for T {}
pub mod adapter;
pub mod atomic;
pub mod connect;
pub mod port;
// use garde::{Report, Unvalidated, Valid, Validate};
// pub trait IntoValid: Validate {
// fn into_valid(self) -> Result<Valid<Self>, Report>
// where
// Self: Sized,
// <Self as Validate>::Context: Default,
// {
// Unvalidated::new(self).validate()
// }
// }
// impl<T: garde::Validate> IntoValid for T {}

View File

@ -17,6 +17,8 @@ pub trait CRUD<C> {
async fn delete(connection: &mut C, data: Self::Unique) -> Result;
}
const TOO_LONG: &str = "too long";
pub mod base;
pub mod package;
pub mod user;

View File

@ -1,8 +1,7 @@
pub use super::{CRUD, Result};
pub use chrono::{DateTime, Utc};
use derive_more::{Deref, From, Into};
use garde::{Valid, Validate};
use derive_more::{Deref, Into};
#[allow(async_fn_in_trait)]
pub trait BaseRepository<C>:
@ -13,24 +12,45 @@ pub trait BaseRepository<C>:
// #[derive(Deref, Into, Clone, Copy)]
// pub struct Id(pub(crate) u64);
#[derive(Validate, Deref, From, Into)]
#[garde(transparent)]
pub struct Name(#[garde(length(chars, max = 127))] pub String);
#[derive(Clone, Deref, Into)]
pub struct Name(String);
impl TryFrom<String> for Name {
type Error = &'static str;
#[derive(Validate, Deref, From, Into)]
#[garde(transparent)]
pub struct Description(#[garde(length(chars, max = 510))] pub Option<String>);
fn try_from(value: String) -> std::result::Result<Self, Self::Error> {
if value.chars().count() > 127 {
Err(super::TOO_LONG)
} else {
Ok(Self(value))
}
}
}
#[derive(Clone, Deref, Into)]
pub struct Description(Option<String>);
impl TryFrom<Option<String>> for Description {
type Error = &'static str;
fn try_from(value: Option<String>) -> std::result::Result<Self, Self::Error> {
if let Some(x) = &value {
if x.chars().count() > 510 {
return Err(super::TOO_LONG);
}
}
Ok(Self(value))
}
}
pub enum Field {
Name(Valid<Name>),
Description(Valid<Description>),
Name(Name),
Description(Description),
CreatedAt(DateTime<Utc>),
UpdatedAt(DateTime<Utc>),
}
pub struct New {
pub name: Valid<Name>,
pub description: Valid<Description>,
pub name: Name,
pub description: Description,
}
pub struct Base {

View File

@ -1,8 +1,7 @@
pub use super::{CRUD, Result, base::Base};
pub use chrono::{DateTime, Utc};
use derive_more::{Deref, From, Into};
use garde::{Valid, Validate};
use derive_more::{Deref, Into};
#[allow(async_fn_in_trait)]
pub trait PackageRepository<C>:
@ -10,33 +9,75 @@ pub trait PackageRepository<C>:
{
}
#[derive(Validate, Deref, From, Into)]
#[garde(transparent)]
pub struct Name(#[garde(length(chars, max = 127))] pub String);
#[derive(Clone, Deref, Into)]
pub struct Name(String);
impl TryFrom<String> for Name {
type Error = &'static str;
#[derive(Validate, Deref, From, Into)]
#[garde(transparent)]
pub struct Version(#[garde(length(chars, max = 127))] pub String);
fn try_from(value: String) -> std::result::Result<Self, Self::Error> {
if value.chars().count() > 127 {
Err(super::TOO_LONG)
} else {
Ok(Self(value))
}
}
}
#[derive(Validate, Deref, From, Into)]
#[garde(transparent)]
pub struct Description(#[garde(length(chars, max = 255))] pub Option<String>);
#[derive(Clone, Deref, Into)]
pub struct Version(String);
impl TryFrom<String> for Version {
type Error = &'static str;
#[derive(Validate, Deref, From, Into)]
#[garde(transparent)]
pub struct URL(#[garde(length(chars, max = 510))] pub Option<String>);
fn try_from(value: String) -> std::result::Result<Self, Self::Error> {
if value.chars().count() > 127 {
Err(super::TOO_LONG)
} else {
Ok(Self(value))
}
}
}
#[derive(Clone, Deref, Into)]
pub struct Description(Option<String>);
impl TryFrom<Option<String>> for Description {
type Error = &'static str;
fn try_from(value: Option<String>) -> std::result::Result<Self, Self::Error> {
if let Some(x) = &value {
if x.chars().count() > 255 {
return Err(super::TOO_LONG);
}
}
Ok(Self(value))
}
}
#[derive(Clone, Deref, Into)]
pub struct URL(Option<String>);
impl TryFrom<Option<String>> for URL {
type Error = &'static str;
fn try_from(value: Option<String>) -> std::result::Result<Self, Self::Error> {
if let Some(x) = &value {
if x.chars().count() > 510 {
return Err(super::TOO_LONG);
}
}
Ok(Self(value))
}
}
pub enum Unique {
Id(u64),
Name(Valid<Name>),
Name(Name),
}
pub enum Field {
PackageBase(Base),
Name(Valid<Name>),
Version(Valid<Version>),
Description(Valid<Description>),
URL(Valid<URL>),
Name(Name),
Version(Version),
Description(Description),
URL(URL),
FlaggedAt(Option<DateTime<Utc>>),
CreatedAt(DateTime<Utc>),
UpdatedAt(DateTime<Utc>),
@ -44,10 +85,10 @@ pub enum Field {
pub struct New {
pub package_base: Base,
pub name: Valid<Name>,
pub version: Valid<Version>,
pub description: Valid<Description>,
pub url: Valid<URL>,
pub name: Name,
pub version: Version,
pub description: Description,
pub url: URL,
pub flagged_at: Option<DateTime<Utc>>,
}

View File

@ -1,8 +1,7 @@
pub use super::{CRUD, Result};
pub use chrono::{DateTime, Utc};
use derive_more::{Deref, From, Into};
use garde::{Valid, Validate};
use derive_more::{Deref, Into};
#[allow(async_fn_in_trait)]
pub trait UserRepository<C>:
@ -10,37 +9,67 @@ pub trait UserRepository<C>:
{
}
#[derive(Validate, Deref, From, Into)]
#[garde(transparent)]
pub struct Name(#[garde(length(chars, max = 31))] pub String);
#[derive(Clone, Deref, Into)]
pub struct Name(String);
impl TryFrom<String> for Name {
type Error = &'static str;
#[derive(Validate, Deref, From, Into)]
#[garde(transparent)]
pub struct Email(#[garde(length(chars, max = 255))] pub String);
fn try_from(value: String) -> std::result::Result<Self, Self::Error> {
if value.chars().count() > 31 {
Err(super::TOO_LONG)
} else {
Ok(Self(value))
}
}
}
#[derive(Validate, Deref, From, Into)]
#[garde(transparent)]
pub struct Password(#[garde(length(chars, max = 255))] pub String);
#[derive(Clone, Deref, Into)]
pub struct Email(String);
impl TryFrom<String> for Email {
type Error = &'static str;
fn try_from(value: String) -> std::result::Result<Self, Self::Error> {
if value.chars().count() > 255 {
Err(super::TOO_LONG)
} else {
Ok(Self(value))
}
}
}
#[derive(Clone, Deref, Into)]
pub struct Password(String);
impl TryFrom<String> for Password {
type Error = &'static str;
fn try_from(value: String) -> std::result::Result<Self, Self::Error> {
if value.chars().count() > 255 {
Err(super::TOO_LONG)
} else {
Ok(Self(value))
}
}
}
pub enum Unique {
Id(u64),
Name(Valid<Name>),
Email(Valid<Email>),
Name(Name),
Email(Email),
}
pub enum Field {
Name(Valid<Name>),
Email(Valid<Email>),
Password(Valid<Password>),
Name(Name),
Email(Email),
Password(Password),
LastUsed(Option<DateTime<Utc>>),
CreatedAt(DateTime<Utc>),
UpdatedAt(DateTime<Utc>),
}
pub struct New {
pub name: Valid<Name>,
pub email: Valid<Email>,
pub password: Valid<Password>,
pub name: Name,
pub email: Email,
pub password: Password,
pub last_used: Option<DateTime<Utc>>,
}