CategoryService.coffee 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  1. # app/services/CategoryService.coffee
  2. { Category } = require 'app/types/data'
  3. class CategoryService
  4. constructor: ->
  5. @pouchService = require 'app/utils/pouch'
  6. @initialized = false
  7. init: ->
  8. return Promise.resolve() if @initialized
  9. try
  10. await @pouchService.init()
  11. @initialized = true
  12. log '✅ CategoryService инициализирован'
  13. return Promise.resolve()
  14. catch error
  15. log '❌ Ошибка инициализации CategoryService:', error
  16. return Promise.reject(error)
  17. getAllCategories: ->
  18. await @ensureInit()
  19. try
  20. result = await @pouchService.queryView('categories', 'active_categories', {
  21. include_docs: true
  22. })
  23. categories = result.rows.map (row) ->
  24. new Category(row.doc)
  25. # Сортировка по порядку
  26. categories.sort (a, b) -> a.order - b.order
  27. log '📂 Загружены категории:', categories.length
  28. return categories
  29. catch error
  30. log '❌ Ошибка загрузки категорий:', error
  31. throw error
  32. getCategoryBySlug: (slug) ->
  33. await @ensureInit()
  34. try
  35. result = await @pouchService.queryView('categories', 'by_slug', {
  36. key: slug
  37. include_docs: true
  38. })
  39. if result.rows.length > 0
  40. category = new Category(result.rows[0].doc)
  41. log "📂 Загружена категория по slug: #{slug}"
  42. return category
  43. else
  44. log "⚠️ Категория не найдена по slug: #{slug}"
  45. return null
  46. catch error
  47. log "❌ Ошибка поиска категории по slug #{slug}:", error
  48. throw error
  49. getHierarchicalCategories: ->
  50. await @ensureInit()
  51. try
  52. result = await @pouchService.queryView('categories', 'hierarchical', {
  53. include_docs: true
  54. })
  55. categories = result.rows.map (row) ->
  56. new Category(row.doc)
  57. # Построение иерархии
  58. hierarchical = @buildHierarchy(categories)
  59. log '🌳 Построена иерархия категорий'
  60. return hierarchical
  61. catch error
  62. log '❌ Ошибка построения иерархии категорий:', error
  63. throw error
  64. buildHierarchy: (categories, parentId = null) ->
  65. hierarchy = []
  66. categories
  67. .filter (cat) -> cat.parent == parentId
  68. .sort (a, b) -> a.order - b.order
  69. .forEach (category) =>
  70. children = @buildHierarchy(categories, category._id)
  71. if children.length > 0
  72. category.children = children
  73. hierarchy.push(category)
  74. return hierarchy
  75. saveCategory: (categoryData) ->
  76. await @ensureInit()
  77. try
  78. category = new Category(categoryData)
  79. # Генерация ID если не установлен
  80. if not category._id
  81. category._id = "category:#{Date.now()}"
  82. result = await @pouchService.saveDocument(category)
  83. log "💾 Категория сохранена: #{category.name}"
  84. return result
  85. catch error
  86. log "❌ Ошибка сохранения категории:", error
  87. throw error
  88. ensureInit: ->
  89. unless @initialized
  90. throw new Error('CategoryService не инициализирован. Вызовите init() сначала.')
  91. module.exports = new CategoryService()