diff --git a/.gitignore b/.gitignore index 2f98d2a..3eaf1d2 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ node_modules # Database stuff db/**/*.db* +users_export.json # Test stuff /coverage diff --git a/scripts/export_users.js b/scripts/export_users.js new file mode 100755 index 0000000..15fee27 --- /dev/null +++ b/scripts/export_users.js @@ -0,0 +1,11 @@ +const fs = require("fs").promises +const pj = require("path").join +const db = require("../src/lib/db") + +;(async () => { + const users = db.prepare("SELECT * FROM Users").all() + const targetDir = process.argv.slice(2).includes("--publish") ? "../src/site/html" : ".." + const target = pj(__dirname, targetDir, "users_export.json") + fs.writeFile(target, JSON.stringify(users), {encoding: "utf8"}) + console.log(`Users exported to ${target}`) +})() diff --git a/scripts/import_users.js b/scripts/import_users.js new file mode 100644 index 0000000..84abd3a --- /dev/null +++ b/scripts/import_users.js @@ -0,0 +1,33 @@ +const fs = require("fs").promises +const pj = require("path").join +const db = require("../src/lib/db") +const {request} = require("../src/lib/utils/request") + +;(async () => { + const target = process.argv[2] + if (!target) { + console.log("Provide the file or URL to import from on the command line.") + process.exit(1) + } + if (target.match(/^https?:\/\//)) { + var usersString = await request(target).then(res => res.text()) + } else { + var usersString = await fs.readFile(target, {encoding: "utf8"}) + } + /** @type {{username: string, user_id: string, created: number, updated: number, updated_version: number, biography: string, post_count: number, following_count: number, followed_by_count: number, external_url: string, full_name: string, is_private: number, is_verified: number, profile_pic_url: string}[]} */ + const users = JSON.parse(usersString) + let newCount = 0 + let overwrittenCount = 0 + db.transaction(() => { + for (const user of users) { + const existing = db.prepare("SELECT user_id FROM Users WHERE username = ?").get(user.username) + db.prepare( + "REPLACE INTO Users (username, user_id, created, updated, updated_version, biography, post_count, following_count, followed_by_count, external_url, full_name, is_private, is_verified, profile_pic_url) VALUES " + +"(@username, @user_id, @created, @updated, @updated_version, @biography, @post_count, @following_count, @followed_by_count, @external_url, @full_name, @is_private, @is_verified, @profile_pic_url)" + ).run(user) + if (existing) overwrittenCount++ + else newCount++ + } + })() + console.log(`Imported ${users.length} entries (${newCount} new, ${overwrittenCount} overwritten)`) +})()