@oino-ts/db 0.0.12 → 0.0.13

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -68,8 +68,14 @@ class OINODbHtmlTemplate extends index_js_1.OINOHtmlTemplate {
68
68
  let html = "";
69
69
  const dataset = modelset.dataset;
70
70
  const datamodel = modelset.datamodel;
71
+ const api = modelset.datamodel.api;
72
+ const modified_index = datamodel.findFieldIndexByName(api.params.cacheModifiedField || "");
73
+ let last_modified = this.modified;
71
74
  while (!dataset.isEof()) {
72
75
  const row = dataset.getRow();
76
+ if (modified_index >= 0) {
77
+ last_modified = Math.max(last_modified, new Date(row[modified_index]).getTime());
78
+ }
73
79
  let row_id_seed = datamodel.getRowPrimarykeyValues(row).join(' ');
74
80
  let primary_key_values = [];
75
81
  let html_row = this.template.replaceAll('###' + index_js_1.OINODbConfig.OINODB_ID_FIELD + '###', '###createHtmlFromData_temporary_oinoid###');
@@ -82,6 +88,7 @@ class OINODbHtmlTemplate extends index_js_1.OINOHtmlTemplate {
82
88
  }
83
89
  primary_key_values.push(value || "");
84
90
  }
91
+ // OINOLog.debug("renderFromDbData replace field value", {field:f.name, value:value })
85
92
  html_row = html_row.replaceAll('###' + f.name + '###', index_js_1.OINOStr.encode(value, index_js_1.OINOContentType.html));
86
93
  }
87
94
  html_row = html_row.replaceAll('###createHtmlFromData_temporary_oinoid###', index_js_1.OINOStr.encode(index_js_1.OINODbConfig.printOINOId(primary_key_values), index_js_1.OINOContentType.html));
@@ -89,6 +96,7 @@ class OINODbHtmlTemplate extends index_js_1.OINOHtmlTemplate {
89
96
  dataset.next();
90
97
  }
91
98
  const result = new index_js_1.OINOHttpResult(html);
99
+ result.lastModified = last_modified;
92
100
  return result;
93
101
  }
94
102
  }
