ids.alfacom.it/server/storage.ts
marco370 76f447fe01 Add file management and upload capabilities for IDF Mikrotik projects
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
2025-11-15 10:54:17 +00:00

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();