use ormlite::model::{Insert, Join, JoinMeta, Model};
use serde::{Deserialize, Serialize};
use serde_json::json;
use sql::ToSql;
use ormlite::Connection;
#[path = "../setup.rs"]
mod setup;
#[derive(Debug, Model, Clone, Serialize, Deserialize)]
pub struct Organization {
id: i32,
name: String,
}
#[derive(Model)]
#[ormlite(insert = "InsertUser", extra_derives(Serialize, Deserialize))]
pub struct User {
id: i32,
name: String,
#[ormlite(default)]
secret: Option<String>,
#[ormlite(default_value = "5")]
number: i32,
#[ormlite(column = "type")]
ty: i32,
#[ormlite(column = "org_id")]
organization: Join<Organization>,
}
#[derive(Insert)]
#[ormlite(returns = "User")]
pub struct InsertUser2 {
name: String,
number: i32,
#[ormlite(column = "type")]
ty: i32,
org_id: i32,
}
#[tokio::main]
async fn main() {
env_logger::init();
let mut db = ormlite::sqlite::SqliteConnection::connect(":memory:").await.unwrap();
let migration = setup::migrate_self(&[file!()]);
for s in migration.statements {
let sql = s.to_sql(sql::Dialect::Sqlite);
ormlite::query(&sql).execute(&mut db).await.unwrap();
}
let org = Organization {
id: 12321,
name: "my org".to_string(),
};
let champ = InsertUser {
name: "Champ".to_string(),
organization: Join::new(org.clone()),
ty: 12,
}
.insert(&mut db)
.await
.unwrap();
assert_eq!(champ.id, 1);
assert_eq!(champ.secret, None);
assert_eq!(champ.number, 5);
assert_eq!(champ.organization.id, 12321);
assert_eq!(champ.organization.name, "my org");
let champ_copy = InsertUser {
name: "Champ".to_string(),
organization: Join::new(org.clone()),
ty: 12,
};
let champ_json = json!(champ_copy).to_string();
assert_eq!(
champ_json,
r#"{"name":"Champ","organization":{"id":12321,"name":"my org"},"ty":12}"#
);
let champ_deserializing =
serde_json::from_str::<InsertUser>(r#"{"name":"Champ","organization":{"id":12321,"name":"my org"},"ty":12}"#);
let Ok(champ_deserialized) = champ_deserializing else {
panic!("Deserialize failing");
};
assert_eq!(champ_deserialized.name, champ_copy.name);
assert_eq!(champ_deserialized.organization.name, champ_copy.organization.name);
let millie = InsertUser {
name: "Millie".to_string(),
organization: Join::new(org),
ty: 3,
}
.insert(&mut db)
.await
.unwrap();
assert_eq!(millie.id, 2);
assert_eq!(millie.secret, None);
assert_eq!(millie.number, 5);
assert_eq!(millie.organization.id, 12321);
assert_eq!(millie.organization.name, "my org");
let enoki = InsertUser {
name: "Enoki".to_string(),
organization: Join::new_with_id(12321),
ty: 6,
}
.insert(&mut db)
.await
.unwrap();
assert_eq!(enoki.id, 3);
assert_eq!(enoki.secret, None);
assert_eq!(enoki.number, 5);
assert_eq!(enoki.organization.id, 12321);
assert_eq!(enoki.organization.loaded(), false);
let user = InsertUser2 {
name: "Kloud".to_string(),
number: 12,
ty: 8,
org_id: 12321,
}
.insert(&mut db)
.await
.unwrap();
assert_eq!(user.id, 4);
assert_eq!(user.name, "Kloud");
let user = User::fetch_one(4, &mut db).await.unwrap();
assert_eq!(user.id, 4);
assert_eq!(user.name, "Kloud");
assert_eq!(user.ty, 8);
assert_eq!(user.organization.id, 12321);
let orgs = vec![
Organization {
id: 1,
name: "bulk-org1".to_string(),
},
Organization {
id: 2,
name: "bulk-org2".to_string(),
},
Organization {
id: 3,
name: "bulk-org3".to_string(),
},
];
let orgs = Organization::insert_many(orgs, &mut db).await.unwrap();
assert_eq!(orgs.len(), 3);
}