@@ -235,8 +235,11 @@ class OINONumberDataField extends OINODbDataField {
235
235
  *
236
236
  */
237
237
  deserializeCell(value) {
238
- if (!value) {
239
- return 0;
238
+ if (value === undefined) {
239
+ return undefined;
240
+ }
241
+ else if ((value == "") || (value == null)) {
242
+ return null;
240
243
  }
241
244
  else {
242
245
  return Number.parseFloat(value);
@@ -101,6 +101,14 @@ class OINODbFactory {
101
101
  if (result.responseType === undefined) {
102
102
  result.responseType = index_js_1.OINOContentType.json;
103
103
  }
104
+ const last_modified = request.headers.get("if-modified-since");
105
+ if (last_modified) {
106
+ result.lastModified = new Date(last_modified).getTime();
107
+ }
108
+ const etags = request.headers.get("if-none-match")?.split(',').map(e => e.trim());
109
+ if (etags) {
110
+ result.etags = etags;
111
+ }
104
112
  // OINOLog.debug("createParamsFromRequest", {params:result})
105
113
  return result;
106
114
  }
@@ -64,8 +64,14 @@ export class OINODbHtmlTemplate extends OINOHtmlTemplate {
64
64
  let html = "";
65
65
  const dataset = modelset.dataset;
66
66
  const datamodel = modelset.datamodel;
67
+ const api = modelset.datamodel.api;
68
+ const modified_index = datamodel.findFieldIndexByName(api.params.cacheModifiedField || "");
69
+ let last_modified = this.modified;
67
70
  while (!dataset.isEof()) {
68
71
  const row = dataset.getRow();
72
+ if (modified_index >= 0) {
73
+ last_modified = Math.max(last_modified, new Date(row[modified_index]).getTime());
74
+ }
69
75
  let row_id_seed = datamodel.getRowPrimarykeyValues(row).join(' ');
70
76
  let primary_key_values = [];
71
77
  let html_row = this.template.replaceAll('###' + OINODbConfig.OINODB_ID_FIELD + '###', '###createHtmlFromData_temporary_oinoid###');
@@ -78,6 +84,7 @@ export class OINODbHtmlTemplate extends OINOHtmlTemplate {
78
84
  }
79
85
  primary_key_values.push(value || "");
80
86
  }
87
+ // OINOLog.debug("renderFromDbData replace field value", {field:f.name, value:value })
81
88
  html_row = html_row.replaceAll('###' + f.name + '###', OINOStr.encode(value, OINOContentType.html));
82
89
  }
83
90
  html_row = html_row.replaceAll('###createHtmlFromData_temporary_oinoid###', OINOStr.encode(OINODbConfig.printOINOId(primary_key_values), OINOContentType.html));
@@ -85,6 +92,7 @@ export class OINODbHtmlTemplate extends OINOHtmlTemplate {
85
92
  dataset.next();
86
93
  }
87
94
  const result = new OINOHttpResult(html);
95
+ result.lastModified = last_modified;
88
96
  return result;
89
97
  }
90
98
  }
@@ -229,8 +229,11 @@ export class OINONumberDataField extends OINODbDataField {
229
229
  *
230
230
  */
231
231
  deserializeCell(value) {
232
- if (!value) {
233
- return 0;
232
+ if (value === undefined) {
233
+ return undefined;
234
+ }
235
+ else if ((value == "") || (value == null)) {
236
+ return null;
234
237
  }
235
238
  else {
236
239
  return Number.parseFloat(value);
@@ -98,6 +98,14 @@ export class OINODbFactory {
98
98
  if (result.responseType === undefined) {
99
99
  result.responseType = OINOContentType.json;
100
100
  }
101
+ const last_modified = request.headers.get("if-modified-since");
102
+ if (last_modified) {
103
+ result.lastModified = new Date(last_modified).getTime();
104
+ }
105
+ const etags = request.headers.get("if-none-match")?.split(',').map(e => e.trim());
106
+ if (etags) {
107
+ result.etags = etags;
108
+ }
101
109
  // OINOLog.debug("createParamsFromRequest", {params:result})
102
110
  return result;
103
111
  }
@@ -36,6 +36,8 @@ export type OINODbApiParams = {
36
36
  hashidLength?: number;
37
37
  /** Make hashids static per row/table */
38
38
  hashidRandomIds?: boolean;
39
+ /** Name of field that has the modified field */
40
+ cacheModifiedField?: string;
39
41
  };
40
42
  /**
41
43
  * Database class (constructor) type
@@ -88,6 +90,10 @@ export type OINODbApiRequestParams = {
88
90
  responseType?: OINOContentType;
89
91
  /** Multipart boundary token */
90
92
  multipartBoundary?: string;
93
+ /** Request last-modified value */
94
+ lastModified?: number;
95
+ /** Request etag values */
96
+ etags?: string[];
91
97
  /** SQL parameters */
92
98
  sqlParams?: OINODbSqlParams;
93
99
  };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@oino-ts/db",
3
- "version": "0.0.12",
3
+ "version": "0.0.13",
4
4
  "description": "OINO TS library package for publishing an SQL database tables as a REST API.",
5
5
  "author": "Matias Kiviniemi (pragmatta)",
6
6
  "license": "MPL-2.0",
@@ -20,7 +20,7 @@
20
20
  "types": "./dist/types/index.d.ts",
21
21
  "dependencies": {
22
22
  "@types/node": "^20.14.10",
23
- "@oino-ts/types": "0.0.12"
23
+ "@oino-ts/types": "0.0.13"
24
24
  },
25
25
  "devDependencies": {
26
26
  "@types/bun": "latest",
package/src/OINODbApi.ts CHANGED
@@ -71,8 +71,15 @@ export class OINODbHtmlTemplate extends OINOHtmlTemplate {
71
71
  let html:string = ""
72
72
  const dataset:OINODbDataSet|undefined = modelset.dataset
73
73
  const datamodel:OINODbDataModel = modelset.datamodel
74
+ const api:OINODbApi = modelset.datamodel.api
75
+ const modified_index = datamodel.findFieldIndexByName(api.params.cacheModifiedField || "")
76
+ let last_modified:number = this.modified
77
+
74
78
  while (!dataset.isEof()) {
75
79
  const row:OINODataRow = dataset.getRow()
80
+ if (modified_index >= 0) {
81
+ last_modified = Math.max(last_modified, new Date(row[modified_index] as Date).getTime())
82
+ }
76
83
  let row_id_seed:string = datamodel.getRowPrimarykeyValues(row).join(' ')
77
84
  let primary_key_values:string[] = []
78
85
  let html_row:string = this.template.replaceAll('###' + OINODbConfig.OINODB_ID_FIELD + '###', '###createHtmlFromData_temporary_oinoid###')
@@ -85,6 +92,7 @@ export class OINODbHtmlTemplate extends OINOHtmlTemplate {
85
92
  }
86
93
  primary_key_values.push(value || "")
87
94
  }
95
+ // OINOLog.debug("renderFromDbData replace field value", {field:f.name, value:value })
88
96
  html_row = html_row.replaceAll('###' + f.name + '###', OINOStr.encode(value, OINOContentType.html))
89
97
  }
90
98
  html_row = html_row.replaceAll('###createHtmlFromData_temporary_oinoid###', OINOStr.encode(OINODbConfig.printOINOId(primary_key_values), OINOContentType.html))
@@ -92,6 +100,7 @@ export class OINODbHtmlTemplate extends OINOHtmlTemplate {
92
100
  dataset.next()
93
101
  }
94
102
  const result:OINOHttpResult = new OINOHttpResult(html)
103
+ result.lastModified = last_modified
95
104
  return result
96
105
  }
97
106
 
@@ -248,10 +248,12 @@ export class OINONumberDataField extends OINODbDataField {
248
248
  *
249
249
  */
250
250
  deserializeCell(value: string|null|undefined): OINODataCell {
251
- if (!value) {
252
- return 0
251
+ if (value === undefined) {
252
+ return undefined
253
+ } else if ((value == "") || (value == null)) {
254
+ return null
253
255
  } else {
254
- return Number.parseFloat(value)
256
+ return Number.parseFloat(value)
255
257
  }
256
258
  }
257
259
  }
@@ -106,6 +106,14 @@ export class OINODbFactory {
106
106
  if (result.responseType === undefined) {
107
107
  result.responseType = OINOContentType.json
108
108
  }
109
+ const last_modified = request.headers.get("if-modified-since")
110
+ if (last_modified) {
111
+ result.lastModified = new Date(last_modified).getTime()
112
+ }
113
+ const etags = request.headers.get("if-none-match")?.split(',').map(e => e.trim())
114
+ if (etags) {
115
+ result.etags = etags
116
+ }
109
117
 
110
118
  // OINOLog.debug("createParamsFromRequest", {params:result})
111
119
  return result
package/src/index.ts CHANGED
@@ -39,7 +39,9 @@ export type OINODbApiParams = {
39
39
  /** Set (minimum) length (12-32 chars) of the hashids */
40
40
  hashidLength?:number,
41
41
  /** Make hashids static per row/table */
42
- hashidRandomIds?: boolean
42
+ hashidRandomIds?: boolean,
43
+ /** Name of field that has the modified field */
44
+ cacheModifiedField?:string
43
45
  }
44
46
 
45
47
  /**
@@ -98,6 +100,10 @@ export type OINODbApiRequestParams = {
98
100
  responseType?:OINOContentType
99
101
  /** Multipart boundary token */
100
102
  multipartBoundary?:string
103
+ /** Request last-modified value */
104
+ lastModified?:number
105
+ /** Request etag values */
106
+ etags?:string[]
101
107
  /** SQL parameters */
102
108
  sqlParams?:OINODbSqlParams
103
109
  }