Initial commit
This commit is contained in:
37
shared/constants/api.ts
Normal file
37
shared/constants/api.ts
Normal file
@@ -0,0 +1,37 @@
|
||||
export const API_ENDPOINTS = {
|
||||
FILES: '/api/files',
|
||||
FILES_CONTENT: '/api/files/content',
|
||||
FILES_MOVE: '/api/files/move',
|
||||
FILES_RECYCLE: '/api/files/recycle',
|
||||
FILES_EXISTS: '/api/files/exists',
|
||||
FILES_RENAME: '/api/files/rename',
|
||||
FILES_CREATE: '/api/files/create',
|
||||
FILES_MKDIR: '/api/files/mkdir',
|
||||
FILES_RESTORE: '/api/files/restore',
|
||||
FILES_PERMANENT_DELETE: '/api/files/permanent-delete',
|
||||
FILES_EMPTY_RECYCLE_BIN: '/api/files/empty-recycle-bin',
|
||||
TIME: '/api/time',
|
||||
TIME_EVENT: '/api/time/event',
|
||||
TIME_STATS: '/api/time/stats',
|
||||
TIME_DAY: '/api/time/day',
|
||||
TIME_MONTH: '/api/time/month',
|
||||
TIME_YEAR: '/api/time/year',
|
||||
TODO: '/api/todo',
|
||||
TODO_ADD: '/api/todo/add',
|
||||
TODO_TOGGLE: '/api/todo/toggle',
|
||||
TODO_UPDATE: '/api/todo/update',
|
||||
TODO_DELETE: '/api/todo/delete',
|
||||
TODO_MIGRATE: '/api/todo/migrate',
|
||||
SEARCH: '/api/search',
|
||||
EVENTS: '/api/events',
|
||||
SYNC: '/api/sync',
|
||||
SYNC_UPLOAD: '/api/sync/upload',
|
||||
SYNC_DOWNLOAD: '/api/sync/download',
|
||||
SYNC_STATUS: '/api/sync/status',
|
||||
PYDEMOS: '/api/pydemos',
|
||||
PYDEMOS_CREATE: '/api/pydemos/create',
|
||||
PYDEMOS_RENAME: '/api/pydemos/rename',
|
||||
PYDEMOS_DELETE: '/api/pydemos/delete',
|
||||
} as const
|
||||
|
||||
export type ApiEndpoint = typeof API_ENDPOINTS[keyof typeof API_ENDPOINTS]
|
||||
14
shared/constants/asyncImport.ts
Normal file
14
shared/constants/asyncImport.ts
Normal file
@@ -0,0 +1,14 @@
|
||||
export const ASYNC_IMPORT_STATUS = {
|
||||
PDF_PARSING_TITLE: '# 正在解析 PDF 内容...',
|
||||
HTML_PARSING_TITLE: '# 正在解析 HTML 内容...',
|
||||
PDF_PARSING_CONTENT: '# 正在解析 PDF 内容...\n\n> 请稍候,系统正在后台解析您的 PDF 文件。解析完成后,本文档将自动更新。\n> \n> 您可以继续进行其他操作。',
|
||||
HTML_PARSING_CONTENT: '# 正在解析 HTML 内容...\n\n> 请稍候,系统正在解析您的 HTML 文件。解析完成后,本文档将自动更新。',
|
||||
} as const
|
||||
|
||||
export const isAsyncImportProcessingContent = (text: string): boolean => {
|
||||
const trimmed = text.trimStart()
|
||||
return (
|
||||
trimmed.startsWith(ASYNC_IMPORT_STATUS.PDF_PARSING_TITLE) ||
|
||||
trimmed.startsWith(ASYNC_IMPORT_STATUS.HTML_PARSING_TITLE)
|
||||
)
|
||||
}
|
||||
1
shared/constants/dates.ts
Normal file
1
shared/constants/dates.ts
Normal file
@@ -0,0 +1 @@
|
||||
export const WEEK_DAYS = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] as const
|
||||
22
shared/constants/errors.ts
Normal file
22
shared/constants/errors.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
export const ERROR_CODES = {
|
||||
PATH_NOT_FOUND: 'PATH_NOT_FOUND',
|
||||
NOT_A_DIRECTORY: 'NOT_A_DIRECTORY',
|
||||
ACCESS_DENIED: 'ACCESS_DENIED',
|
||||
FILE_EXISTS: 'FILE_EXISTS',
|
||||
INVALID_PATH: 'INVALID_PATH',
|
||||
VALIDATION_ERROR: 'VALIDATION_ERROR',
|
||||
INTERNAL_ERROR: 'INTERNAL_ERROR',
|
||||
NOT_FOUND: 'NOT_FOUND',
|
||||
BAD_REQUEST: 'BAD_REQUEST',
|
||||
NAME_GENERATION_FAILED: 'NAME_GENERATION_FAILED',
|
||||
SSE_UNSUPPORTED: 'SSE_UNSUPPORTED',
|
||||
ALREADY_EXISTS: 'ALREADY_EXISTS',
|
||||
NOT_A_FILE: 'NOT_A_FILE',
|
||||
FORBIDDEN: 'FORBIDDEN',
|
||||
UNSUPPORTED_MEDIA_TYPE: 'UNSUPPORTED_MEDIA_TYPE',
|
||||
PAYLOAD_TOO_LARGE: 'PAYLOAD_TOO_LARGE',
|
||||
RESOURCE_LOCKED: 'RESOURCE_LOCKED',
|
||||
INVALID_NAME: 'INVALID_NAME',
|
||||
} as const
|
||||
|
||||
export type ErrorCode = typeof ERROR_CODES[keyof typeof ERROR_CODES]
|
||||
5
shared/constants/index.ts
Normal file
5
shared/constants/index.ts
Normal file
@@ -0,0 +1,5 @@
|
||||
export { API_ENDPOINTS, type ApiEndpoint } from './api.js'
|
||||
export { ERROR_CODES, type ErrorCode } from './errors.js'
|
||||
export { ERROR_MESSAGES, getErrorMessage } from './messages.js'
|
||||
export { ASYNC_IMPORT_STATUS, isAsyncImportProcessingContent } from './asyncImport.js'
|
||||
export { WEEK_DAYS } from './dates.js'
|
||||
26
shared/constants/messages.ts
Normal file
26
shared/constants/messages.ts
Normal file
@@ -0,0 +1,26 @@
|
||||
import { ERROR_CODES } from './errors'
|
||||
|
||||
export const ERROR_MESSAGES: Record<string, string> = {
|
||||
[ERROR_CODES.PATH_NOT_FOUND]: '路径不存在',
|
||||
[ERROR_CODES.NOT_A_DIRECTORY]: '不是目录',
|
||||
[ERROR_CODES.ACCESS_DENIED]: '访问被拒绝',
|
||||
[ERROR_CODES.FILE_EXISTS]: '文件已存在',
|
||||
[ERROR_CODES.INVALID_PATH]: '无效路径',
|
||||
[ERROR_CODES.VALIDATION_ERROR]: '验证失败',
|
||||
[ERROR_CODES.INTERNAL_ERROR]: '内部错误',
|
||||
[ERROR_CODES.NOT_FOUND]: '资源不存在',
|
||||
[ERROR_CODES.BAD_REQUEST]: '请求错误',
|
||||
[ERROR_CODES.NAME_GENERATION_FAILED]: '名称生成失败',
|
||||
[ERROR_CODES.SSE_UNSUPPORTED]: 'SSE 不支持',
|
||||
[ERROR_CODES.ALREADY_EXISTS]: '已存在',
|
||||
[ERROR_CODES.NOT_A_FILE]: '不是文件',
|
||||
[ERROR_CODES.FORBIDDEN]: '禁止访问',
|
||||
[ERROR_CODES.UNSUPPORTED_MEDIA_TYPE]: '不支持的媒体类型',
|
||||
[ERROR_CODES.PAYLOAD_TOO_LARGE]: '请求体过大',
|
||||
[ERROR_CODES.RESOURCE_LOCKED]: '资源已锁定',
|
||||
[ERROR_CODES.INVALID_NAME]: '无效名称',
|
||||
}
|
||||
|
||||
export const getErrorMessage = (code: string): string => {
|
||||
return ERROR_MESSAGES[code] || '未知错误'
|
||||
}
|
||||
Reference in New Issue
Block a user