grain.social is a photo sharing platform built on atproto.
1import { stringifyLex } from "npm:@atproto/lexicon";
2import type { LabelRow } from "./main.ts";
3import {
4 createConfig,
5 createDb,
6 createLabel,
7 createModService,
8 ModService,
9} from "./main.ts";
10
11async function handleCreate(
12 args: string[],
13 cfg: Awaited<ReturnType<typeof createConfig>>,
14 modService: ModService,
15) {
16 const [src, uri, val, negArg] = args;
17 if (!src || !uri || !val) {
18 console.error("Usage: deno run -A bin.ts create <src> <uri> <val> [neg]");
19 Deno.exit(1);
20 }
21 const neg = negArg === "true" || negArg === "1";
22 const doCreateLabel = createLabel(cfg, modService);
23 await doCreateLabel({
24 src,
25 uri,
26 val,
27 neg,
28 cts: new Date().toISOString(),
29 });
30 console.log(
31 `Label created for src: ${src}, uri: ${uri}, val: ${val}, neg: ${neg}`,
32 );
33}
34
35function parseQueryArgs(args: string[]) {
36 let src = "";
37 let val = "";
38 let limit = 50;
39 let cursor = 0;
40 const patterns: string[] = [];
41 let i = 0;
42 while (i < args.length) {
43 if (args[i] === "--src" && args[i + 1]) {
44 src = args[i + 1];
45 i += 2;
46 continue;
47 }
48 if (args[i] === "--val" && args[i + 1]) {
49 val = args[i + 1];
50 i += 2;
51 continue;
52 }
53 if (args[i] === "--limit" && args[i + 1]) {
54 limit = parseInt(args[i + 1], 10);
55 i += 2;
56 continue;
57 }
58 if (args[i] === "--cursor" && args[i + 1]) {
59 cursor = parseInt(args[i + 1], 10);
60 i += 2;
61 continue;
62 }
63 i++;
64 }
65 return { src, val, limit, cursor, patterns };
66}
67
68function handleQuery(args: string[], modService: ModService) {
69 // Usage: deno run -A bin.ts query [--src <src>] [--val <val>] [--limit <n>] [--cursor <id>]
70 const { src, val, limit, cursor, patterns } = parseQueryArgs(args);
71 const sources = src ? [src] : [];
72 // If val is set, filter in JS after query
73 const { rows } = modService.getLabels({ patterns, sources, limit, cursor });
74 const filtered = val ? rows.filter((r: LabelRow) => r.val === val) : rows;
75 for (const row of filtered) {
76 console.log(stringifyLex(row));
77 }
78}
79
80async function main() {
81 const [cmd, ...args] = Deno.args;
82 if (!cmd || ["create", "query"].indexOf(cmd) === -1) {
83 console.error("Usage: deno run -A bin.ts <create|query> [...args]");
84 Deno.exit(1);
85 }
86 const cfg = await createConfig();
87 const db = createDb(cfg);
88 const modService = createModService(db);
89
90 if (cmd === "create") {
91 await handleCreate(args, cfg, modService);
92 } else if (cmd === "query") {
93 handleQuery(args, modService);
94 }
95}
96
97if (import.meta.main) {
98 main();
99}