@gameroom/cli
Version:
A command line tool for Gameroom
108 lines (103 loc) • 4.05 kB
JavaScript
const cosmetic = require('cosmetic'),
Table = require('tabley'),
{
enums: { timecard_status },
models: { User, Changelog }
} = require('@gameroom/kit'),
{ join, resolve } = require('path'),
{ correctionStatus, dateAddDays, dateLocaleString, dateString, getAll, grGreen, printTable, writeCSVFile } = require('../../helpers'),
{ spinner } = require('../../refs')
module.exports = async({ start_at, end_at, days, weeks, id, verbose, write }) => {
spinner.start()
spinner.info(`generating ${grGreen('changelogs')} report`)
spinner.info(`from ${grGreen(start_at.toLocaleString())} to ${grGreen(end_at.toLocaleString())}`)
const filters = [{ key: 'locked', value: false }]
if (id) filters.push({ key: 'id', value: id })
spinner.text = `getting ${grGreen('users')}`
const users = await User.getAll(
{ filter: { and: filters }, sort : [{ last_name: 1 }] },
(r) => spinner.text = `getting ${grGreen('users')} (${r.length})`, (e) => spinner.warn(`error getting ${grGreen('users')} ${e}`))
spinner.succeed(`got ${users.length} ${grGreen('users')}`)
spinner.text = `getting ${grGreen('changelogs')}`
const and = [
{ key: 'created_at', comparison: '>=', value: start_at },
{ key: 'created_at', comparison: '<=', value: end_at },
]
if (id) and.push({ key: 'user_id', value: id })
let changelogs = await Changelog.getAll(
{ filter: { and } },
(r) => spinner.text = `getting ${grGreen('changelogs')} (${r.length})`, (e) => spinner.warn(`error getting ${grGreen('changelogs')} ${e}`))
spinner.succeed(`got ${changelogs.length} ${grGreen('changelogs')}`)
const total_data = []
const total_meta = {
user: 'Total',
created: 0,
updated: 0,
deleted: 0,
}
for (const user of users) {
const user_changelogs = changelogs.filter(c => c.user_id === user.id)
if (user_changelogs.length === 0) continue
// meta
const created = user_changelogs.filter(c => c.before === null).length,
updated = user_changelogs.filter(c => c.before !== null && c.after !== null).length,
deleted = user_changelogs.filter(c => c.after === null).length
total_meta.created += created
total_meta.updated += updated
total_meta.deleted += deleted
total_data.push({
user: `${user.last_name}, ${user.first_name}`,
created,
updated,
deleted
})
const data = []
for (const changelog of user_changelogs) {
data.push({
created_at: changelog.created_at,
action: !changelog.before ? 'Create' : !changelog.after ? 'Delete' : 'Update',
changeable_type: changelog.changeable_type,
changeable_id: changelog.changeable_id,
name: changelog.after && changelog.after.name ? changelog.after.name : changelog.after && changelog.after.name ? changelog.after.name : null,
})
}
if (!verbose) continue
const table = new Table(data, {
title: grGreen(`${user.last_name}, ${user.first_name}`),
align: 'center',
columns: [
{ key: 'created_at', title: 'Created At', value: (d) => d.toLocaleString() },
{ key: 'action', title: 'Action' },
{ key: 'changeable_type', title: 'Type' },
{ key: 'changeable_id', title: 'ID' },
{ key: 'name', title: 'Name' }
],
margin: 4
})
spinner.stop()
table.print()
console.log()
spinner.start()
}
const table = new Table(total_data, {
title: grGreen('Total Changelogs'),
align: 'center',
columns: [
{ key: 'user', title: 'User' },
{ key: 'created', title: 'Created' },
{ key: 'updated', title: 'Updated' },
{ key: 'deleted', title: 'Deleted' }
],
meta: [ total_meta ],
margin: 4
})
spinner.stop()
table.print()
console.log()
spinner.start()
if (write) {
const path = await writeCSVFile(join(resolve(write === true ? '.' : write), 'gameroom-changelogs-report.csv'), csv_data)
spinner.succeed(`wrote data to ${path}`)
}
spinner.succeed(`generated ${grGreen('changelogs')} report `).stop()
}