import { Command } from "commander"; import "dotenv/config"; import * as admin from "firebase-admin"; import * as moment from "moment-timezone"; interface ExportUserCommandArguments { startDate: string; } if (process.env.GOOGLE_APPLICATION_CREDENTIALS == null) { throw new Error("credential not found"); } const serviceAccount = require(process.env.GOOGLE_APPLICATION_CREDENTIALS!); admin.initializeApp({ credential: admin.credential.cert(serviceAccount), }); const program = new Command(); program.option("-s, --start-date ", "export start date").parse(process.argv); const args = program.opts() as ExportUserCommandArguments; if (args.startDate == null || !args.startDate) { throw new Error("Invalid start date"); } const startDate = moment.tz(args.startDate, "YYYY-MM-DDTHH:mm:ssZ"); function formatDate(dt: Date) { return ( [ dt.getHours().toString().padStart(2, "0"), dt.getMinutes().toString().padStart(2, "0"), dt.getSeconds().toString().padStart(2, "0"), ].join(":") + "." + dt.getMilliseconds().toString().padStart(3, "0") ); } async function execute(startTs: admin.firestore.Timestamp) { const db = admin.firestore(); const useres = db.collection("/users").where("createdAt", ">", startTs).orderBy("createdAt", "desc"); const useresSs = await useres.get(); useresSs.forEach((row) => { const rowData = row.data() as { name?: string; id: string; createdAt: admin.firestore.Timestamp; }; if (rowData.name == null) return; const dt = rowData.createdAt.toDate(); console.log([row.id, rowData.name, formatDate(dt)].join("\t")); }); } console.log(`dump users from ${startDate.toLocaleString()}.`); execute(admin.firestore.Timestamp.fromDate(startDate.toDate()));