Discord bot
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

107 lines
2.3 KiB

  1. import { Database } from 'sqlite3'
  2. import { v4 } from 'uuid'
  3. import Folder from '../../models/Folder'
  4. import Item from '../../models/Item'
  5. export default class FolderService {
  6. private readonly db = new Database(process.env.DATABASE_PATH)
  7. async getChildren(id: string): Promise<Folder[]> {
  8. return new Promise((resolve, reject) => {
  9. const statement = this.db.prepare(`
  10. SELECT *
  11. FROM folders
  12. WHERE parent_id = (?)
  13. `)
  14. statement.all(id, (err, rows) => {
  15. if (err) {
  16. reject(err)
  17. return
  18. }
  19. resolve(rows.map(row => Folder.resolve(row)))
  20. })
  21. })
  22. }
  23. async get(id: string): Promise<Folder> {
  24. return new Promise((resolve, reject) => {
  25. const statement = this.db.prepare(`
  26. SELECT *
  27. FROM folders
  28. WHERE id = (?)
  29. `)
  30. statement.get(id, (err, row) => {
  31. if (err) {
  32. reject(err)
  33. return
  34. }
  35. if (row) {
  36. resolve(Folder.resolve(row))
  37. return
  38. }
  39. resolve(null)
  40. })
  41. })
  42. }
  43. async create(name: string, parentId?: string): Promise<Folder> {
  44. return new Promise((resolve, reject) => {
  45. const id = v4()
  46. const statement = this.db.prepare(`
  47. INSERT INTO folders (id, name, parent_id, created_at, updated_at, deleted_at) VALUES (?, ?, ?, ?, ?, NULL)
  48. `)
  49. const now = new Date()
  50. const createdAt = now.toISOString()
  51. const updatedAt = now.toISOString()
  52. statement.run(id, name, parentId, createdAt, updatedAt, async (err) => {
  53. if (err) {
  54. reject(err)
  55. return
  56. }
  57. resolve(Folder.resolve({
  58. 'id': id,
  59. 'name': name,
  60. 'parent_id': parentId || null,
  61. 'created_at': createdAt,
  62. 'updated_at': updatedAt,
  63. 'deleted_at': null,
  64. }))
  65. })
  66. })
  67. }
  68. async getItems(id: string): Promise<Item[]> {
  69. return new Promise((resolve, reject) => {
  70. const statement = this.db.prepare(`
  71. SELECT *
  72. FROM items
  73. WHERE folder_id = (?)
  74. `)
  75. statement.all(id, (err, rows) => {
  76. if (err) {
  77. reject(err)
  78. return
  79. }
  80. resolve(rows.map(item => Item.resolve(item)))
  81. })
  82. })
  83. }
  84. async getHierarchy(id: string): Promise<Folder[]> {
  85. let currentId: string = id as string
  86. const hierarchy: Folder[] = []
  87. let selectedFolder: Folder
  88. while (currentId !== null) {
  89. selectedFolder = await this.get(currentId)
  90. hierarchy.unshift(selectedFolder)
  91. currentId = selectedFolder.parent?.id || null
  92. }
  93. return hierarchy
  94. }
  95. }