add assign + login
This commit is contained in:
parent
c2944722dd
commit
b046374280
4 changed files with 85 additions and 2 deletions
|
@ -259,4 +259,46 @@ impl VikunjaAPI {
|
||||||
);
|
);
|
||||||
serde_json::from_str(&resp).unwrap()
|
serde_json::from_str(&resp).unwrap()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pub fn login(&self, username: &str, password: &str, totp: Option<&str>) -> String {
|
||||||
|
let resp = self.post_request(
|
||||||
|
"/login",
|
||||||
|
&serde_json::json!({
|
||||||
|
"username": username,
|
||||||
|
"password": password,
|
||||||
|
"totp_passcode": totp
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
|
||||||
|
let val: serde_json::Value = serde_json::from_str(&resp).unwrap();
|
||||||
|
val.as_object()
|
||||||
|
.unwrap()
|
||||||
|
.get("token")
|
||||||
|
.unwrap()
|
||||||
|
.as_str()
|
||||||
|
.unwrap()
|
||||||
|
.to_string()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn search_user(&self, search: &str) -> Option<Vec<User>> {
|
||||||
|
let resp = self.get_request(&format!("/users?s={search}"));
|
||||||
|
serde_json::from_str(&resp).ok()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn assign_to_task(&self, user: &str, task_id: isize) {
|
||||||
|
let user = self.search_user(user).unwrap();
|
||||||
|
|
||||||
|
self.put_request(
|
||||||
|
&format!("/tasks/{task_id}/assignees"),
|
||||||
|
&serde_json::json!({
|
||||||
|
"user_id": user.first().unwrap().id
|
||||||
|
}),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn remove_assign_to_task(&self, user: &str, task_id: isize) {
|
||||||
|
let user = self.search_user(user).unwrap();
|
||||||
|
let user_id = user.first().unwrap().id;
|
||||||
|
self.delete_request(&format!("/tasks/{task_id}/assignees/{user_id}"));
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
16
src/args.rs
16
src/args.rs
|
@ -32,6 +32,22 @@ pub fn get_args() -> clap::ArgMatches {
|
||||||
.default_value("Inbox"),
|
.default_value("Inbox"),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
.subcommand(
|
||||||
|
command!()
|
||||||
|
.name("login")
|
||||||
|
.about("Get a JWT Token for authentication")
|
||||||
|
.arg(arg!(-u --username <username> "Username").required(true))
|
||||||
|
.arg(arg!(-p --password <password> "Password").required(true))
|
||||||
|
.arg(arg!(--totp <totp> "TOTP Code").required(false)),
|
||||||
|
)
|
||||||
|
.subcommand(
|
||||||
|
command!()
|
||||||
|
.name("assign")
|
||||||
|
.about("Assign a user to a task")
|
||||||
|
.arg(arg!(-u --undo "Remove label from task").required(false))
|
||||||
|
.arg(arg!([user] "User").required(true))
|
||||||
|
.arg(arg!([task_id] "Task ID").required(true)),
|
||||||
|
)
|
||||||
.subcommand(
|
.subcommand(
|
||||||
command!()
|
command!()
|
||||||
.name("label")
|
.name("label")
|
||||||
|
|
19
src/main.rs
19
src/main.rs
|
@ -16,6 +16,14 @@ fn main() {
|
||||||
let task_id: &String = task_info_arg.get_one("task_id").unwrap();
|
let task_id: &String = task_info_arg.get_one("task_id").unwrap();
|
||||||
ui::task::print_task_info(task_id.parse().unwrap(), &api);
|
ui::task::print_task_info(task_id.parse().unwrap(), &api);
|
||||||
}
|
}
|
||||||
|
Some(("login", login_arg)) => {
|
||||||
|
let username: &String = login_arg.get_one("username").unwrap();
|
||||||
|
let password: &String = login_arg.get_one("password").unwrap();
|
||||||
|
let totp: Option<&String> = login_arg.get_one("totp");
|
||||||
|
|
||||||
|
let token = api.login(username, password, totp.map(|x| x.as_str()));
|
||||||
|
println!("\"token\" = \"{token}\"");
|
||||||
|
}
|
||||||
Some(("prj", prj_arg)) => match prj_arg.subcommand() {
|
Some(("prj", prj_arg)) => match prj_arg.subcommand() {
|
||||||
Some(("ls", _)) => {
|
Some(("ls", _)) => {
|
||||||
ui::project::list_projects(&api);
|
ui::project::list_projects(&api);
|
||||||
|
@ -25,6 +33,17 @@ fn main() {
|
||||||
ui::project::list_projects(&api);
|
ui::project::list_projects(&api);
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
Some(("assign", assign_arg)) => {
|
||||||
|
let user: &String = assign_arg.get_one("user").unwrap();
|
||||||
|
let task_id: &String = assign_arg.get_one("task_id").unwrap();
|
||||||
|
let undo = assign_arg.get_flag("undo");
|
||||||
|
|
||||||
|
if undo {
|
||||||
|
api.remove_assign_to_task(user, task_id.parse().unwrap());
|
||||||
|
} else {
|
||||||
|
api.assign_to_task(user, task_id.parse().unwrap());
|
||||||
|
}
|
||||||
|
}
|
||||||
Some(("labels", label_args)) => match label_args.subcommand() {
|
Some(("labels", label_args)) => match label_args.subcommand() {
|
||||||
Some(("ls", _)) => {
|
Some(("ls", _)) => {
|
||||||
ui::print_all_labels(&api);
|
ui::print_all_labels(&api);
|
||||||
|
|
|
@ -135,7 +135,13 @@ pub fn print_task_info(task_id: isize, api: &VikunjaAPI) {
|
||||||
println!("---\n{}", task.description);
|
println!("---\n{}", task.description);
|
||||||
}
|
}
|
||||||
|
|
||||||
//pub assignees: Option<Vec<String>>,
|
if let Some(assigned) = task.assignees {
|
||||||
//pub labels: Option<Vec<Label>>,
|
print!("Assigned to: ");
|
||||||
|
for assignee in assigned {
|
||||||
|
print!("{} ", assignee.username);
|
||||||
|
}
|
||||||
|
println!();
|
||||||
|
}
|
||||||
|
|
||||||
// pub percent_done: f64,
|
// pub percent_done: f64,
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue