From 68d96ab82d0f4debd8171541333d9216f651ece2 Mon Sep 17 00:00:00 2001 From: JTran-IDM Date: Mon, 11 Aug 2025 18:57:07 -0700 Subject: [PATCH 01/10] refactor --- .../import/analysis/ImportAnalysisTable.vue | 5 ++-- .../import/file-upload/ImportFileUpload.vue | 5 ---- .../features/import/file-upload/PdfUpload.vue | 12 ++++---- .../components/features/import/types.ts | 7 ++--- extralit-frontend/v1/di/di.ts | 6 ---- .../domain/entities/import/ImportAnalysis.ts | 18 ------------ ...> FileMatchingService.integration.spec.js} | 2 +- ...ce.spec.js => FileMatchingService.spec.js} | 2 +- ...chingService.ts => FileMatchingService.ts} | 8 ++--- .../domain/services/IFileMatchingService.ts | 17 +++++++++++ .../v1/domain/services/IPdfMatchingService.ts | 17 ----------- .../usecases/get-import-analysis-use-case.ts | 29 ------------------- 12 files changed, 32 insertions(+), 96 deletions(-) rename extralit-frontend/v1/domain/services/{PdfMatchingService.integration.spec.js => FileMatchingService.integration.spec.js} (99%) rename extralit-frontend/v1/domain/services/{PdfMatchingService.spec.js => FileMatchingService.spec.js} (99%) rename extralit-frontend/v1/domain/services/{PdfMatchingService.ts => FileMatchingService.ts} (98%) create mode 100644 extralit-frontend/v1/domain/services/IFileMatchingService.ts delete mode 100644 extralit-frontend/v1/domain/services/IPdfMatchingService.ts diff --git a/extralit-frontend/components/features/import/analysis/ImportAnalysisTable.vue b/extralit-frontend/components/features/import/analysis/ImportAnalysisTable.vue index b321a468a..ce60040ee 100644 --- a/extralit-frontend/components/features/import/analysis/ImportAnalysisTable.vue +++ b/extralit-frontend/components/features/import/analysis/ImportAnalysisTable.vue @@ -62,7 +62,6 @@ import "assets/icons/chevron-down"; import type { ImportAnalysisResponse, ImportStatus, - DataframeData, DocumentImportAnalysis, } from '~/v1/domain/entities/import/ImportAnalysis'; import { @@ -72,13 +71,14 @@ import { } from '../types'; import { useImportAnalysisTableViewModel } from './useImportAnalysisTableViewModel'; import { Workspace } from "~/v1/domain/entities/workspace/Workspace"; +import { TableData } from "~/v1/domain/entities/table/TableData"; export default { name: "ImportAnalysisTable", props: { dataframeData: { - type: Object as () => DataframeData | null, + type: Object as () => TableData | null, default: null, }, pdfData: { @@ -152,7 +152,6 @@ export default { canToggle: this.canToggleStatus(originalStatus) && !this.isAnalyzing, }; - // Add all other dataframe fields dynamically Object.keys(row).forEach(key => { if (!['reference', 'title', 'authors', 'author', 'year', 'filePaths'].includes(key)) { rowData[key] = row[key]; diff --git a/extralit-frontend/components/features/import/file-upload/ImportFileUpload.vue b/extralit-frontend/components/features/import/file-upload/ImportFileUpload.vue index d4195e074..c7f6fa0d5 100644 --- a/extralit-frontend/components/features/import/file-upload/ImportFileUpload.vue +++ b/extralit-frontend/components/features/import/file-upload/ImportFileUpload.vue @@ -102,11 +102,6 @@ export default { }; }, - mounted() { - // Initialize with existing data if provided - // Don't call initializeWithExistingData here since watchers with immediate: true will handle it - }, - computed: { isValid(): boolean { return ( diff --git a/extralit-frontend/components/features/import/file-upload/PdfUpload.vue b/extralit-frontend/components/features/import/file-upload/PdfUpload.vue index 2681cbf08..ef0febf48 100644 --- a/extralit-frontend/components/features/import/file-upload/PdfUpload.vue +++ b/extralit-frontend/components/features/import/file-upload/PdfUpload.vue @@ -60,8 +60,7 @@ diff --git a/extralit-frontend/components/features/import/types.ts b/extralit-frontend/components/features/import/types.ts index 713a3857f..1c253bb07 100644 --- a/extralit-frontend/components/features/import/types.ts +++ b/extralit-frontend/components/features/import/types.ts @@ -6,15 +6,12 @@ import type { ImportStatus, DocumentMetadata, - DataframeData, } from "~/v1/domain/entities/import/ImportAnalysis"; +import { TableData } from "~/v1/domain/entities/table/TableData"; // Re-export commonly used backend types for convenience export type { FieldType, - DataframeField, - DataframeSchema, - DataframeData, ImportStatus, DocumentCreate, FileInfo, @@ -70,7 +67,7 @@ export interface ImportConfirmationData { confirmedDocuments: Record; totalConfirmed: number; documentActions: Record; - filteredDataframeData: DataframeData | null; + filteredDataframeData: TableData | null; } // Table row data for ImportAnalysisTable diff --git a/extralit-frontend/v1/di/di.ts b/extralit-frontend/v1/di/di.ts index b212c0d3d..0f70a2544 100644 --- a/extralit-frontend/v1/di/di.ts +++ b/extralit-frontend/v1/di/di.ts @@ -79,8 +79,6 @@ import { CreateDatasetUseCase } from "@/v1/domain/usecases/create-dataset-use-ca import { GetFirstRecordFromHub } from "@/v1/domain/usecases/get-first-record-from-hub"; import { ExportDatasetToHubUseCase } from "@/v1/domain/usecases/export-dataset-to-hub-use-case"; import { AuthLoginUseCase } from "@/v1/domain/usecases/auth-login-use-case"; -import { FileService } from "@/v1/domain/services/FileService"; -import { PdfMatchingService } from "@/v1/domain/services/PdfMatchingService"; export const loadDependencyContainer = (context: Context) => { const useAxios = useAxiosExtension(context); @@ -210,10 +208,6 @@ export const loadDependencyContainer = (context: Context) => { register(GetFirstRecordFromHub).withDependency(HubRepository).build(), register(ExportDatasetToHubUseCase).withDependencies(DatasetRepository, useLocalStorage).build(), - - // File processing services - register(FileService).build(), - register(PdfMatchingService).build(), ]; Container.register(dependencies); diff --git a/extralit-frontend/v1/domain/entities/import/ImportAnalysis.ts b/extralit-frontend/v1/domain/entities/import/ImportAnalysis.ts index 04288a349..dd6356940 100644 --- a/extralit-frontend/v1/domain/entities/import/ImportAnalysis.ts +++ b/extralit-frontend/v1/domain/entities/import/ImportAnalysis.ts @@ -6,24 +6,6 @@ // Basic field types supported in dataframes export type FieldType = "string" | "integer" | "float" | "boolean"; -// Dataframe field definition -export interface DataframeField { - name: string; - type: FieldType; -} - -// Dataframe schema definition -export interface DataframeSchema { - fields: DataframeField[]; - primaryKey: string[]; -} - -// Tabular dataframe representation -export interface DataframeData { - schema: DataframeSchema; - data: Record[]; -} - // Import analysis status for individual documents (maps to ImportStatus enum in backend) export type ImportStatus = "add" | "update" | "skip" | "ignore" | "failed"; diff --git a/extralit-frontend/v1/domain/services/PdfMatchingService.integration.spec.js b/extralit-frontend/v1/domain/services/FileMatchingService.integration.spec.js similarity index 99% rename from extralit-frontend/v1/domain/services/PdfMatchingService.integration.spec.js rename to extralit-frontend/v1/domain/services/FileMatchingService.integration.spec.js index 45cfda595..8462c7f49 100644 --- a/extralit-frontend/v1/domain/services/PdfMatchingService.integration.spec.js +++ b/extralit-frontend/v1/domain/services/FileMatchingService.integration.spec.js @@ -1,4 +1,4 @@ -import { PdfMatchingService } from "./PdfMatchingService"; +import { PdfMatchingService } from "./FileMatchingService"; describe("PdfMatchingService Integration", () => { let service; diff --git a/extralit-frontend/v1/domain/services/PdfMatchingService.spec.js b/extralit-frontend/v1/domain/services/FileMatchingService.spec.js similarity index 99% rename from extralit-frontend/v1/domain/services/PdfMatchingService.spec.js rename to extralit-frontend/v1/domain/services/FileMatchingService.spec.js index d0cca4036..505a764d7 100644 --- a/extralit-frontend/v1/domain/services/PdfMatchingService.spec.js +++ b/extralit-frontend/v1/domain/services/FileMatchingService.spec.js @@ -1,4 +1,4 @@ -import { PdfMatchingService } from "./PdfMatchingService"; +import { PdfMatchingService } from "./FileMatchingService"; describe("PdfMatchingService", () => { let service; diff --git a/extralit-frontend/v1/domain/services/PdfMatchingService.ts b/extralit-frontend/v1/domain/services/FileMatchingService.ts similarity index 98% rename from extralit-frontend/v1/domain/services/PdfMatchingService.ts rename to extralit-frontend/v1/domain/services/FileMatchingService.ts index 991b60cd4..9caa730b0 100644 --- a/extralit-frontend/v1/domain/services/PdfMatchingService.ts +++ b/extralit-frontend/v1/domain/services/FileMatchingService.ts @@ -1,4 +1,4 @@ -import type { IPdfMatchingService, PdfMatchResult, PdfMatchingResult } from "./IPdfMatchingService"; +import type { IFileMatchingService, FileMatchResult, FileMatchingResult } from "./IFileMatchingService"; import type { ParsedEntry } from "./IFileService"; interface MatchCandidate { @@ -13,8 +13,8 @@ interface PrefixMatchResult { type: string; } -export class PdfMatchingService implements IPdfMatchingService { - matchFiles(files: File[], entries: ParsedEntry[]): PdfMatchingResult { +export class PdfMatchingService implements IFileMatchingService { + matchFiles(files: File[], entries: ParsedEntry[]): FileMatchingResult { if (!entries || entries.length === 0 || files.length === 0) { return { matchedFiles: [], @@ -22,7 +22,7 @@ export class PdfMatchingService implements IPdfMatchingService { }; } - const matchedFiles: PdfMatchResult[] = []; + const matchedFiles: FileMatchResult[] = []; const unmatchedFiles: File[] = []; // Track which references have been matched to support multiple files per reference diff --git a/extralit-frontend/v1/domain/services/IFileMatchingService.ts b/extralit-frontend/v1/domain/services/IFileMatchingService.ts new file mode 100644 index 000000000..2bd8ec595 --- /dev/null +++ b/extralit-frontend/v1/domain/services/IFileMatchingService.ts @@ -0,0 +1,17 @@ +import type { ParsedEntry } from "./IFileService"; + +export interface FileMatchResult { + file: File; + bibEntry: ParsedEntry; + matchType: string; + confidence: number; +} + +export interface FileMatchingResult { + matchedFiles: FileMatchResult[]; + unmatchedFiles: File[]; +} + +export interface IFileMatchingService { + matchFiles(files: File[], entries: ParsedEntry[]): FileMatchingResult; +} diff --git a/extralit-frontend/v1/domain/services/IPdfMatchingService.ts b/extralit-frontend/v1/domain/services/IPdfMatchingService.ts deleted file mode 100644 index bdfb4c3e2..000000000 --- a/extralit-frontend/v1/domain/services/IPdfMatchingService.ts +++ /dev/null @@ -1,17 +0,0 @@ -import type { ParsedEntry } from "./IFileService"; - -export interface PdfMatchResult { - file: File; - bibEntry: ParsedEntry; - matchType: string; - confidence: number; -} - -export interface PdfMatchingResult { - matchedFiles: PdfMatchResult[]; - unmatchedFiles: File[]; -} - -export interface IPdfMatchingService { - matchFiles(files: File[], entries: ParsedEntry[]): PdfMatchingResult; -} diff --git a/extralit-frontend/v1/domain/usecases/get-import-analysis-use-case.ts b/extralit-frontend/v1/domain/usecases/get-import-analysis-use-case.ts index de6b0a7fa..8cadb5ec2 100644 --- a/extralit-frontend/v1/domain/usecases/get-import-analysis-use-case.ts +++ b/extralit-frontend/v1/domain/usecases/get-import-analysis-use-case.ts @@ -121,33 +121,4 @@ export class GetImportAnalysisUseCase { documents, }; } - - private extractMetadata(row: Record): Record | undefined { - // Extract additional metadata fields not covered by DocumentCreate - const excludedFields = [ - "reference", - "title", - "authors", - "year", - "journal", - "volume", - "pages", - "doi", - "url", - "abstract", - "keywords", - "pmid", - "filePaths", - "type", - ]; - - const metadata: Record = {}; - Object.keys(row).forEach((key) => { - if (!excludedFields.includes(key) && row[key] !== undefined && row[key] !== null && row[key] !== "") { - metadata[key] = row[key]; - } - }); - - return Object.keys(metadata).length > 0 ? metadata : undefined; - } } From 3fc04a16240d487447213dace7fd2894907750ba Mon Sep 17 00:00:00 2001 From: JTran-IDM Date: Mon, 11 Aug 2025 19:05:26 -0700 Subject: [PATCH 02/10] refactoring DataframeSchema --- .../components/features/import/analysis/ImportAnalysisTable.vue | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/extralit-frontend/components/features/import/analysis/ImportAnalysisTable.vue b/extralit-frontend/components/features/import/analysis/ImportAnalysisTable.vue index ce60040ee..ccdd4a825 100644 --- a/extralit-frontend/components/features/import/analysis/ImportAnalysisTable.vue +++ b/extralit-frontend/components/features/import/analysis/ImportAnalysisTable.vue @@ -175,7 +175,7 @@ export default { return this.allTableData.filter(row => row.filePaths && row.filePaths.length > 0).length; }, - filteredDataframeData(): DataframeData | null { + filteredDataframeData(): TableData | null { if (!this.dataframeData) { return null; } From 82f895d40cec91e5dd6b53d9604623b539fd5d99 Mon Sep 17 00:00:00 2001 From: JTran-IDM Date: Mon, 11 Aug 2025 19:05:39 -0700 Subject: [PATCH 03/10] DataframeSchema --- .../v1/domain/entities/import/ImportAnalysis.ts | 4 +++- .../v1/domain/entities/import/ImportHistoryDetails.ts | 6 +++--- extralit-frontend/v1/domain/services/FileService.ts | 5 +++-- extralit-frontend/v1/domain/services/IFileService.ts | 4 ++-- .../v1/domain/usecases/get-import-analysis-use-case.ts | 6 +++--- .../domain/usecases/get-import-history-details-use-case.ts | 6 +++--- 6 files changed, 17 insertions(+), 14 deletions(-) diff --git a/extralit-frontend/v1/domain/entities/import/ImportAnalysis.ts b/extralit-frontend/v1/domain/entities/import/ImportAnalysis.ts index dd6356940..0b036c18f 100644 --- a/extralit-frontend/v1/domain/entities/import/ImportAnalysis.ts +++ b/extralit-frontend/v1/domain/entities/import/ImportAnalysis.ts @@ -3,6 +3,8 @@ * Maps to extralit-server/src/extralit_server/api/schemas/v1/imports.py */ +import { TableData } from "../table/TableData"; + // Basic field types supported in dataframes export type FieldType = "string" | "integer" | "float" | "boolean"; @@ -78,7 +80,7 @@ export interface ImportHistoryResponse { user_id: string; filename: string; created_at: string; - data?: DataframeData; // Tabular dataframe data (only in detailed view) + data?: TableData; // Tabular dataframe data (only in detailed view) metadata?: { documents: Record; // Reference key to document info mapping summary: ImportSummary; // Import analysis summary diff --git a/extralit-frontend/v1/domain/entities/import/ImportHistoryDetails.ts b/extralit-frontend/v1/domain/entities/import/ImportHistoryDetails.ts index 53e9585c6..1215d4a12 100644 --- a/extralit-frontend/v1/domain/entities/import/ImportHistoryDetails.ts +++ b/extralit-frontend/v1/domain/entities/import/ImportHistoryDetails.ts @@ -3,9 +3,9 @@ * Provides TypeScript interfaces for ImportHistory data structure */ +import { TableData } from "../table/TableData"; import type { ImportHistoryResponse, - DataframeData, ImportStatus, DocumentImportAnalysis, ImportSummary, @@ -38,7 +38,7 @@ export interface ImportHistorySummaryStats { * Enhanced ImportHistory details with computed properties */ export class ImportHistoryDetails { - constructor(private readonly data: ImportHistoryResponse & { data: DataframeData }) {} + constructor(private readonly data: ImportHistoryResponse & { data: TableData }) {} get id(): string { return this.data.id; @@ -161,7 +161,7 @@ export class ImportHistoryDetails { /** * Get raw data for export or further processing */ - getRawData(): ImportHistoryResponse & { data: DataframeData } { + getRawData(): ImportHistoryResponse & { data: TableData } { return this.data; } diff --git a/extralit-frontend/v1/domain/services/FileService.ts b/extralit-frontend/v1/domain/services/FileService.ts index 564193845..ffa13ca82 100644 --- a/extralit-frontend/v1/domain/services/FileService.ts +++ b/extralit-frontend/v1/domain/services/FileService.ts @@ -1,7 +1,8 @@ import bibtexParse from "@orcid/bibtex-parse-js"; import Papa from "papaparse"; +import { TableData } from "../entities/table/TableData"; import type { IFileService, ParsedEntry, ParseResult, CSVConfig, CSVPreviewData } from "./IFileService"; -import type { DataframeData, FieldType } from "~/v1/domain/entities/import/ImportAnalysis"; +import type { FieldType } from "~/v1/domain/entities/import/ImportAnalysis"; export class BibTeXParser { parse(content: string): ParsedEntry[] { @@ -242,7 +243,7 @@ export class CSVParser { } export class DataframeBuilder { - static build(entries: ParsedEntry[]): DataframeData { + static build(entries: ParsedEntry[]): TableData { if (entries.length === 0) { return { schema: { fields: [], primaryKey: ["reference"] }, diff --git a/extralit-frontend/v1/domain/services/IFileService.ts b/extralit-frontend/v1/domain/services/IFileService.ts index 3116d22c6..62c7144f6 100644 --- a/extralit-frontend/v1/domain/services/IFileService.ts +++ b/extralit-frontend/v1/domain/services/IFileService.ts @@ -1,4 +1,4 @@ -import type { DataframeData } from "~/v1/domain/entities/import/ImportAnalysis"; +import { TableData } from "../entities/table/TableData"; export interface ParsedEntry { reference: string; @@ -9,7 +9,7 @@ export interface ParsedEntry { export interface ParseResult { entries: ParsedEntry[]; - dataframeData: DataframeData; + dataframeData: TableData; } export interface CSVConfig { diff --git a/extralit-frontend/v1/domain/usecases/get-import-analysis-use-case.ts b/extralit-frontend/v1/domain/usecases/get-import-analysis-use-case.ts index 8cadb5ec2..f0bfa7a13 100644 --- a/extralit-frontend/v1/domain/usecases/get-import-analysis-use-case.ts +++ b/extralit-frontend/v1/domain/usecases/get-import-analysis-use-case.ts @@ -5,8 +5,8 @@ import { ImportAnalysisResponse, DocumentMetadata, FileInfo, - DataframeData, } from "~/v1/domain/entities/import/ImportAnalysis"; +import { TableData } from "@/v1/domain/entities/table/TableData"; const IMPORT_ANALYSIS_API_ERRORS = { ERROR_FETCHING_IMPORT_ANALYSIS: "ERROR_FETCHING_IMPORT_ANALYSIS", @@ -17,7 +17,7 @@ export class GetImportAnalysisUseCase { async analyzeImport( workspaceId: string, - dataframeData: DataframeData, + dataframeData: TableData, matchedFiles: any[] ): Promise { try { @@ -46,7 +46,7 @@ export class GetImportAnalysisUseCase { private createAnalysisRequest( workspaceId: string, - dataframeData: DataframeData, + dataframeData: TableData, matchedFiles: any[] ): ImportAnalysisRequest { const documents: Record = {}; diff --git a/extralit-frontend/v1/domain/usecases/get-import-history-details-use-case.ts b/extralit-frontend/v1/domain/usecases/get-import-history-details-use-case.ts index 4ac2a3748..b3cda08e0 100644 --- a/extralit-frontend/v1/domain/usecases/get-import-history-details-use-case.ts +++ b/extralit-frontend/v1/domain/usecases/get-import-history-details-use-case.ts @@ -3,9 +3,9 @@ */ import { type NuxtAxiosInstance } from "@nuxtjs/axios"; +import { TableData } from "../entities/table/TableData"; import type { ImportHistoryResponse, - DataframeData, DocumentImportAnalysis, ImportStatus, ImportSummary, @@ -22,7 +22,7 @@ export interface ImportHistoryDetailItem { } export interface ImportHistoryDetailsResponse extends ImportHistoryResponse { - data: DataframeData; // Always present in detailed view + data: TableData; metadata: { documents: Record; // Reference key to document info mapping summary: ImportSummary; // Import analysis summary @@ -73,7 +73,7 @@ export class GetImportHistoryDetailsUseCase { /** * Calculate summary from data and metadata */ - calculateSummary(data: DataframeData, metadata?: ImportHistoryResponse["metadata"]): ImportSummary { + calculateSummary(data: TableData, metadata?: ImportHistoryResponse["metadata"]): ImportSummary { // If metadata already contains a summary, use it if (metadata?.summary) { return metadata.summary; From d12eecf05a0f8ccf68647fd3822bacd4d60e8ca4 Mon Sep 17 00:00:00 2001 From: JonnyTran Date: Mon, 11 Aug 2025 19:14:29 -0700 Subject: [PATCH 04/10] fix refactors --- .../analysis/useImportAnalysisTableViewModel.ts | 5 +++-- .../features/import/file-upload/PdfUpload.vue | 10 ++++++---- extralit-frontend/v1/di/di.ts | 5 +++++ .../v1/domain/services/FileService.ts | 14 +++----------- 4 files changed, 17 insertions(+), 17 deletions(-) diff --git a/extralit-frontend/components/features/import/analysis/useImportAnalysisTableViewModel.ts b/extralit-frontend/components/features/import/analysis/useImportAnalysisTableViewModel.ts index b14dc356f..db4a20985 100644 --- a/extralit-frontend/components/features/import/analysis/useImportAnalysisTableViewModel.ts +++ b/extralit-frontend/components/features/import/analysis/useImportAnalysisTableViewModel.ts @@ -1,8 +1,9 @@ import { ref, watch } from "vue"; import { useResolve } from "ts-injecty"; import { GetImportAnalysisUseCase } from "~/v1/domain/usecases/get-import-analysis-use-case"; -import type { ImportAnalysisResponse, ImportStatus, DataframeData } from "~/v1/domain/entities/import/ImportAnalysis"; +import type { ImportAnalysisResponse, ImportStatus } from "~/v1/domain/entities/import/ImportAnalysis"; import { Workspace } from "~/v1/domain/entities/workspace/Workspace"; +import { TableData } from "~/v1/domain/entities/table/TableData"; export function useImportAnalysisTableViewModel(props: any) { const isAnalyzing = ref(false); @@ -23,7 +24,7 @@ export function useImportAnalysisTableViewModel(props: any) { lastAnalysisKey.value = ""; }; - const analyzeImport = async (workspace: Workspace, dataframeData: DataframeData, matchedFiles: any[]) => { + const analyzeImport = async (workspace: Workspace, dataframeData: TableData, matchedFiles: any[]) => { if (!workspace || !dataframeData || dataframeData.data.length === 0) { return; } diff --git a/extralit-frontend/components/features/import/file-upload/PdfUpload.vue b/extralit-frontend/components/features/import/file-upload/PdfUpload.vue index ef0febf48..e0f4231f9 100644 --- a/extralit-frontend/components/features/import/file-upload/PdfUpload.vue +++ b/extralit-frontend/components/features/import/file-upload/PdfUpload.vue @@ -60,6 +60,7 @@ diff --git a/extralit-frontend/v1/di/di.ts b/extralit-frontend/v1/di/di.ts index 0f70a2544..afc23b4a8 100644 --- a/extralit-frontend/v1/di/di.ts +++ b/extralit-frontend/v1/di/di.ts @@ -79,6 +79,8 @@ import { CreateDatasetUseCase } from "@/v1/domain/usecases/create-dataset-use-ca import { GetFirstRecordFromHub } from "@/v1/domain/usecases/get-first-record-from-hub"; import { ExportDatasetToHubUseCase } from "@/v1/domain/usecases/export-dataset-to-hub-use-case"; import { AuthLoginUseCase } from "@/v1/domain/usecases/auth-login-use-case"; +import { FileService } from "@/v1/domain/services/FileService"; +import { PdfMatchingService } from "@/v1/domain/services/FileMatchingService"; export const loadDependencyContainer = (context: Context) => { const useAxios = useAxiosExtension(context); @@ -208,6 +210,9 @@ export const loadDependencyContainer = (context: Context) => { register(GetFirstRecordFromHub).withDependency(HubRepository).build(), register(ExportDatasetToHubUseCase).withDependencies(DatasetRepository, useLocalStorage).build(), + + register(FileService).build(), + register(PdfMatchingService).build(), ]; Container.register(dependencies); diff --git a/extralit-frontend/v1/domain/services/FileService.ts b/extralit-frontend/v1/domain/services/FileService.ts index ffa13ca82..376acbbb7 100644 --- a/extralit-frontend/v1/domain/services/FileService.ts +++ b/extralit-frontend/v1/domain/services/FileService.ts @@ -1,6 +1,7 @@ import bibtexParse from "@orcid/bibtex-parse-js"; import Papa from "papaparse"; import { TableData } from "../entities/table/TableData"; +import { DataFrameSchema } from "../entities/table/Schema"; import type { IFileService, ParsedEntry, ParseResult, CSVConfig, CSVPreviewData } from "./IFileService"; import type { FieldType } from "~/v1/domain/entities/import/ImportAnalysis"; @@ -245,10 +246,7 @@ export class CSVParser { export class DataframeBuilder { static build(entries: ParsedEntry[]): TableData { if (entries.length === 0) { - return { - schema: { fields: [], primaryKey: ["reference"] }, - data: [], - }; + return new TableData([], new DataFrameSchema([], ["reference"])); } const allFields = new Set(); @@ -261,13 +259,7 @@ export class DataframeBuilder { type: this.inferFieldType(entries, fieldName), })); - return { - schema: { - fields, - primaryKey: ["reference"], - }, - data: entries, - }; + return new TableData(entries, new DataFrameSchema(fields, ["reference"])); } private static inferFieldType(entries: ParsedEntry[], fieldName: string): FieldType { From 20f0cce518c749cfdacc57041bca0659b8cc594c Mon Sep 17 00:00:00 2001 From: JonnyTran Date: Mon, 11 Aug 2025 19:22:58 -0700 Subject: [PATCH 05/10] rename FileService to FileParsingService --- .../features/import/file-upload/CsvColumnSelection.vue | 2 +- .../components/features/import/file-upload/PdfUpload.vue | 2 -- .../features/import/file-upload/TableUpload.vue | 6 +++--- extralit-frontend/v1/di/di.ts | 4 ++-- .../v1/domain/services/FileMatchingService.ts | 2 +- .../{FileService.spec.js => FileParsingService.spec.js} | 8 +++++--- .../services/{FileService.ts => FileParsingService.ts} | 4 ++-- .../v1/domain/services/IFileMatchingService.ts | 2 +- .../services/{IFileService.ts => IFileParsingService.ts} | 2 +- 9 files changed, 16 insertions(+), 16 deletions(-) rename extralit-frontend/v1/domain/services/{FileService.spec.js => FileParsingService.spec.js} (94%) rename extralit-frontend/v1/domain/services/{FileService.ts => FileParsingService.ts} (98%) rename extralit-frontend/v1/domain/services/{IFileService.ts => IFileParsingService.ts} (95%) diff --git a/extralit-frontend/components/features/import/file-upload/CsvColumnSelection.vue b/extralit-frontend/components/features/import/file-upload/CsvColumnSelection.vue index 7e499757a..163e37ad5 100644 --- a/extralit-frontend/components/features/import/file-upload/CsvColumnSelection.vue +++ b/extralit-frontend/components/features/import/file-upload/CsvColumnSelection.vue @@ -85,7 +85,7 @@