grain.social is a photo sharing platform built on atproto.
at main 2.6 kB view raw
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}