Files
api.personalink/app/controllers/backups_controller.js
2026-05-13 16:00:07 +02:00

67 lines
3.2 KiB
JavaScript

import BrandColor from '#models/brand_color';
import BrandFont from '#models/brand_font';
import Fanart from '#models/fanart';
import Game from '#models/game';
import Profile from '#models/profile';
import SocialLink from '#models/social_link';
import Tag from '#models/tag';
export default class BackupsController {
async export({ response }) {
const [profile, tags, games, socialLinks, fanarts, brandColors, brandFonts] = await Promise.all([
Profile.first(),
Tag.all(),
Game.query().orderBy('sort_order', 'asc'),
SocialLink.all(),
Fanart.query().orderBy('sort_order', 'asc'),
BrandColor.all(),
BrandFont.all(),
]);
return response.json({
version: 1,
exportedAt: new Date().toISOString(),
profile: profile?.serialize(),
tags: tags.map((t) => ({ name: t.name })),
games: games.map((g) => ({ name: g.name, icon: g.icon, type: g.type, sortOrder: g.sortOrder })),
socialLinks: socialLinks.map((s) => ({ platform: s.platform, url: s.url, username: s.username, icon: s.icon, color: s.color })),
fanarts: fanarts.map((f) => ({ title: f.title, author: f.author, imageUrl: f.imageUrl, sortOrder: f.sortOrder })),
brand: {
colors: brandColors.map((c) => ({ name: c.name, hex: c.hex })),
fonts: brandFonts.map((f) => ({ name: f.name })),
},
});
}
async restore({ request, response }) {
const backup = request.body();
if (backup.profile) {
await Profile.truncate();
const { name, avatarUrl, title, description, aboutText, backgroundImageUrl } = backup.profile;
await Profile.create({ name, avatarUrl, title, description, aboutText, backgroundImageUrl });
}
if (Array.isArray(backup.tags)) {
await Tag.truncate();
await Tag.createMany(backup.tags.map((t) => ({ name: t.name })));
}
if (Array.isArray(backup.games)) {
await Game.truncate();
await Game.createMany(backup.games.map((g) => ({ name: g.name, icon: g.icon, type: g.type, sortOrder: g.sortOrder })));
}
if (Array.isArray(backup.socialLinks)) {
await SocialLink.truncate();
await SocialLink.createMany(backup.socialLinks.map((s) => ({ platform: s.platform, url: s.url, username: s.username, icon: s.icon, color: s.color })));
}
if (Array.isArray(backup.fanarts)) {
await Fanart.truncate();
await Fanart.createMany(backup.fanarts.map((f) => ({ title: f.title, author: f.author, imageUrl: f.imageUrl, sortOrder: f.sortOrder })));
}
if (backup.brand?.colors) {
await BrandColor.truncate();
await BrandColor.createMany(backup.brand.colors.map((c) => ({ name: c.name, hex: c.hex })));
}
if (backup.brand?.fonts) {
await BrandFont.truncate();
await BrandFont.createMany(backup.brand.fonts.map((f) => ({ name: f.name })));
}
return response.json({ success: true, restoredAt: new Date().toISOString() });
}
}
//# sourceMappingURL=backups_controller.js.map