From 745eb8e9807f8ef8c580dbcf5556274c56bca7d1 Mon Sep 17 00:00:00 2001 From: Dave Date: Tue, 17 Mar 2026 10:44:36 -0400 Subject: [PATCH] Revert "Merged in feature/IO-2433-esignature (pull request #3133)" This reverts commit af52c350133ca293f1ffa7b36daaf4302b176b0b, reversing changes made to 36157d87bbc3cfcb38e7e0a050fa55e19cea5a75. --- client/package-lock.json | 11 - client/package.json | 1 - client/src/App/App.styles.scss | 7 - .../esignature-modal.container.jsx | 78 -- .../print-center-item.component.jsx | 49 +- .../pages/manage/manage.page.component.jsx | 10 +- client/src/redux/modals/modals.reducer.js | 3 +- client/src/redux/modals/modals.selectors.js | 1 - client/src/translations/en_us/common.json | 1 - client/src/translations/es/common.json | 1 - client/src/translations/fr/common.json | 1 - package-lock.json | 729 ------------------ package.json | 1 - server.js | 1 - server/esign/esign-new.js | 304 -------- server/esign/webhook.js | 393 ---------- server/esign/webhook.types.ts | 95 --- server/graphql-client/queries.js | 53 +- server/media/imgproxy-media.js | 42 - server/routes/esignRoutes.js | 17 - server/utils/utils.js | 5 +- 21 files changed, 13 insertions(+), 1790 deletions(-) delete mode 100644 client/src/components/esignature-modal/esignature-modal.container.jsx delete mode 100644 server/esign/esign-new.js delete mode 100644 server/esign/webhook.js delete mode 100644 server/esign/webhook.types.ts delete mode 100644 server/routes/esignRoutes.js diff --git a/client/package-lock.json b/client/package-lock.json index a5e145ed0..02a8f6229 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -16,7 +16,6 @@ "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", - "@documenso/embed-react": "^0.5.1", "@emotion/is-prop-valid": "^1.4.0", "@fingerprintjs/fingerprintjs": "^5.0.1", "@firebase/analytics": "^0.10.19", @@ -2576,16 +2575,6 @@ "react": ">=16.8.0" } }, - "node_modules/@documenso/embed-react": { - "version": "0.5.1", - "resolved": "https://registry.npmjs.org/@documenso/embed-react/-/embed-react-0.5.1.tgz", - "integrity": "sha512-PlkZ3vrdZVBTc0J3xfG2wtPVGmxCxWgpQ/SsdR2oBMdTwsR+rDbj9k+CeTv+M9Xi5tKbLr5Y78bS9Sb8K+ltTQ==", - "license": "MIT", - "peerDependencies": { - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - } - }, "node_modules/@dotenvx/dotenvx": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/@dotenvx/dotenvx/-/dotenvx-1.52.0.tgz", diff --git a/client/package.json b/client/package.json index a190ec650..1f14bec96 100644 --- a/client/package.json +++ b/client/package.json @@ -15,7 +15,6 @@ "@dnd-kit/modifiers": "^9.0.0", "@dnd-kit/sortable": "^10.0.0", "@dnd-kit/utilities": "^3.2.2", - "@documenso/embed-react": "^0.5.1", "@emotion/is-prop-valid": "^1.4.0", "@fingerprintjs/fingerprintjs": "^5.0.1", "@firebase/analytics": "^0.10.19", diff --git a/client/src/App/App.styles.scss b/client/src/App/App.styles.scss index 1aca1eecb..5f66030b5 100644 --- a/client/src/App/App.styles.scss +++ b/client/src/App/App.styles.scss @@ -509,10 +509,3 @@ pointer-events: none !important; } } - - -.esignature-embed { -width: 100%; -height: 100%; -border-width: 0; -} \ No newline at end of file diff --git a/client/src/components/esignature-modal/esignature-modal.container.jsx b/client/src/components/esignature-modal/esignature-modal.container.jsx deleted file mode 100644 index be82394e0..000000000 --- a/client/src/components/esignature-modal/esignature-modal.container.jsx +++ /dev/null @@ -1,78 +0,0 @@ -import { EmbedUpdateDocumentV1 } from "@documenso/embed-react"; -import { Modal } from "antd"; -import axios from "axios"; -import { useTranslation } from "react-i18next"; -import { connect } from "react-redux"; -import { createStructuredSelector } from "reselect"; -import { toggleModalVisible } from "../../redux/modals/modals.actions"; -import { selectEsignature } from "../../redux/modals/modals.selectors"; -import { selectBodyshop } from "../../redux/user/user.selectors"; - -const mapStateToProps = createStructuredSelector({ - esignatureModal: selectEsignature, - bodyshop: selectBodyshop -}); - -const mapDispatchToProps = (dispatch) => ({ - toggleModalVisible: () => dispatch(toggleModalVisible("esignature")) -}); - -export function EsignatureModalContainer({ esignatureModal, toggleModalVisible, bodyshop }) { - const { t } = useTranslation(); - const { open, context } = esignatureModal; - const { token, envelopeId, documentId, jobid } = context; - - return ( - { - try { - const distResult = await axios.post("/esign/distribute", { - documentId, - envelopeId, - jobid, - bodyshopid: bodyshop.id - }); - console.log("Distribution result:", distResult); - toggleModalVisible(); - } catch (error) { - console.error("Error distributing document:", error); - } - }} - onCancel={async () => { - try { - const cancelResult = await axios.post("/esign/delete", { - documentId, - envelopeId - }); - console.log("Cancel result:", cancelResult); - toggleModalVisible(); - } catch (error) { - console.error("Error cancelling document:", error); - } - }} - okButtonProps={{ title: "Distribute by Email" }} - width="90%" - destroyOnHidden - > -
- {token ? ( - { - console.log("Document updated:", data.documentId); - }} - /> - ) : ( -
No token...
- )} -
-
- ); -} - -export default connect(mapStateToProps, mapDispatchToProps)(EsignatureModalContainer); diff --git a/client/src/components/print-center-item/print-center-item.component.jsx b/client/src/components/print-center-item/print-center-item.component.jsx index 191f6b811..7af2b15f1 100644 --- a/client/src/components/print-center-item/print-center-item.component.jsx +++ b/client/src/components/print-center-item/print-center-item.component.jsx @@ -1,4 +1,4 @@ -import { MailOutlined, PrinterOutlined, SignatureFilled } from "@ant-design/icons"; +import { MailOutlined, PrinterOutlined } from "@ant-design/icons"; import { Space, Spin } from "antd"; import { useState } from "react"; import { connect } from "react-redux"; @@ -10,8 +10,6 @@ import { GenerateDocument } from "../../utils/RenderTemplate"; import LockWrapperComponent from "../lock-wrapper/lock-wrapper.component"; import { HasFeatureAccess } from "./../feature-wrapper/feature-wrapper.component"; import { useNotification } from "../../contexts/Notifications/notificationContext.jsx"; -import axios from "axios"; -import { setModalContext } from "../../redux/modals/modals.actions.js"; const mapStateToProps = createStructuredSelector({ printCenterModal: selectPrintCenter, @@ -19,25 +17,9 @@ const mapStateToProps = createStructuredSelector({ technician: selectTechnician }); -const mapDispatchToProps = (dispatch) => ({ - setEsignatureContext: (context) => - dispatch( - setModalContext({ - context: context, - modal: "esignature" - }) - ) -}); +const mapDispatchToProps = () => ({}); -export function PrintCenterItemComponent({ - printCenterModal, - setEsignatureContext, - item, - id, - bodyshop, - disabled, - technician -}) { +export function PrintCenterItemComponent({ printCenterModal, item, id, bodyshop, disabled, technician }) { const [loading, setLoading] = useState(false); const { context } = printCenterModal; const notification = useNotification(); @@ -57,30 +39,6 @@ export function PrintCenterItemComponent({ setLoading(false); }; - const esignatureGenerate = async () => { - setLoading(true); - try { - const { - data: { token, documentId, evnelopeId } - } = await axios.post("/esign/new", { - name: item.key, - jobid: id, - context, - bodyshop, - templateObject: { - name: item.key, - variables: { id: id } - } - }); - - setEsignatureContext({ context: { token, documentId, evnelopeId, jobid: id } }); - } catch (error) { - console.log(error); - } finally { - setLoading(false); - } - }; - if ( disabled || (item.featureNameRestricted && !HasFeatureAccess({ featureName: item.featureNameRestricted, bodyshop })) @@ -96,7 +54,6 @@ export function PrintCenterItemComponent({
  • {item.title} - {!technician ? ( import("../../components/print-center-modal/print-center-modal.container") @@ -69,9 +68,7 @@ const FeatureRequestPage = lazyDev(() => import("../feature-request/feature-requ const JobCostingModal = lazyDev(() => import("../../components/job-costing-modal/job-costing-modal.container")); const ReportCenterModal = lazyDev(() => import("../../components/report-center-modal/report-center-modal.container")); const BillEnterModalContainer = lazyDev(() => import("../../components/bill-enter-modal/bill-enter-modal.container")); -const TimeTicketModalContainer = lazyDev( - () => import("../../components/time-ticket-modal/time-ticket-modal.container") -); +const TimeTicketModalContainer = lazyDev(() => import("../../components/time-ticket-modal/time-ticket-modal.container")); const TimeTicketModalTask = lazyDev( () => import("../../components/time-ticket-task-modal/time-ticket-task-modal.container") ); @@ -113,9 +110,7 @@ const TtApprovals = lazyDev(() => import("../tt-approvals/tt-approvals.page.cont const MyTasksPage = lazyDev(() => import("../tasks/myTasksPageContainer.jsx")); const AllTasksPage = lazyDev(() => import("../tasks/allTasksPageContainer.jsx")); -const TaskUpsertModalContainer = lazyDev( - () => import("../../components/task-upsert-modal/task-upsert-modal.container") -); +const TaskUpsertModalContainer = lazyDev(() => import("../../components/task-upsert-modal/task-upsert-modal.container")); const { Content } = Layout; const mapStateToProps = createStructuredSelector({ @@ -183,7 +178,6 @@ export function Manage({ conflict, bodyshop, partsManagementOnly, isDarkMode, cu - diff --git a/client/src/redux/modals/modals.reducer.js b/client/src/redux/modals/modals.reducer.js index b7e67823f..0035ba17b 100644 --- a/client/src/redux/modals/modals.reducer.js +++ b/client/src/redux/modals/modals.reducer.js @@ -27,8 +27,7 @@ const INITIAL_STATE = { contractFinder: { ...baseModal }, inventoryUpsert: { ...baseModal }, ca_bc_eftTableConvert: { ...baseModal }, - cardPayment: { ...baseModal }, - esignature: { ...baseModal } + cardPayment: { ...baseModal } }; const modalsReducer = (state = INITIAL_STATE, action) => { diff --git a/client/src/redux/modals/modals.selectors.js b/client/src/redux/modals/modals.selectors.js index ad796f8da..cd836a3d1 100644 --- a/client/src/redux/modals/modals.selectors.js +++ b/client/src/redux/modals/modals.selectors.js @@ -36,4 +36,3 @@ export const selectInventoryUpsert = createSelector([selectModals], (modals) => export const selectCaBcEtfTableConvert = createSelector([selectModals], (modals) => modals.ca_bc_eftTableConvert); export const selectCardPayment = createSelector([selectModals], (modals) => modals.cardPayment); -export const selectEsignature = createSelector([selectModals], (modals) => modals.esignature); diff --git a/client/src/translations/en_us/common.json b/client/src/translations/en_us/common.json index 96a415f8a..5e2662509 100644 --- a/client/src/translations/en_us/common.json +++ b/client/src/translations/en_us/common.json @@ -2205,7 +2205,6 @@ "duplicateconfirm": "Are you sure you want to duplicate this Job? Some elements of this Job will not be duplicated.", "emailaudit": "Email Audit Trail", "employeeassignments": "Employee Assignments", - "esignature": "E-Signature", "estimatelines": "Estimate Lines", "estimator": "Estimator", "existing_jobs": "Existing Jobs", diff --git a/client/src/translations/es/common.json b/client/src/translations/es/common.json index 2cc78314f..ec98030b8 100644 --- a/client/src/translations/es/common.json +++ b/client/src/translations/es/common.json @@ -2205,7 +2205,6 @@ "duplicateconfirm": "", "emailaudit": "", "employeeassignments": "", - "esignature": "", "estimatelines": "", "estimator": "", "existing_jobs": "Empleos existentes", diff --git a/client/src/translations/fr/common.json b/client/src/translations/fr/common.json index 6d8c56c13..fcbcfea4c 100644 --- a/client/src/translations/fr/common.json +++ b/client/src/translations/fr/common.json @@ -2205,7 +2205,6 @@ "duplicateconfirm": "", "emailaudit": "", "employeeassignments": "", - "esignature": "", "estimatelines": "", "estimator": "", "existing_jobs": "Emplois existants", diff --git a/package-lock.json b/package-lock.json index 33f38e385..95e0f0740 100644 --- a/package-lock.json +++ b/package-lock.json @@ -19,7 +19,6 @@ "@aws-sdk/credential-provider-node": "^3.972.21", "@aws-sdk/lib-storage": "^3.1009.0", "@aws-sdk/s3-request-presigner": "^3.1009.0", - "@documenso/sdk-typescript": "^0.8.0", "@jsreport/nodejs-client": "^4.1.0", "@opensearch-project/opensearch": "^2.13.0", "@socket.io/admin-ui": "^0.5.1", @@ -1360,18 +1359,6 @@ "kuler": "^2.0.0" } }, - "node_modules/@documenso/sdk-typescript": { - "version": "0.8.0", - "resolved": "https://registry.npmjs.org/@documenso/sdk-typescript/-/sdk-typescript-0.8.0.tgz", - "integrity": "sha512-Emzd5j+v8tA8gxtL+M/svVuzSOKMZw3/U4bS8zRoagvQEqkt+XNU2JraPEAJzxTjf3ww6EnlURXydbglBmR7AQ==", - "dependencies": { - "@modelcontextprotocol/sdk": "^1.26.0", - "zod": "^3.25.0 || ^4.0.0" - }, - "bin": { - "mcp": "bin/mcp-server.js" - } - }, "node_modules/@esbuild/aix-ppc64": { "version": "0.27.2", "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.27.2.tgz", @@ -2208,18 +2195,6 @@ "node": ">=6" } }, - "node_modules/@hono/node-server": { - "version": "1.19.9", - "resolved": "https://registry.npmjs.org/@hono/node-server/-/node-server-1.19.9.tgz", - "integrity": "sha512-vHL6w3ecZsky+8P5MD+eFfaGTyCeOHUIFYMGpQGbrBTSmNNoxv0if69rEZ5giu36weC5saFuznL411gRX7bJDw==", - "license": "MIT", - "engines": { - "node": ">=18.14.1" - }, - "peerDependencies": { - "hono": "^4" - } - }, "node_modules/@humanfs/core": { "version": "0.19.1", "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", @@ -2327,364 +2302,12 @@ "url": "https://opencollective.com/js-sdsl" } }, - "node_modules/@jsreport/nodejs-client": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/@jsreport/nodejs-client/-/nodejs-client-4.1.0.tgz", - "integrity": "sha512-QWupUQzMzxWFvY+AlSdUZGlinJv4cKhYmVE9rIe+he7rn4B24tezFmNdnrDcTSFv3hj4x7sTNqpeHT0fItfs5Q==", - "dependencies": { - "axios": "1.13.2", - "concat-stream": "2.0.0", - "mimic-response": "2.1.0" - }, - "engines": { - "node": ">=22.18" - } - }, - "node_modules/@jsreport/nodejs-client/node_modules/axios": { - "version": "1.13.2", - "resolved": "https://registry.npmjs.org/axios/-/axios-1.13.2.tgz", - "integrity": "sha512-VPk9ebNqPcy5lRGuSlKx752IlDatOjT9paPlm8A7yOuW2Fbvp4X3JznJtT4f0GzGLLiWE9W8onz51SqLYwzGaA==", - "license": "MIT", - "dependencies": { - "follow-redirects": "^1.15.6", - "form-data": "^4.0.4", - "proxy-from-env": "^1.1.0" - } - }, "node_modules/@kurkle/color": { "version": "0.3.4", "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.4.tgz", "integrity": "sha512-M5UknZPHRu3DEDWoipU6sE8PdkZ6Z/S+v4dD+Ke8IaNlpdSQah50lz1KtcFBa2vsdOnwbbnxJwVM4wty6udA5w==", "license": "MIT" }, - "node_modules/@modelcontextprotocol/sdk": { - "version": "1.27.1", - "resolved": "https://registry.npmjs.org/@modelcontextprotocol/sdk/-/sdk-1.27.1.tgz", - "integrity": "sha512-sr6GbP+4edBwFndLbM60gf07z0FQ79gaExpnsjMGePXqFcSSb7t6iscpjk9DhFhwd+mTEQrzNafGP8/iGGFYaA==", - "license": "MIT", - "dependencies": { - "@hono/node-server": "^1.19.9", - "ajv": "^8.17.1", - "ajv-formats": "^3.0.1", - "content-type": "^1.0.5", - "cors": "^2.8.5", - "cross-spawn": "^7.0.5", - "eventsource": "^3.0.2", - "eventsource-parser": "^3.0.0", - "express": "^5.2.1", - "express-rate-limit": "^8.2.1", - "hono": "^4.11.4", - "jose": "^6.1.3", - "json-schema-typed": "^8.0.2", - "pkce-challenge": "^5.0.0", - "raw-body": "^3.0.0", - "zod": "^3.25 || ^4.0", - "zod-to-json-schema": "^3.25.1" - }, - "engines": { - "node": ">=18" - }, - "peerDependencies": { - "@cfworker/json-schema": "^4.1.1", - "zod": "^3.25 || ^4.0" - }, - "peerDependenciesMeta": { - "@cfworker/json-schema": { - "optional": true - }, - "zod": { - "optional": false - } - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/content-disposition": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.1.tgz", - "integrity": "sha512-oIXISMynqSqm241k6kcQ5UwttDILMK4BiurCfGEREw6+X9jkkpEe5T9FZaApyLGGOnFuyMWZpdolTXMtvEJ08Q==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/express": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/express/-/express-5.2.1.tgz", - "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.1", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "depd": "^2.0.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/finalhandler": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.1.tgz", - "integrity": "sha512-S8KoZgRZN+a5rNwqTxlZZePjT/4cnm0ROV70LedRHZ0p8u9fRID0hJUZQpkKLzro8LfmC8sx23bY6tVNxv8pQA==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/jose": { - "version": "6.1.3", - "resolved": "https://registry.npmjs.org/jose/-/jose-6.1.3.tgz", - "integrity": "sha512-0TpaTfihd4QMNwrz/ob2Bp7X04yuxJkjRGi4aKmOqwhov54i6u79oCv7T+C7lo70MKH6BesI3vscD1yb/yzKXQ==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/panva" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/send": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.1.tgz", - "integrity": "sha512-1gnZf7DFcoIcajTjTwjwuDjzuz4PPcY2StKPlsGAQ1+YH20IRVrBaXSWmdjowTJ6u8Rc01PoYOGHXfP1mYcZNQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.3", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.1", - "mime-types": "^3.0.2", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/serve-static": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.1.tgz", - "integrity": "sha512-xRXBn0pPqQTVQiC8wyQrKs2MOlX24zQ0POGaj0kultvoOCstBQM5yvOhAVSUwOMjQtTvsPWoNCHfPGwaaQJhTw==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/@modelcontextprotocol/sdk/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/@msgpackr-extract/msgpackr-extract-darwin-arm64": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/@msgpackr-extract/msgpackr-extract-darwin-arm64/-/msgpackr-extract-darwin-arm64-3.0.3.tgz", @@ -4574,45 +4197,6 @@ "url": "https://github.com/sponsors/epoberezkin" } }, - "node_modules/ajv-formats": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ajv-formats/-/ajv-formats-3.0.1.tgz", - "integrity": "sha512-8iUql50EUR+uUcdRQ3HDqa6EVyo3docL8g5WJ3FNcWmu62IbkGUue/pEyLBW8VGKKucTPgqeks4fIU1DA4yowQ==", - "license": "MIT", - "dependencies": { - "ajv": "^8.0.0" - }, - "peerDependencies": { - "ajv": "^8.0.0" - }, - "peerDependenciesMeta": { - "ajv": { - "optional": true - } - } - }, - "node_modules/ajv-formats/node_modules/ajv": { - "version": "8.18.0", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-8.18.0.tgz", - "integrity": "sha512-PlXPeEWMXMZ7sPYOHqmDyCJzcfNrUr3fGNKtezX14ykXOEIvyK81d+qydx89KY5O71FKMPaQ2vBfBFI5NHR63A==", - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.3", - "fast-uri": "^3.0.1", - "json-schema-traverse": "^1.0.0", - "require-from-string": "^2.0.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ajv-formats/node_modules/json-schema-traverse": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-1.0.0.tgz", - "integrity": "sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==", - "license": "MIT" - }, "node_modules/ansi-colors": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.3.tgz", @@ -5071,100 +4655,6 @@ "node": "*" } }, - "node_modules/body-parser": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.2.tgz", - "integrity": "sha512-oP5VkATKlNwcgvxi0vM0p/D3n2C3EReYVX+DNYs5TjZFn/oQt2j+4sVJtSMr18pdRr8wjTcBl6LoV+FUwzPmNA==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.3", - "http-errors": "^2.0.0", - "iconv-lite": "^0.7.0", - "on-finished": "^2.4.1", - "qs": "^6.14.1", - "raw-body": "^3.0.1", - "type-is": "^2.0.1" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/body-parser/node_modules/mime-types": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.2.tgz", - "integrity": "sha512-Lbgzdk0h4juoQ9fCKXW4by0UJqj+nOOrI9MJ1sSj4nI8aI2eo1qmvQEie4VD1glsS250n15LsWsYtCugiStS5A==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/body-parser/node_modules/qs": { - "version": "6.15.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.15.0.tgz", - "integrity": "sha512-mAZTtNCeetKMH+pSjrb76NAM8V9a05I9aBZOHztWy/UqcJdQYNsf59vrRKWnojAT9Y+GbIvoTBC++CPHqpDBhQ==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/body-parser/node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, "node_modules/boolbase": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", @@ -6915,27 +6405,6 @@ "node": ">=0.8.x" } }, - "node_modules/eventsource": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/eventsource/-/eventsource-3.0.7.tgz", - "integrity": "sha512-CRT1WTyuQoD771GW56XEZFQ/ZoSfWid1alKGDYMmkt2yl8UXrVR4pspqWNEcqKvVIzg6PAltWjxcSSPrboA4iA==", - "license": "MIT", - "dependencies": { - "eventsource-parser": "^3.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/eventsource-parser": { - "version": "3.0.6", - "resolved": "https://registry.npmjs.org/eventsource-parser/-/eventsource-parser-3.0.6.tgz", - "integrity": "sha512-Vo1ab+QXPzZ4tCa8SwIHJFaSzy4R6SHf7BY79rFBDf0idraZWAkYrDjDj8uWaSm3S2TK+hJ7/t1CEmZ7jXw+pg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, "node_modules/expect-type": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/expect-type/-/expect-type-1.3.0.tgz", @@ -6992,24 +6461,6 @@ "url": "https://opencollective.com/express" } }, - "node_modules/express-rate-limit": { - "version": "8.2.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.2.1.tgz", - "integrity": "sha512-PCZEIEIxqwhzw4KF0n7QF4QqruVTcF73O5kFKUnGOyjbCCgizBBiFaYpd/fnBLUMPw/BWw9OsiN7GgrNYr7j6g==", - "license": "MIT", - "dependencies": { - "ip-address": "10.0.1" - }, - "engines": { - "node": ">= 16" - }, - "funding": { - "url": "https://github.com/sponsors/express-rate-limit" - }, - "peerDependencies": { - "express": ">= 4.11" - } - }, "node_modules/express/node_modules/body-parser": { "version": "1.20.3", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", @@ -7132,22 +6583,6 @@ "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", "license": "MIT" }, - "node_modules/fast-uri": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/fast-uri/-/fast-uri-3.1.0.tgz", - "integrity": "sha512-iPeeDKJSWf4IEOasVVrknXpaBV0IApz/gp7S2bb7Z4Lljbl2MGJRqInZiUrQwV16cpzw/D3S5j5Julj/gT52AA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fastify" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fastify" - } - ], - "license": "BSD-3-Clause" - }, "node_modules/fast-xml-builder": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/fast-xml-builder/-/fast-xml-builder-1.1.4.tgz", @@ -8028,15 +7463,6 @@ "node": ">= 0.4" } }, - "node_modules/hono": { - "version": "4.12.3", - "resolved": "https://registry.npmjs.org/hono/-/hono-4.12.3.tgz", - "integrity": "sha512-SFsVSjp8sj5UumXOOFlkZOG6XS9SJDKw0TbwFeV+AJ8xlST8kxK5Z/5EYa111UY8732lK2S/xB653ceuaoGwpg==", - "license": "MIT", - "engines": { - "node": ">=16.9.0" - } - }, "node_modules/hpagent": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/hpagent/-/hpagent-1.2.0.tgz", @@ -8295,15 +7721,6 @@ "url": "https://opencollective.com/ioredis" } }, - "node_modules/ip-address": { - "version": "10.0.1", - "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", - "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", - "license": "MIT", - "engines": { - "node": ">= 12" - } - }, "node_modules/ipaddr.js": { "version": "1.9.1", "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", @@ -8545,12 +7962,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, "node_modules/is-regex": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", @@ -8824,12 +8235,6 @@ "dev": true, "license": "MIT" }, - "node_modules/json-schema-typed": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/json-schema-typed/-/json-schema-typed-8.0.2.tgz", - "integrity": "sha512-fQhoXdcvc3V28x7C7BMs4P5+kNlgUURe2jmUT1T//oBRMDrqy1QPelJimwZGo7Hg9VPV3EQV5Bnq4hbFy2vetA==", - "license": "BSD-2-Clause" - }, "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", @@ -9329,18 +8734,6 @@ "node": ">= 0.6" } }, - "node_modules/mimic-response": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-2.1.0.tgz", - "integrity": "sha512-wXqjST+SLt7R009ySCglWBCFpjUygmCIfD790/kVbiGmUgfYGuB14PiTd5DwVxSV4NcYHjzMkoj5LjQZwTQLEA==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/minimalistic-assert": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz", @@ -10094,15 +9487,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/pkce-challenge": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/pkce-challenge/-/pkce-challenge-5.0.1.tgz", - "integrity": "sha512-wQ0b/W4Fr01qtpHlqSqspcj3EhBvimsdh0KlHhH8HRZnMsEa0ea2fTULOXOS9ccQr3om+GcGRk4e+isrZWV8qQ==", - "license": "MIT", - "engines": { - "node": ">=16.20.0" - } - }, "node_modules/possible-typed-array-names": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", @@ -10335,66 +9719,6 @@ "node": ">= 0.6" } }, - "node_modules/raw-body": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.2.tgz", - "integrity": "sha512-K5zQjDllxWkf7Z5xJdV0/B0WTNqx6vxG70zJE4N0kBs4LovmEYWJzQGxC9bS9RAKu3bgM40lrd5zoLJ12MQ5BA==", - "license": "MIT", - "dependencies": { - "bytes": "~3.1.2", - "http-errors": "~2.0.1", - "iconv-lite": "~0.7.0", - "unpipe": "~1.0.0" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/raw-body/node_modules/http-errors": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", - "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", - "license": "MIT", - "dependencies": { - "depd": "~2.0.0", - "inherits": "~2.0.4", - "setprototypeof": "~1.2.0", - "statuses": "~2.0.2", - "toidentifier": "~1.0.1" - }, - "engines": { - "node": ">= 0.8" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/raw-body/node_modules/iconv-lite": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.7.2.tgz", - "integrity": "sha512-im9DjEDQ55s9fL4EYzOAv0yMqmMBSZp6G0VvFyTMPKWxiSBHUj9NW/qqLmXUwXrrM7AvqSlTCfvqRb0cM8yYqw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/raw-body/node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, "node_modules/react-is": { "version": "16.13.1", "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", @@ -10560,15 +9884,6 @@ "node": ">=0.10.0" } }, - "node_modules/require-from-string": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/require-from-string/-/require-from-string-2.0.2.tgz", - "integrity": "sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/resolve": { "version": "2.0.0-next.5", "resolved": "https://registry.npmjs.org/resolve/-/resolve-2.0.0-next.5.tgz", @@ -10761,32 +10076,6 @@ "fsevents": "~2.3.2" } }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/router/node_modules/path-to-regexp": { - "version": "8.3.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.3.0.tgz", - "integrity": "sha512-7jdwVIRtsP8MYpdXSwOS0YdD0Du+qOoF/AEPIt88PcCFrZCzx41oxku1jD88hZBwbNUIEfpqvuhjFaMAqMTWnA==", - "license": "MIT", - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, "node_modules/rsa-pem-from-mod-exp": { "version": "0.8.6", "resolved": "https://registry.npmjs.org/rsa-pem-from-mod-exp/-/rsa-pem-from-mod-exp-0.8.6.tgz", @@ -13056,24 +12345,6 @@ "engines": { "node": ">= 14" } - }, - "node_modules/zod": { - "version": "4.3.6", - "resolved": "https://registry.npmjs.org/zod/-/zod-4.3.6.tgz", - "integrity": "sha512-rftlrkhHZOcjDwkGlnUtZZkvaPHCsDATp4pGpuOOMDaTdDDXF91wuVDJoWoPsKX/3YPQ5fHuF3STjcYyKr+Qhg==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, - "node_modules/zod-to-json-schema": { - "version": "3.25.1", - "resolved": "https://registry.npmjs.org/zod-to-json-schema/-/zod-to-json-schema-3.25.1.tgz", - "integrity": "sha512-pM/SU9d3YAggzi6MtR4h7ruuQlqKtad8e9S0fmxcMi+ueAK5Korys/aWcV9LIIHTVbj01NdzxcnXSN+O74ZIVA==", - "license": "ISC", - "peerDependencies": { - "zod": "^3.25 || ^4" - } } } } diff --git a/package.json b/package.json index dbe1c1192..5b3dcf23b 100644 --- a/package.json +++ b/package.json @@ -28,7 +28,6 @@ "@aws-sdk/credential-provider-node": "^3.972.21", "@aws-sdk/lib-storage": "^3.1009.0", "@aws-sdk/s3-request-presigner": "^3.1009.0", - "@documenso/sdk-typescript": "^0.8.0", "@jsreport/nodejs-client": "^4.1.0", "@opensearch-project/opensearch": "^2.13.0", "@socket.io/admin-ui": "^0.5.1", diff --git a/server.js b/server.js index 82f2928e1..90f16f33d 100644 --- a/server.js +++ b/server.js @@ -130,7 +130,6 @@ const applyRoutes = ({ app }) => { app.use("/ai", require("./server/routes/aiRoutes")); app.use("/chatter", require("./server/routes/chatterRoutes")); - app.use("/esign", require("./server/routes/esignRoutes")); // Default route for forbidden access app.get("/", (req, res) => { diff --git a/server/esign/esign-new.js b/server/esign/esign-new.js deleted file mode 100644 index 5c976e4de..000000000 --- a/server/esign/esign-new.js +++ /dev/null @@ -1,304 +0,0 @@ - -const { Documenso } = require("@documenso/sdk-typescript"); -const axios = require("axios"); -const { jsrAuthString } = require("../utils/utils"); -const logger = require("../utils/logger"); -const DOCUMENSO_API_KEY = "api_asojim0czruv13ud";//Done on a by team basis, -const documenso = new Documenso({ - apiKey: DOCUMENSO_API_KEY,//Done on a by team basis, - serverURL: "https://stg-app.documenso.com/api/v2", -}); -const JSR_SERVER = "https://reports.test.imex.online"; -const jsreport = require("@jsreport/nodejs-client"); -const { QUERY_JOB_FOR_SIGNATURE, INSERT_ESIG_AUDIT_TRAIL } = require("../graphql-client/queries"); - - -async function distributeDocument(req, res) { - try { - const client = req.userGraphQLClient; - - const { documentId } = req.body; - const distributeResult = await documenso.documents.distribute({ - documentId, - }); - - const auditEntry = await client.request(INSERT_ESIG_AUDIT_TRAIL, { - obj: { - jobid: req.body.jobid, - bodyshopid: req.body.bodyshopid, - operation: `Esignature document with title ${distributeResult.title} (ID: ${documentId}) distributed to recipients.`, - useremail: req.user?.email, - type: 'esig-distribute' - } - }) - - res.json({ success: true, distributeResult }); - } catch (error) { - console.error("Error distributing document:", error?.data); - logger.log(`esig-distribute-error`, "ERROR", "esig", "api", { - message: error.message, stack: error.stack, - body: req.body - }); - res.status(500).json({ error: "An error occurred while distributing the document." }); - } -} - -async function deleteDocument(req, res) { - try { - const { documentId } = req.body; - //TODO: This needs to be hardened to prevent deleting other people's documents, completed ones, etc. - const deleteResult = await documenso.documents.delete({ - documentId - }); - res.json({ success: true, deleteResult }); - } catch (error) { - console.error("Error deleting document:", error?.data); - logger.log(`esig-delete-error`, "ERROR", "esig", "api", { - message: error.message, stack: error.stack, - body: req.body - }); - res.status(500).json({ error: "An error occurred while deleting the document." }); - } -} - -async function newEsignDocument(req, res) { - try { - const client = req.userGraphQLClient; - const { bodyshop } = req.body - const { pdf: fileBuffer, esigData } = await RenderTemplate({ client, req }) - const fileBlob = new Blob([fileBuffer], { type: "application/pdf" }); - - - //Get the Job data. - const { jobs_by_pk: jobData } = await client.request(QUERY_JOB_FOR_SIGNATURE, { jobid: req.body.jobid }); - - const createDocumentResponse = await documenso.documents.create({ - payload: { - title: esigData?.title, - externalId: `${req.body.jobid}|${req.user?.email}`, //Have to pass the uploaded by later on. Limited to 255 chars. - recipients: [ - { - email: "patrick@imexsystems.ca",//jobData.ownr_ea, - name: `${jobData.ownr_fn} ${jobData.ownr_ln}`, - role: "SIGNER", - } - ], - meta: { - timezone: bodyshop.timezone, - dateFormat: "MM/dd/yyyy hh:mm a", - language: "en", - subject: esigData?.subject, - message: esigData?.message, - - } - }, - file: fileBlob - }); - - const documentResult = await documenso.documents.get({ - documentId: createDocumentResponse.id, - }); - - - if (esigData?.fields && esigData.fields.length > 0) { - try { - await documenso.envelopes.fields.createMany({ - envelopeId: createDocumentResponse.envelopeId, - data: esigData.fields.map(sigField => ({ ...sigField, recipientId: documentResult.recipients[0].id, })) - - }); - } catch (error) { - logger.log(`esig-new-fields-error`, "ERROR", "esig", "api", { - message: error.message, stack: error.stack, - body: req.body - }); - } - } - - const presignToken = await documenso.embedding.embeddingPresignCreateEmbeddingPresignToken({}) - - //add to job audit trail. - - const auditEntry = await client.request(INSERT_ESIG_AUDIT_TRAIL, { - obj: { - jobid: req.body.jobid, - bodyshopid: bodyshop.id, - operation: `Esignature document created. Subject: ${esigData?.subject || "No subject"}, Message: ${esigData?.message || "No message"}. Document ID: ${createDocumentResponse.id} Envlope ID: ${createDocumentResponse.envelopeId}`, - useremail: req.user?.email, - type: 'esig-create' - - } - }) - - res.json({ token: presignToken.token, documentId: createDocumentResponse.id, envelopeId: createDocumentResponse.envelopeId }); - } - catch (error) { - logger.log(`esig-new-error`, "ERROR", "esig", "api", { - message: error.message, stack: error.stack, - body: req.body - }); - res.status(500).json({ error: "An error occurred while creating the e-sign document." }); - } -} - - -async function RenderTemplate({ req }) { - //TODO Refactor to pull - const jsrAuth = jsrAuthString() - - const jsreportClient = new jsreport("https://reports.test.imex.online", process.env.JSR_USER, process.env.JSR_PASSWORD); - const { templateObject, bodyshop } = req.body; - let { contextData, useShopSpecificTemplate, shopSpecificFolder, esigData } = await fetchContextData({ templateObject, jsrAuth, req }); - - const { ignoreCustomMargins } = { ignoreCustomMargins: false }// Templates[templateObject.name]; - let reportRequest = { - template: { - name: useShopSpecificTemplate ? `/${bodyshop.imexshopid}/${templateObject.name}` : `/${templateObject.name}`, - - recipe: "chrome-pdf", - ...(!ignoreCustomMargins && { - chrome: { - marginTop: - bodyshop.logo_img_path && - bodyshop.logo_img_path.headerMargin && - bodyshop.logo_img_path.headerMargin > 36 - ? bodyshop.logo_img_path.headerMargin - : "36px", - marginBottom: - bodyshop.logo_img_path && - bodyshop.logo_img_path.footerMargin && - bodyshop.logo_img_path.footerMargin > 50 - ? bodyshop.logo_img_path.footerMargin - : "50px" - } - }), - }, - data: { - ...contextData, - ...templateObject.variables, - ...templateObject.context, - headerpath: shopSpecificFolder ? `/${bodyshop.imexshopid}/header.html` : `/GENERIC/header.html`, - footerpath: shopSpecificFolder ? `/${bodyshop.imexshopid}/footer.html` : `/GENERIC/footer.html`, - bodyshop: bodyshop, - filters: templateObject?.filters, - sorters: templateObject?.sorters, - offset: bodyshop.timezone, //dayjs().utcOffset(), - defaultSorters: templateObject?.defaultSorters - } - }; - const render = await jsreportClient.render(reportRequest); - - //Check render object and download. It should be the PDF? - const pdfBuffer = await render.body() - return { pdf: pdfBuffer, esigData } -} - -const fetchContextData = async ({ templateObject, jsrAuth, req, }) => { - const { bodyshop } = req.body - - - const folders = await axios.get(`${JSR_SERVER}/odata/folders`, { - headers: { Authorization: jsrAuth } - }); - const shopSpecificFolder = folders.data.value.find((f) => f.name === bodyshop.imexshopid); - - const jsReportQueries = await axios.get( - `${JSR_SERVER}/odata/assets?$filter=name eq '${templateObject.name}.query'`, - { headers: { Authorization: jsrAuth } } - ); - const jsReportEsig = await axios.get( - `${JSR_SERVER}/odata/assets?$filter=name eq '${templateObject.name}.esig'`, - { headers: { Authorization: jsrAuth } } - ); - - let templateQueryToExecute; - let esigData; - let useShopSpecificTemplate = false; - // let shopSpecificTemplate; - - if (shopSpecificFolder) { - let shopSpecificTemplate = jsReportQueries.data.value.find( - (f) => f?.folder?.shortid === shopSpecificFolder.shortid - ); - if (shopSpecificTemplate) { - useShopSpecificTemplate = true; - templateQueryToExecute = atob(shopSpecificTemplate.content); - } - let shopSpecificEsig = jsReportEsig.data.value.find( - (f) => f?.folder?.shortid === shopSpecificFolder.shortid - ); - if (shopSpecificEsig) { - esigData = (atob(shopSpecificEsig.content)); - } - } - - if (!templateQueryToExecute) { - const generalTemplate = jsReportQueries.data.value.find((f) => !f.folder); - useShopSpecificTemplate = false; - templateQueryToExecute = atob(generalTemplate.content); - } - if (!esigData) { - const generalTemplate = jsReportEsig.data.value.find((f) => !f.folder); - useShopSpecificTemplate = false; - if (generalTemplate && generalTemplate.content) { - esigData = atob(generalTemplate?.content); - } - } - - const client = req.userGraphQLClient; - - - // In the print center, we will never have sorters or filters. - // We have no template filters or sorters, so we can just execute the query and return the data - // if (!hasFilters && !hasSorters && !hasDefaultSorters) { - let contextData = {}; - if (templateQueryToExecute) { - const data = await client.request( - templateQueryToExecute, - templateObject.variables, - ); - contextData = data; - } - - let parsedEsigData - try { - parsedEsigData = esigData ? JSON.parse(esigData) : null; - } catch (error) { - console.log("Error parsing esig data", error); - parsedEsigData = {} - } - - return { - contextData, - useShopSpecificTemplate, - shopSpecificFolder, - esigData: parsedEsigData - }; - // } - - // return await generateTemplate(templateQueryToExecute, templateObject, useShopSpecificTemplate, shopSpecificFolder); -}; - -module.exports = { - newEsignDocument, - distributeDocument, - deleteDocument -} - - - -// const sample_esig_for_jsr = { -// "fields": [ -// { -// "placeholder": "[[signature]]", -// "type": "SIGNATURE" -// }, -// { -// "placeholder": "[[date]]", -// "type": "DATE" -// } -// ], -// "subject": "CASL Auth Set in JSR", -// "message": "CASL Message set in JSR", -// "title": "CASL Title set in JSR" -// } \ No newline at end of file diff --git a/server/esign/webhook.js b/server/esign/webhook.js deleted file mode 100644 index 3c83a07ae..000000000 --- a/server/esign/webhook.js +++ /dev/null @@ -1,393 +0,0 @@ - -const { Documenso } = require("@documenso/sdk-typescript"); -const fs = require("fs"); -const path = require("path"); -const logger = require("../utils/logger"); -const { QUERY_META_FOR_ESIG_COMPLETION, INSERT_ESIGNATURE_DOCUMENT, INSERT_ESIG_AUDIT_TRAIL } = require("../graphql-client/queries"); -const { uploadFileBuffer } = require("../media/imgproxy-media"); -const client = require('../graphql-client/graphql-client').client; -const documenso = new Documenso({ - apiKey: "api_asojim0czruv13ud",//Done on a by team basis, - serverURL: "https://stg-app.documenso.com/api/v2", -}); - -const webhookTypeEnums = { - DOCUMENT_CREATED: "DOCUMENT_CREATED", - DOCUMENT_SENT: "DOCUMENT_SENT", - DOCUMENT_COMPLETED: "DOCUMENT_COMPLETED", - DOCUMENT_REJECTED: "DOCUMENT_REJECTED", - DOCUMENT_CANCELLED: "DOCUMENT_CANCELLED", - DOCUMENT_OPENED: "DOCUMENT_OPENED", - DOCUMENT_SIGNED: "DOCUMENT_SIGNED", -} - -async function esignWebhook(req, res) { - console.log("Esign Webhook Received:", req.body); - try { - const message = req.body - logger.log(`esig-webhook-received`, "DEBUG", "redis", "api", { - event: message.event, - body: message - }); - - switch (message.event) { - case webhookTypeEnums.DOCUMENT_CREATED: - //This is largely a throwaway event we know it was created. - console.log("Document created event received. Document ID:", message.payload.documentId); - // Here you can add any additional processing you want to do when a document is created - break; - case webhookTypeEnums.DOCUMENT_COMPLETED: - console.log("Document completed event received. Document ID:", message.payload.documentId); - await handleDocumentCompleted(message.payload); - // Here you can add any additional processing you want to do when a document is completed - break; - case webhookTypeEnums.DOCUMENT_SIGNED: - console.log("Document signed event received. Document ID:", message.payload.documentId); - // Here you can add any additional processing you want to do when a document is signed - break; - default: - console.log(`Unhandled event type: ${message.event}`); - } - - // const result = await documenso.documents.download({ - // documentId: req.body.payload.id, - // }); - // result.resultingBuffer = Buffer.from(result.resultingArrayBuffer); - // // Save the document to a file for testing purposes - // const downloadsDir = path.join(__dirname, '../downloads'); - // if (!fs.existsSync(downloadsDir)) { - // fs.mkdirSync(downloadsDir, { recursive: true }); - // } - // const filePath = path.join(downloadsDir, `document_${req.body.payload.id}.pdf`); - // fs.writeFileSync(filePath, result.resultingBuffer); - - // console.log(result) - - res.sendStatus(200) - } catch (error) { - logger.log(`esig-webhook-error`, "ERROR", "redis", "api", { - message: error.message, stack: error.stack, - body: req.body - }); - // const downloadsDir = path.join(__dirname, '../downloads'); - // if (!fs.existsSync(downloadsDir)) { - // fs.mkdirSync(downloadsDir, { recursive: true }); - // } - // const filePath = path.join(downloadsDir, `document_${req.body.payload.id}.pdf`); - // fs.writeFileSync(filePath, Buffer.from(err.body)); - // console.error("Error handling esign webhook:", err); - res.sendStatus(500) - } -} - -async function handleDocumentCompleted(payload = sampleComplete) { - - - //Check if the bodyshop is on image proxy or not - try { - //Split the external id to get the uploaded user. - const [jobid, uploaded_by] = payload.externalId.split("|"); - - if (!jobid || !uploaded_by) { - throw new Error(`Invalid externalId format. Expected "jobid|uploaded_by", got "${payload.externalId}"`); - } - const { jobs_by_pk } = await client.request(QUERY_META_FOR_ESIG_COMPLETION, { - jobid - }); - const document = await documenso.document.documentDownload({ - documentId: payload.id, - }); - - const response = await fetch(document.downloadUrl); - const arrayBuffer = await response.arrayBuffer(); - const buffer = Buffer.from(arrayBuffer); - - - let key = `${jobs_by_pk.bodyshop.id}/${jobs_by_pk.id}/${replaceAccents(document.filename).replace(/[^A-Z0-9]+/gi, "_")}-${new Date().getTime()}.pdf`; - - if (jobs_by_pk?.bodyshop?.uselocalmediaserver) { - //LMS not yet implemented. - - } else { - //S3 Upload - const uploadResult = await uploadFileBuffer({ key, buffer, contentType: "application/pdf" }); - if (!uploadResult.success) { - logger.log(`esig-webhook-s3-upload-error`, "ERROR", "redis", "api", { - message: uploadResult.message, - stack: uploadResult.stack, - jobid: jobid, - documentId: payload.id - }); - } else { - logger.log(`esig-webhook-s3-upload-success`, "INFO", "redis", "api", { - jobid: jobid, - documentId: payload.id, - s3Key: key, - bucket: uploadResult.bucket - }); - const auditEntry = await client.request(INSERT_ESIG_AUDIT_TRAIL, { - obj: { - jobid: jobs_by_pk.id, - bodyshopid: jobs_by_pk.bodyshop.id, - operation: `Esignature document with title ${payload.title} (ID: ${payload.documentMeta.id}) has been completed.`, - useremail: uploaded_by, - type: 'esig-complete' - } - }) - //insert the document record with the s3 key and bucket info. - await client.request(INSERT_ESIGNATURE_DOCUMENT, { - docInput: { - jobid: jobs_by_pk.id, - uploaded_by: uploaded_by, - key, - type: "application/pdf", - extension: "pdf", - bodyshopid: jobs_by_pk.bodyshop.id, - size: buffer.length, - takenat: new Date().toISOString(), - } - }) - } - } - - } catch (error) { - logger.log(`esig-webhook-event-completed-error`, "ERROR", "redis", "api", { - message: error.message, stack: error.stack, - payload - }); - } - - - -} - - -module.exports = { - esignWebhook -} - - -const sampleComplete = { - "id": 10929, - "title": "CASL Title set in JSR", - "source": "DOCUMENT", - "status": "COMPLETED", - "teamId": 742, - "userId": 654, - "Recipient": [ - { - "id": 24997, - "name": "James Tschetter", - "role": "SIGNER", - "email": "patrick@imexsystems.ca", - "token": "uMom0GwL29NBqMfohGpUE", - "signedAt": "2026-02-27T22:11:52.835Z", - "expiresAt": "2026-05-28T22:10:48.991Z", - "documentId": 10929, - "readStatus": "OPENED", - "sendStatus": "SENT", - "templateId": null, - "authOptions": { - "accessAuth": [], - "actionAuth": [] - }, - "signingOrder": null, - "signingStatus": "SIGNED", - "rejectionReason": null, - "documentDeletedAt": null, - "expirationNotifiedAt": null - } - ], - "createdAt": "2026-02-27T22:10:10.580Z", - "deletedAt": null, - "updatedAt": "2026-02-27T22:11:57.753Z", - "externalId": null, - "formValues": null, - "recipients": [ - { - "id": 24997, - "name": "James Tschetter", - "role": "SIGNER", - "email": "patrick@imexsystems.ca", - "token": "uMom0GwL29NBqMfohGpUE", - "signedAt": "2026-02-27T22:11:52.835Z", - "expiresAt": "2026-05-28T22:10:48.991Z", - "documentId": 10929, - "readStatus": "OPENED", - "sendStatus": "SENT", - "templateId": null, - "authOptions": { - "accessAuth": [], - "actionAuth": [] - }, - "signingOrder": null, - "signingStatus": "SIGNED", - "rejectionReason": null, - "documentDeletedAt": null, - "expirationNotifiedAt": null - } - ], - "templateId": null, - "visibility": "EVERYONE", - "authOptions": { - "globalAccessAuth": [], - "globalActionAuth": [] - }, - "completedAt": "2026-02-27T22:11:57.752Z", - "documentMeta": { - "id": "cmm5g3y7u00ecad1sv3ague1w", - "message": "CASL Message set in JSR", - "subject": "CASL Auth Set in JSR", - "language": "en", - "timezone": "Etc/UTC", - "dateFormat": "yyyy-MM-dd hh:mm a", - "redirectUrl": null, - "signingOrder": "PARALLEL", - "emailSettings": { - "documentDeleted": true, - "documentPending": true, - "recipientSigned": true, - "recipientRemoved": true, - "documentCompleted": true, - "ownerDocumentCompleted": true, - "recipientSigningRequest": true - }, - "distributionMethod": "EMAIL", - "drawSignatureEnabled": true, - "typedSignatureEnabled": true, - "allowDictateNextSigner": false, - "uploadSignatureEnabled": true - } -} -// const sampleBody = { -// event: "DOCUMENT_COMPLETED", -// payload: { -// Recipient: [ -// { -// authOptions: { -// accessAuth: [ -// ], -// actionAuth: [ -// ], -// }, -// documentDeletedAt: null, -// documentId: 9827, -// email: "patrick@imexsystems.ca", -// expired: null, -// id: 13311, -// name: "Customer Fullname", -// readStatus: "OPENED", -// rejectionReason: null, -// role: "SIGNER", -// sendStatus: "SENT", -// signedAt: "2026-01-30T18:29:12.648Z", -// signingOrder: null, -// signingStatus: "SIGNED", -// templateId: null, -// token: "uiEWIsXUPTbWHd7QedVgt", -// }, -// ], -// authOptions: { -// globalAccessAuth: [ -// ], -// globalActionAuth: [ -// ], -// }, -// completedAt: "2026-01-30T18:29:16.279Z", -// createdAt: "2026-01-30T18:28:48.861Z", -// deletedAt: null, -// documentMeta: { -// allowDictateNextSigner: false, -// dateFormat: "yyyy-MM-dd hh:mm a", -// distributionMethod: "EMAIL", -// drawSignatureEnabled: true, -// emailSettings: { -// documentCompleted: true, -// documentDeleted: true, -// documentPending: true, -// ownerDocumentCompleted: true, -// recipientRemoved: false, -// recipientSigned: true, -// recipientSigningRequest: true, -// }, -// id: "cml17vfb200qjad1t2spxnc1n", -// language: "en", -// message: "To perform repairs on your vehicle, we must receive digital authorization. Please review and sign the document to proceed with repairs. ", -// redirectUrl: null, -// signingOrder: "PARALLEL", -// subject: "Repair Authorization for ABC Collision", -// timezone: "Etc/UTC", -// typedSignatureEnabled: true, -// uploadSignatureEnabled: true, -// }, -// externalId: null, -// formValues: null, -// id: 9827, -// recipients: [ -// { -// authOptions: { -// accessAuth: [ -// ], -// actionAuth: [ -// ], -// }, -// documentDeletedAt: null, -// documentId: 9827, -// email: "patrick@imexsystems.ca", -// expired: null, -// id: 13311, -// name: "Customer Fullname", -// readStatus: "OPENED", -// rejectionReason: null, -// role: "SIGNER", -// sendStatus: "SENT", -// signedAt: "2026-01-30T18:29:12.648Z", -// signingOrder: null, -// signingStatus: "SIGNED", -// templateId: null, -// token: "uiEWIsXUPTbWHd7QedVgt", -// }, -// ], -// source: "DOCUMENT", -// status: "COMPLETED", -// teamId: 742, -// templateId: null, -// title: "Repair Authorization - 1/30/2026, 6:28:48 PM", -// updatedAt: "2026-01-30T18:29:16.280Z", -// userId: 654, -// visibility: "EVERYONE", -// }, -// createdAt: "2026-01-30T18:29:18.504Z", -// webhookEndpoint: "https://dev.patrickfic.com/esign/webhook", -// } - -function replaceAccents(str) { - // Verifies if the String has accents and replace them - if (str.search(/[\xC0-\xFF]/g) > -1) { - str = str - .replace(/[\xC0-\xC5]/g, "A") - .replace(/[\xC6]/g, "AE") - .replace(/[\xC7]/g, "C") - .replace(/[\xC8-\xCB]/g, "E") - .replace(/[\xCC-\xCF]/g, "I") - .replace(/[\xD0]/g, "D") - .replace(/[\xD1]/g, "N") - .replace(/[\xD2-\xD6\xD8]/g, "O") - .replace(/[\xD9-\xDC]/g, "U") - .replace(/[\xDD]/g, "Y") - .replace(/[\xDE]/g, "P") - .replace(/[\xE0-\xE5]/g, "a") - .replace(/[\xE6]/g, "ae") - .replace(/[\xE7]/g, "c") - .replace(/[\xE8-\xEB]/g, "e") - .replace(/[\xEC-\xEF]/g, "i") - .replace(/[\xF1]/g, "n") - .replace(/[\xF2-\xF6\xF8]/g, "o") - .replace(/[\xF9-\xFC]/g, "u") - .replace(/[\xFE]/g, "p") - .replace(/[\xFD\xFF]/g, "y"); - } - return str; -} - -`Unexpected Status or Content-Type: Status 200 Content-Type application/pdf\nBody: %PDF-1.7\n%����\n1 0 obj\n<<\n/Type /Catalog\n/Pages 2 0 R\n/Names 74 0 R\n/Dests 75 0 R\n/Info 77 0 R\n/Lang (en-US)\n/Version /1.7\n>>\nendobj\n77 0 obj\n<<\n/Type /Info\n/CreationDate (D:20260227230617Z00'00')\n/Producer \n/ModDate (D:20260227231057Z)…�5[�>�Wu7��V�����Pw�WX�ܮJ'6NWg�vYϳ�����Щr�\n\t+�1��m{휑 �hwb���8��q y�1e�)۱�5m����MVM!�m�[A���{l��\t�hia4��Tm��8��a�e�}� ߫���]MVpяG��֏�jJ<"�A�mO*�P� ������ѧЛ\nendstream\nendobj\n26 0 obj\n<<\n/Length 478/Filter /FlateDecode\n>>\nstream\nx�MSK�9��)��*�O�i��,��o ��kS%�$��hR\rS'�I��~��������T[/�{�k�FC#��֛���;Ӏ�[�⫀m�|Q��\x1b��>� R�����a�E#�pI��._H�ᆫt�k�D3p�I�����W2���oJ0�j���j#��!�$��-������.Ϋ���TI|8D�H��Y��x����1�73%�u�T��Ӑ.rcb�x��Dd6=��Oڏ1 ^�-�...and 252354 more chars` \ No newline at end of file diff --git a/server/esign/webhook.types.ts b/server/esign/webhook.types.ts deleted file mode 100644 index d82e74061..000000000 --- a/server/esign/webhook.types.ts +++ /dev/null @@ -1,95 +0,0 @@ -export type WebhookEventType = - | "DOCUMENT_CREATED" - | "DOCUMENT_SENT" - | "DOCUMENT_COMPLETED" - | "DOCUMENT_REJECTED" - | "DOCUMENT_CANCELLED" - | "DOCUMENT_OPENED" - | "DOCUMENT_SIGNED"; - -export interface AuthOptions { - accessAuth: unknown[]; - actionAuth: unknown[]; -} - -export interface Recipient { - id: number; - name: string; - role: string; - email: string; - token?: string | null; - signedAt?: string | null; - expiresAt?: string | null; - documentId?: number; - readStatus?: string | null; - sendStatus?: string | null; - templateId?: number | null; - authOptions?: AuthOptions; - signingOrder?: number | null; - signingStatus?: string | null; - rejectionReason?: string | null; - documentDeletedAt?: string | null; - expirationNotifiedAt?: string | null; -} - -export interface EmailSettings { - documentDeleted: boolean; - documentPending: boolean; - recipientSigned: boolean; - recipientRemoved: boolean; - documentCompleted: boolean; - ownerDocumentCompleted: boolean; - recipientSigningRequest: boolean; -} - -export interface DocumentMeta { - id: string; - message?: string | null; - subject?: string | null; - language?: string | null; - timezone?: string | null; - dateFormat?: string | null; - redirectUrl?: string | null; - signingOrder?: string | null; - emailSettings?: EmailSettings; - distributionMethod?: string | null; - drawSignatureEnabled?: boolean; - typedSignatureEnabled?: boolean; - allowDictateNextSigner?: boolean; - uploadSignatureEnabled?: boolean; -} - -export interface DocumentAuthOptions { - globalAccessAuth: unknown[]; - globalActionAuth: unknown[]; -} - -export interface DocumentPayload { - id: number; - title?: string | null; - source?: string | null; - status?: string | null; - teamId?: number | null; - userId?: number | null; - Recipient?: Recipient[]; - recipients?: Recipient[]; - createdAt?: string | null; - deletedAt?: string | null; - updatedAt?: string | null; - externalId?: string | null; - formValues?: unknown | null; - templateId?: number | null; - visibility?: string | null; - authOptions?: DocumentAuthOptions; - completedAt?: string | null; - documentMeta?: DocumentMeta | null; -} - -export interface WebhookEventPayload { - event: WebhookEventType; - payload: DocumentPayload; - createdAt?: string | null; - webhookEndpoint?: string | null; -} - -export default WebhookEventPayload; diff --git a/server/graphql-client/queries.js b/server/graphql-client/queries.js index 2bf20931d..846759de7 100644 --- a/server/graphql-client/queries.js +++ b/server/graphql-client/queries.js @@ -2253,16 +2253,18 @@ exports.UPDATE_OLD_TRANSITION = `mutation UPDATE_OLD_TRANSITION($jobid: uuid!, $ exports.INSERT_NEW_TRANSITION = ( includeOldTransition -) => `mutation INSERT_NEW_TRANSITION($newTransition: transitions_insert_input!, ${includeOldTransition ? `$oldTransitionId: uuid!, $duration: numeric` : "" +) => `mutation INSERT_NEW_TRANSITION($newTransition: transitions_insert_input!, ${ + includeOldTransition ? `$oldTransitionId: uuid!, $duration: numeric` : "" }) { insert_transitions_one(object: $newTransition) { id } - ${includeOldTransition - ? `update_transitions(where: {id: {_eq: $oldTransitionId}}, _set: {duration: $duration}) { + ${ + includeOldTransition + ? `update_transitions(where: {id: {_eq: $oldTransitionId}}, _set: {duration: $duration}) { affected_rows }` - : "" + : "" } }`; @@ -3254,46 +3256,3 @@ exports.SET_JOB_DMS_ID = `mutation SetJobDmsId($id: uuid!, $dms_id: String!, $dm kmin } }`; - - -exports.QUERY_JOB_FOR_SIGNATURE = `query QUERY_JOB_FOR_SIGNATURE($jobid: uuid!) { - jobs_by_pk(id: $jobid) { - id - ownr_fn - ownr_ln - ownr_co_nm - ownr_ea - ownr_ph1 - } -} -` - -exports.INSERT_ESIG_AUDIT_TRAIL = `mutation INSERT_ESIG_AUDIT_TRAIL($obj: audit_trail_insert_input!) { - insert_audit_trail_one(object: $obj) { - id - } -} -` - -exports.QUERY_META_FOR_ESIG_COMPLETION = `query QUERY_META_FOR_ESIG_COMPLETION($jobid: uuid!) { - jobs_by_pk(id: $jobid) { - id - ro_number - bodyshop { - id - uselocalmediaserver - localmediatoken - localmediaserverhttp - localmediaservernetwork - } - } -}` - -exports.INSERT_ESIGNATURE_DOCUMENT = `mutation INSERT_ESIGNATURE_DOCUMENT($docInput: documents_insert_input!) { - insert_documents_one(object: $docInput) { - id - name - key - } -} -` \ No newline at end of file diff --git a/server/media/imgproxy-media.js b/server/media/imgproxy-media.js index 34d609571..b6f480e5b 100644 --- a/server/media/imgproxy-media.js +++ b/server/media/imgproxy-media.js @@ -94,47 +94,6 @@ const generateSignedUploadUrls = async (req, res) => { } }; -/** - * Upload a file buffer directly to S3. - * Accepts either `req.file.buffer` (e.g. from multer) or `req.body.buffer` (base64 string). - */ -const uploadFileBuffer = async ({ key, contentType, buffer }) => { - try { - - - if (!key) { - throw new Error("key is required"); - } - if (!buffer) { - throw new Error("buffer is required"); - } - - const isPdf = key.toLowerCase().endsWith(".pdf"); - const client = new S3Client({ region: InstanceRegion() }); - - const putParams = { - Bucket: imgproxyDestinationBucket, - Key: key, - Body: buffer, - StorageClass: "INTELLIGENT_TIERING" - }; - - if (contentType) { - putParams.ContentType = contentType; - } else if (isPdf) { - putParams.ContentType = "application/pdf"; - } - - await client.send(new PutObjectCommand(putParams)); - - - return ({ success: true, key, bucket: imgproxyDestinationBucket }); - } catch (error) { - - return { success: false, message: error.message, stack: error.stack }; - } -}; - /** * Get Thumbnail URLS * @param req @@ -541,7 +500,6 @@ const keyStandardize = (doc) => { module.exports = { generateSignedUploadUrls, - uploadFileBuffer, getThumbnailUrls, getOriginalImageByDocumentId, downloadFiles, diff --git a/server/routes/esignRoutes.js b/server/routes/esignRoutes.js deleted file mode 100644 index 059f49666..000000000 --- a/server/routes/esignRoutes.js +++ /dev/null @@ -1,17 +0,0 @@ -const express = require("express"); -const router = express.Router(); - -const validateFirebaseIdTokenMiddleware = require("../middleware/validateFirebaseIdTokenMiddleware"); -const withUserGraphQLClientMiddleware = require("../middleware/withUserGraphQLClientMiddleware"); -const { newEsignDocument, distributeDocument, deleteDocument } = require("../esign/esign-new"); -const { esignWebhook } = require("../esign/webhook"); - -//router.use(validateFirebaseIdTokenMiddleware); - -router.post("/new", validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, newEsignDocument); -router.post("/distribute", validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, distributeDocument); -router.post("/delete", validateFirebaseIdTokenMiddleware, withUserGraphQLClientMiddleware, deleteDocument); -router.post("/webhook", esignWebhook); - - -module.exports = router; diff --git a/server/utils/utils.js b/server/utils/utils.js index bd78094b3..7b7e61fc2 100644 --- a/server/utils/utils.js +++ b/server/utils/utils.js @@ -2,9 +2,6 @@ exports.servertime = (req, res) => { res.status(200).send(new Date()); }; -exports.jsrAuthString =() => { - return "Basic " + Buffer.from(`${process.env.JSR_USER}:${process.env.JSR_PASSWORD}`).toString("base64") -} exports.jsrAuth = async (req, res) => { - res.send(exports.jsrAuthString()); + res.send("Basic " + Buffer.from(`${process.env.JSR_USER}:${process.env.JSR_PASSWORD}`).toString("base64")); };