From b65b3fa6d272faa2e38a37cb675a5901dc5c88a4 Mon Sep 17 00:00:00 2001 From: Carlos Valente Date: Sun, 2 Nov 2025 11:49:06 +0100 Subject: [PATCH] refactor: get worksheet names from excel upload --- apps/client/src/common/api/excel.ts | 12 +----- .../sources-panel/SourcesPanel.tsx | 4 +- .../server/src/api-data/excel/excel.router.ts | 39 +++++++++---------- .../src/api-data/excel/excel.service.ts | 7 +--- 4 files changed, 22 insertions(+), 40 deletions(-) diff --git a/apps/client/src/common/api/excel.ts b/apps/client/src/common/api/excel.ts index bc51c1bb3..67f6c896c 100644 --- a/apps/client/src/common/api/excel.ts +++ b/apps/client/src/common/api/excel.ts @@ -11,22 +11,14 @@ const excelPath = `${apiEntryUrl}/excel`; * upload Excel file to server * @return string - file ID op the uploaded file */ -export async function upload(file: File) { +export async function upload(file: File): Promise { const formData = new FormData(); formData.append('excel', file); - await axios.post(`${excelPath}/upload`, formData, { + const response = await axios.post(`${excelPath}/upload`, formData, { headers: { 'Content-Type': 'multipart/form-data', }, }); -} - -/** - * Get Worksheet names - * @return string[] - array of available worksheets - */ -export async function getWorksheetNames(): Promise { - const response: AxiosResponse = await axios.get(`${excelPath}/worksheets`); return response.data; } diff --git a/apps/client/src/features/app-settings/panel/manage-panel/sources-panel/SourcesPanel.tsx b/apps/client/src/features/app-settings/panel/manage-panel/sources-panel/SourcesPanel.tsx index 167a5cb3e..329891b11 100644 --- a/apps/client/src/features/app-settings/panel/manage-panel/sources-panel/SourcesPanel.tsx +++ b/apps/client/src/features/app-settings/panel/manage-panel/sources-panel/SourcesPanel.tsx @@ -3,7 +3,6 @@ import { IoCloudOutline, IoDownloadOutline } from 'react-icons/io5'; import { getErrorMessage, ImportMap } from 'ontime-utils'; import { - getWorksheetNames as getWorksheetNamesExcel, importRundownPreview as importRundownPreviewExcel, upload as uploadExcel, } from '../../../../../common/api/excel'; @@ -54,8 +53,7 @@ export default function SourcesPanel() { try { setHasFile('loading'); validateExcelImport(fileToUpload); - await uploadExcel(fileToUpload); - const names = await getWorksheetNamesExcel(); + const names = await uploadExcel(fileToUpload); setWorksheets(names); setImportFlow('excel'); setHasFile('done'); diff --git a/apps/server/src/api-data/excel/excel.router.ts b/apps/server/src/api-data/excel/excel.router.ts index aef73c855..1ca89eb09 100644 --- a/apps/server/src/api-data/excel/excel.router.ts +++ b/apps/server/src/api-data/excel/excel.router.ts @@ -2,35 +2,32 @@ import express from 'express'; import type { Request, Response } from 'express'; import { CustomFields, ErrorResponse, Rundown } from 'ontime-types'; +import { getDataProvider } from '../../classes/data-provider/DataProvider.js'; + import { getProjectCustomFields } from '../rundown/rundown.dao.js'; import { uploadExcel } from './excel.middleware.js'; import { validateFileExists, validateImportMapOptions, validateRundownExport } from './excel.validation.js'; -import { generateExcelFile, generateRundownPreview, listWorksheets, readExcelFile } from './excel.service.js'; +import { generateExcelFile, generateRundownPreview, readExcelFile } from './excel.service.js'; import { EXCEL_MIME } from './excel.constants.js'; -import { getDataProvider } from '../../classes/data-provider/DataProvider.js'; export const router = express.Router(); -router.post('/upload', uploadExcel, validateFileExists, async (req: Request, res: Response) => { - try { - // file has been validated by middleware - const filePath = (req.file as Express.Multer.File).path; - await readExcelFile(filePath); - res.status(201).send(); - } catch (error) { - res.status(500).send({ message: String(error) }); - } -}); - -router.get('/worksheets', (_req: Request, res: Response) => { - try { - const names = listWorksheets(); - res.status(200).send(names); - } catch (error) { - res.status(500).send({ message: String(error) }); - } -}); +router.post( + '/upload', + uploadExcel, + validateFileExists, + async (req: Request, res: Response) => { + try { + // file has been validated by middleware + const filePath = (req.file as Express.Multer.File).path; + const worksheetNames = await readExcelFile(filePath); + res.status(200).send(worksheetNames); + } catch (error) { + res.status(500).send({ message: String(error) }); + } + }, +); router.post( '/preview', diff --git a/apps/server/src/api-data/excel/excel.service.ts b/apps/server/src/api-data/excel/excel.service.ts index 49d4684d6..73d4a6575 100644 --- a/apps/server/src/api-data/excel/excel.service.ts +++ b/apps/server/src/api-data/excel/excel.service.ts @@ -27,7 +27,7 @@ let excelData: WorkBook = xlsx.utils.book_new(); * Receives and parses an excel file * The file is deleted after being read */ -export async function readExcelFile(filePath: string) { +export async function readExcelFile(filePath: string): Promise { if (!existsSync(filePath)) { throw new Error('Upload of excel file failed'); } @@ -39,12 +39,7 @@ export async function readExcelFile(filePath: string) { excelData = xlsx.readFile(filePath, { cellDates: true, cellFormula: false }); await deleteFile(filePath); -} -/** - * List all worksheets in the current spreadsheet file - */ -export function listWorksheets(): string[] { return excelData.SheetNames; }