/* 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 prisma = new PrismaClient() const config = verifyConfig() const { encrypt, decrypt } = encryption(config.encryption.key) // // 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 sqlite. // // 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/' // Load filtered data for migration const file = 'freesewing-filtered.json' const data = JSON.parse(fs.readFileSync(path.resolve(dir, file), { encoding: 'utf-8' })) console.log() console.log('Migrating:') console.log(' 🧑 ', Object.keys(data.users).length, 'users') console.log(' 🕺 ', Object.keys(data.people).length, 'people') console.log(' 👕 ', Object.keys(data.patterns).length, 'patterns') console.log(' 📰 ', data.subscribers.length, 'subscribers') console.log() data.userhandles = {} await migrateUsers(data.users) console.log() data.peoplehandles = {} await migratePeople(data.people) console.log() await migratePatterns(data.patterns) console.log() await migrateSubscribers(data.subscribers) console.log() function progress(text) { process.stdout.clearLine() process.stdout.cursorTo(0) process.stdout.write(text) } async function migrateSubscribers(subscribers) { const total = subscribers.length let i = 0 for (const sub of subscribers) { i++ progress(` 📰 subscriber ${i}/${total}`) await createSubscriber(sub) } } async function createSubscriber(sub) { const record = await prisma.subscriber.create({ data: { createdAt: sub.createdAt, data: JSON.stringify({}), ehash: hash(clean(sub.email)), email: encrypt(clean(sub.email)), }, }) } async function migratePatterns(patterns) { const total = Object.keys(patterns).length let i = 0 for (const pattern of Object.values(patterns)) { i++ progress(` 👕 pattern ${i}/${total}`) await createPattern(pattern) } } async function createPattern(pattern) { const record = await prisma.pattern.create({ data: { createdAt: pattern.createdAt, data: JSON.stringify(pattern.data), personId: data.peoplehandles[pattern.person], userId: data.userhandles[pattern.user], }, }) } async function migratePeople(people) { const total = Object.keys(people).length let i = 0 for (const person of Object.values(people)) { i++ progress(` 🕺 person ${i}/${total}`) await createPerson(person) } } async function createPerson(person) { const record = await prisma.person.create({ data: { createdAt: person.createdAt, data: JSON.stringify(person.data), userId: data.userhandles[person.user], measies: JSON.stringify(person.measurements), }, }) data.peoplehandles[person.handle] = record.id } async function migrateUsers(users) { const total = Object.keys(users).length let i = 0 for (const user of Object.values(users)) { i++ progress(` 🧑 user ${i}/${total}`) await createUser(user) } } async function createUser(user) { const ehash = hash(clean(user.email)) let record const _data = { consent: user.consent, createdAt: user.createdAt, data: JSON.stringify(user.data), ehash, email: encrypt(clean(user.email)), ihash: ehash, initial: encrypt(clean(user.email)), newsletter: user.newsletter, password: JSON.stringify({ type: 'v2', data: user.password, }), patron: user.patron, role: user.role, status: user.status, username: user.username, lusername: user.username.toLowerCase(), lastLogin: new Date(user.lastLogin), } try { record = await prisma.user.create({ data: _data }) } catch (err) { _data.username += ' 2' _data.lusername += ' 2' try { record = await prisma.user.create({ data: _data }) } catch (err) { console.log(err) process.exit() } } data.userhandles[user.handle] = record.id } / // 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 = { 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 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, } } */