tethys.backend/app/models/DocumentXmlCache.ts

99 lines
3.4 KiB
TypeScript
Raw Permalink Normal View History

2024-03-14 19:25:27 +00:00
import { column, BaseModel, SnakeCaseNamingStrategy, belongsTo } from '@adonisjs/lucid/orm';
import Dataset from './dataset.js';
import { builder, create } from 'xmlbuilder2';
2024-03-14 19:25:27 +00:00
import { XMLBuilder } from 'xmlbuilder2/lib/interfaces.js';
import db from '@adonisjs/lucid/services/db';
import { DateTime } from 'luxon';
2024-03-14 19:25:27 +00:00
import type { BelongsTo } from "@adonisjs/lucid/types/relations";
export default class DocumentXmlCache extends BaseModel {
public static namingStrategy = new SnakeCaseNamingStrategy();
public static table = 'document_xml_cache';
// public static fillable: string[] = ['value', 'label', 'type', 'relation'];
// public static primaryKey = false;
static primaryKey = ''; // Set primaryKey to null to indicate there is no primary key
@column({
isPrimary: true,
})
public document_id: number;
@column({})
public xml_version: number;
@column()
public server_date_modified?: string;
// @column.dateTime({
// autoCreate: true,
// autoUpdate: true,
// })
// public updated_at?: DateTime;
@column({})
public xml_data: string;
@belongsTo(() => Dataset, {
foreignKey: 'document_id',
})
public dataset: BelongsTo<typeof Dataset>;
/**
* Get dom document of 'xml_data' string
*
* @returns {XMLBuilder}
*/
public getDomDocument(): XMLBuilder {
// const dom = xmlbuilder.create({ version: "1.0", encoding: "UTF-8", standalone: true });
let dom: XMLBuilder = create({ version: '1.0', encoding: 'UTF-8', standalone: true }, this.xml_data);
// return dom.first();
const rdrDataset = dom.find(
(n) => {
const test = n.node.nodeName == 'Rdr_Dataset';
return test;
},
false,
true,
)?.node;
if (rdrDataset == undefined) {
return dom.first();
} else {
dom = builder({ version: '1.0', encoding: 'UTF-8', standalone: true }, rdrDataset);
return dom;
}
}
/**
* Check if a dataset in a specific xml version is already cached or not.
*
* @param mixed datasetId
* @param mixed serverDateModified
* @returns {Promise<boolean>} Returns true on cached hit else false.
*/
// public static async hasValidEntry(datasetId: number, datasetServerDateModified: DateTime): Promise<boolean> {
// // const formattedDate = dayjs(datasetServerDateModified).format('YYYY-MM-DD HH:mm:ss');
// const query = Database.from(this.table)
// .where('document_id', datasetId)
// .where('server_date_modified', '2023-08-17 16:51:03')
// .first();
// const row = await query;
// return !!row;
// }
// Assuming 'DocumentXmlCache' has a table with a 'server_date_modified' column in your database
public static async hasValidEntry(datasetId: number, datasetServerDateModified: DateTime): Promise<boolean> {
const serverDateModifiedString: string = datasetServerDateModified.toFormat('yyyy-MM-dd HH:mm:ss'); // Convert DateTime to ISO string
2024-03-14 19:25:27 +00:00
const query = db.from(this.table)
.where('document_id', datasetId)
.where('server_date_modified', '>=', serverDateModifiedString) // Check if server_date_modified is newer or equal
.first();
const row = await query;
return !!row;
}
}