UNPKG

@gameroom/cli

Version:

A command line tool for Gameroom

108 lines (103 loc) 4.05 kB
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() }