Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactoring/fairspc 82 #1566

Merged
merged 89 commits into from
Nov 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
89 commits
Select commit Hold shift + click to select a range
f194327
FAIRSPC-82: started switching to Spring Boot
tgreenwood Jun 11, 2024
5147398
FAIRSPC-82: started switching to Spring Boot
tgreenwood Jun 11, 2024
f96bc0a
Merge remote-tracking branch 'origin/refactoring/FAIRSPC-82' into ref…
tgreenwood Jul 18, 2024
8e1ee28
FAIRSPC-82: config loader
tgreenwood Aug 13, 2024
22e00fb
FAIRSPC-82: updated security config
tgreenwood Aug 23, 2024
0d9d964
FAIRSPC-82: fixed webdav endpoints
tgreenwood Aug 23, 2024
923bfc1
FAIRSPC-82: fixed user service and security config
tgreenwood Aug 23, 2024
34620c5
FAIRSPC-82: fixed security issue in async processes
tgreenwood Sep 4, 2024
322325a
FAIRSPC-82: fixed webdav endpoints
tgreenwood Sep 4, 2024
f3564b3
FAIRSPC-82: added SPARQL query read-only endpoint
tgreenwood Sep 6, 2024
9fa7093
FAIRSPC-82: slightly cleaned up the code, removed obsoleted todo's
tgreenwood Sep 6, 2024
84d0914
FAIRSPC-82: added permission check for the sparql query
tgreenwood Sep 6, 2024
3b3a2c8
FAIRSPC-82: added features config and condition to switch it on/off
tgreenwood Sep 9, 2024
b8e8bb8
FAIRSPC-82: moved part of configs to properties files
tgreenwood Sep 10, 2024
fc0d25e
FAIRSPC-82: switched cache config to spring properties
tgreenwood Sep 10, 2024
88052d8
FAIRSPC-82:
tgreenwood Sep 11, 2024
2dd43ad
FAIRSPC-82: moved public url to application.yml
tgreenwood Sep 11, 2024
e50b5b0
FAIRSPC-82: moved webdav to application.yml
tgreenwood Sep 12, 2024
66d5476
FAIRSPC-82: moved auth config to keycloak properties
tgreenwood Sep 16, 2024
3363eb0
FAIRSPC-82: removed old-fashion readiness and health endpoints; added…
tgreenwood Sep 16, 2024
75c87b3
FAIRSPC-82: fixed pluto health check of saturn
tgreenwood Sep 17, 2024
96c501e
FAIRSPC-82: got rid of config file amd moved to application.yaml
tgreenwood Sep 17, 2024
8d113f4
Merge branch 'dev' into refactoring/FAIRSPC-82
tgreenwood Sep 18, 2024
77b247a
FAIRSPC-82: applied spotless rules + warnings resolve
tgreenwood Sep 18, 2024
2d0f542
FAIRSPC-82: fixed some tests + refactoring
tgreenwood Sep 23, 2024
9dbe166
FAIRSPC-82: fixed some tests
tgreenwood Sep 26, 2024
f2889a7
FAIRSPC-82: fixed UserService tests
tgreenwood Sep 27, 2024
6590c66
FAIRSPC-82: fixed a bunch of tests
tgreenwood Oct 1, 2024
164c986
FAIRSPC-82: upgraded version of jena
tgreenwood Oct 2, 2024
0710bb3
FAIRSPC-82: fixed some tests
tgreenwood Oct 2, 2024
5f76dd4
FAIRSPC-82: fixed the remaining failing tests
tgreenwood Oct 2, 2024
718c152
FAIRSPC-82: cleaned up warnings
tgreenwood Oct 2, 2024
009acc2
FAIRSPC-82: cleaned up warnings
tgreenwood Oct 2, 2024
c951859
FAIRSPC-82: removed redundant ttl files
tgreenwood Oct 2, 2024
1e72d47
FAIRSPC-82 removed accidentally added yarn command
tgreenwood Oct 8, 2024
0c9043a
Update README.adoc
tgreenwood Oct 8, 2024
29adbdb
FAIRSPC-81: migrated views endpoint to spring mvc
tgreenwood Oct 3, 2024
d3f11cd
FAIRSPC-81: migrated workspace endpoints to spring mvc
tgreenwood Oct 4, 2024
51b3ce9
FAIRSPC-81: refactoring of controller tests
tgreenwood Oct 4, 2024
ea2e4d6
FAIRSPC-81: migrated metadata API to spring mvc
tgreenwood Oct 7, 2024
e070d9d
FAIRSPC-81: migrated vocabulary API to spring mvc
tgreenwood Oct 7, 2024
0e2a77b
FAIRSPC-81: migrated features endpoint to spring mvc
tgreenwood Oct 8, 2024
1351e93
FAIRSPC-81: migrated maintain endpoint to spring mvc
tgreenwood Oct 8, 2024
e344891
FAIRSPC-81: migrated user endpoints to spring mvc
tgreenwood Oct 8, 2024
1500c8a
FAIRSPC-82: fixed typo
tgreenwood Oct 9, 2024
766f84b
FAIRSPC-82: rollback of accidentally commited change in security config
tgreenwood Oct 9, 2024
86203c3
FAIRSPC-82: fixed health endpoints
tgreenwood Oct 9, 2024
d96b8c9
FAIRSPC-82: added timeout to sparql endpoint
tgreenwood Oct 9, 2024
7c8bbd0
Merge branch 'refactoring/FAIRSPC-82' into refactoring/FAIRSPC-81
tgreenwood Oct 9, 2024
b81b005
FAIRSPC-82: migrated search endpoints to spring mvc
tgreenwood Oct 9, 2024
b480ae7
FAIRSPC-82: removed redundant logout from Saturn as logging out happe…
tgreenwood Oct 10, 2024
e53bc8e
Merge branch 'refactoring/FAIRSPC-82' into refactoring/FAIRSPC-81
tgreenwood Oct 10, 2024
17e7514
FAIRSPC-81: got rid of java-spark framework and Jetty
tgreenwood Oct 10, 2024
921ade7
FAIRSPC-81: tuned global exception handling
tgreenwood Oct 11, 2024
c8217f6
FAIRSPC-82: fixed liveness and readiness probes of Saturn in helm charts
tgreenwood Oct 11, 2024
41d5807
FAIRSPC-82: got rid of PermissionService
tgreenwood Oct 11, 2024
8f85b5f
FAIRSPC-82: removed unused method and rolled back accidentally commit…
tgreenwood Oct 14, 2024
d4c338b
Merge branch 'refactoring/FAIRSPC-82' into refactoring/FAIRSPC-81
tgreenwood Oct 14, 2024
62eb244
FAIRSPC-79: partially refactored code with some services marked as bean
tgreenwood Oct 14, 2024
a1fbee9
FAIRSPC-79: migrated all web DAV instantiation under Spring's control
tgreenwood Oct 14, 2024
ac7b6e4
FAIRSPC-81: aligned all controllers with /api/ path
tgreenwood Oct 14, 2024
b18d47a
FAIRSPC-81: named reasonable get view data
tgreenwood Oct 14, 2024
c35bae3
FAIRSPC-81: removed redundant try-catch
tgreenwood Oct 14, 2024
a0c37d1
FAIRSPC-81: aligned the way we map resources across all controllers
tgreenwood Oct 14, 2024
001022e
FAIRSPC-81: removed mentioning of spark on log config
tgreenwood Oct 14, 2024
91ef6af
FAIRSPC-81: replaced two value classes with records
tgreenwood Oct 14, 2024
8397e6f
Merge branch 'refactoring/FAIRSPC-81' into refactoring/FAIRSPC-79
tgreenwood Oct 14, 2024
fc40d62
FAIRSPC-81: set servlet context path to /api
tgreenwood Oct 15, 2024
3ce8b8b
Merge branch 'refactoring/FAIRSPC-81' into refactoring/FAIRSPC-79
tgreenwood Oct 15, 2024
f8d27ea
FAIRSPC-81: got rid of Service.java (first iteration)
tgreenwood Oct 15, 2024
59e870e
Merge pull request #1567 from thehyve/refactoring/FAIRSPC-81
tgreenwood Oct 17, 2024
0d93e23
FAIRSPC-79: made configs more granular and other changes towards IoC …
tgreenwood Oct 17, 2024
dd99457
FAIRSPC-79: got rid of redundant qualifier annotations
tgreenwood Oct 17, 2024
9fd8994
FAIRSPC-79: migrated vocabularies from static context to IoC managed
tgreenwood Oct 17, 2024
00ccac3
FAIRSPC-79: migrated validators to spring initialisation
tgreenwood Oct 17, 2024
5725884
FAIRSPC-79: light refactoring + important todo
tgreenwood Oct 17, 2024
9a2890f
FAIRSPC-79: fixed all tests after migration
tgreenwood Oct 17, 2024
bd77df5
FAIRSPC-79: removed redundant init block in tests
tgreenwood Oct 23, 2024
c36d3a1
FAIRSPC-79: changed default transaction simple to bulk
tgreenwood Oct 23, 2024
9d07d42
FAIRSPC-79: removed dependency of URI validator from DavFactory
tgreenwood Oct 23, 2024
56e4d30
FAIRSPC-79: updated todos
tgreenwood Oct 23, 2024
19e7e18
Merge pull request #1568 from thehyve/refactoring/FAIRSPC-79
tgreenwood Oct 24, 2024
3270f16
Move model and views back to root project location.
ewelinagr Nov 25, 2024
d215ac4
Fix saturn configmap for the new configuration.
ewelinagr Nov 26, 2024
399660c
Update dependencies.
ewelinagr Nov 26, 2024
89291f7
Fix gradle dependencies issues.
ewelinagr Nov 26, 2024
157da11
Fix helm mapping of health endpointand local config.
ewelinagr Nov 27, 2024
8c7df9c
Fix formating of vocabulary.ttl.
ewelinagr Nov 28, 2024
0a8e8b1
Update documentation on Saturn component.
ewelinagr Nov 28, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions .github/workflows/build_and_upload_on_push_to_dev.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -76,10 +76,10 @@ jobs:
- name: Check out repository
uses: actions/checkout@v4

