From a0c77b49391a0d21a617958667015c2df028c396 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?S=C3=A9rgio=20Salgado?= Date: Tue, 25 May 2021 09:54:18 +0100 Subject: [PATCH] feat: correct timezone offset on downloaded logs --- .../graphql/resolvers/log.resolver.js | 20 +++++++++++++++---- .../graphql/resolvers/transaction.resolver.js | 17 +++++++++++++--- lib/new-admin/graphql/types/log.type.js | 4 ++-- .../src/components/LogsDownloaderPopper.js | 12 +++++++++-- new-lamassu-admin/src/pages/MachineLogs.js | 5 ++++- new-lamassu-admin/src/pages/ServerLogs.js | 16 +++++++++++++-- .../src/pages/Transactions/Transactions.js | 16 +++++++++++++-- 7 files changed, 74 insertions(+), 16 deletions(-) diff --git a/lib/new-admin/graphql/resolvers/log.resolver.js b/lib/new-admin/graphql/resolvers/log.resolver.js index 6b439dc2..b8a90ecc 100644 --- a/lib/new-admin/graphql/resolvers/log.resolver.js +++ b/lib/new-admin/graphql/resolvers/log.resolver.js @@ -1,18 +1,30 @@ const { parseAsync } = require('json2csv') +const moment = require('moment') +const _ = require('lodash/fp') const logs = require('../../../logs') const serverLogs = require('../../services/server-logs') +const dateFormat = (timezone, logs) => _.map(log => { + const offset = timezone.split(':')[1] + return { + ...log, + timestamp: moment.utc(log.timestamp).utcOffset(parseInt(offset)).format('YYYY-MM-DDTHH:mm:ss.SSS') + } +}, logs) + const resolvers = { Query: { machineLogs: (...[, { deviceId, from, until, limit, offset }]) => logs.simpleGetMachineLogs(deviceId, from, until, limit, offset), - machineLogsCsv: (...[, { deviceId, from, until, limit, offset }]) => - logs.simpleGetMachineLogs(deviceId, from, until, limit, offset).then(parseAsync), + machineLogsCsv: (...[, { deviceId, from, until, limit, offset, timezone }]) => + logs.simpleGetMachineLogs(deviceId, from, until, limit, offset) + .then(res => parseAsync(dateFormat(timezone, res))), serverLogs: (...[, { from, until, limit, offset }]) => serverLogs.getServerLogs(from, until, limit, offset), - serverLogsCsv: (...[, { from, until, limit, offset }]) => - serverLogs.getServerLogs(from, until, limit, offset).then(parseAsync) + serverLogsCsv: (...[, { from, until, limit, offset, timezone }]) => + serverLogs.getServerLogs(from, until, limit, offset) + .then(res => parseAsync(dateFormat(timezone, res))) } } diff --git a/lib/new-admin/graphql/resolvers/transaction.resolver.js b/lib/new-admin/graphql/resolvers/transaction.resolver.js index 81829198..15457f98 100644 --- a/lib/new-admin/graphql/resolvers/transaction.resolver.js +++ b/lib/new-admin/graphql/resolvers/transaction.resolver.js @@ -1,5 +1,7 @@ const DataLoader = require('dataloader') const { parseAsync } = require('json2csv') +const moment = require('moment') +const _ = require('lodash/fp') const filters = require('../../filters') const transactions = require('../../services/transactions') @@ -18,6 +20,15 @@ const txLogFields = ['txClass', 'id', 'deviceId', 'toAddress', 'cryptoAtoms', 'customerIdCardDataExpiration', 'customerIdCardData', 'customerName', 'customerFrontCameraPath', 'customerIdCardPhotoPath', 'expired', 'machineName'] +const dateFormat = (timezone, logs) => _.map(log => { + const offset = timezone.split(':')[1] + return { + ...log, + created: moment.utc(log.created).utcOffset(parseInt(offset)).format('YYYY-MM-DDTHH:mm:ss.SSS'), + sendTime: moment.utc(log.sendTime).utcOffset(parseInt(offset)).format('YYYY-MM-DDTHH:mm:ss.SSS') + } +}, logs) + const resolvers = { Customer: { transactions: parent => transactionsLoader.load(parent.id) @@ -30,11 +41,11 @@ const resolvers = { transactions.batch(from, until, limit, offset, deviceId, txClass, machineName, customerName, fiatCode, cryptoCode, toAddress, status), transactionsCsv: (...[, { from, until, limit, offset, txClass, machineName, customerName, fiatCode, cryptoCode, toAddress, status }]) => transactions.batch(from, until, limit, offset, txClass, machineName, customerName, fiatCode, cryptoCode, toAddress, status) - .then(data => parseAsync(data, {fields: tx_logFields})), + .then(data => parseAsync(data, { fields: tx_logFields, transforms: dateFormat(timezone, data) })), transactionCsv: (...[, { id, txClass }]) => - transactions.getTx(id, txClass).then(parseAsync), + transactions.getTx(id, txClass).then(data => parseAsync(data)), txAssociatedDataCsv: (...[, { id, txClass }]) => - transactions.getTxAssociatedData(id, txClass).then(parseAsync), + transactions.getTxAssociatedData(id, txClass).then(data => parseAsync(data)), transactionFilters: () => filters.transaction() } } diff --git a/lib/new-admin/graphql/types/log.type.js b/lib/new-admin/graphql/types/log.type.js index 166cbfde..2c231147 100644 --- a/lib/new-admin/graphql/types/log.type.js +++ b/lib/new-admin/graphql/types/log.type.js @@ -17,9 +17,9 @@ const typeDef = gql` type Query { machineLogs(deviceId: ID!, from: Date, until: Date, limit: Int, offset: Int): [MachineLog] @auth - machineLogsCsv(deviceId: ID!, from: Date, until: Date, limit: Int, offset: Int): String @auth + machineLogsCsv(deviceId: ID!, from: Date, until: Date, limit: Int, offset: Int, timezone: String): String @auth serverLogs(from: Date, until: Date, limit: Int, offset: Int): [ServerLog] @auth - serverLogsCsv(from: Date, until: Date, limit: Int, offset: Int): String @auth + serverLogsCsv(from: Date, until: Date, limit: Int, offset: Int, timezone: String): String @auth } ` diff --git a/new-lamassu-admin/src/components/LogsDownloaderPopper.js b/new-lamassu-admin/src/components/LogsDownloaderPopper.js index 0945e9b2..8e26dcd7 100644 --- a/new-lamassu-admin/src/components/LogsDownloaderPopper.js +++ b/new-lamassu-admin/src/components/LogsDownloaderPopper.js @@ -11,6 +11,7 @@ import { ReactComponent as Arrow } from 'src/styling/icons/arrow/download_logs.s import { ReactComponent as DownloadInverseIcon } from 'src/styling/icons/button/download/white.svg' import { ReactComponent as Download } from 'src/styling/icons/button/download/zodiac.svg' import { primaryColor, offColor, zircon } from 'src/styling/variables' +import { formatDate } from 'src/utils/timezones' import Popper from './Popper' import DateRangePicker from './date-range-picker/DateRangePicker' @@ -129,7 +130,14 @@ const useStyles = makeStyles(styles) const ALL = 'all' const RANGE = 'range' -const LogsDownloaderPopover = ({ name, query, args, title, getLogs }) => { +const LogsDownloaderPopover = ({ + name, + query, + args, + title, + getLogs, + timezone +}) => { const [selectedRadio, setSelectedRadio] = useState(ALL) const [range, setRange] = useState({ from: null, until: null }) const [anchorEl, setAnchorEl] = useState(null) @@ -183,7 +191,7 @@ const LogsDownloaderPopover = ({ name, query, args, title, getLogs }) => { const createLogsFile = (logs, range) => { const formatDateFile = date => { - return moment(date).format('YYYY-MM-DD_HH-mm') + return formatDate(date, timezone, 'YYYY-MM-DD_HH-mm') } const blob = new window.Blob([logs], { diff --git a/new-lamassu-admin/src/pages/MachineLogs.js b/new-lamassu-admin/src/pages/MachineLogs.js index a54c108d..7d1be1f7 100644 --- a/new-lamassu-admin/src/pages/MachineLogs.js +++ b/new-lamassu-admin/src/pages/MachineLogs.js @@ -39,12 +39,14 @@ const GET_MACHINE_LOGS_CSV = gql` $limit: Int $from: DateTime $until: DateTime + $timezone: String ) { machineLogsCsv( deviceId: $deviceId limit: $limit from: $from until: $until + timezone: $timezone ) } ` @@ -114,8 +116,9 @@ const Logs = () => { title="Download logs" name={selected.name} query={GET_MACHINE_LOGS_CSV} - args={{ deviceId }} + args={{ deviceId, timezone }} getLogs={logs => R.path(['machineLogsCsv'])(logs)} + timezone={timezone} /> {saveMessage} diff --git a/new-lamassu-admin/src/pages/ServerLogs.js b/new-lamassu-admin/src/pages/ServerLogs.js index eac1297b..37873b5a 100644 --- a/new-lamassu-admin/src/pages/ServerLogs.js +++ b/new-lamassu-admin/src/pages/ServerLogs.js @@ -57,8 +57,18 @@ const SHOW_ALL = { code: 'SHOW_ALL', display: 'Show all' } const NUM_LOG_RESULTS = 500 const GET_CSV = gql` - query ServerData($limit: Int, $from: DateTime, $until: DateTime) { - serverLogsCsv(limit: $limit, from: $from, until: $until) + query ServerData( + $limit: Int + $from: DateTime + $until: DateTime + $timezone: String + ) { + serverLogsCsv( + limit: $limit + from: $from + until: $until + timezone: $timezone + ) } ` @@ -138,8 +148,10 @@ const Logs = () => { title="Download logs" name="server-logs" query={GET_CSV} + args={{ timezone }} logs={data.serverLogs} getLogs={logs => R.path(['serverLogsCsv'])(logs)} + timezone={timezone} /> {saveMessage} diff --git a/new-lamassu-admin/src/pages/Transactions/Transactions.js b/new-lamassu-admin/src/pages/Transactions/Transactions.js index c1014aff..4bde18a5 100644 --- a/new-lamassu-admin/src/pages/Transactions/Transactions.js +++ b/new-lamassu-admin/src/pages/Transactions/Transactions.js @@ -35,8 +35,18 @@ const GET_DATA = gql` ` const GET_TRANSACTIONS_CSV = gql` - query transactions($limit: Int, $from: DateTime, $until: DateTime) { - transactionsCsv(limit: $limit, from: $from, until: $until) + query transactions( + $limit: Int + $from: DateTime + $until: DateTime + $timezone: String + ) { + transactionsCsv( + limit: $limit + from: $from + until: $until + timezone: $timezone + ) } ` @@ -271,7 +281,9 @@ const Transactions = () => { title="Download logs" name="transactions" query={GET_TRANSACTIONS_CSV} + args={{ timezone }} getLogs={logs => R.path(['transactionsCsv'])(logs)} + timezone={timezone} /> )}