/* import path from 'path' import fs from 'fs' import { PrismaClient } from '@prisma/client' import { hash, encryption } from '../src/utils/crypto.mjs' import { clean } from '../src/utils/index.mjs' import { verifyConfig } from '../src/config.mjs' const config = verifyConfig() // // Note: This is not intended to work for you // // This script imports a raw database dump of the current (v2) // FreeSewing backend and writes it to JSON. // // This is not the kind of thing you should try to run yourself // because for one thing you do not have a raw database dump // // Dumped data folder const dir = '/home/joost/' let data // Dump filtered data from raw data const file = 'freesewing-dump.json' data = filterData(JSON.parse(fs.readFileSync(path.resolve(dir, file), { encoding: 'utf-8' }))) console.log(JSON.stringify(data, null, 2)) // // Only migrate user data if the user was active in the last 12 months // Unless they are patrons. Keep patrons regardless coz patrons rock. // function filterData(data) { let i = 0 const filtered = { totals: { users: Object.keys(data.users).length, people: Object.keys(data.people).length, patterns: Object.keys(data.patterns).length, subscribers: Object.keys(data.subscribers).length, }, users: {}, people: {}, patterns: {}, subscribers: [], } for (const user of data.users) { const migrated = migrateUser(user) if (migrated) { i++ filtered.users[migrated.handle] = migrated } } const users = Object.keys(filtered.users) for (const person of data.people) { if (users.includes(person.user)) filtered.people[person.handle] = migratePerson(person) } for (const pattern of data.patterns) { if (users.includes(pattern.user)) filtered.patterns[pattern.handle] = migratePattern(pattern) } for (const sub of data.subscribers) { filtered.subscribers.push(migrateSubscriber(sub)) } return filtered } // // Migrates role field // function getRole(entry) { if (entry.handle === 'joost') return 'admin' if (entry.patron > 0) return 'patron' return 'user' } // // Migrates consent field // function getConsent(entry) { let consent = 0 if (entry.consent.profile) consent++ if (entry.consent.model) consent++ if (entry.consent.openData) consent++ return consent } // // Migrates user entry // function migrateUser(entry) { const now = Date.now() const lastLogin = new Date(entry.time?.login || 0) const daysSince = Math.floor((now - lastLogin) / (1000 * 3600 * 24)) // FreeSewing's privacy policy says we'll keep your data 12 months // so if last login is longer than that, we won't migrate the account if (daysSince > 366) return false return { data: { settings: entry.settings, social: entry.social, bio: entry.bio, img: entry.img, }, consent: getConsent(entry), patron: entry.patron, status: 1, handle: entry.handle, username: entry.username, role: getRole(entry), ehash: entry.ehash, password: entry.password, createdAt: entry.createdAt, email: entry.email, initial: entry.initial, newsletter: entry.newsletter, img: entry.img, lastLogin, } } // // Migrates person entry // function migratePerson(entry) { return { user: entry.user, units: entry.units, name: entry.name, handle: entry.handle, img: entry.img, data: { notes: entry.notes, units: entry.units }, measurements: entry.measurements, createdAt: entry.created, updatedAt: entry.updatedAt, } } // // Migrates pattern entry // function migratePattern(entry) { return { handle: entry.handle, user: entry.user, name: entry.name, createdAt: entry.createdAt, updatedAt: entry.updatedAt, person: entry.person, data: { ...entry.data, notes: entry.notes }, } } // // Migrates subscriber entry // function migrateSubscriber(entry) { return { createdAt: entry.created, email: entry.email, } } */