- name: Set Node.js 18.x
uses: actions/setup-node@v3
- name: Set Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: 18.x
node-version: 22.x

- name: Set deployment version
env:
Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/build_on_pull_request.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,10 @@ jobs:
- name: Check out repository
uses: actions/checkout@v4

- name: Set Node.js 18.x
- name: Set Node.js 22.x
uses: actions/setup-node@v4
with:
node-version: 18.x
node-version: 22.x

- name: Log details
run: |
Expand Down
18 changes: 9 additions & 9 deletions README.adoc
Original file line number Diff line number Diff line change
Expand Up @@ -2238,10 +2238,10 @@ The data models for these metadata are defined using the {SHACL}[Shapes Constrai
* The customisable data model includes the custom (shared)
metadata entities, custom controlled vocabulary types,
and custom properties of the system entities.
The default custom data model is defined in link:projects/saturn/vocabulary.ttl[vocabulary.ttl].
The default custom data model is defined in link:projects/saturn/src/main/resources/vocabulary.ttl[vocabulary.ttl].
This data model can be overriden by a data more suitable for your organisation.

A schematic overview of the default data model in link:projects/saturn/vocabulary.ttl[vocabulary.ttl]:
A schematic overview of the default data model in link:projects/saturn/src/main/resources/vocabulary.ttl[vocabulary.ttl]:

image:docs/images/diagrams/CDR data model.png[CDR data model]

Expand Down Expand Up @@ -2462,8 +2462,8 @@ use `--set-file` option:
+
This should also restart the Saturn pod. If not, trigger the restart manually.
+
For local development - replace vocabulary file in link:projects/saturn/vocabulary.ttl[projects/saturn/vocabulary.ttl]
and views configuration in link:projects/saturn/views.ttl[projects/saturn/views.ttl].
For local development - replace vocabulary file in link:projects/saturn/src/main/resources/vocabulary.ttl[vocabulary.ttl]
and views configuration in link:projects/saturn/src/main/resources/views.yaml[views.yaml].
Restart Saturn run.
+
. Load data for new entities or properties.
Expand All @@ -2474,7 +2474,7 @@ Restart Saturn run.

For controlled vocabulary types, e.g., _Gender_ and _Species_ in the example, you should insert the allowed values in the database by uploading
a taxonomies file using the <<RDF metadata>> API.
An example taxonomy is in link:projects/saturn/taxonomies.ttl[taxonomies.ttl].
An example taxonomy is in link:projects/saturn/src/main/resources/taxonomies.ttl[taxonomies.ttl].

It is preferred to use existing standard taxonomies and labels.
If that is not possible, please define your own namespaces for
Expand Down Expand Up @@ -2526,7 +2526,7 @@ ncbitaxon:10090 a example:Species ;

For the metadata pages in the user interface, a view configuration needs to be created
that specifies the tables and columns.
An example can be found in link:projects/saturn/views.yaml[views.yaml]
An example can be found in link:projects/saturn/src/main/resources/views.yaml[views.yaml]



Expand Down Expand Up @@ -3233,14 +3233,14 @@ and, together with link:https://bitbucket.org/connect2id/nimbus-jose-jwt[Nimbus
The heart of Fairspace, back-end application handling all the logic and connection to the storages.
Data repository and catalog.

Saturn is served as link:https://jena.apache.org/documentation/fuseki2/[Apache Jena Fuseki SPARQL] server,
embedded into link:https://www.eclipse.org/jetty/[Jetty] Web server.
Saturn is also a link:https://spring.io/projects/spring-boot[Java Spring Boot] application with embedded Tomcat web server.

Saturn uses link:https://jena.apache.org/documentation/rdf/[Apache Jena RDF] for handling RDF graphs,
serialisation of triples and TDB triple store connection.
All data within Fairspace, except to uploaded files and logs, are stored in Apache Jena RDF database.

For security, Saturn is integrated with Keycloak using link:https://www.keycloak.org/docs/latest/securing_apps/#_jetty9_adapter[Keycloak Jetty client adapter].
Saturn is secured using OAuth2 with Keycloak, integrated with Spring Boot and
link:https://docs.spring.io/spring-security/reference/servlet/oauth2/[Spring Security].
It enables user authentication with access tokens.

Saturn is also responsible for authorization of users in Fairspace - it includes user access validators
Expand Down
2 changes: 1 addition & 1 deletion charts/fairspace/templates/project/configmap-pluto.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ data:
domains:
- {{ template "fairspace.url" . }}
{{ if .Values.pluto.externalDomains }}{{ toYaml .Values.pluto.externalDomains | indent 8 }}{{ end }}
downstreamServiceHealthUrl: {{ .Values.pluto.backends.saturn | default "http://localhost:8090"}}/api/health/
downstreamServiceHealthUrl: {{ .Values.pluto.backends.saturn | default "http://localhost:8091"}}/actuator/health/
max-file-size: {{ .Values.pluto.maxFileSize }}
staticHtmlLocation: /opt/mercury
oauth2:
Expand Down
84 changes: 59 additions & 25 deletions charts/fairspace/templates/project/configmap-saturn.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -7,37 +7,71 @@ metadata:
{{- include "fairspace.labels" . | nindent 4 }}
data:
application.yaml: |-
port: 8090
livenessPort: 8091
publicUrl: {{ template "fairspace.url" . }}
jena:
metadataBaseIRI: http://{{ .Values.fairspace.ingress.domain }}/iri/
datasetPath: "/data/saturn/db"
storeParams:
{{ toYaml .Values.saturn.storeParams | indent 8 }}
transactionLogPath: "/data/saturn/files/log"
bulkTransactions: {{ .Values.saturn.bulkTransactions }}
auth:
authServerUrl: {{ .Values.external.keycloak.managementUrl | default .Values.external.keycloak.baseUrl }}/
server:
port: 8090
servlet:
context-path: /api

spring:
security:
oauth2:
resourceserver:
jwt:
issuer-uri: {{ .Values.external.keycloak.baseUrl }}/realms/fairspace
jwk-set-uri: {{ .Values.external.keycloak.baseUrl }}/realms/fairspace/protocol/openid-connect/certs
servlet:
multipart:
max-file-size: 2GB
max-request-size: 2GB
http:
multipart:
enabled: true

keycloak:
auth-server-url: {{ .Values.external.keycloak.managementUrl | default .Values.external.keycloak.baseUrl }}/
realm: {{ .Values.external.keycloak.realm }}
clientId: {{ .Values.external.keycloak.clientId }}
enableBasicAuth: {{ .Values.saturn.auth.enableBasicAuth }}
superAdminUser: {{ .Values.external.keycloak.superAdminUser | default (printf "organisation-admin-%s" .Values.external.keycloak.realm ) }}
client-id: {{ .Values.external.keycloak.clientId }}
super-admin-user: {{ .Values.external.keycloak.superAdminUser | default (printf "organisation-admin-%s" .Values.external.keycloak.realm ) }}
{{ if .Values.saturn.auth.defaultUserRoles }}
defaultUserRoles:
default-user-roles:
{{ toYaml .Values.saturn.auth.defaultUserRoles | indent 8 }}
{{ end }}
webDAV:
blobStorePath: "/data/saturn/files/blobs"
viewDatabase:
enabled: true
mvRefreshOnStartRequired: {{ .Values.saturn.mvRefreshOnStartRequired }}
features:
{{ toYaml .Values.fairspace.features | indent 6 }}

jwt:
auth:
converter:
resource-id: {{ .Values.external.keycloak.clientId }}
principal-attribute: preferred_username

application:
publicUrl: {{ template "fairspace.url" . }}
jena:
metadataBaseIRI: http://{{ .Values.fairspace.ingress.domain }}/iri/
datasetPath: "/data/saturn/db"
storeParams:
{{ toYaml .Values.saturn.storeParams | indent 10 }}
transactionLogPath: "/data/saturn/files/log"
bulkTransactions: {{ .Values.saturn.bulkTransactions }}

webdav:
blobStorePath: "/data/saturn/files/blobs"
{{ if has "ExtraStorage" .Values.fairspace.features }}
extraStorage:
blobStorePath: "/data/saturn/extrafiles/blobs"
extraStorage:
blobStorePath: "/data/saturn/extrafiles/blobs"
defaultRootCollections:
- "analysis-export"
{{ end }}
view-database:
enabled: true
url: "jdbc:postgresql://localhost:5432/fairspace"
mvRefreshOnStartRequired: {{ .Values.saturn.mvRefreshOnStartRequired }}
username: fairspace
autoCommitEnabled: false
maxPoolSize: 50
connectionTimeout: 1000
password: fairspace
features:
{{ toYaml .Values.fairspace.features | indent 8 }}

vocabulary.ttl: |
{{ if .Values.saturn.vocabulary -}}
Expand Down
8 changes: 4 additions & 4 deletions charts/fairspace/templates/project/stateful-set.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -100,16 +100,16 @@ spec:
{{- end }}
livenessProbe:
httpGet:
path: /liveness
path: /actuator/health/liveness
port: 8091
initialDelaySeconds: {{ .Values.saturn.livenessProbe.initialDelaySeconds }}
periodSeconds: {{ .Values.saturn.livenessProbe.periodSeconds }}
successThreshold: {{ .Values.saturn.livenessProbe.successThreshold }}
timeoutSeconds: {{ .Values.saturn.livenessProbe.timeoutSeconds }}
readinessProbe:
httpGet:
path: /api/health/
port: 8090
path: /actuator/health/readiness
port: 8091
periodSeconds: {{ .Values.saturn.readinessProbe.periodSeconds }}
successThreshold: {{ .Values.saturn.readinessProbe.successThreshold }}
timeoutSeconds: {{ .Values.saturn.readinessProbe.timeoutSeconds }}
Expand Down Expand Up @@ -222,4 +222,4 @@ spec:
storageClassName: {{ index .Values "saturn" "persistence" "extra-file-storage" "storageClass" | quote }}
{{- end }}
{{- end }}
{{- end }}
{{- end }}
4 changes: 2 additions & 2 deletions local-development/fairspace/local-values.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -25,15 +25,15 @@ fairspace:
JupyterHub:
name: "JupyterHub"
url: http://jupyterhub.local/user/${username}/lab
icons-name: jupyter
icon-name: jupyter
metadata-sources:
internal:
label: "Metadata"
icon-name: metadata
test:
name: test
label: "External Metadata"
url: http://pluto.local/api/
url: http://fairspace.local/api/
icon-name: "test-icon"

# Specific settings for Saturn subchart
Expand Down
20 changes: 10 additions & 10 deletions projects/mercury/package.json
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,12 @@
"dev-be": "concurrently \"yarn localdevelopment\" \"yarn saturn\" \"yarn pluto\"",
"dev-fe": "yarn build && yarn start",
"localdevelopment": "cd ../../local-development && docker compose up",
"saturn": "wait-on http://localhost:5100/ && wait-on tcp:9432 && cd ../saturn/ && KEYCLOAK_CLIENT_SECRET=********** ./gradlew run",
"pluto": "wait-on http://localhost:8090/api/health/ && cd ../pluto/ && KEYCLOAK_CLIENT_SECRET=********** ./gradlew bootRun --args='--spring.profiles.active=local'",
"saturn": "wait-on http://localhost:5100/ && wait-on tcp:9432 && cd ../saturn/ && KEYCLOAK_CLIENT_SECRET=********** ./gradlew bootRun",
"pluto": "wait-on http://localhost:8091/actuator/health/ && cd ../pluto/ && KEYCLOAK_CLIENT_SECRET=********** ./gradlew bootRun --args='--spring.profiles.active=local'",
"start": "craco start",
"build": "yarn check-format && craco build",
"test": "craco test --env=jsdom",
"test:coverage": "craco test --env=jsdom --coverage --watchAll=false",
"eject": "react-scripts eject",
"lint": "eslint ./src",
"flow": "flow",
"format": "prettier --write './**/*.{js,jsx,css,md,json}' --config ./.prettierrc.js",
Expand All @@ -32,14 +31,14 @@
"@testing-library/react-hooks": "^8.0.1",
"@wojtekmaj/enzyme-adapter-react-17": "^0.8.0",
"axios": "^1.7.5",
"body-parser": "^1.19.0",
"body-parser": "^1.20.3",
"classnames": "^2.2.6",
"cors": "^2.8.5",
"date-fns": "^2.29.3",
"deepmerge": "^4.2.2",
"escape-string-regexp": "^5.0.0",
"filesize": "^8.0.7",
"http-proxy-middleware": "^2.0.4",
"http-proxy-middleware": "^3.0.3",
"jsonld": "8.2.0",
"lodash": "^4.17.21",
"mdi-material-ui": "^7.2.0",
Expand All @@ -52,20 +51,21 @@
"react-dropzone": "^14.2.3",
"react-is-mounted-hook": "^1.1.2",
"react-markdown": "^7.1.2",
"react-router-dom": "5.3.0",
"react-router-dom": "5.3.4",
"react-scripts": "^5.0.1",
"react-select": "^5.7.0",
"react-virtualized": "^9.22.3",
"react-window": "^1.8.8",
"text-table": "^0.2.0",
"typeface-roboto": "^1.1.13",
"use-deep-compare-effect": "^1.3.0",
"webdav": "^4.11.2"
"webdav": "^4.11.4"
},
"devDependencies": {
"@testing-library/jest-dom": "^5.16.5",
"@testing-library/react": "^13.4.0",
"@testing-library/user-event": "^14.4.3",
"@babel/plugin-proposal-private-property-in-object": "^7.21.11",
"concurrently": "^5.0.0",
"enzyme": "^3.11.0",
"eslint": "^8.57.0",
Expand All @@ -77,11 +77,11 @@
"eslint-plugin-jsx-a11y": "^6.2.3",
"eslint-plugin-prettier": "^5.1.3",
"eslint-plugin-react-hooks": "^4.6.0",
"express-session": "^1.17.1",
"express-session": "^1.18.1",
"flow-bin": "^0.117.0",
"hermes-eslint": "^0.20.0",
"history": "^5.0.0",
"keycloak-connect": "^24.0.1",
"keycloak-connect": "^26.0.6",
"node-fetch": "^2.6.1",
"nodemon": "^3.1.0",
"prettier": "^3.2.5",
Expand All @@ -95,7 +95,7 @@
"not op_mini all"
],
"engines": {
"node": ">=18.16.0"
"node": ">=22.11.0"
},
"jest": {
"moduleNameMapper": {
Expand Down
Loading