Skip to content

Commit e4c1a13

Browse files
committed
Merge branch 'next' of github.com:devforth/adminforth into next
2 parents 447e5e7 + 2a19fc7 commit e4c1a13

File tree

1 file changed

+30
-14
lines changed

1 file changed

+30
-14
lines changed

adminforth/dataConnectors/postgres.ts

Lines changed: 30 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -97,57 +97,62 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa
9797
rows.forEach((row) => {
9898
const field: any = {};
9999
const baseType = row.type.toLowerCase();
100-
if (baseType == 'int') {
100+
const isPgArray = baseType.endsWith('[]');
101+
const normalizedBaseType = isPgArray ? baseType.slice(0, -2) : baseType;
102+
if (normalizedBaseType == 'int') {
101103
field.type = AdminForthDataTypes.INTEGER;
102104
field._underlineType = 'int';
103105

104-
} else if (baseType.includes('float') || baseType.includes('double')) {
106+
} else if (normalizedBaseType.includes('float') || normalizedBaseType.includes('double')) {
105107
field.type = AdminForthDataTypes.FLOAT;
106108
field._underlineType = 'float';
107109

108-
} else if (baseType.includes('bool')) {
110+
} else if (normalizedBaseType.includes('bool')) {
109111
field.type = AdminForthDataTypes.BOOLEAN;
110112
field._underlineType = 'bool';
111113

112-
} else if (baseType == 'uuid') {
114+
} else if (normalizedBaseType == 'uuid') {
113115
field.type = AdminForthDataTypes.STRING;
114116
field._underlineType = 'uuid';
115117

116-
} else if (baseType.includes('character varying')) {
118+
} else if (normalizedBaseType.includes('character varying')) {
117119
field.type = AdminForthDataTypes.STRING;
118120
field._underlineType = 'varchar';
119-
const length = baseType.match(/\d+/);
121+
const length = normalizedBaseType.match(/\d+/);
120122
field.maxLength = length ? parseInt(length[0]) : null;
121123

122-
} else if (baseType == 'text') {
124+
} else if (normalizedBaseType == 'text') {
123125
field.type = AdminForthDataTypes.TEXT;
124126
field._underlineType = 'text';
125127

126-
} else if (baseType.includes('decimal(') || baseType.includes('numeric(')) {
128+
} else if (normalizedBaseType.includes('decimal(') || normalizedBaseType.includes('numeric(')) {
127129
field.type = AdminForthDataTypes.DECIMAL;
128130
field._underlineType = 'decimal';
129-
const [precision, scale] = baseType.match(/\d+/g);
131+
const [precision, scale] = normalizedBaseType.match(/\d+/g);
130132
field.precision = parseInt(precision);
131133
field.scale = parseInt(scale);
132134

133-
} else if (baseType == 'real') {
135+
} else if (normalizedBaseType == 'real') {
134136
field.type = AdminForthDataTypes.FLOAT;
135137
field._underlineType = 'real';
136138

137-
} else if (baseType == 'date') {
139+
} else if (normalizedBaseType == 'date') {
138140
field.type = AdminForthDataTypes.DATE;
139141
field._underlineType = 'timestamp';
140142

141-
} else if (baseType.includes('date') || baseType.includes('time')) {
143+
} else if (normalizedBaseType.includes('date') || normalizedBaseType.includes('time')) {
142144
field.type = AdminForthDataTypes.DATETIME;
143145
field._underlineType = 'timestamp';
144-
} else if (baseType == 'json' || baseType == 'jsonb') {
146+
} else if (normalizedBaseType == 'json' || normalizedBaseType == 'jsonb') {
145147
field.type = AdminForthDataTypes.JSON;
146148
field._underlineType = 'json';
147149
} else {
148150
field.type = 'unknown'
149151
}
150152
field._baseTypeDebug = baseType;
153+
if (isPgArray) {
154+
field._isPgArray = true;
155+
}
151156
field.primaryKey = row.pk == 1;
152157
field.default = row.dflt_value;
153158
field.required = row.notnull && !row.dflt_value;
@@ -211,11 +216,22 @@ class PostgresConnector extends AdminForthBaseConnector implements IAdminForthDa
211216
} else if (field._underlineType == 'varchar') {
212217
return dayjs(value).toISOString();
213218
}
219+
} else if (field.isArray?.enabled) {
220+
if (value === null || value === undefined) {
221+
return null;
222+
}
223+
if (field._isPgArray) {
224+
return value;
225+
}
226+
if (field._underlineType == 'json') {
227+
return JSON.stringify(value);
228+
}
229+
return JSON.stringify(value);
214230
} else if (field.type == AdminForthDataTypes.BOOLEAN) {
215231
return value === null ? null : (value ? 1 : 0);
216232
} else if (field.type == AdminForthDataTypes.JSON) {
217233
if (field._underlineType == 'json') {
218-
return value;
234+
return typeof value === 'string' || value === null ? value : JSON.stringify(value);
219235
} else {
220236
return JSON.stringify(value);
221237
}

0 commit comments

Comments
 (0)