1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
use csv;
use diesel::prelude::*;
use diesel::MysqlConnection;
use dotenv::dotenv;
use log::debug;
use log::error;
use log::info;
use serde::Deserialize;
use serde::Serialize;
use webdev_lib::users::models::{NewUser, UserRequest};
use webdev_lib::users::requests;
#[derive(Serialize, Deserialize, Debug)]
struct CsvUser {
#[serde(rename = "Banner ID")]
banner_id: i32,
#[serde(rename = "Last Name")]
last_name: String,
#[serde(rename = "First Name")]
first_name: String,
#[serde(rename = "Email")]
email: String,
#[serde(rename = "Year")]
year: String,
#[serde(rename = "Department")]
department: String,
}
fn main() {
dotenv().ok();
simplelog::TermLogger::init(simplelog::LevelFilter::Trace, simplelog::Config::default())
.unwrap();
info!("Connecting to database");
let database_url = match env::var("DATABASE_URL") {
Ok(url) => url,
Err(_e) => {
error!("Could not read DATABASE_URL environment variable");
return;
}
};
debug!("Connecting to {}", database_url);
let connection = match MysqlConnection::establish(&database_url) {
Ok(c) => c,
Err(e) => {
error!("Could not connect to database: {}", e);
return;
}
};
debug!("Connected to database");
use std::env;
let arg = env::args().next();
let filename = match arg {
Some(name) => name,
None => {
error!("Needs a filename");
return;
}
};
debug!("{}", filename);
let mut user_count = 0;
let all_users_result = csv::Reader::from_path(filename);
let mut all_users = match all_users_result {
Ok(data) => data,
Err(e) => {
error!("Bad file. Error {}", e);
return;
}
};
for result in all_users.deserialize() {
let csv_user: CsvUser = match result {
Ok(data) => data,
Err(e) => {
error!("Bad data, {:?}", e);
return;
}
};
let new_user: NewUser = NewUser {
first_name: csv_user.first_name,
last_name: csv_user.last_name,
email: csv_user.email,
banner_id: csv_user.banner_id as u32,
permissions: Vec::new(),
};
let import_user = UserRequest::CreateUser(new_user);
requests::handle_user(import_user, Some(0), &connection).unwrap();
user_count = user_count + 1;
}
info!("Imported {} user(s)", user_count);
}