From ecbe1725aa06301f7b835ba91287da45834cdcfc Mon Sep 17 00:00:00 2001 From: duanfuxiang Date: Thu, 24 Apr 2025 16:22:46 +0800 Subject: [PATCH] update commnad name --- src/database/exception.ts | 8 +- src/database/json/command/CommandManager.ts | 148 ++++++++++++++++++ src/database/json/command/TemplateManager.ts | 148 ------------------ src/database/json/command/types.ts | 6 +- src/database/json/constants.ts | 2 +- src/database/json/exception.ts | 14 +- src/database/json/migrateToJsonDatabase.ts | 40 ++--- .../modules/command/command-manager.ts | 4 +- src/hooks/use-commands.ts | 12 +- 9 files changed, 191 insertions(+), 191 deletions(-) create mode 100755 src/database/json/command/CommandManager.ts delete mode 100755 src/database/json/command/TemplateManager.ts diff --git a/src/database/exception.ts b/src/database/exception.ts index 5f843c3..cd98a2e 100644 --- a/src/database/exception.ts +++ b/src/database/exception.ts @@ -12,9 +12,9 @@ export class DatabaseNotInitializedException extends DatabaseException { } } -export class DuplicateTemplateException extends DatabaseException { - constructor(templateName: string) { - super(`Template with name "${templateName}" already exists`) - this.name = 'DuplicateTemplateException' +export class DuplicateCommandException extends DatabaseException { + constructor(commandName: string) { + super(`Command with name "${commandName}" already exists`) + this.name = 'DuplicateCommandException' } } diff --git a/src/database/json/command/CommandManager.ts b/src/database/json/command/CommandManager.ts new file mode 100755 index 0000000..6cb6790 --- /dev/null +++ b/src/database/json/command/CommandManager.ts @@ -0,0 +1,148 @@ +import fuzzysort from 'fuzzysort' +import { App } from 'obsidian' +import { v4 as uuidv4 } from 'uuid' + +import { AbstractJsonRepository } from '../base' +import { COMMAND_DIR, ROOT_DIR } from '../constants' +import { + DuplicateCommandException, + EmptyCommandNameException, +} from '../exception' + +import { COMMAND_SCHEMA_VERSION, Command, CommandMetadata } from './types' + +export class CommandManager extends AbstractJsonRepository< + Command, + CommandMetadata +> { + constructor(app: App) { + super(app, `${ROOT_DIR}/${COMMAND_DIR}`) + } + + protected generateFileName(template: Command): string { + // Format: v{schemaVersion}_name_id.json (with name encoded) + const encodedName = encodeURIComponent(template.name) + return `v${COMMAND_SCHEMA_VERSION}_${encodedName}_${template.id}.json` + } + + protected parseFileName(fileName: string): CommandMetadata | null { + const match = fileName.match( + new RegExp(`^v${COMMAND_SCHEMA_VERSION}_(.+)_([0-9a-f-]+)\\.json$`), + ) + if (!match) return null + + const encodedName = match[1] + const id = match[2] + const name = decodeURIComponent(encodedName) + + return { id, name, schemaVersion: COMMAND_SCHEMA_VERSION } + } + + public async createCommand( + command: Omit< + Command, + 'id' | 'createdAt' | 'updatedAt' | 'schemaVersion' + >, + ): Promise { + if (command.name !== undefined && command.name.length === 0) { + throw new EmptyCommandNameException() + } + + const existingCommand = await this.findByName(command.name) + if (existingCommand) { + throw new DuplicateCommandException(command.name) + } + + const newCommand: Command = { + id: uuidv4(), + ...command, + createdAt: Date.now(), + updatedAt: Date.now(), + schemaVersion: COMMAND_SCHEMA_VERSION, + } + + await this.create(newCommand) + return newCommand + } + + public async ListCommands(): Promise { + const allMetadata = await this.listMetadata() + const allCommands = await Promise.all(allMetadata.map(async (meta) => this.read(meta.fileName))) + return allCommands.sort((a, b) => b.updatedAt - a.updatedAt) + } + + public async findById(id: string): Promise { + const allMetadata = await this.listMetadata() + const targetMetadata = allMetadata.find((meta) => meta.id === id) + + if (!targetMetadata) return null + + return this.read(targetMetadata.fileName) + } + + public async findByName(name: string): Promise { + const allMetadata = await this.listMetadata() + const targetMetadata = allMetadata.find((meta) => meta.name === name) + + if (!targetMetadata) return null + + return this.read(targetMetadata.fileName) + } + + public async updateCommand( + id: string, + updates: Partial< + Omit + >, + ): Promise { + if (updates.name !== undefined && updates.name.length === 0) { + throw new EmptyCommandNameException() + } + + const command = await this.findById(id) + if (!command) return null + + if (updates.name && updates.name !== command.name) { + const existingCommand = await this.findByName(updates.name) + if (existingCommand) { + throw new DuplicateCommandException(updates.name) + } + } + + const updatedCommand: Command = { + ...command, + ...updates, + updatedAt: Date.now(), + } + + await this.update(command, updatedCommand) + return updatedCommand + } + + public async deleteCommand(id: string): Promise { + const command = await this.findById(id) + if (!command) return false + + const fileName = this.generateFileName(command) + await this.delete(fileName) + return true + } + + public async searchCommands(query: string): Promise { + const allMetadata = await this.listMetadata() + const results = fuzzysort.go(query, allMetadata, { + keys: ['name'], + threshold: 0.2, + limit: 20, + all: true, + }) + + const commands = ( + await Promise.all( + results.map(async (result) => this.read(result.obj.fileName)), + ) + ).filter((command): command is Command => command !== null) + + return commands + } +} diff --git a/src/database/json/command/TemplateManager.ts b/src/database/json/command/TemplateManager.ts deleted file mode 100755 index bfd9019..0000000 --- a/src/database/json/command/TemplateManager.ts +++ /dev/null @@ -1,148 +0,0 @@ -import fuzzysort from 'fuzzysort' -import { App } from 'obsidian' -import { v4 as uuidv4 } from 'uuid' - -import { AbstractJsonRepository } from '../base' -import { ROOT_DIR, TEMPLATE_DIR } from '../constants' -import { - DuplicateTemplateException, - EmptyTemplateNameException, -} from '../exception' - -import { TEMPLATE_SCHEMA_VERSION, Template, TemplateMetadata } from './types' - -export class TemplateManager extends AbstractJsonRepository< - Template, - TemplateMetadata -> { - constructor(app: App) { - super(app, `${ROOT_DIR}/${TEMPLATE_DIR}`) - } - - protected generateFileName(template: Template): string { - // Format: v{schemaVersion}_name_id.json (with name encoded) - const encodedName = encodeURIComponent(template.name) - return `v${TEMPLATE_SCHEMA_VERSION}_${encodedName}_${template.id}.json` - } - - protected parseFileName(fileName: string): TemplateMetadata | null { - const match = fileName.match( - new RegExp(`^v${TEMPLATE_SCHEMA_VERSION}_(.+)_([0-9a-f-]+)\\.json$`), - ) - if (!match) return null - - const encodedName = match[1] - const id = match[2] - const name = decodeURIComponent(encodedName) - - return { id, name, schemaVersion: TEMPLATE_SCHEMA_VERSION } - } - - public async createTemplate( - template: Omit< - Template, - 'id' | 'createdAt' | 'updatedAt' | 'schemaVersion' - >, - ): Promise