From 2a7480d2ed70c4ea3db462c8853263db3685847a Mon Sep 17 00:00:00 2001 From: Arno Kaimbacher Date: Thu, 28 Sep 2023 22:43:46 +0200 Subject: [PATCH] - added new class CollectionRole.ts - added relation 'collectionRole' to Collection.ts class - added 'ListSets' and =GetRecord request for OaiController.ts - npm updates - added utility-functions.ts --- Dockerfile | 2 +- app/Controllers/Http/Oai/OaiController.ts | 227 +++++++++++++++++- .../Http/Submitter/DatasetController.ts | 21 +- app/Models/Collection.ts | 9 +- app/Models/CollectionRole.ts | 38 +++ app/Models/DocumentXmlCache.ts | 1 - app/Utils/utility-functions.ts | 21 ++ package-lock.json | 119 ++++----- tests/functional/dataset_controller.spec.ts | 2 +- 9 files changed, 349 insertions(+), 91 deletions(-) create mode 100644 app/Models/CollectionRole.ts create mode 100644 app/Utils/utility-functions.ts diff --git a/Dockerfile b/Dockerfile index 128ed11..0975855 100644 --- a/Dockerfile +++ b/Dockerfile @@ -85,7 +85,7 @@ RUN npm ci --omit=dev # Copy files to the working directory from the build folder the user COPY --chown=node:node --from=build /home/node/app/build . # Expose port -EXPOSE $PORT +EXPOSE 3333 ENTRYPOINT ["/home/node/app/docker-entrypoint.sh"] # Run the command to start the server using "dumb-init" CMD [ "dumb-init", "node", "server.js" ] \ No newline at end of file diff --git a/app/Controllers/Http/Oai/OaiController.ts b/app/Controllers/Http/Oai/OaiController.ts index 3629241..dbe0991 100644 --- a/app/Controllers/Http/Oai/OaiController.ts +++ b/app/Controllers/Http/Oai/OaiController.ts @@ -10,7 +10,11 @@ import { StatusCodes } from 'http-status-codes'; import { transform } from 'saxon-js'; // import { Xslt, xmlParse } from 'xslt-processor' import { OaiErrorCodes, OaiModelError } from 'App/Exceptions/OaiErrorCodes'; -import { OaiModelException } from 'App/Exceptions/OaiModelException'; +import { OaiModelException, BadOaiModelException } from 'App/Exceptions/OaiModelException'; +import Dataset from 'App/Models/Dataset'; +import Collection from 'App/Models/Collection'; +import { getDomain } from 'App/Utils/utility-functions'; +import XmlModel from 'App/Library/XmlModel'; interface XslTParameter { [key: string]: any; @@ -21,9 +25,12 @@ interface Dictionary { } export default class OaiController { - // private deliveringDocumentStates = ["published", "deleted"]; + private deliveringDocumentStates = ['published', 'deleted']; // private sampleRegEx = /^[A-Za-zäüÄÜß0-9\-_.!~]+$/; private xsltParameter: XslTParameter; + // private configuration: Configuration; + // private tokenWorker: TokenWorker; + /** * Holds xml representation of document information to be processed. * @@ -61,7 +68,7 @@ export default class OaiController { } // const oaiRequest: OaiParameter = request.body; try { - this.handleRequest(oaiRequest, request); + await this.handleRequest(oaiRequest, request); } catch (error) { if (error instanceof OaiModelException) { const code = error.oaiCode; @@ -106,7 +113,7 @@ export default class OaiController { response.status(StatusCodes.OK).send(xmlOutput); } - protected handleRequest(oaiRequest: Dictionary, request: RequestContract) { + protected async handleRequest(oaiRequest: Dictionary, request: RequestContract) { // Setup stylesheet // $this->loadStyleSheet('datasetxml2oai-pmh.xslt'); @@ -130,17 +137,17 @@ export default class OaiController { this.handleIdentify(); } else if (verb === 'ListMetadataFormats') { this.handleListMetadataFormats(); + } else if (verb == 'GetRecord') { + await this.handleGetRecord(oaiRequest); } - // else if (verb == "GetRecord") { - // await this.handleGetRecord(oaiRequest); - // } else if (verb == "ListRecords") { + // else if (verb == "ListRecords") { // await this.handleListRecords(oaiRequest); // } else if (verb == "ListIdentifiers") { // await this.handleListIdentifiers(oaiRequest); - // } else if (verb == "ListSets") { - // await this.handleListSets(); // } - else { + else if (verb == 'ListSets') { + await this.handleListSets(); + } else { this.handleIllegalVerb(); } } else { @@ -182,6 +189,206 @@ export default class OaiController { this.xml.root().ele('Datasets'); } + protected async handleListSets() { + const repIdentifier = 'tethys.at'; + this.xsltParameter['repIdentifier'] = repIdentifier; + const datasetElement = this.xml.root().ele('Datasets'); + + const sets: { [key: string]: string } = { + 'open_access': 'Set for open access licenses', + 'doc-type:ResearchData': 'Set for document type ResearchData', + // ...(await this.getSetsForDatasetTypes()), + ...(await this.getSetsForCollections()), + // ... await this.getSetsForProjects(), + } as Dictionary; + + for (const [key, value] of Object.entries(sets)) { + const setElement = datasetElement.ele('Rdr_Sets'); + setElement.att('Type', key); + setElement.att('TypeName', value); + } + } + + protected async handleGetRecord(oaiRequest: Dictionary) { + const repIdentifier = 'tethys.at'; + this.xsltParameter['repIdentifier'] = repIdentifier; + + const dataId = this.validateAndGetIdentifier(oaiRequest); + const dataset = await Dataset.query().where('publish_id', dataId).preload('xmlCache').preload('collections').first(); + + if (!dataset || !dataset.publish_id) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + 'The value of the identifier argument is unknown or illegal in this repository.', + OaiErrorCodes.IDDOESNOTEXIST, + ); + } + + const metadataPrefix = this.validateAndGetMetadataPrefix(oaiRequest); + this.xsltParameter['oai_metadataPrefix'] = metadataPrefix; + // do not deliver datasets which are restricted by document state defined in deliveringStates + this.validateDatasetState(dataset); + + // add xml elements + const datasetNode = this.xml.root().ele('Datasets'); + await this.createXmlRecord(dataset, datasetNode); + } + + private validateAndGetIdentifier(oaiRequest: Dictionary): number { + // Identifier references metadata Urn, not plain Id! + // Currently implemented as 'oai:foo.bar.de:{docId}' or 'urn:nbn...-123' + if (!('identifier' in oaiRequest)) { + throw new BadOaiModelException('The prefix of the identifier argument is unknown.'); + } + const dataId = Number(this.getDocumentIdByIdentifier(oaiRequest.identifier)); + if (isNaN(dataId)) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + 'The value of the identifier argument is illegal in this repository.', + OaiErrorCodes.BADARGUMENT, + ); + } + return dataId; + } + + private validateAndGetMetadataPrefix(oaiRequest: Dictionary): string { + let metadataPrefix = ''; + if ('metadataPrefix' in oaiRequest) { + metadataPrefix = oaiRequest['metadataPrefix']; + } else { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + 'The prefix of the metadata argument is unknown.', + OaiErrorCodes.BADARGUMENT, + ); + } + return metadataPrefix; + } + + private validateDatasetState(dataset: Dataset): void { + if (dataset.server_state == null || !this.deliveringDocumentStates.includes(dataset.server_state)) { + throw new OaiModelException( + StatusCodes.INTERNAL_SERVER_ERROR, + 'Document is not available for OAI export!', + OaiErrorCodes.NORECORDSMATCH, + ); + } + } + + private async createXmlRecord(dataset: Dataset, datasetNode: XMLBuilder) { + const domNode = await this.getDatasetXmlDomNode(dataset); + + if (domNode) { + // add frontdoor url and data-type + dataset.publish_id && this.addLandingPageAttribute(domNode, dataset.publish_id.toString()); + this.addSpecInformation(domNode, 'data-type:' + dataset.type); + + // if (dataset.collections) { + // for (const coll of dataset.collections) { + // const collRole = await coll.getCollectionRole(); + // this.addSpecInformation(domNode, collRole.oai_name + ':' + coll.number); + // } + // } + + datasetNode.import(domNode); + } + } + + private async getDatasetXmlDomNode(dataset: Dataset) { + const xmlModel = new XmlModel(dataset); + // xmlModel.setModel(dataset); + xmlModel.excludeEmptyFields(); + xmlModel.caching = true; + // const cache = dataset.xmlCache ? dataset.xmlCache : null; + // dataset.load('xmlCache'); + if (dataset.xmlCache) { + xmlModel.xmlCache = dataset.xmlCache; + } + + // return cache.getDomDocument(); + const domDocument: XMLBuilder | null = await xmlModel.getDomDocument(); + return domDocument; + } + + private addSpecInformation(domNode: XMLBuilder, information: string) { + domNode.ele('SetSpec').att('Value', information); + } + + private addLandingPageAttribute(domNode: XMLBuilder, dataid: string) { + const baseDomain = process.env.BASE_DOMAIN || 'localhost'; + const url = 'https://' + getDomain(baseDomain) + '/dataset/' + dataid; + // add attribute du dataset xml element + domNode.att('landingpage', url); + } + + private getDocumentIdByIdentifier(oaiIdentifier: string): string { + const identifierParts: string[] = oaiIdentifier.split(':'); // explode(":", $oaiIdentifier); + const dataId: string = identifierParts[2]; + // switch (identifierParts[0]) { + // case 'oai': + // if (isset($identifierParts[2])) { + // $dataId = $identifierParts[2]; + // } + // break; + // default: + // throw new OaiModelException( + // 'The prefix of the identifier argument is unknown.', + // OaiModelError::BADARGUMENT + // ); + // break; + // } + + // if (empty($dataId) or !preg_match('/^\d+$/', $dataId)) { + // throw new OaiModelException( + // 'The value of the identifier argument is unknown or illegal in this repository.', + // OaiModelError::IDDOESNOTEXIST + // ); + + return dataId; + } + + private async getSetsForCollections(): Promise { + const sets: { [key: string]: string } = {} as Dictionary; + + const collections = await Collection.query() + .select('name', 'number', 'role_id') + .whereHas('collectionRole', (query) => { + query.where('visible_oai', true); + }) + .preload('collectionRole'); + + collections.forEach((collection) => { + // if collection has a collection role (classification like ddc): + if (collection.number) { + // collection.load('collectionRole'); + const setSpec = collection.collectionRole?.oai_name + ':' + collection.number; + sets[setSpec] = `Set ${collection.number} '${collection.name}'`; + } + }); + return sets; + } + + // private async getSetsForDatasetTypes(): Promise { + // const sets: { [key: string]: string } = {} as IDictionary; + + // const datasets: Array = await Dataset.findAll({ + // attributes: ["type"], + // where: { server_state: { [Sequelize.Op.eq]: "published" } }, + // }); + // datasets.forEach((dataset) => { + // if (dataset.type && false == preg_match(this.sampleRegEx, dataset.type)) { + // const msg = `Invalid SetSpec (data-type='${dataset.type}'). + // Allowed characters are [${this.sampleRegEx}].`; + // Logger.err(`OAI: ${msg}`); + // // Log::error("OAI-PMH: $msg"); + // return; + // } + // const setSpec = "data-type:" + dataset.type; + // sets[setSpec] = `Set for document type '${dataset.type}'`; + // }); + // return sets; + // } + private handleIllegalVerb() { this.xsltParameter['oai_error_code'] = 'badVerb'; this.xsltParameter['oai_error_message'] = 'The verb provided in the request is illegal.'; diff --git a/app/Controllers/Http/Submitter/DatasetController.ts b/app/Controllers/Http/Submitter/DatasetController.ts index 0484ac7..043fb18 100644 --- a/app/Controllers/Http/Submitter/DatasetController.ts +++ b/app/Controllers/Http/Submitter/DatasetController.ts @@ -33,8 +33,8 @@ import ClamScan from 'clamscan'; import { ValidationException } from '@ioc:Adonis/Core/Validator'; import Drive from '@ioc:Adonis/Core/Drive'; import { Exception } from '@adonisjs/core/build/standalone'; -import XmlModel from 'App/Library/XmlModel'; -import { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; +// import XmlModel from 'App/Library/XmlModel'; +// import { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; export default class DatasetController { public async index({ auth, request, inertia }: HttpContextContract) { @@ -579,23 +579,6 @@ export default class DatasetController { 'files.extnames': 'file extension is not supported', }; - private async getDatasetXmlDomNode(dataset: Dataset) { - // dataset.fetchValues(); - const xmlModel = new XmlModel(dataset); - // xmlModel.setModel(dataset); - xmlModel.excludeEmptyFields(); - xmlModel.caching = true; - // const cache = dataset.xmlCache ? dataset.xmlCache : null; - // dataset.load('xmlCache'); - if (dataset.xmlCache) { - xmlModel.xmlCache = dataset.xmlCache; - } - - // return cache.getDomDocument(); - const domDocument: XMLBuilder | null = await xmlModel.getDomDocument(); - return domDocument; - } - // public async release({ params, view }) { public async release({ request, inertia, response }: HttpContextContract) { const id = request.param('id'); diff --git a/app/Models/Collection.ts b/app/Models/Collection.ts index f15b74a..0d67be3 100644 --- a/app/Models/Collection.ts +++ b/app/Models/Collection.ts @@ -1,6 +1,7 @@ -import { column, SnakeCaseNamingStrategy, manyToMany, ManyToMany } from '@ioc:Adonis/Lucid/Orm'; +import { column, SnakeCaseNamingStrategy, manyToMany, ManyToMany, belongsTo, BelongsTo } from '@ioc:Adonis/Lucid/Orm'; import Dataset from './Dataset'; import BaseModel from './BaseModel'; +import CollectionRole from './CollectionRole'; export default class Collection extends BaseModel { public static namingStrategy = new SnakeCaseNamingStrategy(); @@ -43,4 +44,10 @@ export default class Collection extends BaseModel { pivotTable: 'link_documents_collections', }) public datasets: ManyToMany; + + @belongsTo(() => CollectionRole, { + foreignKey: 'role_id', + }) + public collectionRole: BelongsTo; + } diff --git a/app/Models/CollectionRole.ts b/app/Models/CollectionRole.ts new file mode 100644 index 0000000..a72c4be --- /dev/null +++ b/app/Models/CollectionRole.ts @@ -0,0 +1,38 @@ +import { column, SnakeCaseNamingStrategy, hasMany, HasMany } from '@ioc:Adonis/Lucid/Orm'; +import BaseModel from './BaseModel'; +import Collection from './Collection'; + +export default class CollectionRole extends BaseModel { + public static namingStrategy = new SnakeCaseNamingStrategy(); + public static primaryKey = 'id'; + public static table = 'collections_roles'; + public static fillable: string[] = ['name', 'oai_name', 'visible']; + + @column({ + isPrimary: true, + }) + public id: number; + + @column({}) + public name: string; + + @column({}) + public oai_name?: string; + + @column({}) + public position: number; + + @column({}) + public visible: boolean; + + @column({}) + public visible_frontdoor: boolean; + + @column({}) + public visible_oai: boolean; + + @hasMany(() => Collection, { + foreignKey: 'role_id', + }) + public collections: HasMany; +} diff --git a/app/Models/DocumentXmlCache.ts b/app/Models/DocumentXmlCache.ts index 4f20770..d32dc25 100644 --- a/app/Models/DocumentXmlCache.ts +++ b/app/Models/DocumentXmlCache.ts @@ -3,7 +3,6 @@ import Dataset from './Dataset'; import { builder, create } from 'xmlbuilder2'; import { XMLBuilder } from 'xmlbuilder2/lib/interfaces'; import Database from '@ioc:Adonis/Lucid/Database'; -import dayjs from 'dayjs'; import { DateTime } from 'luxon'; export default class DocumentXmlCache extends BaseModel { diff --git a/app/Utils/utility-functions.ts b/app/Utils/utility-functions.ts new file mode 100644 index 0000000..d1b7ccd --- /dev/null +++ b/app/Utils/utility-functions.ts @@ -0,0 +1,21 @@ +export function sum(a: number, b: number): number { + return a + b; +} + +export function getDomain(host: string): string { + // $myhost = strtolower(trim($host)); + let myHost: string = host.trim().toLocaleLowerCase(); + // $count = substr_count($myhost, '.'); + const count: number = myHost.split(',').length - 1; + + if (count == 2) { + const words = myHost.split('.'); + if (words[1].length > 3) { + myHost = myHost.split('.', 2)[1]; + } + } else if (count > 2) { + myHost = getDomain(myHost.split('.', 2)[1]); + } + myHost = myHost.replace(new RegExp(/^.*:\/\//i, 'g'), ''); + return myHost; +} diff --git a/package-lock.json b/package-lock.json index 701fe34..88534aa 100644 --- a/package-lock.json +++ b/package-lock.json @@ -2677,9 +2677,9 @@ } }, "node_modules/@eslint-community/regexpp": { - "version": "4.8.2", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.2.tgz", - "integrity": "sha512-0MGxAVt1m/ZK+LTJp/j0qF7Hz97D9O/FH9Ms3ltnyIdDD57cbb1ACIQTkbHvNXtWDv5TPq7w5Kq56+cNukbo7g==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.9.0.tgz", + "integrity": "sha512-zJmuCWj2VLBt4c25CfBIbMZLGLyhkvs7LznyVX5HfpzeocThgIj5XQK4L+g3U36mMcx8bPMhGyPpwCATamC4jQ==", "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" @@ -2832,9 +2832,9 @@ } }, "node_modules/@inertiajs/core/node_modules/axios": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.0.tgz", - "integrity": "sha512-D4DdjDo5CY50Qms0qGQTTw6Q44jl7zRwY7bthds06pUGfChBCTcQs+N743eFWGEd6pRTMd6A+I87aWyFV5wiZQ==", + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.5.1.tgz", + "integrity": "sha512-Q28iYCWzNHjAm+yEAot5QaAMxhMghWLFVf7rRdwhUI+c2jix2DUXjAHXVi+s1ibs3mjPO/cCgbA++3BjD0vP/A==", "dependencies": { "follow-redirects": "^1.15.0", "form-data": "^4.0.0", @@ -3966,9 +3966,9 @@ "dev": true }, "node_modules/@types/istanbul-lib-report": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.0.tgz", - "integrity": "sha512-plGgXAPfVKFoYfa9NpYDAkseG+g6Jr294RqeqcqDixSbU34MZVJRi/P+7Y8GDpzkEwLaGZZOpKIEmeVZNtKsrg==", + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", + "integrity": "sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==", "dev": true, "dependencies": { "@types/istanbul-lib-coverage": "*" @@ -4026,14 +4026,14 @@ "integrity": "sha512-l5cpE57br4BIjK+9BSkFBOsWtwv6J9bJpC7gdXIzZyI0vuKvNTk0wZZrkQxMGsUAuGW9+WMNWF2IJMD7br2yeQ==" }, "node_modules/@types/md5": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.2.tgz", - "integrity": "sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og==" + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.3.tgz", + "integrity": "sha512-4K40FjTW0tiIx9NfV+/DHJ56ih3fcdkDqBYz5CffKwJVWYho1FxzjkddGcgEEIs+fP2DqmQ3lujC5c4bUOESTQ==" }, "node_modules/@types/mime": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.2.tgz", - "integrity": "sha512-YATxVxgRqNH6nHEIsvg6k2Boc1JHI9ZbH5iWFFv/MTkchz3b1ieGDa5T0a9RznNdI0KhVbdbWSN+KWWrQZRxTw==", + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.3.tgz", + "integrity": "sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==", "dev": true }, "node_modules/@types/minimatch": { @@ -4043,9 +4043,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.7.0", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.0.tgz", - "integrity": "sha512-zI22/pJW2wUZOVyguFaUL1HABdmSVxpXrzIqkjsHmyUjNhPoWM1CKfvVuXfetHhIok4RY573cqS0mZ1SJEnoTg==" + "version": "20.7.1", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.7.1.tgz", + "integrity": "sha512-LT+OIXpp2kj4E2S/p91BMe+VgGX2+lfO+XTpfXhh+bCk2LkQtHZSub8ewFBMGP5ClysPjTDFa4sMI8Q3n4T0wg==" }, "node_modules/@types/pino": { "version": "6.3.12", @@ -4092,9 +4092,9 @@ "dev": true }, "node_modules/@types/range-parser": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.4.tgz", - "integrity": "sha512-EEhsLsD6UsDM1yFhAvy0Cjr6VwmpMWqFBCb9w07wVugF7w9nfajxLuVmngTIpgS6svCnm6Vaw+MZhoDCKnOfsw==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.5.tgz", + "integrity": "sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==", "dev": true }, "node_modules/@types/retry": { @@ -4168,9 +4168,9 @@ } }, "node_modules/@types/validator": { - "version": "13.11.1", - "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.1.tgz", - "integrity": "sha512-d/MUkJYdOeKycmm75Arql4M5+UuXmf4cHdHKsyw1GcvnNgL6s77UkgSgJ8TE/rI5PYsnwYq5jkcWBLuN/MpQ1A==" + "version": "13.11.2", + "resolved": "https://registry.npmjs.org/@types/validator/-/validator-13.11.2.tgz", + "integrity": "sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==" }, "node_modules/@types/ws": { "version": "8.5.6", @@ -5868,9 +5868,9 @@ } }, "node_modules/browserslist": { - "version": "4.21.11", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.21.11.tgz", - "integrity": "sha512-xn1UXOKUz7DjdGlg9RrUr0GGiWzI97UQJnugHtH0OLDfJB7jMgoIkYvRIEO1l9EeEERVqeqLYOcFBW9ldjypbQ==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.22.1.tgz", + "integrity": "sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==", "dev": true, "funding": [ { @@ -5887,8 +5887,8 @@ } ], "dependencies": { - "caniuse-lite": "^1.0.30001538", - "electron-to-chromium": "^1.4.526", + "caniuse-lite": "^1.0.30001541", + "electron-to-chromium": "^1.4.535", "node-releases": "^2.0.13", "update-browserslist-db": "^1.0.13" }, @@ -6085,9 +6085,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001539", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001539.tgz", - "integrity": "sha512-hfS5tE8bnNiNvEOEkm8HElUHroYwlqMMENEzELymy77+tJ6m+gA2krtHl5hxJaj71OlpC2cHZbdSMX1/YEqEkA==", + "version": "1.0.30001541", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001541.tgz", + "integrity": "sha512-bLOsqxDgTqUBkzxbNlSBt8annkDpQB9NdzdTbO2ooJ+eC/IQcvDspDc058g84ejCelF7vHUx57KIOjEecOHXaw==", "dev": true, "funding": [ { @@ -6128,18 +6128,18 @@ } }, "node_modules/chai": { - "version": "4.3.8", - "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.8.tgz", - "integrity": "sha512-vX4YvVVtxlfSZ2VecZgFUTU5qPCYsobVI2O9FmwEXBhDigYGQA6jRXCycIs1yJnnWbZ6/+a2zNIF5DfVCcJBFQ==", + "version": "4.3.10", + "resolved": "https://registry.npmjs.org/chai/-/chai-4.3.10.tgz", + "integrity": "sha512-0UXG04VuVbruMUYbJ6JctvH0YnC/4q3/AkT18q4NaITo91CUm0liMS9VqzT9vZhVQ/1eqPanMWjBM+Juhfb/9g==", "dev": true, "dependencies": { "assertion-error": "^1.1.0", - "check-error": "^1.0.2", - "deep-eql": "^4.1.2", - "get-func-name": "^2.0.0", - "loupe": "^2.3.1", + "check-error": "^1.0.3", + "deep-eql": "^4.1.3", + "get-func-name": "^2.0.2", + "loupe": "^2.3.6", "pathval": "^1.1.1", - "type-detect": "^4.0.5" + "type-detect": "^4.0.8" }, "engines": { "node": ">=4" @@ -6208,10 +6208,13 @@ } }, "node_modules/check-error": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.2.tgz", - "integrity": "sha512-BrgHpW9NURQgzoNyjfq0Wu6VFO6D7IZEmJNdtgNqpzGG8RuNFHt2jQxWlAs4HMe119chBnv+34syEZtc6IhLtA==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/check-error/-/check-error-1.0.3.tgz", + "integrity": "sha512-iKEoDYaRmd1mxM90a2OEfWhjsjPpYPuQ+lMYsoxB126+t8fw7ySEO48nmDg5COTjxDI65/Y2OWpeEHk3ZOe8zg==", "dev": true, + "dependencies": { + "get-func-name": "^2.0.2" + }, "engines": { "node": "*" } @@ -7970,9 +7973,9 @@ "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" }, "node_modules/electron-to-chromium": { - "version": "1.4.529", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.529.tgz", - "integrity": "sha512-6uyPyXTo8lkv8SWAmjKFbG42U073TXlzD4R8rW3EzuznhFS2olCIAfjjQtV2dV2ar/vRF55KUd3zQYnCB0dd3A==", + "version": "1.4.535", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.535.tgz", + "integrity": "sha512-4548PpR4S5X5dlvX8NUIw0njH7btQtBoJWcgzpq7n2F9NQ5gMXOPP/6p6iVx6+YT3FVioNhEGa14WJj1k+2SfA==", "dev": true }, "node_modules/emittery": { @@ -9213,9 +9216,9 @@ } }, "node_modules/get-func-name": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.0.tgz", - "integrity": "sha512-Hm0ixYtaSZ/V7C8FJrtZIuBBI+iSgL+1Aq82zSu8VQNB4S3Gk8e7Qs3VwBDJAhmRZcFqkl3tQu36g/Foh5I5ig==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/get-func-name/-/get-func-name-2.0.2.tgz", + "integrity": "sha512-8vXOvuE167CtIc3OyItco7N/dpRtBbYOsPsXCz7X/PMnlGjYjSGuZJgM1Y7mmew7BKf9BqvLX2tnOVy1BBUsxQ==", "dev": true, "engines": { "node": "*" @@ -10793,9 +10796,9 @@ } }, "node_modules/jest-util/node_modules/@types/istanbul-reports": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.1.tgz", - "integrity": "sha512-c3mAZEuK0lvBp8tmuL74XRKn1+y2dcwOUpH7x4WrF6gk1GIgiluDRgMYQtw2OFcBvAJWlt6ASU3tSqxp0Uu0Aw==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.2.tgz", + "integrity": "sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==", "dev": true, "dependencies": { "@types/istanbul-lib-report": "*" @@ -12983,9 +12986,9 @@ } }, "node_modules/pino-pretty/node_modules/sonic-boom": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.3.0.tgz", - "integrity": "sha512-LYxp34KlZ1a2Jb8ZQgFCK3niIHzibdwtwNUWKg0qQRzsDoJ3Gfgkf8KdBTFU3SkejDEIlWwnSnpVdOZIhFMl/g==", + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-3.4.0.tgz", + "integrity": "sha512-zSe9QQW30nPzjkSJ0glFQO5T9lHsk39tz+2bAAwCj8CNgEG8ItZiX7Wb2ZgA8I04dwRGCcf1m3ABJa8AYm12Fw==", "dependencies": { "atomic-sleep": "^1.0.0" } @@ -16763,9 +16766,9 @@ } }, "node_modules/vue-facing-decorator": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/vue-facing-decorator/-/vue-facing-decorator-3.0.2.tgz", - "integrity": "sha512-hwOWIblWLBovaCHkNvqp2XTmaVmY8ZE7JcnkwlH9GZz0ZETZyN/O3kmZSmNVnOcRVG/ZOFhVdiBivozhaZxInA==", + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/vue-facing-decorator/-/vue-facing-decorator-3.0.3.tgz", + "integrity": "sha512-gMeyi6l+IBUijBITIzVcOQ6fPYHqbfqRGmazMmVNkR/TE+aW7OLDF2MW6+GBnzC+hUKTm8KtK5uPw1x/pkiZmA==", "dev": true, "peerDependencies": { "vue": "^3.0.0" diff --git a/tests/functional/dataset_controller.spec.ts b/tests/functional/dataset_controller.spec.ts index 71d2cb9..f1dc168 100644 --- a/tests/functional/dataset_controller.spec.ts +++ b/tests/functional/dataset_controller.spec.ts @@ -28,7 +28,7 @@ test.group('DatasetController', (group) => { const dataset = new Dataset(); dataset.type = 'analysisdata'; - dataset.creatingCorporation = 'Tethys RDR'; + dataset.creating_corporation = 'Tethys RDR'; dataset.language = 'de'; dataset.server_state = 'inprogress'; // Set the desired server state here await dataset.save();