|
- 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<Folder[]> {
- 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<Folder> {
- 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<Folder> {
- 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<Item[]> {
- 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<Folder[]> {
- 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
- }
- }
|