@gameroom/cli
Version:
A command line tool for Gameroom
87 lines (74 loc) • 3.96 kB
JavaScript
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()
}