Integrate multer and adm-zip for handling file uploads and zip extraction. Add API endpoints for fetching, searching, and uploading files. Update storage interface and schema to support project files. Replit-Commit-Author: Agent Replit-Commit-Session-Id: 7a657272-55ba-4a79-9a2e-f1ed9bc7a528 Replit-Commit-Checkpoint-Type: full_checkpoint Replit-Commit-Event-Id: fadde5c0-d787-4605-8d47-ab3e7884f567 Replit-Commit-Screenshot-Url: https://storage.googleapis.com/screenshot-production-us-central1/449cf7c4-c97a-45ae-8234-e5c5b8d6a84f/7a657272-55ba-4a79-9a2e-f1ed9bc7a528/c9ITWqD
64 lines
1.9 KiB
TypeScript
64 lines
1.9 KiB
TypeScript
import { type ProjectFile, type InsertProjectFile } from "@shared/schema";
|
|
import { randomUUID } from "crypto";
|
|
|
|
export interface IStorage {
|
|
getAllFiles(): Promise<ProjectFile[]>;
|
|
getFileById(id: string): Promise<ProjectFile | undefined>;
|
|
getFilesByCategory(category: string): Promise<ProjectFile[]>;
|
|
createFile(file: InsertProjectFile): Promise<ProjectFile>;
|
|
deleteFile(id: string): Promise<boolean>;
|
|
searchFiles(query: string): Promise<ProjectFile[]>;
|
|
}
|
|
|
|
export class MemStorage implements IStorage {
|
|
private files: Map<string, ProjectFile>;
|
|
|
|
constructor() {
|
|
this.files = new Map();
|
|
}
|
|
|
|
async getAllFiles(): Promise<ProjectFile[]> {
|
|
return Array.from(this.files.values()).sort((a, b) =>
|
|
b.uploadedAt.getTime() - a.uploadedAt.getTime()
|
|
);
|
|
}
|
|
|
|
async getFileById(id: string): Promise<ProjectFile | undefined> {
|
|
return this.files.get(id);
|
|
}
|
|
|
|
async getFilesByCategory(category: string): Promise<ProjectFile[]> {
|
|
return Array.from(this.files.values())
|
|
.filter(file => file.category === category)
|
|
.sort((a, b) => b.uploadedAt.getTime() - a.uploadedAt.getTime());
|
|
}
|
|
|
|
async createFile(insertFile: InsertProjectFile): Promise<ProjectFile> {
|
|
const id = randomUUID();
|
|
const file: ProjectFile = {
|
|
...insertFile,
|
|
id,
|
|
uploadedAt: new Date(),
|
|
};
|
|
this.files.set(id, file);
|
|
return file;
|
|
}
|
|
|
|
async deleteFile(id: string): Promise<boolean> {
|
|
return this.files.delete(id);
|
|
}
|
|
|
|
async searchFiles(query: string): Promise<ProjectFile[]> {
|
|
const lowerQuery = query.toLowerCase();
|
|
return Array.from(this.files.values())
|
|
.filter(file =>
|
|
file.filename.toLowerCase().includes(lowerQuery) ||
|
|
file.filepath.toLowerCase().includes(lowerQuery) ||
|
|
(file.content && file.content.toLowerCase().includes(lowerQuery))
|
|
)
|
|
.sort((a, b) => b.uploadedAt.getTime() - a.uploadedAt.getTime());
|
|
}
|
|
}
|
|
|
|
export const storage = new MemStorage();
|