feat(nextcloud): DeckClient hold reference to FullCtx

given a full context
This commit is contained in:
Paul Campbell 2024-12-07 18:11:24 +00:00
parent ae0d1b2649
commit 10e6bcf982
2 changed files with 90 additions and 30 deletions

View file

@ -1,9 +1,5 @@
//
use kxio::net::Net;
use kxio::print::Printer;
use crate::api_result::APIResult;
use crate::{config::NextcloudConfig, f};
use crate::{api_result::APIResult, f, FullCtx};
use crate::nextcloud::model::{NextcloudHostname, NextcloudPassword, NextcloudUsername};
use model::{Board, Card, NextcloudBoardId, Stack};
@ -13,21 +9,19 @@ pub mod model;
#[cfg(test)]
mod tests;
pub(crate) struct DeckClient<'cfg> {
net: Net,
prt: Printer,
hostname: &'cfg NextcloudHostname,
username: &'cfg NextcloudUsername,
password: &'cfg NextcloudPassword,
pub(crate) struct DeckClient<'ctx> {
ctx: &'ctx FullCtx,
hostname: &'ctx NextcloudHostname,
username: &'ctx NextcloudUsername,
password: &'ctx NextcloudPassword,
}
impl<'cfg> DeckClient<'cfg> {
pub fn new(cfg: &'cfg NextcloudConfig, net: Net, prt: Printer) -> Self {
impl<'ctx> DeckClient<'ctx> {
pub fn new(ctx: &'ctx FullCtx) -> Self {
Self {
net,
prt,
hostname: &cfg.hostname,
username: &cfg.username,
password: &cfg.password,
ctx,
hostname: &ctx.cfg.nextcloud.hostname,
username: &ctx.cfg.nextcloud.username,
password: &ctx.cfg.nextcloud.password,
}
}
@ -41,26 +35,63 @@ impl<'cfg> DeckClient<'cfg> {
pub async fn get_boards(&self) -> APIResult<Vec<Board>> {
APIResult::new(
self.net
self.ctx
.net
.get(self.url("boards"))
.basic_auth(self.username.as_str(), Some(self.password.as_str()))
.header("accept", "application/json")
.send()
.await,
&self.prt,
&self.ctx.prt,
)
.await
}
pub async fn get_board(&self, board_id: NextcloudBoardId) -> APIResult<Board> {
APIResult::new(
self.ctx
.net
.get(self.url(f!("boards/{board_id}")))
.basic_auth(self.username.as_str(), Some(self.password.as_str()))
.header("accept", "application/json")
.send()
.await,
&self.ctx.prt,
)
.await
}
pub async fn create_board(&self, title: &str, color: &str) -> APIResult<Board> {
APIResult::new(
self.ctx
.net
.post(self.url("boards"))
.basic_auth(self.username.as_str(), Some(self.password.as_str()))
.header("accept", "application/json")
.body(
serde_json::json!({
"title": title,
"color": color
})
.to_string(),
)
.send()
.await,
&self.ctx.prt,
)
.await
}
pub async fn get_stacks(&self, board_id: NextcloudBoardId) -> APIResult<Vec<Stack>> {
APIResult::new(
self.net
self.ctx
.net
.get(self.url(f!("boards/{board_id}/stacks")))
.basic_auth(self.username.as_str(), Some(self.password.as_str()))
.header("accept", "application/json")
.send()
.await,
&self.prt,
&self.ctx.prt,
)
.await
}
@ -86,14 +117,15 @@ impl<'cfg> DeckClient<'cfg> {
}
APIResult::new(
self.net
self.ctx
.net
.post(&url)
.basic_auth(self.username.as_str(), Some(self.password.as_str()))
.header("accept", "application/json")
.body(json.to_string())
.send()
.await,
&self.prt,
&self.ctx.prt,
)
.await
}

View file

@ -139,8 +139,9 @@ mod client {
)
.expect("mock request");
let cfg = given::a_nextcloud_config();
let deck_client = DeckClient::new(&cfg, mock_net.into(), given::a_printer());
let fs = given::a_filesystem();
let ctx = given::a_full_context(mock_net, fs);
let deck_client = DeckClient::new(&ctx);
//when
let result = deck_client.get_boards().await.result.expect("get boards");
@ -181,12 +182,13 @@ mod client {
.body(include_str!("../tests/responses/nextcloud-stack-list.json"))
.expect("mock request");
let cfg = given::a_nextcloud_config();
let deck_client = DeckClient::new(&cfg, mock_net.into(), given::a_printer());
let fs = given::a_filesystem();
let ctx = given::a_full_context(mock_net, fs);
let deck_client = DeckClient::new(&ctx);
//when
let result = deck_client
.get_stacks(cfg.board_id)
.get_stacks(ctx.cfg.nextcloud.board_id)
.await
.result
.expect("get stacks");
@ -221,7 +223,9 @@ mod client {
}
mod given {
use kxio::print::Printer;
use kxio::{fs::TempFileSystem, net::MockNet, print::Printer};
use crate::{config::TrelloConfig, s, AppConfig, FullCtx};
use super::*;
@ -241,4 +245,28 @@ mod given {
pub fn a_printer() -> Printer {
kxio::print::test()
}
pub(crate) fn a_filesystem() -> TempFileSystem {
kxio::fs::temp().expect("temp fs")
}
pub(crate) fn a_trello_config() -> TrelloConfig {
TrelloConfig {
api_key: s!("trello-api-key").into(),
api_secret: s!("trello-api-secret").into(),
board_name: s!("trello-board-name").into(),
}
}
pub(crate) fn a_full_context(mock_net: MockNet, fs: TempFileSystem) -> FullCtx {
FullCtx {
fs: fs.as_real(),
net: mock_net.into(),
prt: given::a_printer(),
cfg: AppConfig {
trello: given::a_trello_config(),
nextcloud: given::a_nextcloud_config(),
},
}
}
}