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
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
|
import { getGlobalOptions } from "@/lib/globals";
import {
printError,
printErrorMessageWithReason,
printObject,
printSuccess,
} from "@/lib/output";
import { getAPIClient } from "@/lib/trpc";
import { Command } from "@commander-js/extra-typings";
import { getBorderCharacters, table } from "table";
import { listsToTree } from "@hoarder/shared/utils/listUtils";
export const listsCmd = new Command()
.name("lists")
.description("manipulating lists");
listsCmd
.command("list")
.description("lists all lists")
.action(async () => {
const api = getAPIClient();
try {
const resp = await api.lists.list.query();
if (getGlobalOptions().json) {
printObject(resp);
} else {
const { allPaths } = listsToTree(resp.lists);
const data: string[][] = [["Id", "Name"]];
allPaths.forEach((path) => {
const name = path.map((p) => `${p.icon} ${p.name}`).join(" / ");
const id = path[path.length - 1].id;
data.push([id, name]);
});
console.log(
table(data, {
border: getBorderCharacters("ramac"),
singleLine: true,
}),
);
}
} catch (error) {
printErrorMessageWithReason("Failed to list all lists", error as object);
}
});
listsCmd
.command("delete")
.description("deletes a list")
.argument("<id>", "the id of the list")
.action(async (id) => {
const api = getAPIClient();
await api.lists.delete
.mutate({
listId: id,
})
.then(printSuccess(`Successfully deleted list with id "${id}"`))
.catch(printError(`Failed to delete list with id "${id}"`));
});
export async function addToList(listId: string, bookmarkId: string) {
const api = getAPIClient();
await api.lists.addToList
.mutate({
listId,
bookmarkId,
})
.then(
printSuccess(
`Successfully added bookmark "${bookmarkId}" to list with id "${listId}"`,
),
)
.catch(
printError(
`Failed to add bookmark "${bookmarkId}" to list with id "${listId}"`,
),
);
}
listsCmd
.command("get")
.description("gets all the ids of the bookmarks assigned to the list")
.requiredOption("--list <id>", "the id of the list")
.action(async (opts) => {
const api = getAPIClient();
try {
let resp = await api.bookmarks.getBookmarks.query({ listId: opts.list });
let results: string[] = resp.bookmarks.map((b) => b.id);
while (resp.nextCursor) {
resp = await api.bookmarks.getBookmarks.query({
listId: opts.list,
cursor: resp.nextCursor,
});
results = [...results, ...resp.bookmarks.map((b) => b.id)];
}
printObject(results);
} catch (error) {
printErrorMessageWithReason(
"Failed to get the ids of the bookmarks in the list",
error as object,
);
}
});
listsCmd
.command("add-bookmark")
.description("add a bookmark to list")
.requiredOption("--list <id>", "the id of the list")
.requiredOption("--bookmark <bookmark>", "the id of the bookmark")
.action(async (opts) => {
await addToList(opts.list, opts.bookmark);
});
listsCmd
.command("remove-bookmark")
.description("remove a bookmark from list")
.requiredOption("--list <id>", "the id of the list")
.requiredOption("--bookmark <bookmark>", "the id of the bookmark")
.action(async (opts) => {
const api = getAPIClient();
await api.lists.removeFromList
.mutate({
listId: opts.list,
bookmarkId: opts.bookmark,
})
.then(
printSuccess(
`Successfully removed bookmark "${opts.bookmark}" from list with id "${opts.list}"`,
),
)
.catch(
printError(
`Failed to remove bookmark "${opts.bookmark}" from list with id "${opts.list}"`,
),
);
});
|