import { column, BaseModel, SnakeCaseNamingStrategy, belongsTo } from '@adonisjs/lucid/orm'; import Dataset from './dataset.js'; import { builder, create } from 'xmlbuilder2'; import { XMLBuilder } from 'xmlbuilder2/lib/interfaces.js'; import db from '@adonisjs/lucid/services/db'; import { DateTime } from 'luxon'; 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; /** * 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} Returns true on cached hit else false. */ // public static async hasValidEntry(datasetId: number, datasetServerDateModified: DateTime): Promise { // // 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 { const serverDateModifiedString: string = datasetServerDateModified.toFormat('yyyy-MM-dd HH:mm:ss'); // Convert DateTime to ISO string 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; } }