Skip to content

Commit abeaf84

Browse files
committed
fix: ensure UTC formatting for date values in Clickhouse and Mysql connectors
1 parent 88e3a44 commit abeaf84

2 files changed

Lines changed: 9 additions & 3 deletions

File tree

adminforth/dataConnectors/clickhouse.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,14 @@
11
import { IAdminForthDataSourceConnector, IAdminForthSingleFilter, IAdminForthAndOrFilter, AdminForthResource, AdminForthResourceColumn, IAggregationRule, IGroupByRule, IGroupByDateTrunc, IGroupByField } from '../types/Back.js';
22
import AdminForthBaseConnector from './baseConnector.js';
33
import dayjs from 'dayjs';
4+
import utc from 'dayjs/plugin/utc.js';
45
import { createClient } from '@clickhouse/client'
56

67
import { AdminForthDataTypes, AdminForthFilterOperators, AdminForthSortDirections } from '../types/Common.js';
78
import { afLogger } from '../modules/logger.js';
89

10+
dayjs.extend(utc);
11+
912
class ClickhouseConnector extends AdminForthBaseConnector implements IAdminForthDataSourceConnector {
1013

1114
dbName: string;
@@ -194,8 +197,8 @@ class ClickhouseConnector extends AdminForthBaseConnector implements IAdminForth
194197
|| field._underlineType.startsWith('FixedString')
195198
|| field._underlineType.startsWith('Nullable(String)')
196199
|| field._underlineType.startsWith('Nullable(FixedString)')) {
197-
// value is iso string now, convert to unix timestamp
198-
const iso = dayjs(value).format('YYYY-MM-DDTHH:mm:ss');
200+
// ClickHouse DateTime has no offset in the literal, so keep ISO instants in UTC.
201+
const iso = dayjs.utc(value).format('YYYY-MM-DDTHH:mm:ss');
199202
return iso;
200203
}
201204
} else if (field.type == AdminForthDataTypes.BOOLEAN) {

adminforth/dataConnectors/mysql.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,13 @@
11
import dayjs from 'dayjs';
2+
import utc from 'dayjs/plugin/utc.js';
23
import { AdminForthResource, IAdminForthSingleFilter, IAdminForthAndOrFilter, IAdminForthDataSourceConnector, AdminForthConfig, IAggregationRule, IGroupByRule, IGroupByDateTrunc, IGroupByField } from '../types/Back.js';
34
import { AdminForthDataTypes, AdminForthFilterOperators, AdminForthSortDirections, } from '../types/Common.js';
45
import AdminForthBaseConnector from './baseConnector.js';
56
import mysql from 'mysql2/promise';
67
import { dbLogger, afLogger } from '../modules/logger.js';
78

9+
dayjs.extend(utc);
10+
811
class MysqlConnector extends AdminForthBaseConnector implements IAdminForthDataSourceConnector {
912

1013
async setupClient(url): Promise<void> {
@@ -223,7 +226,7 @@ class MysqlConnector extends AdminForthBaseConnector implements IAdminForthDataS
223226
if (!value) {
224227
return null;
225228
}
226-
return dayjs(value).format('YYYY-MM-DD HH:mm:ss');
229+
return dayjs.utc(value).format('YYYY-MM-DD HH:mm:ss');
227230
} else if (field.type == AdminForthDataTypes.BOOLEAN) {
228231
return value === null ? null : (value ? 1 : 0);
229232
} else if (field.type == AdminForthDataTypes.JSON) {

0 commit comments

Comments
 (0)