From 1596c1fc18c6b65475939269c1a86bd86b26ddc0 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Fri, 11 Apr 2025 12:16:36 -0700 Subject: [PATCH 01/26] adding coral-embed component --- packages/openneuro-app/src/@types/custom.d.ts | 4 + packages/openneuro-app/src/index.html | 1 + .../scripts/dataset/comments/coral-embed.tsx | 28 +++++++ .../dataset/routes/dataset-default.tsx | 84 ++++++++++--------- 4 files changed, 77 insertions(+), 40 deletions(-) create mode 100644 packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx diff --git a/packages/openneuro-app/src/@types/custom.d.ts b/packages/openneuro-app/src/@types/custom.d.ts index c2754522bb..dbb2ea9896 100644 --- a/packages/openneuro-app/src/@types/custom.d.ts +++ b/packages/openneuro-app/src/@types/custom.d.ts @@ -42,9 +42,13 @@ interface Blob { name: string webkitRelativePath: string } +interface CoralEmbedConfig { + storyID?: string +} interface Window { showDirectoryPicker: any + Coral?: Coral } interface Navigator { diff --git a/packages/openneuro-app/src/index.html b/packages/openneuro-app/src/index.html index 95eb2028d2..dba1d38bc4 100644 --- a/packages/openneuro-app/src/index.html +++ b/packages/openneuro-app/src/index.html @@ -18,6 +18,7 @@ href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap" rel="stylesheet" /> + diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx new file mode 100644 index 0000000000..2175656a5d --- /dev/null +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -0,0 +1,28 @@ +import React, { useEffect, useRef } from "react" + +interface CoralEmbedConfig { + datasetId?: string +} + +export const CoralEmbed: React.FC = ({ datasetId }) => { + const coralContainerRef = useRef(null) + const currentURL = window.location.href + + useEffect(() => { + console.log("CoralEmbed useEffect triggered") + console.log("containerRef.current:", coralContainerRef.current) + console.log("window.Coral:", window.Coral) + + if (coralContainerRef.current && window.Coral) { + console.log("Initializing Coral Embed") + window.Coral.createStreamEmbed({ + id: coralContainerRef.current.id, + autoRender: true, + rootURL: "http://localhost:3000", + storyID: `${datasetId}`, + storyURL: currentURL, + }) + } + }, [datasetId, currentURL, coralContainerRef]) + return
+} diff --git a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx index 388ffdd288..2b83afbf50 100644 --- a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx +++ b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx @@ -1,51 +1,55 @@ -import React from "react" +import React, { useRef } from "react" import { Markdown } from "../../utils/markdown" import { ReadMore } from "../../components/read-more/ReadMore" import { MetaDataBlock } from "../components/MetaDataBlock" import Files from "../files/files" import Comments from "../comments/comments" import EditDescriptionField from "../fragments/edit-description-field" +import { CoralEmbed } from "../comments/coral-embed" /** * Default tab for dataset draft pages */ -export const DatasetDefault = ({ dataset, hasEdit }) => ( - <> - ( - - { + return ( + <> + ( + - {dataset.draft.readme || "N/A"} - - - )} - /> - - - -) + + {dataset.draft.readme || "N/A"} + + + )} + /> + + + + + ) +} From 3ff68674207be627074b7bf798465d6c833cdbf5 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Fri, 11 Apr 2025 12:18:13 -0700 Subject: [PATCH 02/26] remove extra interface --- packages/openneuro-app/src/@types/custom.d.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/openneuro-app/src/@types/custom.d.ts b/packages/openneuro-app/src/@types/custom.d.ts index dbb2ea9896..e275f4c423 100644 --- a/packages/openneuro-app/src/@types/custom.d.ts +++ b/packages/openneuro-app/src/@types/custom.d.ts @@ -42,9 +42,6 @@ interface Blob { name: string webkitRelativePath: string } -interface CoralEmbedConfig { - storyID?: string -} interface Window { showDirectoryPicker: any From 44be7faa9b8a0d128c6ae0fd5a7f17b073fe4fb2 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Mon, 14 Apr 2025 12:21:17 -0700 Subject: [PATCH 03/26] update to docker to run coral over Source - adding a button to test initialized coral --- docker-compose.yml | 14 ++++++ packages/openneuro-app/src/@types/custom.d.ts | 1 - packages/openneuro-app/src/index.html | 8 +-- .../scripts/dataset/comments/coral-embed.tsx | 49 +++++++++++++------ .../dataset/routes/dataset-default.tsx | 2 +- 5 files changed, 53 insertions(+), 21 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 6d04276f42..b1ce77ebe8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -155,3 +155,17 @@ services: ports: - "9200:9200" - "9300:9300" + + # Coral Project Talk + coral: + image: coralproject/talk:7 + restart: always + ports: + - "5001:5000" + depends_on: + - mongo + - redis + environment: + - MONGODB_URI=mongodb://mongo:27017/coral + - REDIS_URI=redis://redis:6379 + - SIGNING_SECRET=${CORAL_SIGNING_SECRET} \ No newline at end of file diff --git a/packages/openneuro-app/src/@types/custom.d.ts b/packages/openneuro-app/src/@types/custom.d.ts index e275f4c423..c2754522bb 100644 --- a/packages/openneuro-app/src/@types/custom.d.ts +++ b/packages/openneuro-app/src/@types/custom.d.ts @@ -45,7 +45,6 @@ interface Blob { interface Window { showDirectoryPicker: any - Coral?: Coral } interface Navigator { diff --git a/packages/openneuro-app/src/index.html b/packages/openneuro-app/src/index.html index dba1d38bc4..b0b75d428d 100644 --- a/packages/openneuro-app/src/index.html +++ b/packages/openneuro-app/src/index.html @@ -18,11 +18,13 @@ href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap" rel="stylesheet" /> - + -
+
+
+
- + \ No newline at end of file diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx index 2175656a5d..46915cc7e2 100644 --- a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -1,28 +1,45 @@ -import React, { useEffect, useRef } from "react" +import React, { useCallback, useEffect, useRef, useState } from "react" -interface CoralEmbedConfig { - datasetId?: string +declare global { + interface Window { + Coral?: { + createStreamEmbed: (config: any) => void + } + } } -export const CoralEmbed: React.FC = ({ datasetId }) => { +export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { const coralContainerRef = useRef(null) - const currentURL = window.location.href - - useEffect(() => { - console.log("CoralEmbed useEffect triggered") - console.log("containerRef.current:", coralContainerRef.current) - console.log("window.Coral:", window.Coral) + const [coralInitialized, setCoralInitialized] = useState(false) + const initializeCoralEmbed = useCallback(() => { if (coralContainerRef.current && window.Coral) { - console.log("Initializing Coral Embed") + console.log("Initializing Coral Embed (button)") window.Coral.createStreamEmbed({ id: coralContainerRef.current.id, autoRender: true, - rootURL: "http://localhost:3000", - storyID: `${datasetId}`, - storyURL: currentURL, + rootURL: "http://localhost:5001", + storyID: storyID, + storyURL: window.location.href, }) + setCoralInitialized(true) + } else { + console.log("Coral object not available or ref missing on button click") } - }, [datasetId, currentURL, coralContainerRef]) - return
+ }, [storyID]) + + useEffect(() => { + // No automatic initialization on mount + console.log("CoralEmbed component mounted.") + }, []) + + return ( +
+
+ {!coralInitialized && ( + + )} + {coralInitialized &&

Coral Embed Initialized

} +
+ ) } diff --git a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx index 2b83afbf50..b592e4644f 100644 --- a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx +++ b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx @@ -49,7 +49,7 @@ export const DatasetDefault = ({ dataset, hasEdit }) => { uploader={dataset.uploader} comments={dataset.comments} /> - + ) } From 945883bc581fea59779660e09c3db0218e6f6179 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Mon, 14 Apr 2025 12:21:34 -0700 Subject: [PATCH 04/26] update to docker to run coral over Source - adding a button to test initialized coral --- docker-compose.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index b1ce77ebe8..a4ba18d730 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -156,7 +156,7 @@ services: - "9200:9200" - "9300:9300" - # Coral Project Talk + # Coral Project Talk coral: image: coralproject/talk:7 restart: always @@ -168,4 +168,4 @@ services: environment: - MONGODB_URI=mongodb://mongo:27017/coral - REDIS_URI=redis://redis:6379 - - SIGNING_SECRET=${CORAL_SIGNING_SECRET} \ No newline at end of file + - SIGNING_SECRET=${CORAL_SIGNING_SECRET} From 2ba2ea0f98279904de1e0d5637b9b5ec7ffd8778 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Mon, 14 Apr 2025 12:27:24 -0700 Subject: [PATCH 05/26] log window.Coral --- .../openneuro-app/src/scripts/dataset/comments/coral-embed.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx index 46915cc7e2..e8b1f68d95 100644 --- a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -29,6 +29,7 @@ export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { }, [storyID]) useEffect(() => { + console.log(window.Coral) // No automatic initialization on mount console.log("CoralEmbed component mounted.") }, []) From 279bb52ab6c1bc80f6938bf46e2449534b4f5bda Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Tue, 15 Apr 2025 12:01:28 -0700 Subject: [PATCH 06/26] remove draftjs issues for globals, update coarl embed to contain token for api --- packages/openneuro-app/src/index.html | 7 +-- .../scripts/dataset/comments/coral-embed.tsx | 62 ++++++++++--------- .../dataset/routes/dataset-default.tsx | 6 +- .../dataset/routes/snapshot-default.tsx | 6 +- .../src/scripts/utils/global-polyfill.ts | 28 ++++----- 5 files changed, 56 insertions(+), 53 deletions(-) diff --git a/packages/openneuro-app/src/index.html b/packages/openneuro-app/src/index.html index b0b75d428d..95eb2028d2 100644 --- a/packages/openneuro-app/src/index.html +++ b/packages/openneuro-app/src/index.html @@ -18,13 +18,10 @@ href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap" rel="stylesheet" /> - -
-
-
+
- \ No newline at end of file + diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx index e8b1f68d95..36ba74312b 100644 --- a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -1,4 +1,4 @@ -import React, { useCallback, useEffect, useRef, useState } from "react" +import React, { useEffect, useRef } from "react" declare global { interface Window { @@ -10,37 +10,39 @@ declare global { export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { const coralContainerRef = useRef(null) - const [coralInitialized, setCoralInitialized] = useState(false) + const coralApiToken = "" - const initializeCoralEmbed = useCallback(() => { - if (coralContainerRef.current && window.Coral) { - console.log("Initializing Coral Embed (button)") - window.Coral.createStreamEmbed({ - id: coralContainerRef.current.id, - autoRender: true, - rootURL: "http://localhost:5001", - storyID: storyID, - storyURL: window.location.href, - }) - setCoralInitialized(true) - } else { - console.log("Coral object not available or ref missing on button click") + useEffect(() => { + const script = document.createElement("script") + script.src = "http://localhost:5001/assets/js/embed.js" + script.async = true + script.defer = true + script.onload = () => { + console.log("Coral embed.js loaded.") + if (coralContainerRef.current && window.Coral) { + console.log("Initializing Coral Embed without authentication.") + window.Coral.createStreamEmbed({ + id: coralContainerRef.current.id, + autoRender: true, + rootURL: "http://localhost:5001", + storyID: storyID, + storyURL: window.location.href, + accessToken: coralApiToken, + }) + } else { + console.log("Coral object not available after load or ref missing.") + } + } + script.onerror = () => { + console.error("Failed to load Coral embed.js") } - }, [storyID]) + document.head.appendChild(script) - useEffect(() => { - console.log(window.Coral) - // No automatic initialization on mount - console.log("CoralEmbed component mounted.") - }, []) + return () => { + const scripts = document.querySelectorAll(`script[src="${script.src}"]`) + scripts.forEach((s) => s.remove()) + } + }, [storyID, coralApiToken]) - return ( -
-
- {!coralInitialized && ( - - )} - {coralInitialized &&

Coral Embed Initialized

} -
- ) + return
} diff --git a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx index b592e4644f..a852d45bd8 100644 --- a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx +++ b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx @@ -44,11 +44,13 @@ export const DatasetDefault = ({ dataset, hasEdit }) => { datasetPermissions={dataset.permissions} summary={dataset.draft?.summary} /> - + /> */ + } ) diff --git a/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx b/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx index 9f86d930c0..c23bb8b3ff 100644 --- a/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx +++ b/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx @@ -30,10 +30,12 @@ export const SnapshotDefault = ({ dataset, snapshot }) => ( datasetPermissions={dataset.permissions} summary={snapshot?.summary} /> - + /> */ + } ) diff --git a/packages/openneuro-app/src/scripts/utils/global-polyfill.ts b/packages/openneuro-app/src/scripts/utils/global-polyfill.ts index 6eb475d19e..a5a4959abc 100644 --- a/packages/openneuro-app/src/scripts/utils/global-polyfill.ts +++ b/packages/openneuro-app/src/scripts/utils/global-polyfill.ts @@ -1,16 +1,16 @@ -/* eslint-disable */ -// Workaround for incorrect global reference in draft.js via fbjs -interface Object { - // eslint-disable-next-line @typescript-eslint/ban-types - global: object -} +// /* eslint-disable */ +// // Workaround for incorrect global reference in draft.js via fbjs +// interface Object { +// // eslint-disable-next-line @typescript-eslint/ban-types +// global: object +// } -function polyfillGlobal(): void { - if (typeof global === "object") return - Object.defineProperty(Object.prototype, "global", { - get: () => globalThis, - configurable: true, - }) -} +// function polyfillGlobal(): void { +// if (typeof global === "object") return +// Object.defineProperty(Object.prototype, "global", { +// get: () => globalThis, +// configurable: true, +// }) +// } -polyfillGlobal() +// polyfillGlobal() From 21cf40dbc2639a63b4679630928f351c42146b3c Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Wed, 16 Apr 2025 16:02:00 -0700 Subject: [PATCH 07/26] update to coral talk to use jwt --- .../scripts/dataset/comments/coral-embed.tsx | 58 +++++++++++++------ .../dataset/routes/snapshot-default.tsx | 2 + packages/openneuro-server/src/config.ts | 3 + .../openneuro-server/src/handlers/users.ts | 35 ++++++++++- packages/openneuro-server/src/routes.ts | 7 +++ 5 files changed, 86 insertions(+), 19 deletions(-) diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx index 36ba74312b..b7cd3574b5 100644 --- a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -1,4 +1,4 @@ -import React, { useEffect, useRef } from "react" +import React, { useEffect, useRef, useState } from "react" declare global { interface Window { @@ -10,39 +10,61 @@ declare global { export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { const coralContainerRef = useRef(null) - const coralApiToken = "" + const [coralSSOToken, setCoralSSOToken] = useState(null) + const isAuthenticated = document.cookie.includes("accessToken=") useEffect(() => { - const script = document.createElement("script") - script.src = "http://localhost:5001/assets/js/embed.js" - script.async = true - script.defer = true - script.onload = () => { - console.log("Coral embed.js loaded.") + const fetchAndInitializeCoral = async () => { + const accessTokenFromCookie = document.cookie.split("; ").find((cookie) => + cookie.startsWith("accessToken=") + )?.split("=")[1] + const headers = accessTokenFromCookie + ? { Authorization: `Bearer ${accessTokenFromCookie}` } + : {} + + try { + const response = await fetch("/api/auth/coral-sso", { headers }) + const data = await response.json() + setCoralSSOToken(data.token) + console.log("Coral SSO token fetched:", data.token) + initializeCoralEmbed(data.token) + } catch (error) { + console.error("Error fetching Coral SSO token:", error) + initializeCoralEmbed(undefined) + } + } + + const initializeCoralEmbed = (token: string | undefined) => { if (coralContainerRef.current && window.Coral) { - console.log("Initializing Coral Embed without authentication.") + console.log( + "Initializing Coral Embed with token:", + token || "undefined", + ) window.Coral.createStreamEmbed({ id: coralContainerRef.current.id, autoRender: true, rootURL: "http://localhost:5001", storyID: storyID, storyURL: window.location.href, - accessToken: coralApiToken, + accessToken: token, }) - } else { - console.log("Coral object not available after load or ref missing.") } } - script.onerror = () => { - console.error("Failed to load Coral embed.js") - } + + const script = document.createElement("script") + script.src = "http://localhost:5001/assets/js/embed.js" + script.async = true + script.defer = true + script.onload = fetchAndInitializeCoral + script.onerror = () => console.error("Failed to load Coral embed.js") document.head.appendChild(script) return () => { - const scripts = document.querySelectorAll(`script[src="${script.src}"]`) - scripts.forEach((s) => s.remove()) + document.querySelectorAll(`script[src="${script.src}"]`).forEach((s) => + s.remove() + ) } - }, [storyID, coralApiToken]) + }, [storyID]) return
} diff --git a/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx b/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx index c23bb8b3ff..fbff0299a1 100644 --- a/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx +++ b/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx @@ -4,6 +4,7 @@ import { ReadMore } from "../../components/read-more/ReadMore" import { MetaDataBlock } from "../components/MetaDataBlock" import Files from "../files/files" import Comments from "../comments/comments" +import { CoralEmbed } from "../comments/coral-embed" /** * Default tab for snapshot pages @@ -36,6 +37,7 @@ export const SnapshotDefault = ({ dataset, snapshot }) => ( uploader={dataset.uploader} comments={dataset.comments} /> */ + } ) diff --git a/packages/openneuro-server/src/config.ts b/packages/openneuro-server/src/config.ts index fa41d24a6b..e3cff81f20 100644 --- a/packages/openneuro-server/src/config.ts +++ b/packages/openneuro-server/src/config.ts @@ -30,6 +30,9 @@ const config = { jwt: { secret: process.env.JWT_SECRET, }, + coral: { + secret: process.env.CORAL_JWT_SECRET, + }, }, mongo: { url: process.env.MONGO_URL, diff --git a/packages/openneuro-server/src/handlers/users.ts b/packages/openneuro-server/src/handlers/users.ts index 9f5a52b2f5..9dc0f14626 100644 --- a/packages/openneuro-server/src/handlers/users.ts +++ b/packages/openneuro-server/src/handlers/users.ts @@ -1,6 +1,9 @@ // dependencies ------------------------------------------------------------ +import * as Sentry from "@sentry/node" import { generateApiKey } from "../libs/apikey" - +import jwt from "jsonwebtoken" +import config from "../config" +import { v4 as uuidv4 } from "uuid" // handlers ---------------------------------------------------------------- /** @@ -13,3 +16,33 @@ export function createAPIKey(req, res, next) { .then((key) => res.send(key)) .catch((err) => next(err)) } +export const generateCoralSSOToken = async (req, res) => { + try { + if (!req.user) { + return res.status(401).json({ message: "Unauthorized" }) + } + + const payload = { + jti: uuidv4(), + iat: Math.floor(Date.now() / 1000), + exp: Math.floor(Date.now() / 1000) + (60 * 60), + user: { + id: req.user.id, + email: req.user.email, + username: req.user.name, + // badges: [], // Optional: Add user badges here + // role: 'COMMENTER', // Optional: Set user role + // url: '...', // Optional: User account URL + }, + } + + const header = { + alg: "HS256", + } + const token = jwt.sign(payload, config.auth.coral.secret, { header }) + res.json({ token }) + } catch (error) { + Sentry.captureException(error) + res.status(500).json({ message: "Failed to generate Coral SSO token" }) + } +} diff --git a/packages/openneuro-server/src/routes.ts b/packages/openneuro-server/src/routes.ts index 2ea19b8199..e385c4e891 100644 --- a/packages/openneuro-server/src/routes.ts +++ b/packages/openneuro-server/src/routes.ts @@ -157,6 +157,13 @@ const routes = [ middleware: [noCache, orcid.authCallback], handler: jwt.authSuccessHandler, }, + // Coral SSO Token Generation --------------------- + { + method: "get", + url: "/auth/coral-sso", + middleware: [noCache, jwt.authenticate, auth.authenticated], + handler: users.generateCoralSSOToken, + }, // Anonymous reviewer access { method: "get", From 8924840f07ecb4a912fc453023e01fd2fff68510 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Wed, 16 Apr 2025 16:05:55 -0700 Subject: [PATCH 08/26] adding example config --- .env.example | 6 +++++- config.env.example | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/.env.example b/.env.example index 36d21c06c2..43e6b06197 100644 --- a/.env.example +++ b/.env.example @@ -4,4 +4,8 @@ PERSISTENT_DIR=/data # macOS Development Setup - Fixes issues with elastic search container - set to ES_JAVA_OPTS=-XX:UseSVE=0 -Dio.netty.noUnsafe=true -Dio.netty.noKeySetOptimization=true MEM_LIMIT=2g SECOMP="unconfined" MEM_LIMIT= ES_JAVA_OPTS= -SECOMP= \ No newline at end of file +SECOMP= + +# coral -------------------------------------------------------------------- + +CORAL_SIGNING_SECRET="" \ No newline at end of file diff --git a/config.env.example b/config.env.example index dc80925d22..90c08f6edb 100644 --- a/config.env.example +++ b/config.env.example @@ -4,6 +4,9 @@ CRN_SERVER_URL=http://localhost:9876 # Secret authentication value for this instance JWT_SECRET= +# Coral Talk Secret from SSO Config in Admin Panel +CORAL_JWT_SECRET=ssosec_0178013126e99c4f68e06d47794a96c01c5a117b01e00687f24c310a2b49d9f993 + # Google oauth2 configuration - configure to enable Google auth # https://developers.google.com/identity/sign-in/web/sign-in for instructions GOOGLE_CLIENT_ID= From 0c96afc1afad9ac5936078d70816f44c098875e4 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Thu, 17 Apr 2025 16:11:10 -0700 Subject: [PATCH 09/26] updates after review --- config.env.example | 2 +- packages/openneuro-app/src/@types/custom.d.ts | 3 ++ packages/openneuro-app/src/client.jsx | 1 - packages/openneuro-app/src/index.html | 5 +++ .../scripts/dataset/comments/coral-embed.tsx | 39 ++++--------------- .../dataset/routes/dataset-default.tsx | 7 ---- .../dataset/routes/snapshot-default.tsx | 9 +---- .../src/scripts/utils/global-polyfill.ts | 16 -------- 8 files changed, 18 insertions(+), 64 deletions(-) delete mode 100644 packages/openneuro-app/src/scripts/utils/global-polyfill.ts diff --git a/config.env.example b/config.env.example index 90c08f6edb..5becfc912c 100644 --- a/config.env.example +++ b/config.env.example @@ -5,7 +5,7 @@ CRN_SERVER_URL=http://localhost:9876 JWT_SECRET= # Coral Talk Secret from SSO Config in Admin Panel -CORAL_JWT_SECRET=ssosec_0178013126e99c4f68e06d47794a96c01c5a117b01e00687f24c310a2b49d9f993 +CORAL_JWT_SECRET= # Google oauth2 configuration - configure to enable Google auth # https://developers.google.com/identity/sign-in/web/sign-in for instructions diff --git a/packages/openneuro-app/src/@types/custom.d.ts b/packages/openneuro-app/src/@types/custom.d.ts index c2754522bb..3ec1254187 100644 --- a/packages/openneuro-app/src/@types/custom.d.ts +++ b/packages/openneuro-app/src/@types/custom.d.ts @@ -45,6 +45,9 @@ interface Blob { interface Window { showDirectoryPicker: any + Coral?: { + createStreamEmbed: (config: any) => void + } } interface Navigator { diff --git a/packages/openneuro-app/src/client.jsx b/packages/openneuro-app/src/client.jsx index cfb432f7a9..0c7216f86e 100644 --- a/packages/openneuro-app/src/client.jsx +++ b/packages/openneuro-app/src/client.jsx @@ -1,7 +1,6 @@ /** * Browser client entrypoint */ -import "./scripts/utils/global-polyfill" import "./scripts/sentry" import { ApolloClient, ApolloProvider, InMemoryCache } from "@apollo/client" import React from "react" diff --git a/packages/openneuro-app/src/index.html b/packages/openneuro-app/src/index.html index 95eb2028d2..b9e47dca83 100644 --- a/packages/openneuro-app/src/index.html +++ b/packages/openneuro-app/src/index.html @@ -18,6 +18,11 @@ href="https://fonts.googleapis.com/css2?family=Open+Sans:ital,wght@0,300;0,400;0,700;1,300;1,400;1,700&display=swap" rel="stylesheet" /> + diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx index b7cd3574b5..198e19c785 100644 --- a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -1,31 +1,21 @@ -import React, { useEffect, useRef, useState } from "react" - -declare global { - interface Window { - Coral?: { - createStreamEmbed: (config: any) => void - } - } -} +import React, { useEffect, useRef } from "react" export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { const coralContainerRef = useRef(null) - const [coralSSOToken, setCoralSSOToken] = useState(null) - const isAuthenticated = document.cookie.includes("accessToken=") useEffect(() => { const fetchAndInitializeCoral = async () => { - const accessTokenFromCookie = document.cookie.split("; ").find((cookie) => - cookie.startsWith("accessToken=") - )?.split("=")[1] - const headers = accessTokenFromCookie - ? { Authorization: `Bearer ${accessTokenFromCookie}` } + const accessToken = document.cookie + .split("; ") + .find((cookie) => cookie.startsWith("accessToken=")) + ?.split("=")[1] + const headers = accessToken + ? { Authorization: `Bearer ${accessToken}` } : {} try { const response = await fetch("/api/auth/coral-sso", { headers }) const data = await response.json() - setCoralSSOToken(data.token) console.log("Coral SSO token fetched:", data.token) initializeCoralEmbed(data.token) } catch (error) { @@ -50,20 +40,7 @@ export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { }) } } - - const script = document.createElement("script") - script.src = "http://localhost:5001/assets/js/embed.js" - script.async = true - script.defer = true - script.onload = fetchAndInitializeCoral - script.onerror = () => console.error("Failed to load Coral embed.js") - document.head.appendChild(script) - - return () => { - document.querySelectorAll(`script[src="${script.src}"]`).forEach((s) => - s.remove() - ) - } + fetchAndInitializeCoral() }, [storyID]) return
diff --git a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx index a852d45bd8..07fc0bd812 100644 --- a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx +++ b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx @@ -44,13 +44,6 @@ export const DatasetDefault = ({ dataset, hasEdit }) => { datasetPermissions={dataset.permissions} summary={dataset.draft?.summary} /> - { - /* */ - } ) diff --git a/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx b/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx index fbff0299a1..2dce9a2ffb 100644 --- a/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx +++ b/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx @@ -31,13 +31,6 @@ export const SnapshotDefault = ({ dataset, snapshot }) => ( datasetPermissions={dataset.permissions} summary={snapshot?.summary} /> - { - /* */ - - } + ) diff --git a/packages/openneuro-app/src/scripts/utils/global-polyfill.ts b/packages/openneuro-app/src/scripts/utils/global-polyfill.ts deleted file mode 100644 index a5a4959abc..0000000000 --- a/packages/openneuro-app/src/scripts/utils/global-polyfill.ts +++ /dev/null @@ -1,16 +0,0 @@ -// /* eslint-disable */ -// // Workaround for incorrect global reference in draft.js via fbjs -// interface Object { -// // eslint-disable-next-line @typescript-eslint/ban-types -// global: object -// } - -// function polyfillGlobal(): void { -// if (typeof global === "object") return -// Object.defineProperty(Object.prototype, "global", { -// get: () => globalThis, -// configurable: true, -// }) -// } - -// polyfillGlobal() From 85c086ea31d5360c3b4ecd04056842b3361f1fa2 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Thu, 17 Apr 2025 16:16:44 -0700 Subject: [PATCH 10/26] removing logs and other lint updates --- .../src/scripts/dataset/comments/coral-embed.tsx | 8 ++------ .../src/scripts/dataset/routes/dataset-default.tsx | 3 +-- .../src/scripts/dataset/routes/snapshot-default.tsx | 1 - 3 files changed, 3 insertions(+), 9 deletions(-) diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx index 198e19c785..4d8c269ad1 100644 --- a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -1,4 +1,5 @@ import React, { useEffect, useRef } from "react" +import * as Sentry from "@sentry/react" export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { const coralContainerRef = useRef(null) @@ -16,20 +17,15 @@ export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { try { const response = await fetch("/api/auth/coral-sso", { headers }) const data = await response.json() - console.log("Coral SSO token fetched:", data.token) initializeCoralEmbed(data.token) } catch (error) { - console.error("Error fetching Coral SSO token:", error) + Sentry.captureException(error) initializeCoralEmbed(undefined) } } const initializeCoralEmbed = (token: string | undefined) => { if (coralContainerRef.current && window.Coral) { - console.log( - "Initializing Coral Embed with token:", - token || "undefined", - ) window.Coral.createStreamEmbed({ id: coralContainerRef.current.id, autoRender: true, diff --git a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx index 07fc0bd812..6135cc6816 100644 --- a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx +++ b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx @@ -1,9 +1,8 @@ -import React, { useRef } from "react" +import React from "react" import { Markdown } from "../../utils/markdown" import { ReadMore } from "../../components/read-more/ReadMore" import { MetaDataBlock } from "../components/MetaDataBlock" import Files from "../files/files" -import Comments from "../comments/comments" import EditDescriptionField from "../fragments/edit-description-field" import { CoralEmbed } from "../comments/coral-embed" diff --git a/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx b/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx index 2dce9a2ffb..e050fa9c5d 100644 --- a/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx +++ b/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx @@ -3,7 +3,6 @@ import { Markdown } from "../../utils/markdown" import { ReadMore } from "../../components/read-more/ReadMore" import { MetaDataBlock } from "../components/MetaDataBlock" import Files from "../files/files" -import Comments from "../comments/comments" import { CoralEmbed } from "../comments/coral-embed" /** From bd8fd75b1e7896a4cb3bc5cae437ccfff3c77b3c Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Mon, 21 Apr 2025 10:33:41 -0700 Subject: [PATCH 11/26] adding sigin openneuro from coral sigin in button --- .../src/scripts/dataset/comments/coral-embed.tsx | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx index 4d8c269ad1..a389265a64 100644 --- a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -1,8 +1,12 @@ -import React, { useEffect, useRef } from "react" +import React, { useContext, useEffect, useRef } from "react" import * as Sentry from "@sentry/react" +import { isAdmin } from "../../authentication/admin-user" +import { UserModalOpenCtx } from "../../utils/user-login-modal-ctx" // Import your context export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { const coralContainerRef = useRef(null) + const isAdminUser = isAdmin() + const { setUserModalOpen } = useContext(UserModalOpenCtx) useEffect(() => { const fetchAndInitializeCoral = async () => { @@ -33,11 +37,17 @@ export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { storyID: storyID, storyURL: window.location.href, accessToken: token, + role: isAdminUser ? "ADMIN" : "COMMENTER", + events: function (events) { + events.on("loginPrompt", function () { + setUserModalOpen(true) + }) + }, }) } } fetchAndInitializeCoral() - }, [storyID]) + }, [storyID, isAdminUser, setUserModalOpen]) return
} From 0fcf16f5c3d1d6db70dfef8177d078dc8389af02 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Tue, 22 Apr 2025 11:17:34 -0700 Subject: [PATCH 12/26] adding basic openneuro theme styling for coralembed --- .../src/assets/coral/coral-embed.css | 60 +++++++++++++++++++ .../scripts/dataset/comments/coral-embed.tsx | 6 +- .../dataset/routes/snapshot-default.tsx | 5 +- 3 files changed, 69 insertions(+), 2 deletions(-) create mode 100644 packages/openneuro-app/src/assets/coral/coral-embed.css diff --git a/packages/openneuro-app/src/assets/coral/coral-embed.css b/packages/openneuro-app/src/assets/coral/coral-embed.css new file mode 100644 index 0000000000..29b6e4fc56 --- /dev/null +++ b/packages/openneuro-app/src/assets/coral/coral-embed.css @@ -0,0 +1,60 @@ +#coral { + --palette-primary-200: #b5cbd3; + --palette-primary-400: #377ed2; + --palette-primary-500: #1c4550; + --palette-primary-700: #163a45; + --palette-primary-800: #102f38; + --palette-primary-900: #0b252c; + + --palette-error-600: #cc322f; + --palette-error-700: #b32c29; + --palette-error-800: #992523; + --palette-error-900: #7f1f1d; + + --palette-success-600: #28b463; + --palette-success-700: #239b56; + --palette-success-800: #1d8348; + --palette-success-900: #186a3b; + + /* FONTS */ + --font-family-primary: 'Open Sans', sans-serif; + --font-family-secondary: 'Nunito', sans-serif; + + --font-weight-primary-bold: 700; + --font-weight-primary-semi-bold: 600; + --font-weight-primary-regular: 500; + + --font-weight-secondary-bold: 700; + --font-weight-secondary-regular: 500; + + /* SHADOWS */ + --shadow-popover: 1px 0px 4px rgba(0, 0, 0, 0.25); +} + + +#coral .coral.coral-viewerBox{ + display: none; +} + +#coral{ + --palette-primary-500: #1c4550; +} + +#coral.meg{ + --palette-primary-500:rgba(156, 57, 0, 1); +} + + #coral.eeg{ + --palette-primary-500:rgba(134, 31, 55, 1); +} + + #coral.pet{ + --palette-primary-500:rgba(0, 105, 192, 1); +} + + #coral.ieeg{ + --palette-primary-500:rgba(18, 109, 62, 1); +} +#coral.mri{ + --palette-primary-500:rgba(79, 51, 130, 1); +} diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx index a389265a64..98c1206812 100644 --- a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -3,7 +3,10 @@ import * as Sentry from "@sentry/react" import { isAdmin } from "../../authentication/admin-user" import { UserModalOpenCtx } from "../../utils/user-login-modal-ctx" // Import your context -export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { +export const CoralEmbed: React.FC<{ storyID: string; modalities: [] }> = ( + { storyID, modalities }, +) => { + console.log(modalities) const coralContainerRef = useRef(null) const isAdminUser = isAdmin() const { setUserModalOpen } = useContext(UserModalOpenCtx) @@ -38,6 +41,7 @@ export const CoralEmbed: React.FC<{ storyID: string }> = ({ storyID }) => { storyURL: window.location.href, accessToken: token, role: isAdminUser ? "ADMIN" : "COMMENTER", + containerClassName: modalities, events: function (events) { events.on("loginPrompt", function () { setUserModalOpen(true) diff --git a/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx b/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx index e050fa9c5d..ffba8a99fb 100644 --- a/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx +++ b/packages/openneuro-app/src/scripts/dataset/routes/snapshot-default.tsx @@ -30,6 +30,9 @@ export const SnapshotDefault = ({ dataset, snapshot }) => ( datasetPermissions={dataset.permissions} summary={snapshot?.summary} /> - + ) From fffd683595b9cbe08386347b0185a1f179445d2c Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Tue, 22 Apr 2025 12:31:36 -0700 Subject: [PATCH 13/26] remove log --- .../openneuro-app/src/scripts/dataset/comments/coral-embed.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx index 98c1206812..dde89036b6 100644 --- a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -6,7 +6,6 @@ import { UserModalOpenCtx } from "../../utils/user-login-modal-ctx" // Import yo export const CoralEmbed: React.FC<{ storyID: string; modalities: [] }> = ( { storyID, modalities }, ) => { - console.log(modalities) const coralContainerRef = useRef(null) const isAdminUser = isAdmin() const { setUserModalOpen } = useContext(UserModalOpenCtx) From 5359c5ce88ac40dab94f91c949dc92b0b044a768 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Tue, 22 Apr 2025 12:32:28 -0700 Subject: [PATCH 14/26] remove comment --- .../openneuro-app/src/scripts/dataset/comments/coral-embed.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx index dde89036b6..041ec96854 100644 --- a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -1,7 +1,7 @@ import React, { useContext, useEffect, useRef } from "react" import * as Sentry from "@sentry/react" import { isAdmin } from "../../authentication/admin-user" -import { UserModalOpenCtx } from "../../utils/user-login-modal-ctx" // Import your context +import { UserModalOpenCtx } from "../../utils/user-login-modal-ctx" export const CoralEmbed: React.FC<{ storyID: string; modalities: [] }> = ( { storyID, modalities }, From b034ef0696424e278ba873663ba103a791834c2a Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Tue, 22 Apr 2025 12:34:07 -0700 Subject: [PATCH 15/26] removing comments --- packages/openneuro-server/src/handlers/users.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/openneuro-server/src/handlers/users.ts b/packages/openneuro-server/src/handlers/users.ts index 9dc0f14626..c472c1fc6d 100644 --- a/packages/openneuro-server/src/handlers/users.ts +++ b/packages/openneuro-server/src/handlers/users.ts @@ -30,9 +30,6 @@ export const generateCoralSSOToken = async (req, res) => { id: req.user.id, email: req.user.email, username: req.user.name, - // badges: [], // Optional: Add user badges here - // role: 'COMMENTER', // Optional: Set user role - // url: '...', // Optional: User account URL }, } From 8a9fbb52beda80e4b3fa10efa8fd9f6445c1d8ec Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Tue, 22 Apr 2025 12:37:35 -0700 Subject: [PATCH 16/26] update snapshot --- .../__snapshots__/snapshot-container.spec.tsx.snap | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/packages/openneuro-app/src/scripts/dataset/__tests__/__snapshots__/snapshot-container.spec.tsx.snap b/packages/openneuro-app/src/scripts/dataset/__tests__/__snapshots__/snapshot-container.spec.tsx.snap index 3dfe36b137..6acdd2351e 100644 --- a/packages/openneuro-app/src/scripts/dataset/__tests__/__snapshots__/snapshot-container.spec.tsx.snap +++ b/packages/openneuro-app/src/scripts/dataset/__tests__/__snapshots__/snapshot-container.spec.tsx.snap @@ -747,15 +747,8 @@ OCI-1131441 (R. Poldrack, PI) in any publications.
-

- Comments -

-
- Please sign in to contribute to the discussion. -
-
+ id="coral_thread" + />
Date: Tue, 22 Apr 2025 12:43:57 -0700 Subject: [PATCH 17/26] adding modality to dataset default coralembed compoent, update to modalities type --- .../src/scripts/dataset/comments/coral-embed.tsx | 2 +- .../src/scripts/dataset/routes/dataset-default.tsx | 5 ++++- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx index 041ec96854..9f33ca2b4d 100644 --- a/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx +++ b/packages/openneuro-app/src/scripts/dataset/comments/coral-embed.tsx @@ -3,7 +3,7 @@ import * as Sentry from "@sentry/react" import { isAdmin } from "../../authentication/admin-user" import { UserModalOpenCtx } from "../../utils/user-login-modal-ctx" -export const CoralEmbed: React.FC<{ storyID: string; modalities: [] }> = ( +export const CoralEmbed: React.FC<{ storyID: string; modalities: string[] }> = ( { storyID, modalities }, ) => { const coralContainerRef = useRef(null) diff --git a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx index 6135cc6816..3027ec81e7 100644 --- a/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx +++ b/packages/openneuro-app/src/scripts/dataset/routes/dataset-default.tsx @@ -43,7 +43,10 @@ export const DatasetDefault = ({ dataset, hasEdit }) => { datasetPermissions={dataset.permissions} summary={dataset.draft?.summary} /> - + ) } From 2e71f60ad31ebb33f9309410d6c35556bc696741 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Wed, 23 Apr 2025 12:05:54 -0700 Subject: [PATCH 18/26] adding coral-embed test spec --- .../comments/__tests__/coral-embed.spec.jsx | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 packages/openneuro-app/src/scripts/dataset/comments/__tests__/coral-embed.spec.jsx diff --git a/packages/openneuro-app/src/scripts/dataset/comments/__tests__/coral-embed.spec.jsx b/packages/openneuro-app/src/scripts/dataset/comments/__tests__/coral-embed.spec.jsx new file mode 100644 index 0000000000..fe848bcb7f --- /dev/null +++ b/packages/openneuro-app/src/scripts/dataset/comments/__tests__/coral-embed.spec.jsx @@ -0,0 +1,44 @@ +import React from "react" +import { render, waitFor } from "@testing-library/react" +import { CoralEmbed } from "../coral-embed" +import { UserModalOpenCtx } from "../../../utils/user-login-modal-ctx" +import { vi } from "vitest" + +vi.mock("../../../utils/user-login-modal-ctx", () => ({ + UserModalOpenCtx: React.createContext({ setUserModalOpen: vi.fn() }), +})) + +global.fetch = vi.fn().mockResolvedValue(Promise.resolve({ + json: vi.fn().mockResolvedValue({ token: "mock-sso-token" }), +})) + +// Mock the global Coral object +const mockCoralCreateStreamEmbed = vi.fn() +global.window.Coral = { + createStreamEmbed: mockCoralCreateStreamEmbed, +} + +describe("CoralEmbed - Simple Embed.js Check (Vitest)", () => { + const mockStoryID = "simple-test-story" + const mockModalities = ["test"] + + it("should check if window.Coral exists and initializeCoralEmbed is called", async () => { + render( + + + , + ) + + // fetch and Coral initialization + await waitFor(() => { + expect(global.window.Coral).toBeDefined() + expect(mockCoralCreateStreamEmbed).toHaveBeenCalledTimes(1) + }) + + expect(mockCoralCreateStreamEmbed).toHaveBeenCalledWith( + expect.objectContaining({ + storyID: mockStoryID, + }), + ) + }) +}) From 4c0faf6b02a0d3db8a2ada324d066f755f6debb9 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Thu, 24 Apr 2025 12:52:49 -0700 Subject: [PATCH 19/26] remove async from embed.js script tag to ensure its parsed before app --- packages/openneuro-app/src/index.html | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/openneuro-app/src/index.html b/packages/openneuro-app/src/index.html index b9e47dca83..858785f27a 100644 --- a/packages/openneuro-app/src/index.html +++ b/packages/openneuro-app/src/index.html @@ -20,7 +20,6 @@ /> From 00e12aa5a2f24c0ac61dd5ffe78fa3c5d5d670cf Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Tue, 29 Apr 2025 10:36:38 -0700 Subject: [PATCH 20/26] adding nginx proxy --- packages/openneuro-app/nginx.conf | 11 +++++++++++ packages/openneuro-app/src/index.html | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/packages/openneuro-app/nginx.conf b/packages/openneuro-app/nginx.conf index 1432b3616d..694e991b02 100644 --- a/packages/openneuro-app/nginx.conf +++ b/packages/openneuro-app/nginx.conf @@ -23,10 +23,21 @@ server { add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload'; } + location /coral { + client_max_body_size 0; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Connection ""; + proxy_http_version 1.1; + proxy_request_buffering off; + proxy_pass http://coral:5001; + } + location / { gzip_static on; add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload'; add_header Cache-Control 'max-age=31536000; public'; try_files $uri $uri/ /index.html; } + } diff --git a/packages/openneuro-app/src/index.html b/packages/openneuro-app/src/index.html index 858785f27a..a6e7559567 100644 --- a/packages/openneuro-app/src/index.html +++ b/packages/openneuro-app/src/index.html @@ -19,7 +19,7 @@ rel="stylesheet" /> From 0d94a89415e029b5a64897c48f6cc0d3a9bc9781 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Fri, 2 May 2025 14:57:42 -0700 Subject: [PATCH 21/26] update location in dev nginx --- nginx/nginx.dev.conf | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/nginx/nginx.dev.conf b/nginx/nginx.dev.conf index c14087c91e..ade2e29d30 100644 --- a/nginx/nginx.dev.conf +++ b/nginx/nginx.dev.conf @@ -77,6 +77,17 @@ server { # crn-web app root /srv/app/dist; + + location /coral/ { + client_max_body_size 0; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header Connection ""; + proxy_http_version 1.1; + proxy_request_buffering off; + proxy_pass http://coral:5000/; + } + location / { proxy_pass http://app; proxy_http_version 1.1; From d0a041e1eed22089bc4e8de4eaa0f3089cdadead Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Fri, 2 May 2025 15:00:50 -0700 Subject: [PATCH 22/26] update proxy_pass port --- nginx/nginx.dev.conf | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/nginx/nginx.dev.conf b/nginx/nginx.dev.conf index ade2e29d30..5ff6fcd6c0 100644 --- a/nginx/nginx.dev.conf +++ b/nginx/nginx.dev.conf @@ -78,14 +78,14 @@ server { root /srv/app/dist; - location /coral/ { + location /coral { client_max_body_size 0; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Connection ""; proxy_http_version 1.1; proxy_request_buffering off; - proxy_pass http://coral:5000/; + proxy_pass http://coral:5000; } location / { From 51f1e875e216b94f69af1f65b44e8cf09138e76e Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Wed, 28 May 2025 16:38:31 -0700 Subject: [PATCH 23/26] adding actual conflict fix --- packages/openneuro-server/src/routes.ts | 3 --- 1 file changed, 3 deletions(-) diff --git a/packages/openneuro-server/src/routes.ts b/packages/openneuro-server/src/routes.ts index 3883f1c42a..865eedffd3 100644 --- a/packages/openneuro-server/src/routes.ts +++ b/packages/openneuro-server/src/routes.ts @@ -159,7 +159,6 @@ const routes = [ middleware: [noCache, orcid.authCallback], handler: jwt.authSuccessHandler, }, -<<<<<<< HEAD // Coral SSO Token Generation --------------------- { method: "get", @@ -167,7 +166,6 @@ const routes = [ middleware: [noCache, jwt.authenticate, auth.authenticated], handler: users.generateCoralSSOToken, }, -======= // GitHub authentication route { @@ -183,7 +181,6 @@ const routes = [ handler: githubAuth.authCallback, }, ->>>>>>> master // Anonymous reviewer access { method: "get", From fca0504f69cd2069b02966f3d02e09d002056808 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Thu, 29 May 2025 10:51:35 -0700 Subject: [PATCH 24/26] update proxy to only serve one file --- nginx/nginx.dev.conf | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/nginx/nginx.dev.conf b/nginx/nginx.dev.conf index 5ff6fcd6c0..044a477dcd 100644 --- a/nginx/nginx.dev.conf +++ b/nginx/nginx.dev.conf @@ -74,20 +74,22 @@ server { alias /content; } - # crn-web app - root /srv/app/dist; - + - location /coral { + # Specific proxy for ONLY embed.js from Coral + location /coral/assets/js/embed.js { client_max_body_size 0; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header Connection ""; proxy_http_version 1.1; proxy_request_buffering off; - proxy_pass http://coral:5000; + proxy_pass http://coral:5000/assets/js/embed.js; } + # crn-web app + root /srv/app/dist; + location / { proxy_pass http://app; proxy_http_version 1.1; From 04c78b22adbeb0b2e897e572a7a96ec2fa968c4d Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Thu, 29 May 2025 11:40:19 -0700 Subject: [PATCH 25/26] remove coral proxy from app --- packages/openneuro-app/nginx.conf | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/openneuro-app/nginx.conf b/packages/openneuro-app/nginx.conf index 694e991b02..5b85e10701 100644 --- a/packages/openneuro-app/nginx.conf +++ b/packages/openneuro-app/nginx.conf @@ -23,16 +23,6 @@ server { add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload'; } - location /coral { - client_max_body_size 0; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header Connection ""; - proxy_http_version 1.1; - proxy_request_buffering off; - proxy_pass http://coral:5001; - } - location / { gzip_static on; add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload'; From ad1428cbab862e7540a512bb4a5cc67c602c9d39 Mon Sep 17 00:00:00 2001 From: Gregory Noack Date: Thu, 29 May 2025 11:40:59 -0700 Subject: [PATCH 26/26] spacing --- packages/openneuro-app/nginx.conf | 1 - 1 file changed, 1 deletion(-) diff --git a/packages/openneuro-app/nginx.conf b/packages/openneuro-app/nginx.conf index 5b85e10701..1432b3616d 100644 --- a/packages/openneuro-app/nginx.conf +++ b/packages/openneuro-app/nginx.conf @@ -29,5 +29,4 @@ server { add_header Cache-Control 'max-age=31536000; public'; try_files $uri $uri/ /index.html; } - }