UNPKG

@gameroom/cli

Version:

A command line tool for Gameroom

87 lines (74 loc) 3.96 kB
const cosmetic = require('cosmetic'), pluralize = require('pluralize'), { models: { Changelog, User } } = require('@gameroom/kit'), { getChildren, getParents, getStorable, grGreen, getRelatables, prettyPrint } = require('../helpers'), { spinner } = require('../refs') module.exports = async ({ Model, resource, id }) => { if (pluralize.isPlural(resource)) resource = pluralize.singular(resource) spinner.text = `inspecting ${grGreen(resource)} ${id}` spinner.start() // spinner.text = `finding ${grGreen(resource)} ${id}` // const object = await Model.find(id) // spinner.succeed(`found ${grGreen(resource)}`) // // spinner.text = `getting ${grGreen('parents')}` // const parents = await getParents(object, spinner) // spinner.text = `getting ${grGreen('children')}` // const children = await getChildren(object, spinner) spinner.text = `getting ${grGreen('users')}` const users = await User.get() spinner.info(`got ${users.length} ${grGreen('users')}`) spinner.text = `getting ${grGreen('changelogs')}` const changelogs = await Changelog.getAll({ filter: { key: 'changeable_id', value: id }, sort: [{ created_at: 1 }] }, (c) => spinner.text = `getting ${grGreen('changelogs')} ${c.length}`, (e) => spinner.warn(`error getting ${grGreen('changelogs')} ${e}`)) spinner.info(`got ${changelogs.length} ${grGreen('changelogs')}`) spinner.stop() for (const changelog of changelogs) { let { before, after } = changelog if (before) Object.keys(before).map(k => { try { before[k] = JSON.parse(before[k]) } catch (err) {} }) if (after) Object.keys(after).map(k => { try { after[k] = JSON.parse(after[k]) } catch (err) {} }) if (after) { after.created_at = new Date(after.created_at) after.updated_at = new Date(after.updated_at) } if (before) before = new Model(before) if (after) after = new Model(after) const action = !before && after ? 'created' : before && !after ? 'deleted' : 'updated' const user = users.find(u => u.id === changelog.user_id) if (!user) spinner.warn(`${grGreen('changelog')} ${changelog.id} has no ${grGreen('user')}`) console.log(`${action} @ ${cosmetic.magenta(changelog.created_at.toDate().toLocaleString())} by ${grGreen(!user ? '???' : `${user.first_name} ${user.last_name}`)}`) if (action === 'created') { prettyPrint(after) } else if (action === 'updated') { const diff = {} Object.keys(after).map(k => { if (k === 'id' || k === 'created_at' || k === 'updated_at') return switch (k) { case 'properties': const added_properties = {} Object.keys(after.properties).map(p => after.properties[p] !== before.properties[p] ? added_properties[p] = after.properties[p] : null) const removed_properties = {} Object.keys(before.properties).map(p => before.properties[p] !== after.properties[p] ? removed_properties[p] = before.properties[p] : null) const properties = {} if (Object.keys(added_properties).length > 0) properties.added = added_properties if (Object.keys(removed_properties).length > 0) properties.removed = removed_properties if (Object.keys(properties).length > 0) diff.properties = properties break case 'tags': const added = [] after.tags.map(t => !before.tags.includes(t) ? added.push(t) : null) const removed = [] before.tags.map(t => !after.tags.includes(t) ? removed.push(t) : null) const tags = {} if (added.length > 0) tags.added = added if (removed.length > 0) tags.removed = removed if (Object.keys(tags).length > 0) diff.tags = tags break default: if (after[k] !== before[k]) diff[k] = after[k] } }) console.log(diff) } } spinner.succeed(`inspected ${grGreen(resource)}`).stop() }