import { Database } from 'sqlite3' import { v4 } from 'uuid' import Folder from '../../models/Folder' import Item from '../../models/Item' export default class FolderService { private readonly db = new Database(process.env.DATABASE_PATH) async getChildren(id: string): Promise { return new Promise((resolve, reject) => { const statement = this.db.prepare(` SELECT * FROM folders WHERE parent_id = (?) `) statement.all(id, (err, rows) => { if (err) { reject(err) return } resolve(rows.map(row => Folder.resolve(row))) }) }) } async get(id: string): Promise { return new Promise((resolve, reject) => { const statement = this.db.prepare(` SELECT * FROM folders WHERE id = (?) `) statement.get(id, (err, row) => { if (err) { reject(err) return } if (row) { resolve(Folder.resolve(row)) return } resolve(null) }) }) } async create(name: string, parentId?: string): Promise { return new Promise((resolve, reject) => { const id = v4() const statement = this.db.prepare(` INSERT INTO folders (id, name, parent_id, created_at, updated_at, deleted_at) VALUES (?, ?, ?, ?, ?, NULL) `) const now = new Date() const createdAt = now.toISOString() const updatedAt = now.toISOString() statement.run(id, name, parentId, createdAt, updatedAt, async (err) => { if (err) { reject(err) return } resolve(Folder.resolve({ 'id': id, 'name': name, 'parent_id': parentId || null, 'created_at': createdAt, 'updated_at': updatedAt, 'deleted_at': null, })) }) }) } async getItems(id: string): Promise { return new Promise((resolve, reject) => { const statement = this.db.prepare(` SELECT * FROM items WHERE folder_id = (?) `) statement.all(id, (err, rows) => { if (err) { reject(err) return } resolve(rows.map(item => Item.resolve(item))) }) }) } async getHierarchy(id: string): Promise { let currentId: string = id as string const hierarchy: Folder[] = [] let selectedFolder: Folder while (currentId !== null) { selectedFolder = await this.get(currentId) hierarchy.unshift(selectedFolder) currentId = selectedFolder.parent?.id || null } return hierarchy } }