feat(trello): add command 'trello attachement get'

This commit is contained in:
Paul Campbell 2024-12-09 13:45:33 +00:00
parent c0e695c58d
commit ea2b3086fb
6 changed files with 223 additions and 15 deletions

View file

@ -72,7 +72,7 @@ As part of building the import server, the following commands exercise each oper
- [x] trello board get - includes list of stacks
- [x] trello stack get - includes list of cards
- [x] trello card get - includes list of attachments
- [ ] trello attachment get
- [x] trello attachment get - includes download url
- [ ] nextcloud deck get (was board list)
- [ ] nextcloud board get (was stack list)
- [ ] nextcloud stack get (was card list)

View file

@ -0,0 +1,78 @@
{
"id": "65ad94875aed24f70ecdd037",
"bytes": 184198,
"date": "2019-01-02T22:47:17.325Z",
"edgeColor": "#047cbc",
"idMember": "65ad94875aed24f70ecdd038",
"isUpload": true,
"mimeType": null,
"name": "Backlog.png",
"previews": [
{
"id": "65ad94875aed24f70ecdd039",
"_id": "65ad94875aed24f70ecdd039",
"scaled": false,
"url": "https://trello.com/1/cards/65ad94865aed24f70ecdcebb/attachments/65ad94875aed24f70ecdd037/previews/65ad94875aed24f70ecdd039/download/Backlog.png",
"bytes": 1064,
"height": 50,
"width": 70
},
{
"id": "65ad94875aed24f70ecdd03a",
"_id": "65ad94875aed24f70ecdd03a",
"scaled": false,
"url": "https://trello.com/1/cards/65ad94865aed24f70ecdcebb/attachments/65ad94875aed24f70ecdd037/previews/65ad94875aed24f70ecdd03a/download/Backlog.png",
"bytes": 4859,
"height": 150,
"width": 250
},
{
"id": "65ad94875aed24f70ecdd03b",
"_id": "65ad94875aed24f70ecdd03b",
"scaled": true,
"url": "https://trello.com/1/cards/65ad94865aed24f70ecdcebb/attachments/65ad94875aed24f70ecdd037/previews/65ad94875aed24f70ecdd03b/download/Backlog.png",
"bytes": 2721,
"height": 66,
"width": 150
},
{
"id": "65ad94875aed24f70ecdd03c",
"_id": "65ad94875aed24f70ecdd03c",
"scaled": true,
"url": "https://trello.com/1/cards/65ad94865aed24f70ecdcebb/attachments/65ad94875aed24f70ecdd037/previews/65ad94875aed24f70ecdd03c/download/Backlog.png",
"bytes": 5874,
"height": 132,
"width": 300
},
{
"id": "65ad94875aed24f70ecdd03d",
"_id": "65ad94875aed24f70ecdd03d",
"scaled": true,
"url": "https://trello.com/1/cards/65ad94865aed24f70ecdcebb/attachments/65ad94875aed24f70ecdd037/previews/65ad94875aed24f70ecdd03d/download/Backlog.png",
"bytes": 12946,
"height": 264,
"width": 600
},
{
"id": "65ad94875aed24f70ecdd03e",
"_id": "65ad94875aed24f70ecdd03e",
"scaled": true,
"url": "https://trello.com/1/cards/65ad94865aed24f70ecdcebb/attachments/65ad94875aed24f70ecdd037/previews/65ad94875aed24f70ecdd03e/download/Backlog.png",
"bytes": 30062,
"height": 527,
"width": 1200
},
{
"id": "65ad94875aed24f70ecdd03f",
"_id": "65ad94875aed24f70ecdd03f",
"scaled": true,
"url": "https://trello.com/1/cards/65ad94865aed24f70ecdcebb/attachments/65ad94875aed24f70ecdd037/previews/65ad94875aed24f70ecdd03f/download/Backlog.png",
"bytes": 184198,
"height": 3558,
"width": 8100
}
],
"url": "https://trello.com/1/cards/65ad94865aed24f70ecdcebb/attachments/65ad94875aed24f70ecdd037/download/Backlog.png",
"pos": 49152,
"fileName": "Backlog.png"
}

45
src/trello/attachment.rs Normal file
View file

@ -0,0 +1,45 @@
//
use clap::Parser;
use color_eyre::Result;
use crate::{execute::Execute, p, FullCtx};
use super::model::{TrelloAttachmentId, TrelloCardId};
#[derive(Parser, Debug)]
pub(crate) enum TrelloAttachmentCommand {
Get {
#[clap(long, action = clap::ArgAction::SetTrue)]
dump: bool,
card_id: String,
attachment_id: String,
},
}
impl Execute for TrelloAttachmentCommand {
async fn execute(self, ctx: FullCtx) -> Result<()> {
match self {
Self::Get {
dump,
card_id,
attachment_id,
} => {
let api_result = ctx
.trello_client()
.card_attachment(
&TrelloCardId::new(card_id),
&TrelloAttachmentId::new(attachment_id),
)
.await;
if dump {
p!(ctx.prt, "{}", api_result.text);
} else {
let attachment = api_result.result?;
p!(ctx.prt, "{}:{}", attachment.name, attachment.url);
}
Ok(())
}
}
}
}

View file

