feat(backend): avatar migration stuff

This commit is contained in:
sam 2025-04-17 16:05:26 +02:00
parent bcdb2f9540
commit 77e74dd331
Signed by: sam
GPG key ID: B4EF20DDE721CAA1
15 changed files with 2094 additions and 0 deletions

View file

@ -0,0 +1,82 @@
// TODO: i'm not even sure if this code works. it's not easy to test either. woops
import postgres from "postgres";
import { config } from "dotenv";
import { Client } from "minio";
import { Logger } from "tslog";
import axios from "axios";
config();
const log = new Logger();
const env = (key) => {
const value = process.env[key];
if (value) return value;
throw `No env variable with key $${key} found`;
};
const oldBaseUrl = env("OLD_BASE_URL");
const bucket = env("MINIO_BUCKET");
const sql = postgres(env("DATABASE_URL"));
const minio = new Client({
endPoint: env("MINIO_ENDPOINT"),
useSSL: true,
accessKey: env("MINIO_ACCESS_KEY"),
secretKey: env("MINIO_SECRET_KEY"),
});
const users =
await sql`select id::text, username, legacy_id, avatar from users where avatar is not null order by id asc`;
log.info("have to migrate %d users", users.length);
const migrate = async (user) => {
log.debug(
"copying /users/%s/%s.webp to /users/%s/avatars/%s.webp",
user.legacy_id,
user.avatar,
user.id,
user.avatar
);
try {
const file = await axios.get(
`${oldBaseUrl}/users/${user.legacy_id}/${user.avatar}.webp`,
{ responseType: "stream" }
);
await minio.putObject(
bucket,
`users/${user.id}/avatars/${user.avatar}.webp`,
file.data,
file.headers["Content-Length"]
);
log.info("copied avatar for user %s", user.id);
await sql`update users set avatar_migrated = true where id = ${user.id}::bigint`;
} catch (e) {
if ("status" in e && e.status === 404) {
log.warn(
"avatar for user %s/%s is not found. marking it as migrated.",
user.id,
user.username
);
await sql`update users set avatar_migrated = true where id = ${user.id}::bigint`;
return;
}
log.error(
"could not migrate avatar for user %s/%s:",
user.id,
user.username,
e
);
}
};
for (let index = 0; index < users.length; index++) {
const user = users[index];
await migrate(user);
}
log.info("all users migrated!");
process.exit();