use serde::{Deserialize, Serialize};
use sqlx::{MySql, Pool, QueryBuilder, Row};
use crate::map;
#[rustfmt::skip]
#[derive(Debug, Clone, Serialize, Deserialize)]
pub struct UsersRecord {
#[serde(skip_serializing_if = "String::is_empty")]
pub user_id: String,
#[serde(skip_serializing_if = "String::is_empty")]
pub resource_id: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub username: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_country: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_phone: Option<String>,
#[serde(skip_serializing_if = "String::is_empty")]
pub nick_name: String,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_status: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_roles: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub login_type: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub password_hash: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_bio: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_maxim: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub real_name: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub gender: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub idno: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_phone_secondary: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_email: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_address: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_linkman: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub user_linkphone: Option<String>,
#[serde(skip_serializing_if = "Option::is_none")]
pub created_at: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_updated_at: Option<u64>,
#[serde(skip_serializing_if = "Option::is_none")]
pub last_login_at: Option<u64>,
}
#[rustfmt::skip]
#[allow(dead_code)]
impl UsersRecord {
pub async fn select_by_primary_key(_client: &crate::core::mysql::MysqlClient, user_id: &str) {
match _client.query_with_rows("user_mapper_select_by_primary_key", Some(&map!("user_id", user_id))).await {
Ok(rows) => {
println!("{:?}", rows);
},
Err(e) => {
println!("{:?}", e);
}
}
}
pub async fn insert(pool: &Pool<MySql>, record: &UsersRecord) -> Result<u64, anyhow::Error> {
let mut query_builder: QueryBuilder<MySql> = QueryBuilder::new(
"INSERT INTO t_users (user_id, resource_id, username, user_country, user_phone, nick_name, user_status, user_roles, login_type, password_hash, user_bio, user_maxim, real_name, gender, idno, user_phone_secondary, user_email, user_address, user_linkman, user_linkphone, created_at, last_updated_at, last_login_at) ",
);
query_builder.push_values([record].iter(), |mut b, record| {
b.push_bind(record.user_id.to_owned());
b.push_bind(record.resource_id.to_owned());
b.push_bind(record.username.to_owned());
b.push_bind(record.user_country.to_owned());
b.push_bind(record.user_phone.to_owned());
b.push_bind(record.nick_name.to_owned());
b.push_bind(record.user_status.to_owned());
b.push_bind(record.user_roles.to_owned());
b.push_bind(record.login_type.to_owned());
b.push_bind(record.password_hash.to_owned());
b.push_bind(record.user_bio.to_owned());
b.push_bind(record.user_maxim.to_owned());
b.push_bind(record.real_name.to_owned());
b.push_bind(record.gender.to_owned());
b.push_bind(record.idno.to_owned());
b.push_bind(record.user_phone_secondary.to_owned());
b.push_bind(record.user_email.to_owned());
b.push_bind(record.user_address.to_owned());
b.push_bind(record.user_linkman.to_owned());
b.push_bind(record.user_linkphone.to_owned());
b.push_bind(record.created_at.to_owned());
b.push_bind(record.last_updated_at.to_owned());
b.push_bind(record.last_login_at.to_owned());
});
let mut transaction = pool.begin().await.map_err(|e| {
log::error!("insert-failed: error={:?}", e);
anyhow::anyhow!(e)
})?;
let last_insert_id = query_builder
.build()
.execute(&mut *transaction)
.await
.map_err(|e| anyhow::anyhow!(e))?
.last_insert_id();
transaction.commit().await.map_err(|e| {
log::error!("insert-failed: error={:?}", e);
anyhow::anyhow!(e)
})?;
Ok(last_insert_id)
}
pub async fn insert_bulk(pool: &Pool<MySql>, data: Vec<UsersRecord>) -> Result<u64, anyhow::Error> {
let mut insert_result_int = 0;
for chunk in data.chunks(5000) {
let mut query_builder: QueryBuilder<MySql> = QueryBuilder::new(
"INSERT INTO t_users (user_id, resource_id, username, user_country, user_phone, nick_name, user_status, user_roles, login_type, password_hash, user_bio, user_maxim, real_name, gender, idno, user_phone_secondary, user_email, user_address, user_linkman, user_linkphone, created_at, last_updated_at, last_login_at) ",
);
query_builder.push_values(chunk.iter().take(5000 / 23), |mut b, record| {
b.push_bind(record.user_id.to_owned());
b.push_bind(record.resource_id.to_owned());
b.push_bind(record.username.to_owned());
b.push_bind(record.user_country.to_owned());
b.push_bind(record.user_phone.to_owned());
b.push_bind(record.nick_name.to_owned());
b.push_bind(record.user_status.to_owned());
b.push_bind(record.user_roles.to_owned());
b.push_bind(record.login_type.to_owned());
b.push_bind(record.password_hash.to_owned());
b.push_bind(record.user_bio.to_owned());
b.push_bind(record.user_maxim.to_owned());
b.push_bind(record.real_name.to_owned());
b.push_bind(record.gender.to_owned());
b.push_bind(record.idno.to_owned());
b.push_bind(record.user_phone_secondary.to_owned());
b.push_bind(record.user_email.to_owned());
b.push_bind(record.user_address.to_owned());
b.push_bind(record.user_linkman.to_owned());
b.push_bind(record.user_linkphone.to_owned());
b.push_bind(record.created_at.to_owned());
b.push_bind(record.last_updated_at.to_owned());
b.push_bind(record.last_login_at.to_owned());
});
insert_result_int += query_builder
.build()
.execute(pool)
.await
.map_err(|e| anyhow::anyhow!(e))?
.rows_affected();
}
Ok(insert_result_int)
}
pub async fn update_by_primary_key(
pool: &Pool<MySql>,
id: &str,
data: &UsersRecord,
) -> Result<bool, anyhow::Error> {
let mut query_builder: QueryBuilder<MySql> = QueryBuilder::new("update t_users");
query_builder.push("set user_id = ");
if data.user_id.trim() != "" {
query_builder.push_bind(data.user_id.trim());
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", resource_id = ");
if data.resource_id.trim() != "" {
query_builder.push_bind(data.resource_id.trim());
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", username = ");
if let Some(_username) = &data.username {
if _username.trim() != "" {
query_builder.push_bind(_username.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", user_country = ");
if let Some(_user_country) = &data.user_country {
if _user_country.trim() != "" {
query_builder.push_bind(_user_country.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", user_phone = ");
if let Some(_user_phone) = &data.user_phone {
if _user_phone.trim() != "" {
query_builder.push_bind(_user_phone.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", nick_name = ");
if data.nick_name.trim() != "" {
query_builder.push_bind(data.nick_name.trim());
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", user_status = ");
if let Some(_user_status) = &data.user_status {
if _user_status.trim() != "" {
query_builder.push_bind(_user_status.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", user_roles = ");
if let Some(_user_roles) = &data.user_roles {
if _user_roles.trim() != "" {
query_builder.push_bind(_user_roles.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", login_type = ");
if let Some(_login_type) = &data.login_type {
if _login_type.trim() != "" {
query_builder.push_bind(_login_type.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", password_hash = ");
if let Some(_password_hash) = &data.password_hash {
if _password_hash.trim() != "" {
query_builder.push_bind(_password_hash.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", user_bio = ");
if let Some(_user_bio) = &data.user_bio {
if _user_bio.trim() != "" {
query_builder.push_bind(_user_bio.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", user_maxim = ");
if let Some(_user_maxim) = &data.user_maxim {
if _user_maxim.trim() != "" {
query_builder.push_bind(_user_maxim.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", real_name = ");
if let Some(_real_name) = &data.real_name {
if _real_name.trim() != "" {
query_builder.push_bind(_real_name.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", gender = ");
if let Some(_gender) = &data.gender {
if _gender.trim() != "" {
query_builder.push_bind(_gender.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", idno = ");
if let Some(_idno) = &data.idno {
if _idno.trim() != "" {
query_builder.push_bind(_idno.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", user_phone_secondary = ");
if let Some(_user_phone_secondary) = &data.user_phone_secondary {
if _user_phone_secondary.trim() != "" {
query_builder.push_bind(_user_phone_secondary.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", user_email = ");
if let Some(_user_email) = &data.user_email {
if _user_email.trim() != "" {
query_builder.push_bind(_user_email.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", user_address = ");
if let Some(_user_address) = &data.user_address {
if _user_address.trim() != "" {
query_builder.push_bind(_user_address.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", user_linkman = ");
if let Some(_user_linkman) = &data.user_linkman {
if _user_linkman.trim() != "" {
query_builder.push_bind(_user_linkman.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", user_linkphone = ");
if let Some(_user_linkphone) = &data.user_linkphone {
if _user_linkphone.trim() != "" {
query_builder.push_bind(_user_linkphone.trim());
} else {
query_builder.push_bind(None::<String>);
}
} else {
query_builder.push_bind(None::<String>);
}
query_builder.push(", created_at = ");
if let Some(_created_at) = &data.created_at {
query_builder.push_bind(_created_at);
} else {
query_builder.push_bind(None::<i64>);
}
query_builder.push(", last_updated_at = ");
if let Some(_last_updated_at) = &data.last_updated_at {
query_builder.push_bind(_last_updated_at);
} else {
query_builder.push_bind(None::<i64>);
}
query_builder.push(", last_login_at = ");
if let Some(_last_login_at) = &data.last_login_at {
query_builder.push_bind(_last_login_at);
} else {
query_builder.push_bind(None::<i64>);
}
query_builder.push(" where id = ");
query_builder.push_bind(id);
let update_result_int = query_builder
.build()
.execute(pool)
.await
.map_err(|e| anyhow::anyhow!(e))?
.rows_affected();
Ok(update_result_int > 0)
}
pub fn from_row(row: sqlx::mysql::MySqlRow) -> Result<Option<UsersRecord>, anyhow::Error> {
if row.is_empty() { return Ok(None); }
Ok(Some(UsersRecord {
user_id: row.try_get("user_id")?,
resource_id: row.try_get("resource_id")?,
username: row.try_get("username")?,
user_country: row.try_get("user_country")?,
user_phone: row.try_get("user_phone")?,
nick_name: row.try_get("nick_name")?,
user_status: row.try_get("user_status")?,
user_roles: row.try_get("user_roles")?,
login_type: row.try_get("login_type")?,
password_hash: row.try_get("password_hash")?,
user_bio: row.try_get("user_bio")?,
user_maxim: row.try_get("user_maxim")?,
real_name: row.try_get("real_name")?,
gender: row.try_get("gender")?,
idno: row.try_get("idno")?,
user_phone_secondary: row.try_get("user_phone_secondary")?,
user_email: row.try_get("user_email")?,
user_address: row.try_get("user_address")?,
user_linkman: row.try_get("user_linkman")?,
user_linkphone: row.try_get("user_linkphone")?,
created_at: row.try_get("created_at")?,
last_updated_at: row.try_get("last_updated_at")?,
last_login_at: row.try_get("last_login_at")?,
}))
}
}