feat(auth): 添加认证模块和图片批注功能(项目初始化)
- 实现用户登录、登出、密码修改等认证功能 - 添加会话管理和权限控制中间件 - 创建图片批注组件和相关API路由 - 实现批注的增删改查功能 - 添加Docker和Git忽略配置文件 - 创建系统架构文档和开发约定说明 - 集成认证模块到前端应用路由中
This commit is contained in:
28
api/repositories/imagesRepository.ts
Normal file
28
api/repositories/imagesRepository.ts
Normal file
@@ -0,0 +1,28 @@
|
||||
import { database, withTransaction, type QueryContext } from '../database.js';
|
||||
import type { NoteImage } from '../../shared/types.js';
|
||||
|
||||
interface ImageRow extends Omit<NoteImage, 'id' | 'note_id' | 'order_index'> { id: number | string; note_id: number | string; order_index: number | string }
|
||||
function toImage(row: ImageRow): NoteImage { return { ...row, id: Number(row.id), note_id: Number(row.note_id), order_index: Number(row.order_index), url: /^https?:\/\//.test(row.url) || row.url.startsWith('/') ? row.url : `/uploads/${row.url}` }; }
|
||||
|
||||
export const imagesRepository = {
|
||||
async listByNote(noteId: number, versionNumber?: number): Promise<NoteImage[]> {
|
||||
const rows = await database.all<ImageRow>(`SELECT id, note_id, url, width, height, order_index, storage_provider, storage_key FROM images
|
||||
WHERE note_id = ?${versionNumber ? ' AND version_number = ?' : ''} ORDER BY order_index ASC, id ASC`, versionNumber ? [noteId, versionNumber] : [noteId]);
|
||||
return rows.map(toImage);
|
||||
},
|
||||
async createMany(noteId: number, images: { url: string; width: number; height: number; storageProvider: 'local' | 'tencent_cos'; storageKey: string }[], versionNumber = 1, existing?: QueryContext): Promise<number[]> {
|
||||
const insert = async (tx: QueryContext) => {
|
||||
const ids: number[] = [];
|
||||
for (let index = 0; index < images.length; index += 1) {
|
||||
const image = images[index];
|
||||
ids.push(await tx.insertId('INSERT INTO images (note_id, url, width, height, order_index, storage_provider, storage_key, version_number) VALUES (?, ?, ?, ?, ?, ?, ?, ?)', [noteId, image.url, image.width, image.height, index, image.storageProvider, image.storageKey, versionNumber]));
|
||||
}
|
||||
return ids;
|
||||
};
|
||||
return existing ? insert(existing) : withTransaction(insert);
|
||||
},
|
||||
async findById(id: number): Promise<NoteImage | null> {
|
||||
const row = await database.one<ImageRow>('SELECT id, note_id, url, width, height, order_index, storage_provider, storage_key FROM images WHERE id = ?', [id]);
|
||||
return row ? toImage(row) : null;
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user