iceshrimp-legacy/packages/backend/native-utils/src/model/schema/app.rs

148 lines
4.1 KiB
Rust
Raw Normal View History

2023-05-25 08:34:48 +02:00
use jsonschema::JSONSchema;
use once_cell::sync::Lazy;
use schemars::JsonSchema;
use utoipa::ToSchema;
use super::Schema;
2023-05-27 11:50:07 +02:00
#[derive(Clone, Debug, PartialEq, Eq, JsonSchema, ToSchema)]
2023-05-25 08:34:48 +02:00
#[serde(rename_all = "camelCase")]
pub struct App {
pub id: String,
pub name: String,
#[schemars(url)]
pub callback_url: Option<String>,
#[schema(inline)]
2023-06-02 13:08:58 +02:00
pub permission: Vec<AppPermission>,
2023-05-25 08:34:48 +02:00
pub secret: Option<String>,
pub is_authorized: Option<bool>,
}
/// This represents `permissions` in `packages/calckey-js/src/consts.ts`.
2023-05-27 11:50:07 +02:00
#[derive(Clone, Debug, PartialEq, Eq, JsonSchema, ToSchema)]
2023-06-02 13:08:58 +02:00
pub enum AppPermission {
2023-05-25 08:34:48 +02:00
#[serde(rename = "read:account")]
ReadAccount,
#[serde(rename = "write:account")]
WriteAccount,
#[serde(rename = "read:blocks")]
ReadBlocks,
#[serde(rename = "write:blocks")]
WriteBlocks,
#[serde(rename = "read:drive")]
ReadDrive,
#[serde(rename = "write:drive")]
WriteDrive,
#[serde(rename = "read:favorites")]
ReadFavorites,
#[serde(rename = "write:favorites")]
WriteFavorites,
#[serde(rename = "read:following")]
ReadFollowing,
#[serde(rename = "write:following")]
WriteFollowing,
#[serde(rename = "read:messaging")]
ReadMessaging,
#[serde(rename = "write:messaging")]
WriteMessaging,
#[serde(rename = "read:mutes")]
ReadMutes,
#[serde(rename = "write:mutes")]
WriteMutes,
#[serde(rename = "read:notes")]
ReadNotes,
#[serde(rename = "write:notes")]
WriteNotes,
#[serde(rename = "read:notifications")]
ReadNotifications,
#[serde(rename = "write:notifications")]
WriteNotifications,
#[serde(rename = "read:reactions")]
ReadReactions,
#[serde(rename = "write:reactions")]
WriteReactions,
#[serde(rename = "write:votes")]
WriteVotes,
#[serde(rename = "read:pages")]
ReadPages,
#[serde(rename = "write:pages")]
WritePages,
#[serde(rename = "read:page-likes")]
ReadPageLikes,
#[serde(rename = "write:page-likes")]
WritePageLikes,
#[serde(rename = "read:user-groups")]
ReadUserGroups,
#[serde(rename = "write:user-groups")]
WriteUserGroups,
#[serde(rename = "read:channels")]
ReadChannels,
#[serde(rename = "write:channels")]
WriteChannels,
#[serde(rename = "read:gallery")]
ReadGallery,
#[serde(rename = "write:gallery")]
WriteGallery,
#[serde(rename = "read:gallery-likes")]
ReadGalleryLikes,
#[serde(rename = "write:gallery-likes")]
WriteGalleryLikes,
}
impl Schema<Self> for App {}
2023-07-17 00:32:32 +02:00
pub static VALIDATOR: Lazy<JSONSchema> = Lazy::new(App::validator);
2023-05-25 08:34:48 +02:00
#[cfg(test)]
2023-05-27 12:52:15 +02:00
mod unit_test {
2023-06-03 05:01:53 +02:00
use pretty_assertions::assert_eq;
use serde_json::json;
use crate::util::id::{create_id, init_id};
use crate::util::random::gen_string;
use super::VALIDATOR;
2023-05-25 08:34:48 +02:00
#[test]
2023-06-03 05:01:53 +02:00
fn app_valid() {
init_id(16, "");
2023-06-03 05:01:53 +02:00
let instance = json!({
"id": create_id(0).unwrap(),
2023-06-03 05:01:53 +02:00
"name": "Test App",
"secret": gen_string(24),
"callbackUrl": "urn:ietf:wg:oauth:2.0:oob",
"permission": ["read:account", "write:account", "read:notes"],
});
assert!(VALIDATOR.is_valid(&instance));
2023-05-25 08:34:48 +02:00
}
#[test]
2023-06-03 05:01:53 +02:00
fn app_invalid() {
init_id(16, "");
2023-06-03 05:01:53 +02:00
let instance = json!({
"id": create_id(0).unwrap(),
2023-06-03 05:01:53 +02:00
// "name" is required
"name": null,
// "permission" must be one of the app permissions
"permission": ["write:invalid_perm", "write:notes"],
// "secret" is a nullable string
"secret": 123,
// "is_authorized" is a nullable boolean
"isAuthorized": "true-ish",
});
let result = VALIDATOR
.validate(&instance)
.expect_err("validation must fail");
let mut paths: Vec<String> = result
.map(|e| e.instance_path.to_string())
.filter(|e| !e.is_empty())
.collect();
paths.sort();
assert_eq!(
paths,
vec!["/isAuthorized", "/name", "/permission/0", "/secret"]
);
2023-05-25 08:34:48 +02:00
}
}