Files
DeEarthX-CE/backend/src/template/index.ts
15736060610 4654f36202
Some checks failed
CI/CD / Code Check (push) Has been cancelled
CI/CD / Build Windows (push) Has been cancelled
项目迁移
2026-03-14 21:11:59 +08:00

94 lines
2.4 KiB
TypeScript

import fs from "node:fs/promises";
import path from "node:path";
import { TemplateManager } from "./TemplateManager.js";
import { getAppDir } from "../utils/utils.js";
export { TemplateManager };
interface TemplateMetadata {
name: string;
version: string;
description: string;
author: string;
created: string;
type: string;
}
export class TemplateService {
private readonly templatesPath: string;
constructor(templatesPath?: string) {
this.templatesPath = templatesPath || path.join(getAppDir(), "templates");
}
async getTemplate(name: string): Promise<TemplateMetadata | null> {
const metadataPath = path.join(this.templatesPath, name, "metadata.json");
try {
const data = await fs.readFile(metadataPath, "utf-8");
return JSON.parse(data) as TemplateMetadata;
} catch {
return null;
}
}
async updateTemplate(name: string, metadata: Partial<TemplateMetadata>): Promise<boolean> {
const currentMetadata = await this.getTemplate(name);
if (!currentMetadata) {
return false;
}
const updatedMetadata = { ...currentMetadata, ...metadata };
const metadataPath = path.join(this.templatesPath, name, "metadata.json");
await fs.writeFile(metadataPath, JSON.stringify(updatedMetadata, null, 2));
return true;
}
async deleteTemplate(name: string): Promise<boolean> {
const templatePath = path.join(this.templatesPath, name);
try {
await fs.rm(templatePath, { recursive: true, force: true });
return true;
} catch {
return false;
}
}
async listTemplates(): Promise<TemplateMetadata[]> {
const templates: TemplateMetadata[] = [];
try {
// 确保templates文件夹存在
await fs.mkdir(this.templatesPath, { recursive: true });
const entries = await fs.readdir(this.templatesPath, { withFileTypes: true });
for (const entry of entries) {
if (entry.isDirectory()) {
const metadata = await this.getTemplate(entry.name);
if (metadata) {
templates.push(metadata);
}
}
}
} catch {
return [];
}
return templates;
}
async templateExists(name: string): Promise<boolean> {
const metadataPath = path.join(this.templatesPath, name, "metadata.json");
try {
await fs.access(metadataPath);
return true;
} catch {
return false;
}
}
}