design-documents.coffee 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234
  1. # Design документы для CouchDB
  2. module.exports =
  3. # Design документ для блог постов
  4. blog_posts:
  5. version: "1.1"
  6. views:
  7. # Все опубликованные блог посты
  8. published:
  9. map: ((doc) ->
  10. if doc.type is 'blog_post' and doc.status is 'published'
  11. emit(doc.created_at, doc)).toString()
  12. # Блог посты по тегам
  13. by_tag:
  14. map: (doc) ->
  15. if doc.type is 'blog_post' and doc.status is 'published' and doc.tags
  16. for tag in doc.tags
  17. emit([tag, doc.created_at], doc)
  18. # Блог посты по автору
  19. by_author:
  20. map: (doc) ->
  21. if doc.type is 'blog_post' and doc.status is 'published'
  22. emit([doc.author, doc.created_at], doc)
  23. # Поиск по заголовку и содержанию
  24. search:
  25. map: (doc) ->
  26. if doc.type is 'blog_post' and doc.status is 'published'
  27. # Индексируем заголовок и содержание для поиска
  28. text = (doc.title + " " + doc.content + " " + doc.excerpt).toLowerCase()
  29. words = text.split(/\W+/).filter (word) -> word.length > 2
  30. for word in words
  31. emit(word, {
  32. _id: doc._id
  33. title: doc.title
  34. excerpt: doc.excerpt
  35. created_at: doc.created_at
  36. })
  37. # Design документ для мероприятий
  38. events:
  39. version: "1.0"
  40. views:
  41. # Все мероприятия по дате
  42. by_date:
  43. map: (doc) ->
  44. if doc.type is 'event'
  45. emit(doc.event_date, doc)
  46. # Предстоящие мероприятия
  47. upcoming:
  48. map: (doc) ->
  49. if doc.type is 'event' and doc.status is 'upcoming'
  50. emit(doc.event_date, doc)
  51. # Активные мероприятия
  52. ongoing:
  53. map: (doc) ->
  54. if doc.type is 'event' and doc.status is 'ongoing'
  55. emit(doc.event_date, doc)
  56. # Мероприятия по тегам
  57. by_tag:
  58. map: (doc) ->
  59. if doc.type is 'event' and doc.tags
  60. for tag in doc.tags
  61. emit([tag, doc.event_date], doc)
  62. # Мероприятия по местоположению
  63. by_location:
  64. map: (doc) ->
  65. if doc.type is 'event'
  66. emit([doc.location, doc.event_date], doc)
  67. # Design документ для слайдов
  68. slides:
  69. version: "1.0"
  70. views:
  71. # Активные слайды по порядку
  72. active_ordered:
  73. map: (doc) ->
  74. if doc.type is 'slide' and doc.active is true
  75. emit(doc.order, doc)
  76. # Design документ для товаров
  77. products:
  78. version: "1.0"
  79. views:
  80. # Все доступные товары
  81. available:
  82. map: (doc) ->
  83. if doc.type is 'product' and doc.status is 'available'
  84. emit(doc.created_at, doc)
  85. # Товары по категориям
  86. by_category:
  87. map: (doc) ->
  88. if doc.type is 'product' and doc.status is 'available'
  89. emit([doc.category, doc.created_at], doc)
  90. # Товары по тегам
  91. by_tag:
  92. map: (doc) ->
  93. if doc.type is 'product' and doc.tags
  94. for tag in doc.tags
  95. emit([tag, doc.created_at], doc)
  96. # Товары по цене
  97. by_price:
  98. map: (doc) ->
  99. if doc.type is 'product' and doc.status is 'available'
  100. emit(doc.price, doc)
  101. # Design документ для категорий и тем
  102. categories_themes:
  103. version: "1.0"
  104. views:
  105. # Все категории по порядку
  106. categories_ordered:
  107. map: (doc) ->
  108. if doc.type is 'category'
  109. emit(doc.order, doc)
  110. # Категории по родителю (для иерархии)
  111. categories_by_parent:
  112. map: (doc) ->
  113. if doc.type is 'category'
  114. parent = doc.parent or 'root'
  115. emit([parent, doc.order], doc)
  116. # Все темы
  117. themes:
  118. map: (doc) ->
  119. if doc.type is 'theme'
  120. emit(doc.name, doc)
  121. # Design документ для глобального поиска
  122. global_search:
  123. version: "1.0"
  124. views:
  125. # Глобальный поиск по всем типам документов
  126. all_content:
  127. map: (doc) ->
  128. # Индексируем различные типы документов для поиска
  129. searchFields = {}
  130. switch doc.type
  131. when 'blog_post'
  132. searchFields =
  133. title: doc.title
  134. content: doc.content
  135. excerpt: doc.excerpt
  136. author: doc.author
  137. tags: doc.tags
  138. type: 'blog_post'
  139. when 'event'
  140. searchFields =
  141. title: doc.title
  142. content: doc.content
  143. location: doc.location
  144. tags: doc.tags
  145. type: 'event'
  146. when 'product'
  147. searchFields =
  148. title: doc.title
  149. content: doc.content
  150. excerpt: doc.excerpt
  151. category: doc.category
  152. tags: doc.tags
  153. type: 'product'
  154. when 'category', 'theme'
  155. searchFields =
  156. name: doc.name
  157. description: doc.description
  158. type: doc.type
  159. # Создаем поисковый индекс
  160. if searchFields.title
  161. text = (
  162. searchFields.title + " " +
  163. (searchFields.content or "") + " " +
  164. (searchFields.excerpt or "") + " " +
  165. (searchFields.author or "") + " " +
  166. (searchFields.location or "") + " " +
  167. (searchFields.description or "")
  168. ).toLowerCase()
  169. # Добавляем теги
  170. if searchFields.tags
  171. text += " " + searchFields.tags.join(" ")
  172. words = text.split(/\W+/).filter (word) -> word.length > 2
  173. for word in words
  174. emit(word, {
  175. _id: doc._id
  176. type: searchFields.type
  177. title: searchFields.title
  178. excerpt: searchFields.excerpt
  179. created_at: doc.created_at
  180. })
  181. # Design документ для статистики
  182. statistics:
  183. version: "1.0"
  184. views:
  185. # Статистика по типам документов
  186. by_type:
  187. map: (doc) ->
  188. emit(doc.type, 1)
  189. reduce: (keys, values) ->
  190. sum values
  191. # Статистика просмотров блог постов
  192. blog_views:
  193. map: (doc) ->
  194. if doc.type is 'blog_post'
  195. emit(doc._id, doc.views or 0)
  196. reduce: (keys, values) ->
  197. sum values
  198. # Статистика мероприятий по статусу
  199. events_by_status:
  200. map: (doc) ->
  201. if doc.type is 'event'
  202. emit(doc.status, 1)
  203. reduce: (keys, values) ->
  204. sum values