diff --git a/.gitea/workflows/ci.yaml b/.gitea/workflows/ci.yaml index 35a3f43..a9ec6e1 100644 --- a/.gitea/workflows/ci.yaml +++ b/.gitea/workflows/ci.yaml @@ -95,3 +95,30 @@ jobs: # uses: coverallsapp/github-action@master # with: # github-token: ${{ secrets.GITHUB_TOKEN }} + +--- + +name: CI + +on: + push: + branches: + - feat/checkReferenceType + +jobs: + test: + runs-on: ubuntu-latest + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + - name: Set up Node.js + uses: actions/setup-node@v2 + with: + node-version: '14' + + - name: Install dependencies + run: npm install + + - name: Run tests + run: npx japa --group "ReferenceValidation" diff --git a/adonisrc.ts b/adonisrc.ts index 0c424f9..37ef08d 100644 --- a/adonisrc.ts +++ b/adonisrc.ts @@ -33,7 +33,8 @@ export default defineConfig({ () => import('#start/rules/file_length'), () => import('#start/rules/file_scan'), () => import('#start/rules/allowed_extensions_mimetypes'), - () => import('#start/rules/dependent_array_min_length') + () => import('#start/rules/dependent_array_min_length'), + () => import('#start/rules/referenceValidation') ], /* |-------------------------------------------------------------------------- diff --git a/app/Controllers/Http/Submitter/DatasetController.ts b/app/Controllers/Http/Submitter/DatasetController.ts index 41a5733..302c905 100644 --- a/app/Controllers/Http/Submitter/DatasetController.ts +++ b/app/Controllers/Http/Submitter/DatasetController.ts @@ -363,7 +363,8 @@ export default class DatasetController { references: vine .array( vine.object({ - value: vine.string().trim().minLength(3).maxLength(255), + // value: vine.string().trim().minLength(3).maxLength(255), + value: vine.string().trim().minLength(3).maxLength(255).validateReference({ typeField: 'type' }), type: vine.enum(Object.values(ReferenceIdentifierTypes)), relation: vine.enum(Object.values(RelationTypes)), label: vine.string().trim().minLength(2).maxLength(255), diff --git a/app/validators/dataset.ts b/app/validators/dataset.ts index 2b92348..b536955 100644 --- a/app/validators/dataset.ts +++ b/app/validators/dataset.ts @@ -1,6 +1,7 @@ import vine, { SimpleMessagesProvider } from '@vinejs/vine'; import { TitleTypes, DescriptionTypes, ContributorTypes, ReferenceIdentifierTypes, RelationTypes } from '#contracts/enums'; import dayjs from 'dayjs'; + // import MimeType from '#models/mime_type'; // const enabledExtensions = await MimeType.query().select('file_extension').where('enabled', true).exec(); @@ -125,7 +126,7 @@ export const createDatasetValidator = vine.compile( references: vine .array( vine.object({ - value: vine.string().trim().minLength(3).maxLength(255), + value: vine.string().trim().minLength(3).maxLength(255).validateReference({ typeField: 'type' }), type: vine.enum(Object.values(ReferenceIdentifierTypes)), relation: vine.enum(Object.values(RelationTypes)), label: vine.string().trim().minLength(2).maxLength(255), diff --git a/database/migrations/1723813974183_create_appconfigs_table.ts b/database/migrations/config_1_appconfigs_table.ts similarity index 100% rename from database/migrations/1723813974183_create_appconfigs_table.ts rename to database/migrations/config_1_appconfigs_table.ts diff --git a/database/migrations/1721999420193_create_backupcodes_table.ts b/database/migrations/config_2_backupcodes_table.ts similarity index 100% rename from database/migrations/1721999420193_create_backupcodes_table.ts rename to database/migrations/config_2_backupcodes_table.ts diff --git a/package-lock.json b/package-lock.json index 609fd32..70d769b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -214,15 +214,15 @@ } }, "node_modules/@adonisjs/assembler/node_modules/@adonisjs/env": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@adonisjs/env/-/env-6.1.0.tgz", - "integrity": "sha512-CzK+njXTH3EK+d/UJPqckyqWocOItmLgHIUbvhpd6WvveBnfv1Dz5j9H3k+ogHqThDSJCXu1RkaRAC+HNym9gA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@adonisjs/env/-/env-6.1.1.tgz", + "integrity": "sha512-sYvcJMbLSqwFWH0WtTTLddxkyXzERZl+8TEkXlMiIFaAZveq9h5eC4SQ+L5ILe9FHHiHVfmHsYF6LlAfcsIG1w==", "devOptional": true, "license": "MIT", "dependencies": { - "@poppinss/utils": "^6.7.3", - "@poppinss/validator-lite": "^1.0.3", - "dotenv": "^16.4.5", + "@poppinss/utils": "^6.9.2", + "@poppinss/validator-lite": "^2.0.1", + "dotenv": "^16.4.7", "split-lines": "^3.0.0" }, "engines": { @@ -450,14 +450,14 @@ } }, "node_modules/@adonisjs/core/node_modules/@adonisjs/env": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/@adonisjs/env/-/env-6.1.0.tgz", - "integrity": "sha512-CzK+njXTH3EK+d/UJPqckyqWocOItmLgHIUbvhpd6WvveBnfv1Dz5j9H3k+ogHqThDSJCXu1RkaRAC+HNym9gA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/@adonisjs/env/-/env-6.1.1.tgz", + "integrity": "sha512-sYvcJMbLSqwFWH0WtTTLddxkyXzERZl+8TEkXlMiIFaAZveq9h5eC4SQ+L5ILe9FHHiHVfmHsYF6LlAfcsIG1w==", "license": "MIT", "dependencies": { - "@poppinss/utils": "^6.7.3", - "@poppinss/validator-lite": "^1.0.3", - "dotenv": "^16.4.5", + "@poppinss/utils": "^6.9.2", + "@poppinss/validator-lite": "^2.0.1", + "dotenv": "^16.4.7", "split-lines": "^3.0.0" }, "engines": { @@ -1487,9 +1487,9 @@ } }, "node_modules/@babel/compat-data": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.3.tgz", - "integrity": "sha512-nHIxvKPniQXpmQLb0vhY3VaFb3S0YrTAwpOWJZh1wn3oJPjJk9Asva204PsBdmAE8vpzfHudT8DB0scYvy9q0g==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.26.5.tgz", + "integrity": "sha512-XvcZi1KWf88RVbF9wn8MN6tYFloU5qX8KjuF3E1PVBmJ9eypXfs4GRiJwLuTZL0iSnJUKn1BFPa5BPZZJyFzPg==", "dev": true, "license": "MIT", "engines": { @@ -1538,14 +1538,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.3.tgz", - "integrity": "sha512-6FF/urZvD0sTeO7k6/B15pMLC4CHUv1426lzr3N01aHJTl046uCAh9LXW/fzeXXjPNCJ6iABW5XaWOsIZB93aQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.26.5.tgz", + "integrity": "sha512-2caSP6fN9I7HOe6nqhtft7V4g7/V/gfDsC3Ag4W7kEzzvRGKqiv0pu0HogPiZ3KaVSoNDhUws6IJjDjpfmYIXw==", "dev": true, "license": "MIT", "dependencies": { - "@babel/parser": "^7.26.3", - "@babel/types": "^7.26.3", + "@babel/parser": "^7.26.5", + "@babel/types": "^7.26.5", "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^3.0.2" @@ -1568,13 +1568,13 @@ } }, "node_modules/@babel/helper-compilation-targets": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.25.9.tgz", - "integrity": "sha512-j9Db8Suy6yV/VHa4qzrj9yZfZxhLWQdVnRlXxmKLYlhWUVB1sB2G5sxuWYXk/whHD9iW76PmNzxZ4UCnTQTVEQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.26.5.tgz", + "integrity": "sha512-IXuyn5EkouFJscIDuFF5EsiSolseme1s0CZB+QxVugqJLYmKdxI1VfIBOst0SUu4rnk2Z7kqTwmoO1lp3HIfnA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/compat-data": "^7.25.9", + "@babel/compat-data": "^7.26.5", "@babel/helper-validator-option": "^7.25.9", "browserslist": "^4.24.0", "lru-cache": "^5.1.1", @@ -1731,9 +1731,9 @@ } }, "node_modules/@babel/helper-plugin-utils": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.25.9.tgz", - "integrity": "sha512-kSMlyUVdWe25rEsRGviIgOWnoT/nfABVWlqt9N19/dIPWViAOW2s9wznP5tURbs/IDuNk4gPy3YdYRgH3uxhBw==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.26.5.tgz", + "integrity": "sha512-RS+jZcRdZdRFzMyr+wcsaqOmld1/EqTghfaBGQQd/WnRdzdlvSZ//kF7U8VQTxf1ynZ4cjUcYgjVGx13ewNPMg==", "dev": true, "license": "MIT", "engines": { @@ -1759,15 +1759,15 @@ } }, "node_modules/@babel/helper-replace-supers": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.25.9.tgz", - "integrity": "sha512-IiDqTOTBQy0sWyeXyGSC5TBJpGFXBkRynjBeXsvbhQFKj2viwJC76Epz35YLU1fpe/Am6Vppb7W7zM4fPQzLsQ==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.26.5.tgz", + "integrity": "sha512-bJ6iIVdYX1YooY2X7w1q6VITt+LnUILtNk7zT78ykuwStx8BauCzxvFqFaHjOpW1bVnSUM1PN1f0p5P21wHxvg==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-member-expression-to-functions": "^7.25.9", "@babel/helper-optimise-call-expression": "^7.25.9", - "@babel/traverse": "^7.25.9" + "@babel/traverse": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -1848,12 +1848,12 @@ } }, "node_modules/@babel/parser": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.3.tgz", - "integrity": "sha512-WJ/CvmY8Mea8iDXo6a7RK2wbmJITT5fN3BEkRuFlxVyNx8jOKIIhmC4fSkTcPcf8JyavbBwIe6OpiCOBXt/IcA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.26.5.tgz", + "integrity": "sha512-SRJ4jYmXRqV1/Xc+TIVG84WjHBXKlxO9sHQnA2Pf12QQEAp1LOh6kDzNHXcUnbH1QI0FDoPPVOt+vyUDucxpaw==", "license": "MIT", "dependencies": { - "@babel/types": "^7.26.3" + "@babel/types": "^7.26.5" }, "bin": { "parser": "bin/babel-parser.js" @@ -2145,13 +2145,13 @@ } }, "node_modules/@babel/plugin-transform-block-scoped-functions": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.25.9.tgz", - "integrity": "sha512-toHc9fzab0ZfenFpsyYinOX0J/5dgJVA2fm64xPewu7CoYHWEivIWKxkK2rMi4r3yQqLnVmheMXRdG+k239CgA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.26.5.tgz", + "integrity": "sha512-chuTSY+hq09+/f5lMj8ZSYgCFpppV2CbYrhNFJ1BFoXpiWPnnAb7R0MqrafCpN8E1+YRrtM1MXZHJdIx8B6rMQ==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2565,13 +2565,13 @@ } }, "node_modules/@babel/plugin-transform-nullish-coalescing-operator": { - "version": "7.25.9", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.25.9.tgz", - "integrity": "sha512-ENfftpLZw5EItALAD4WsY/KUWvhUlZndm5GC7G3evUsVeSJB6p0pBeLQUnRnBCBx7zV0RKQjR9kCuwrsIrjWog==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-nullish-coalescing-operator/-/plugin-transform-nullish-coalescing-operator-7.26.5.tgz", + "integrity": "sha512-OHqczNm4NTQlW1ghrVY43FPoiRzbmzNVbcgVnMKZN/RQYezHUSdjACjaX50CD3B7UIAjv39+MlsrVDb3v741FA==", "dev": true, "license": "MIT", "dependencies": { - "@babel/helper-plugin-utils": "^7.25.9" + "@babel/helper-plugin-utils": "^7.26.5" }, "engines": { "node": ">=6.9.0" @@ -2894,15 +2894,15 @@ } }, "node_modules/@babel/plugin-transform-typescript": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.3.tgz", - "integrity": "sha512-6+5hpdr6mETwSKjmJUdYw0EIkATiQhnELWlE3kJFBwSg/BGIVwVaVbX+gOXBCdc7Ln1RXZxyWGecIXhUfnl7oA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typescript/-/plugin-transform-typescript-7.26.5.tgz", + "integrity": "sha512-GJhPO0y8SD5EYVCy2Zr+9dSZcEgaSmq5BLR0Oc25TOEhC+ba49vUAGZFjy8v79z9E1mdldq4x9d1xgh4L1d5dQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/helper-annotate-as-pure": "^7.25.9", "@babel/helper-create-class-features-plugin": "^7.25.9", - "@babel/helper-plugin-utils": "^7.25.9", + "@babel/helper-plugin-utils": "^7.26.5", "@babel/helper-skip-transparent-expression-wrappers": "^7.25.9", "@babel/plugin-syntax-typescript": "^7.25.9" }, @@ -3138,17 +3138,17 @@ } }, "node_modules/@babel/traverse": { - "version": "7.26.4", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.4.tgz", - "integrity": "sha512-fH+b7Y4p3yqvApJALCPJcwb0/XaOSgtK4pzV6WVjPR5GLFQBRI7pfoX2V2iM48NXvX07NUxxm1Vw98YjqTcU5w==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.26.5.tgz", + "integrity": "sha512-rkOSPOw+AXbgtwUga3U4u8RpoK9FEFWBNAlTpcnkLFjL5CT+oyHNuUUC/xx6XefEJ16r38r8Bc/lfp6rYuHeJQ==", "dev": true, "license": "MIT", "dependencies": { "@babel/code-frame": "^7.26.2", - "@babel/generator": "^7.26.3", - "@babel/parser": "^7.26.3", + "@babel/generator": "^7.26.5", + "@babel/parser": "^7.26.5", "@babel/template": "^7.25.9", - "@babel/types": "^7.26.3", + "@babel/types": "^7.26.5", "debug": "^4.3.1", "globals": "^11.1.0" }, @@ -3157,9 +3157,9 @@ } }, "node_modules/@babel/types": { - "version": "7.26.3", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.3.tgz", - "integrity": "sha512-vN5p+1kl59GVKMvTHt55NzzmYVxprfJD+ql7U9NFIfKCBkYE55LYtS+WtPlaYOyzydrKI8Nezd+aZextrd+FMA==", + "version": "7.26.5", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.26.5.tgz", + "integrity": "sha512-L6mZmwFDK6Cjh1nRCLXpa6no13ZIioJDz7mdkzHv399pThrTa/k0nUlNaenOeh2kWu/iaOQYElEpKPUswUa9Vg==", "license": "MIT", "dependencies": { "@babel/helper-string-parser": "^7.25.9", @@ -4045,19 +4045,19 @@ } }, "node_modules/@japa/plugin-adonisjs": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@japa/plugin-adonisjs/-/plugin-adonisjs-3.0.1.tgz", - "integrity": "sha512-xUZOzfBXSz2sWRoQT+qs+6LZBtWWE+cCBZ3j9ckz6+nPw3VI0nV6yLaX+oud3AY8Zb+BH+pErABBhaovZYv9dA==", + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/@japa/plugin-adonisjs/-/plugin-adonisjs-3.0.2.tgz", + "integrity": "sha512-yrIif8YYcV4GPXygIm/ndULid/6gIJ/NcylDaAsCw/iKPooU+sgUcZjYWe9AO04xuUJ5nFCvzsM/7q1yP7lxNg==", "devOptional": true, "license": "MIT", "engines": { "node": ">=18.16.0" }, "peerDependencies": { - "@adonisjs/core": "^6.5.0", - "@japa/api-client": "^2.0.3", + "@adonisjs/core": "^6.17.0", + "@japa/api-client": "^2.0.3 || ^3.0.0", "@japa/browser-client": "^2.0.3", - "@japa/runner": "^3.1.2", + "@japa/runner": "^3.1.2 || ^4.0.0", "playwright": "^1.42.1" }, "peerDependenciesMeta": { @@ -4839,13 +4839,10 @@ "license": "BSD-3-Clause" }, "node_modules/@poppinss/validator-lite": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@poppinss/validator-lite/-/validator-lite-1.0.3.tgz", - "integrity": "sha512-u4dmT7PDHwNtxY3q1jHVp/u+hMEEcBlkzd37QwwM4tVt/0mLlEDttSfPQ+TT7sqPG4VEtWKwVSlMInwPUYyJpA==", - "license": "MIT", - "dependencies": { - "validator": "^13.9.0" - } + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/@poppinss/validator-lite/-/validator-lite-2.0.1.tgz", + "integrity": "sha512-jdmx+7RsQL4iHscjEfC9TE6xGYUVug680VqwF8ICYdasxcTHODgQLv6ukCUTNVRFu/Xz70SLPNqXD0dA6MTMVQ==", + "license": "MIT" }, "node_modules/@redis/bloom": { "version": "1.2.0", @@ -5217,9 +5214,9 @@ } }, "node_modules/@swc/core": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.6.tgz", - "integrity": "sha512-zgXXsI6SAVwr6XsXyMnqlyLoa1lT+r09bAWI1xT3679ejWqI1Vnl14eJG0GjWYXCEMKHCNytfMq3OOQ62C39QQ==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.10.7.tgz", + "integrity": "sha512-py91kjI1jV5D5W/Q+PurBdGsdU5TFbrzamP7zSCqLdMcHkKi3rQEM5jkQcZr0MXXSJTaayLxS3MWYTBIkzPDrg==", "dev": true, "hasInstallScript": true, "license": "Apache-2.0", @@ -5235,16 +5232,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.10.6", - "@swc/core-darwin-x64": "1.10.6", - "@swc/core-linux-arm-gnueabihf": "1.10.6", - "@swc/core-linux-arm64-gnu": "1.10.6", - "@swc/core-linux-arm64-musl": "1.10.6", - "@swc/core-linux-x64-gnu": "1.10.6", - "@swc/core-linux-x64-musl": "1.10.6", - "@swc/core-win32-arm64-msvc": "1.10.6", - "@swc/core-win32-ia32-msvc": "1.10.6", - "@swc/core-win32-x64-msvc": "1.10.6" + "@swc/core-darwin-arm64": "1.10.7", + "@swc/core-darwin-x64": "1.10.7", + "@swc/core-linux-arm-gnueabihf": "1.10.7", + "@swc/core-linux-arm64-gnu": "1.10.7", + "@swc/core-linux-arm64-musl": "1.10.7", + "@swc/core-linux-x64-gnu": "1.10.7", + "@swc/core-linux-x64-musl": "1.10.7", + "@swc/core-win32-arm64-msvc": "1.10.7", + "@swc/core-win32-ia32-msvc": "1.10.7", + "@swc/core-win32-x64-msvc": "1.10.7" }, "peerDependencies": { "@swc/helpers": "*" @@ -5256,9 +5253,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.6.tgz", - "integrity": "sha512-USbMvT8Rw5PvIfF6HyTm+yW84J9c45emzmHBDIWY76vZHkFsS5MepNi+JLQyBzBBgE7ScwBRBNhRx6VNhkSoww==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.10.7.tgz", + "integrity": "sha512-SI0OFg987P6hcyT0Dbng3YRISPS9uhLX1dzW4qRrfqQdb0i75lPJ2YWe9CN47HBazrIA5COuTzrD2Dc0TcVsSQ==", "cpu": [ "arm64" ], @@ -5273,9 +5270,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.6.tgz", - "integrity": "sha512-7t2IozcZN4r1p27ei+Kb8IjN4aLoBDn107fPi+aPLcVp2uFgJEUzhCDuZXBNW2057Mx1OHcjzrkaleRpECz3Xg==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.10.7.tgz", + "integrity": "sha512-RFIAmWVicD/l3RzxgHW0R/G1ya/6nyMspE2cAeDcTbjHi0I5qgdhBWd6ieXOaqwEwiCd0Mot1g2VZrLGoBLsjQ==", "cpu": [ "x64" ], @@ -5290,9 +5287,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.6.tgz", - "integrity": "sha512-CPgWT+D0bDp/qhXsLkIJ54LmKU1/zvyGaf/yz8A4iR+YoF6R5CSXENXhNJY8cIrb6+uNWJZzHJ+gefB5V51bpA==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.10.7.tgz", + "integrity": "sha512-QP8vz7yELWfop5mM5foN6KkLylVO7ZUgWSF2cA0owwIaziactB2hCPZY5QU690coJouk9KmdFsPWDnaCFUP8tg==", "cpu": [ "arm" ], @@ -5307,9 +5304,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.6.tgz", - "integrity": "sha512-5qZ6hVnqO/ShETXdGSzvdGUVx372qydlj1YWSYiaxQzTAepEBc8TC1NVUgYtOHOKVRkky1d7p6GQ9lymsd4bHw==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.10.7.tgz", + "integrity": "sha512-NgUDBGQcOeLNR+EOpmUvSDIP/F7i/OVOKxst4wOvT5FTxhnkWrW+StJGKj+DcUVSK5eWOYboSXr1y+Hlywwokw==", "cpu": [ "arm64" ], @@ -5324,9 +5321,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.6.tgz", - "integrity": "sha512-hB2xZFmXCKf2iJF5y2z01PSuLqEoUP3jIX/XlIHN+/AIP7PkSKsValE63LnjlnWPnSEI0IxUyRE3T3FzWE/fQQ==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.10.7.tgz", + "integrity": "sha512-gp5Un3EbeSThBIh6oac5ZArV/CsSmTKj5jNuuUAuEsML3VF9vqPO+25VuxCvsRf/z3py+xOWRaN2HY/rjMeZog==", "cpu": [ "arm64" ], @@ -5341,9 +5338,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.6.tgz", - "integrity": "sha512-PRGPp0I22+oJ8RMGg8M4hXYxEffH3ayu0WoSDPOjfol1F51Wj1tfTWN4wVa2RibzJjkBwMOT0KGLGb/hSEDDXQ==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.10.7.tgz", + "integrity": "sha512-k/OxLLMl/edYqbZyUNg6/bqEHTXJT15l9WGqsl/2QaIGwWGvles8YjruQYQ9d4h/thSXLT9gd8bExU2D0N+bUA==", "cpu": [ "x64" ], @@ -5358,9 +5355,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.6.tgz", - "integrity": "sha512-SoNBxlA86lnoV9vIz/TCyakLkdRhFSHx6tFMKNH8wAhz1kKYbZfDmpYoIzeQqdTh0tpx8e/Zu1zdK4smovsZqQ==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.10.7.tgz", + "integrity": "sha512-XeDoURdWt/ybYmXLCEE8aSiTOzEn0o3Dx5l9hgt0IZEmTts7HgHHVeRgzGXbR4yDo0MfRuX5nE1dYpTmCz0uyA==", "cpu": [ "x64" ], @@ -5375,9 +5372,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.6.tgz", - "integrity": "sha512-6L5Y2E+FVvM+BtoA+mJFjf/SjpFr73w2kHBxINxwH8/PkjAjkePDr5m0ibQhPXV61bTwX49+1otzTY85EsUW9Q==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.10.7.tgz", + "integrity": "sha512-nYAbi/uLS+CU0wFtBx8TquJw2uIMKBnl04LBmiVoFrsIhqSl+0MklaA9FVMGA35NcxSJfcm92Prl2W2LfSnTqQ==", "cpu": [ "arm64" ], @@ -5392,9 +5389,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.6.tgz", - "integrity": "sha512-kxK3tW8DJwEkAkwy0vhwoBAShRebH1QTe0mvH9tlBQ21rToVZQn+GCV/I44dind80hYPw0Tw2JKFVfoEJyBszg==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.10.7.tgz", + "integrity": "sha512-+aGAbsDsIxeLxw0IzyQLtvtAcI1ctlXVvVcXZMNXIXtTURM876yNrufRo4ngoXB3jnb1MLjIIjgXfFs/eZTUSw==", "cpu": [ "ia32" ], @@ -5409,9 +5406,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.10.6", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.6.tgz", - "integrity": "sha512-4pJka/+t8XcHee12G/R5VWcilkp5poT2EJhrybpuREkpQ7iC/4WOlOVrohbWQ4AhDQmojYQI/iS+gdF2JFLzTQ==", + "version": "1.10.7", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.10.7.tgz", + "integrity": "sha512-TBf4clpDBjF/UUnkKrT0/th76/zwvudk5wwobiTFqDywMApHip5O0VpBgZ+4raY2TM8k5+ujoy7bfHb22zu17Q==", "cpu": [ "x64" ], @@ -7842,9 +7839,9 @@ } }, "node_modules/browserslist": { - "version": "4.24.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.3.tgz", - "integrity": "sha512-1CPmv8iobE2fyRMV97dAcMVegvvWKxmq94hkLiAkUGwKVTyDLw33K+ZxiFrREKmmps4rIw6grcCFCnTMSZ/YiA==", + "version": "4.24.4", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.4.tgz", + "integrity": "sha512-KDi1Ny1gSePi1vm0q4oxSF8b4DR44GF4BbmS2YdhPLOEqd8pDviZOGH/GsmRwoWJ2+5Lr085X7naowMwKHDG1A==", "dev": true, "funding": [ { @@ -8079,9 +8076,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001690", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001690.tgz", - "integrity": "sha512-5ExiE3qQN6oF8Clf8ifIDcMRCRE/dMGcETG/XGMD8/XiXm6HXQgQTh1yZYLXXpSOsEUlJm1Xr7kGULZTuGtP/w==", + "version": "1.0.30001692", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001692.tgz", + "integrity": "sha512-A95VKan0kdtrsnMubMKxEKUKImOPSuCpYgxSQBo036P5YYgVIcOYJEgt/txJWqObiRQeISNCfef9nvlQ0vbV7A==", "dev": true, "funding": [ { @@ -10015,9 +10012,9 @@ "license": "MIT" }, "node_modules/electron-to-chromium": { - "version": "1.5.79", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.79.tgz", - "integrity": "sha512-nYOxJNxQ9Om4EC88BE4pPoNI8xwSFf8pU/BAeOl4Hh/b/i6V4biTAzwV7pXi3ARKeoYO5JZKMIXTryXSVer5RA==", + "version": "1.5.80", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.80.tgz", + "integrity": "sha512-LTrKpW0AqIuHwmlVNV+cjFYTnXtM9K37OGhpe0ZI10ScPSxqVSryZHIY3WnCS5NSYbBODRTZyhRMS2h5FAEqAw==", "dev": true, "license": "ISC" }, @@ -11313,9 +11310,9 @@ } }, "node_modules/focus-trap": { - "version": "7.6.2", - "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.2.tgz", - "integrity": "sha512-9FhUxK1hVju2+AiQIDJ5Dd//9R2n2RAfJ0qfhF4IHGHgcoEUTMpbTeG/zbEuwaiYXfuAH6XE0/aCyxDdRM+W5w==", + "version": "7.6.4", + "resolved": "https://registry.npmjs.org/focus-trap/-/focus-trap-7.6.4.tgz", + "integrity": "sha512-xx560wGBk7seZ6y933idtjJQc1l+ck+pI3sKvhKozdBV1dRZoKhkW5xoCaFv9tQiX5RH1xfSxjuNu6g+lmN/gw==", "license": "MIT", "dependencies": { "tabbable": "^6.2.0" @@ -12214,9 +12211,9 @@ } }, "node_modules/http-parser-js": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.8.tgz", - "integrity": "sha512-SGeBX54F94Wgu5RH3X5jsDtf4eHyRogWX1XGT3b4HuW3tQPM4AaBzoUji/4AAJNXCEOWZ5O0DgZmJw1947gD5Q==", + "version": "0.5.9", + "resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.9.tgz", + "integrity": "sha512-n1XsPy3rXVxlqxVioEWdC+0+M+SQw0DpJynwtOPo1X+ZlvdzTLtDBIJJlDQTnwZIFJrZSzSGmIOUdP8tu+SgLw==", "dev": true, "license": "MIT" }, @@ -13772,9 +13769,9 @@ "license": "MIT" }, "node_modules/json11": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/json11/-/json11-2.0.0.tgz", - "integrity": "sha512-VuKJKUSPEJape+daTm70Nx7vdcdorf4S6LCyN2z0jUVH4UrQ4ftXo2kC0bnHpCREmxHuHqCNVPA75BjI3CB6Ag==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/json11/-/json11-2.0.2.tgz", + "integrity": "sha512-HIrd50UPYmP6sqLuLbFVm75g16o0oZrVfxrsY0EEys22klz8mRoWlX9KAEDOSOR9Q34rcxsyC8oDveGrCz5uLQ==", "license": "MIT", "bin": { "json11": "dist/cli.mjs" @@ -16930,13 +16927,13 @@ } }, "node_modules/readdirp": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.0.2.tgz", - "integrity": "sha512-yDMz9g+VaZkqBYS/ozoBJwaBhTbZo3UNYQHNRw1D3UFQB8oHB4uS/tAODO+ZLjGWmUbKnIlOWO+aaIiAxrUWHA==", + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.1.tgz", + "integrity": "sha512-h80JrZu/MHUZCyHu5ciuoI0+WxsCxzxJTILn6Fs8rxSnFPh+UVHYfeIxK1nVGugMqkfC4vJcBOYbkfkwYK0+gw==", "devOptional": true, "license": "MIT", "engines": { - "node": ">= 14.16.0" + "node": ">= 14.18.0" }, "funding": { "type": "individual", @@ -19339,9 +19336,9 @@ "license": "Apache-2.0" }, "node_modules/ts-loader": { - "version": "9.5.1", - "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", - "integrity": "sha512-rNH3sK9kGZcH9dYzC7CewQm4NtxJTjSEVRJ2DyBZR7f8/wcta+iV44UPCXc5+nzDzivKtlzV6c9P4e+oFhDLYg==", + "version": "9.5.2", + "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.2.tgz", + "integrity": "sha512-Qo4piXvOTWcMGIgRiuFa6nHNm+54HbYaZCKqc9eeZCLRy3XqafQgwX2F7mofrbJG3g7EEb+lkiR+z2Lic2s3Zw==", "dev": true, "license": "MIT", "dependencies": { @@ -19549,9 +19546,9 @@ } }, "node_modules/type-fest": { - "version": "4.31.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.31.0.tgz", - "integrity": "sha512-yCxltHW07Nkhv/1F6wWBr8kz+5BGMfP+RbRSYFnegVb0qV/UMT0G0ElBloPVerqn4M2ZV80Ir1FtCcYv1cT6vQ==", + "version": "4.32.0", + "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.32.0.tgz", + "integrity": "sha512-rfgpoi08xagF3JSdtJlCwMq9DGNDE0IMh3Mkpc1wUypg9vPi786AiqeBBKcqvIkq42azsBM85N490fyZjeUftw==", "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=16" @@ -19675,9 +19672,9 @@ } }, "node_modules/typescript": { - "version": "5.7.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", - "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", + "version": "5.7.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.3.tgz", + "integrity": "sha512-84MVSjMEHP+FQRPy3pX9sTVV/INIex71s9TL2Gm5FG/WG1SqXeKyZ0k7/blY/4FdOzI12CBy1vGc4og/eus0fw==", "devOptional": true, "license": "Apache-2.0", "bin": { @@ -19813,9 +19810,9 @@ } }, "node_modules/update-browserslist-db": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.1.tgz", - "integrity": "sha512-R8UzCaa9Az+38REPiJ1tXlImTJXlVfgHZsglwBD/k6nj76ctsH1E3q4doGrukiLQd3sGQYu56r5+lo5r94l29A==", + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.2.tgz", + "integrity": "sha512-PPypAm5qvlD7XMZC3BujecnaOxwhrtoFR+Dqkk5Aa/6DssiH0ibKoketaj9w8LP7Bont1rYeoV5plxD7RTEPRg==", "dev": true, "funding": [ { @@ -19834,7 +19831,7 @@ "license": "MIT", "dependencies": { "escalade": "^3.2.0", - "picocolors": "^1.1.0" + "picocolors": "^1.1.1" }, "bin": { "update-browserslist-db": "cli.js" @@ -20353,9 +20350,9 @@ } }, "node_modules/webpack-dev-middleware/node_modules/memfs": { - "version": "4.15.3", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.15.3.tgz", - "integrity": "sha512-vR/g1SgqvKJgAyYla+06G4p/EOcEmwhYuVb1yc1ixcKf8o/sh7Zngv63957ZSNd1xrZJoinmNyDf2LzuP8WJXw==", + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.17.0.tgz", + "integrity": "sha512-4eirfZ7thblFmqFjywlTmuWVSvccHAJbn1r8qQLzmTO11qcqpohOjmY2mFce6x7x7WtskzRqApPD0hv+Oa74jg==", "dev": true, "license": "Apache-2.0", "dependencies": { diff --git a/providers/query_builder_provider.ts b/providers/query_builder_provider.ts index 6509fae..ed7cfb7 100644 --- a/providers/query_builder_provider.ts +++ b/providers/query_builder_provider.ts @@ -63,6 +63,15 @@ export default class QueryBuilderProvider { public register() { // Register your own bindings + // const ModelQueryBuilder = this.app.container.bind('@adonisjs/lucid/orm/ModelQueryBuilder'); + + // ModelQueryBuilder.macro('whereTrue', function (columnName: string) { + // return this.where(columnName, true); + // }); + + // ModelQueryBuilder.macro('whereFalse', function (columnName: string) { + // return this.where(columnName, false); + // }); } public async boot() { @@ -73,15 +82,14 @@ export default class QueryBuilderProvider { // let rolesPluck = {}; let rolesPluck: { [key: number]: any } = {}; const result = await this.exec(); - result.forEach((user, index) => { - let idc; + result.forEach((user: { [key: string]: any }, index: number) => { + let idc: number; if (!id) { idc = index; } else { idc = user[id]; } - const value = user[valueColumn]; - // rolesPluck[idc] = user.name; + const value: any = user[valueColumn]; rolesPluck[idc] = value; }); return rolesPluck; diff --git a/public/assets/manifest.json b/public/assets/manifest.json index 9062764..c1adf2a 100644 --- a/public/assets/manifest.json +++ b/public/assets/manifest.json @@ -98,6 +98,5 @@ "assets/images/marker-icon.png": "http://localhost:8080/assets/images/marker-icon.2b3e1faf.png", "assets/images/layers-2x.png": "http://localhost:8080/assets/images/layers-2x.8f2c4d11.png", "assets/images/layers.png": "http://localhost:8080/assets/images/layers.416d9136.png", - "assets/images/Close.svg": "http://localhost:8080/assets/images/Close.e4887675.svg", - "assets/vendors-node_modules_vue-facing-decorator_dist_esm_index_js-node_modules_vue-facing-decorator-818045.js": "http://localhost:8080/assets/vendors-node_modules_vue-facing-decorator_dist_esm_index_js-node_modules_vue-facing-decorator-818045.js" + "assets/images/Close.svg": "http://localhost:8080/assets/images/Close.e4887675.svg" } \ No newline at end of file diff --git a/start/rules/referenceValidation.ts b/start/rules/referenceValidation.ts new file mode 100644 index 0000000..4aaaf8e --- /dev/null +++ b/start/rules/referenceValidation.ts @@ -0,0 +1,114 @@ +import { FieldContext } from '@vinejs/vine/types'; +import vine from '@vinejs/vine'; +import { VineString } from '@vinejs/vine'; +import axios, { AxiosInstance } from 'axios'; +import { ReferenceIdentifierTypes } from '#contracts/enums'; + +type Options = { + typeField: string; +}; + +// Function to check if DOI exists using the DOI API +async function checkDoiExists(doi: string): Promise { + try { + const response = await axios.get(`${doi}`); + return response.status === 200; // If status is 200, DOI is valid + } catch (error) { + return false; // If request fails, DOI does not exist + } +} + +// Function to check if ISBN exists using the Open Library API +async function checkIsbnExists(isbn: string): Promise { + try { + const response = await axios.get(`https://isbnsearch.org/isbn/${isbn}`); + return response.data && response.status == 200; // If title is returned, ISBN is valid + } catch (error) { + return false; // If request fails, ISBN does not exist + } +} + +async function validateReference(value: unknown, options: Options, field: FieldContext) { + if (typeof value !== 'string') { + return; + } + + const type = field.parent[options.typeField]; + + if (type === ReferenceIdentifierTypes.URL) { + if (!/^https?:\/\/[^\s$.?#].[^\s]*$/.test(value)) { + field.report('The {{ field }} must be a valid URL', 'validateReference', field); + } else { + try { + const exists = await checkDoiExists(value); + if (!exists) { + field.report('The {{ field }} must be an existing DOI', 'validateReference', field); + } + } catch (error) { + field.report('Error checking DOI existence: ' + error.message, 'validateReference', field); + } + } + } + // Check if the value does not match the DOI pattern + // The regex pattern ^10.\d{4,9}\/[-._;()/:a-zA-Z0-9]+$ is designed to match valid DOI formats. + // - ^10. ensures that the string starts with "10." + // - \d{4,9} matches a sequence of 4 to 9 digits. + // - \/ matches the literal forward slash character. + // - [-._;()/:a-zA-Z0-9]+ matches one or more characters that can include uppercase and lowercase letters, digits, and a set of special characters. + // The i flag at the end of the regex makes the matching case-insensitive, meaning it will match both uppercase and lowercase letters. + // If the value does not match this pattern, the code inside the if block will execute. + else if (type === ReferenceIdentifierTypes.DOI) { + // Extract the DOI from the URL if it starts with 'https://doi.org/' + const doiPattern = /^https:\/\/doi\.org\/(10.\d{4,9}\/[-._;()/:a-zA-Z0-9]+)$/i; + const match = value.match(doiPattern); + const doi = match ? match[1] : value; + // Check if the extracted DOI or the value itself matches the DOI patter + if (!/^10.\d{4,9}\/[-._;()/:a-zA-Z0-9]+$/i.test(doi)) { + field.report('The {{ field }} must be a valid DOI', 'validateReference', field); + } else { + try { + const exists = await checkDoiExists(value); + if (!exists) { + field.report('The {{ field }} must be an existing DOI', 'validateReference', field); + } + } catch (error) { + field.report('Error checking DOI existence: ' + error.message, 'validateReference', field); + } + } + } else if (type === ReferenceIdentifierTypes.ISBN) { + if (!/^(?=(?:[^0-9]*[0-9]){10}(?:(?:[^0-9]*[0-9]){3})?$)[\d-]+$/.test(value)) { + field.report('The {{ field }} must be a valid ISBN', 'validateReference', field); + } else { + try { + const exists = await checkIsbnExists(value); + if (!exists) { + field.report('The {{ field }} must be an existing ISBN', 'validateReference', field); + } + } catch (error) { + field.report('Error checking ISBN existence: ' + error.message, 'validateReference', field); + } + } + } else if (type === ReferenceIdentifierTypes.Handle && !/^\d{2,}.\d{4,9}\/[-._;()/:a-zA-Z0-9]+$/.test(value)) { + /// Extract the Handle from the URL if it contains '/handle/' + field.report('The {{ field }} must be a valid Handle', 'validateReference', field); + } else if ( + type === ReferenceIdentifierTypes.URN && + !/^urn:[a-zA-Z0-9][a-zA-Z0-9-]{0,31}:[a-zA-Z0-9()+,\-.:=@;$_!*'%/?#]+$/.test(value) + ) { + field.report('The {{ field }} must be a valid URN', 'validateReference', field); + } else if (type === ReferenceIdentifierTypes.ISSN && !/^\d{4}-\d{3}[\dxX]$/.test(value)) { + field.report('The {{ field }} must be a valid ISSN', 'validateReference', field); + } +} + +export const validateReferenceRule = vine.createRule(validateReference); + +declare module '@vinejs/vine' { + interface VineString { + validateReference(options: Options): this; + } +} + +VineString.macro('validateReference', function (this: VineString, options: Options) { + return this.use(validateReferenceRule(options)); +}); diff --git a/tests/bootstrap.ts b/tests/bootstrap.ts index eb6901a..2496c87 100644 --- a/tests/bootstrap.ts +++ b/tests/bootstrap.ts @@ -15,7 +15,7 @@ import { assert } from '@japa/assert'; import { apiClient } from '@japa/api-client'; import { pluginAdonisJS } from '@japa/plugin-adonisjs'; import app from '@adonisjs/core/services/app'; - +import env from '#start/env' /* |-------------------------------------------------------------------------- | Japa Plugins @@ -28,7 +28,13 @@ import app from '@adonisjs/core/services/app'; | */ // export const plugins: Required['plugins'] = [assert(), runFailedTests(), apiClient()]; -export const plugins: Config['plugins'] = [assert(), apiClient(), pluginAdonisJS(app)]; +export const plugins: Config['plugins'] = [ + assert(), + apiClient({ + baseURL: `http://${env.get('HOST')}:${env.get('PORT')}`, + }), + pluginAdonisJS(app), +]; /* |-------------------------------------------------------------------------- @@ -59,11 +65,18 @@ export const reporters: Required['reporters'] = { */ export const runnerHooks: Pick, 'setup' | 'teardown'> = { setup: [ + () => { + console.log('running before all the tests'); + }, // () => testUtils.ace().loadCommands(), () => testUtils.db().migrate(), // () => testUtils.httpServer().start(), ], - teardown: [], + teardown: [ + () => { + console.log('running after all the tests'); + }, + ], }; /* diff --git a/tests/functional/referenceValidation.spec.ts b/tests/functional/referenceValidation.spec.ts new file mode 100644 index 0000000..251548e --- /dev/null +++ b/tests/functional/referenceValidation.spec.ts @@ -0,0 +1,215 @@ +import { test } from '@japa/runner'; +import { ReferenceIdentifierTypes } from '#contracts/enums'; +import vine from '@vinejs/vine'; + +// node ace test functional --groups "ReferenceValidation" +test.group('ReferenceValidation', () => { + test('validate valid DOI', async ({ assert }) => { + const validator = vine.compile( + vine.object({ + reference: vine.string().validateReference({ typeField: 'type' }), + type: vine.enum(Object.values(ReferenceIdentifierTypes)), + }), + ); + + const data = { + reference: 'https://doi.org/10.24341/tethys.236', + type: ReferenceIdentifierTypes.DOI, + }; + + try { + const payload = await validator.validate(data); + assert.deepEqual(payload, data); + } catch { + assert.isTrue(false); + } + }); + + test('validate invalid DOI', async ({ assert }) => { + const validator = vine.compile( + vine.object({ + reference: vine.string().validateReference({ typeField: 'type' }), + type: vine.enum(Object.values(ReferenceIdentifierTypes)), + }), + ); + + const data = { + reference: 'https://doi.org/invalid-doi', + type: ReferenceIdentifierTypes.DOI, + }; + + let payload = {}; + try { + payload = await validator.validate(data); + } catch { + assert.notDeepEqual(payload, data); + } + }); + + test('validate valid Handle', async ({ assert }) => { + const validator = vine.compile( + vine.object({ + reference: vine.string().validateReference({ typeField: 'type' }), + type: vine.enum(Object.values(ReferenceIdentifierTypes)), + }) + ); + + const data = { + reference: '20.5000/abc123', + type: ReferenceIdentifierTypes.Handle, + }; + + try { + const payload = await validator.validate(data); + assert.deepEqual(payload, data); + } catch { + assert.isTrue(false); + } + }); + test('validate valid ISBN', async ({ assert }) => { + const validator = vine.compile( + vine.object({ + reference: vine.string().validateReference({ typeField: 'type' }), + type: vine.enum(Object.values(ReferenceIdentifierTypes)), + }) + ); + + const data = { + // reference: '978-3-85316-090-9', + // reference: '9783853160909', + // reference: '978-3-900312-64-0', // Geologische Karte der Republik Österreich 1 : 50.000 + reference: '3900312648', // Geologische Karte der Republik Österreich 1 : 50.000 + type: ReferenceIdentifierTypes.ISBN, + }; + + try { + const payload = await validator.validate(data); + assert.deepEqual(payload, data); + } catch { + assert.isTrue(false); + } + }); + + test('validate invalid ISBN', async ({ assert }) => { + const validator = vine.compile( + vine.object({ + reference: vine.string().validateReference({ typeField: 'type' }), + type: vine.enum(Object.values(ReferenceIdentifierTypes)), + }) + ); + + const data = { + reference: 'invalid-isbn', + type: ReferenceIdentifierTypes.ISBN, + }; + + let payload = {}; + try { + payload = await validator.validate(data); + } catch { + assert.notDeepEqual(payload, data); + } + }); + + test('validate valid URN', async ({ assert }) => { + const validator = vine.compile( + vine.object({ + reference: vine.string().validateReference({ typeField: 'type' }), + type: vine.enum(Object.values(ReferenceIdentifierTypes)), + }) + ); + + const data = { + reference: 'urn:isbn:0451450523', + type: ReferenceIdentifierTypes.URN, + }; + + try { + const payload = await validator.validate(data); + assert.deepEqual(payload, data); + } catch { + assert.isTrue(false); + } + }); + + test('validate invalid URN', async ({ assert }) => { + const validator = vine.compile( + vine.object({ + reference: vine.string().validateReference({ typeField: 'type' }), + type: vine.enum(Object.values(ReferenceIdentifierTypes)), + }) + ); + + const data = { + reference: 'invalid-urn', + type: ReferenceIdentifierTypes.URN, + }; + + let payload = {}; + try { + payload = await validator.validate(data); + } catch { + assert.notDeepEqual(payload, data); + } + }); + + test('validate valid ISSN', async ({ assert }) => { + const validator = vine.compile( + vine.object({ + reference: vine.string().validateReference({ typeField: 'type' }), + type: vine.enum(Object.values(ReferenceIdentifierTypes)), + }) + ); + + const data = { + reference: '1234-567X', + type: ReferenceIdentifierTypes.ISSN, + }; + + try { + const payload = await validator.validate(data); + assert.deepEqual(payload, data); + } catch { + assert.isTrue(false); + } + }); + + test('validate invalid ISSN', async ({ assert }) => { + const validator = vine.compile( + vine.object({ + reference: vine.string().validateReference({ typeField: 'type' }), + type: vine.enum(Object.values(ReferenceIdentifierTypes)), + }) + ); + + const data = { + reference: 'invalid-issn', + type: ReferenceIdentifierTypes.ISSN, + }; + + let payload = {}; + try { + payload = await validator.validate(data); + } catch { + assert.notDeepEqual(payload, data); + } + }); + // test('validate invalid Handle', async ({ assert }) => { + // const validator = vine.compile( + // vine.object({ + // reference: vine.string().validateReference({ typeField: 'type' }), + // type: vine.enum(Object.values(ReferenceIdentifierTypes)), + // }) + // ); + + // const data = { + // reference: 'invalid-handle', + // type: ReferenceIdentifierTypes.Handle, + // }; + + // const result = await validator.validate(data); + // assert.isFalse(result.valid); + // }); + + // Add more tests for other reference types as needed +});