Add graphql request to back end

This commit is contained in:
Patrick Fic
2025-03-20 14:54:13 -07:00
parent 4310b3779a
commit 6345b5a9a8
8 changed files with 90 additions and 6 deletions

View File

@@ -1 +1,2 @@
VITE_FIREBASE_CONFIG={"apiKey":"AIzaSyDPLT8GiDHDR1R4nI66Qi0BY1aYviDPioc","authDomain":"imex-dev.firebaseapp.com","databaseURL":"https://imex-dev.firebaseio.com","projectId":"imex-dev","storageBucket":"imex-dev.appspot.com","messagingSenderId":"759548147434","appId":"1:759548147434:web:e8239868a48ceb36700993","measurementId":"G-K5XRBVVB4S"}
VITE_GRAPHQL_ENDPOINT=https://db.dev.imex.online/v1/graphql

6
package-lock.json generated
View File

@@ -17,7 +17,7 @@
"electron-log": "^5.3.2",
"electron-store": "^8.2.0",
"electron-updater": "^6.3.9",
"graphql-request": "^7.1.2",
"graphql": "^16.10.0",
"i18next": "^24.2.2",
"lodash": "^4.17.21",
"playwright": "^1.51.0",
@@ -47,6 +47,7 @@
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.19",
"firebase": "^11.4.0",
"graphql-request": "^7.1.2",
"prettier": "^3.5.3",
"react": "^19.0.0",
"react-dom": "^19.0.0",
@@ -2224,6 +2225,7 @@
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/@graphql-typed-document-node/core/-/core-3.2.0.tgz",
"integrity": "sha512-mB9oAsNCm9aM3/SOv4YtBMqZbYj10R7dkq8byBqxGY/ncFwhf2oQzMV+LCRlWoDSEBJ3COiR1yeDvMtsoOsuFQ==",
"dev": true,
"license": "MIT",
"peerDependencies": {
"graphql": "^0.8.0 || ^0.9.0 || ^0.10.0 || ^0.11.0 || ^0.12.0 || ^0.13.0 || ^14.0.0 || ^15.0.0 || ^16.0.0 || ^17.0.0"
@@ -7364,7 +7366,6 @@
"resolved": "https://registry.npmjs.org/graphql/-/graphql-16.10.0.tgz",
"integrity": "sha512-AjqGKbDGUFRKIRCP9tCKiIGHyriz2oHEbPIbEtcSLSs4YjReZOIPQQWek4+6hjw62H9QShXHyaGivGiYVLeYFQ==",
"license": "MIT",
"peer": true,
"engines": {
"node": "^12.22.0 || ^14.16.0 || ^16.0.0 || >=17.0.0"
}
@@ -7373,6 +7374,7 @@
"version": "7.1.2",
"resolved": "https://registry.npmjs.org/graphql-request/-/graphql-request-7.1.2.tgz",
"integrity": "sha512-+XE3iuC55C2di5ZUrB4pjgwe+nIQBuXVIK9J98wrVwojzDW3GMdSBZfxUk8l4j9TieIpjpggclxhNEU9ebGF8w==",
"dev": true,
"license": "MIT",
"dependencies": {
"@graphql-typed-document-node/core": "^3.2.0"

View File

@@ -29,7 +29,7 @@
"electron-log": "^5.3.2",
"electron-store": "^8.2.0",
"electron-updater": "^6.3.9",
"graphql-request": "^7.1.2",
"graphql": "^16.10.0",
"i18next": "^24.2.2",
"lodash": "^4.17.21",
"playwright": "^1.51.0",
@@ -59,6 +59,7 @@
"eslint-plugin-react-hooks": "^5.2.0",
"eslint-plugin-react-refresh": "^0.4.19",
"firebase": "^11.4.0",
"graphql-request": "^7.1.2",
"prettier": "^3.5.3",
"react": "^19.0.0",
"react-dom": "^19.0.0",

View File

@@ -0,0 +1,42 @@
import { BrowserWindow, ipcMain } from "electron";
import log from "electron-log/main";
import { GraphQLClient, RequestMiddleware } from "graphql-request";
import errorTypeCheck from "../../util/errorTypeCheck.js";
import ipcTypes from "../../util/ipcTypes.json";
const requestMiddleware: RequestMiddleware = async (request) => {
const token = await getTokenFromRenderer();
return {
...request,
headers: { ...request.headers, Authorization: `Bearer ${token}` },
};
};
const client: GraphQLClient = new GraphQLClient(
import.meta.env.VITE_GRAPHQL_ENDPOINT,
{
requestMiddleware,
}
);
export async function getTokenFromRenderer(): Promise<string> {
return new Promise((resolve) => {
try {
const mainWindow = BrowserWindow.getAllWindows()[0]; //TODO: Filter to only main window once a proper key has been set.
//TODO: Verify that this will work if the app is minimized/closed.
mainWindow.webContents.send(ipcTypes.toRenderer.user.getToken);
} catch (error) {
log.error(
"Unable to send request to renderer process for token",
errorTypeCheck(error)
);
}
// Set up one-time listener for the response
ipcMain.once(ipcTypes.toMain.user.getTokenResponse, (_, token: string) => {
resolve(token);
});
});
}
export default client;

View File

@@ -4,6 +4,7 @@ import log from "electron-log/main";
import path, { join } from "path";
import icon from "../../resources/icon.png?asset";
import ErrorTypeCheck from "../util/errorTypeCheck";
import client from "./graphql/graphql-client";
import store from "./store/store";
log.initialize();
@@ -32,7 +33,7 @@ function createWindow(): void {
},
});
const template = [
const template: Electron.MenuItemConstructorOptions[] = [
// { role: 'appMenu' }
...(isMac
? [
@@ -117,13 +118,14 @@ function createWindow(): void {
submenu: [
{
label: "Learn More",
click: async () => {
click: async (): Promise<void> => {
const { shell } = require("electron");
await shell.openExternal("https://electronjs.org");
},
},
],
},
...(import.meta.env.DEV
? [
{
@@ -148,6 +150,26 @@ function createWindow(): void {
shell.openPath(path.dirname(store.path));
},
},
{
type: "separator",
},
{
label: "Temp Test Action - Get Token from Renderer",
click: (): void => {
client
.request(
`
query jobs{
jobs
{
id}}
`
)
.then((data) => {
log.info("Data from graffle", data);
});
},
},
],
},
]

View File

@@ -2,6 +2,7 @@ import React from "react";
import ReactDOM from "react-dom/client";
import App from "./App";
import "./util/i18n";
import "./util/ipcRendererHandler";
ReactDOM.createRoot(document.getElementById("root") as HTMLElement).render(
<React.StrictMode>

View File

@@ -1,5 +1,6 @@
//Set up all of the IPC handlers.
import ipcTypes from "../../../util/ipcTypes.json";
import { auth } from "./firebase";
const ipcRenderer = window.electron.ipcRenderer;
@@ -10,3 +11,11 @@ ipcRenderer.on(
console.log(arg);
}
);
ipcRenderer.on(
ipcTypes.toRenderer.user.getToken,
async (event: Electron.IpcRendererEvent, arg) => {
const token = await auth.currentUser?.getIdToken();
ipcRenderer.send(ipcTypes.toMain.user.getTokenResponse, token);
}
);

View File

@@ -15,9 +15,15 @@
"add": "toMain_settings_filepaths_add",
"remove": "toMain_settings_filepaths_remove"
}
},
"user": {
"getTokenResponse": "toMain_user_getTokenResponse"
}
},
"toRenderer": {
"test": "toRenderer_test"
"test": "toRenderer_test",
"user": {
"getToken": "toRenderer_user_getToken"
}
}
}