@ -3,6 +3,7 @@ use std::collections::HashMap;
use kxio::net::{Net, ReqBuilder};
use crate::trello::model::{TrelloAttachment, TrelloAttachmentId};
use crate::{
api_result::APIResult,
f, s,
@ -84,18 +85,18 @@ impl<'ctx> TrelloClient<'ctx> {
.await
}
// // https://developer.atlassian.com/cloud/trello/rest/api-group-cards/#api-cards-id-attachments-idattachment-get
// pub(crate) async fn card_attachment(
// &self,
// card_id: &TrelloCardId,
// attachment_id: &TrelloAttachmentId,
// ) -> APIResult<TrelloAttachment> {
// self.request(
// f!("/cards/{card_id}/attachments/{attachment_id}"),
// |net, url| net.get(url),
// )
// .await
// }
// https://developer.atlassian.com/cloud/trello/rest/api-group-cards/#api-cards-id-attachments-idattachment-get
pub(crate) async fn card_attachment(
&self,
card_id: &TrelloCardId,
attachment_id: &TrelloAttachmentId,
) -> APIResult<TrelloAttachment> {
self.request(
f!("/cards/{card_id}/attachments/{attachment_id}"),
|net, url| net.get(url),
)
.await
}
}
impl TrelloClient<'_> {

View file

@ -4,6 +4,7 @@ use clap::Parser;
use crate::{
execute::Execute,
trello::{
attachment::TrelloAttachmentCommand,
board::TrelloBoardCommand,
card::TrelloCardCommand,
member::TrelloMemberCommand,
@ -16,6 +17,7 @@ use crate::{
FullCtx,
};
pub(crate) mod attachment;
pub(crate) mod board;
pub(crate) mod card;
pub(crate) mod client;
@ -39,6 +41,9 @@ pub(crate) enum TrelloCommand {
#[clap(subcommand)]
Card(TrelloCardCommand),
#[clap(subcommand)]
Attachment(TrelloAttachmentCommand),
}
impl Execute for TrelloCommand {
@ -48,6 +53,7 @@ impl Execute for TrelloCommand {
Self::Board(cmd) => cmd.execute(ctx).await,
Self::Stack(cmd) => cmd.execute(ctx).await,
Self::Card(cmd) => cmd.execute(ctx).await,
Self::Attachment(cmd) => cmd.execute(ctx).await,
}
}
}

View file

@ -1,17 +1,20 @@
//
use kxio::{net::MockNet, net::StatusCode};
use std::collections::HashMap;
use kxio::net::{MockNet, StatusCode};
use crate::{
execute::Execute,
s,
tests::given,
trello::{
attachment::TrelloAttachmentCommand,
card::TrelloCardCommand,
model::{
auth::TrelloAuth, board::TrelloBoard, list::TrelloList, TrelloBoardId, TrelloBoardName,
TrelloListId, TrelloListName,
},
TrelloCommand,
},
Command,
};
@ -112,7 +115,6 @@ mod commands {
mod card {
use super::*;
use crate::trello::TrelloCommand;
#[tokio::test]
async fn get() {
@ -178,6 +180,82 @@ mod commands {
.expect("mock request");
}
}
mod attachments {
use super::*;
mod get {
use super::*;
use crate::trello::TrelloCommand;
#[tokio::test]
async fn get() {
//given
let mock_net = kxio::net::mock();
prep_mock_get(&mock_net);
// let fs = given::a_filesystem();
let ctx = given::a_full_context(mock_net);
let prt = ctx.prt.clone();
let prt = prt.as_test().unwrap();
let command =
Command::Trello(TrelloCommand::Attachment(TrelloAttachmentCommand::Get {
dump: false,
card_id: s!("65ad94865aed24f70ecdcebb"),
attachment_id: s!("65ad94875aed24f70ecdd037"),
}));
//when
command.execute(ctx).await;
//then
let output = prt.output();
assert_eq!(output, s!("Backlog.png:https://trello.com/1/cards/65ad94865aed24f70ecdcebb/attachments/65ad94875aed24f70ecdd037/download/Backlog.png\n"));
}
#[tokio::test]
async fn get_dump() {
//given
let mock_net = kxio::net::mock();
prep_mock_get(&mock_net);
// let fs = given::a_filesystem();
let ctx = given::a_full_context(mock_net);
let prt = ctx.prt.clone();
let prt = prt.as_test().unwrap();
let command =
Command::Trello(TrelloCommand::Attachment(TrelloAttachmentCommand::Get {
dump: true,
card_id: s!("65ad94865aed24f70ecdcebb"),
attachment_id: s!("65ad94875aed24f70ecdd037"),
}));
//when
command.execute(ctx).await;
//then
let output = prt.output();
assert_eq!(
output.trim(),
include_str!("../tests/responses/trello-attachment-get.json").trim()
);
}
fn prep_mock_get(mock_net: &MockNet) {
mock_net
.on()
.get("https://api.trello.com/1/cards/65ad94865aed24f70ecdcebb/attachments/65ad94875aed24f70ecdd037")
.header("authorization", "OAuth oauth_consumer_key=\"trello-api-key\", oauth_token=\"trello-api-secret\"")
.header("accept", "application/json")
.header("content-type", "application/json")
.respond(StatusCode::OK)
.body(include_str!("../tests/responses/trello-attachment-get.json"))
.expect("mock request");
}
}
}
}
#[test]