seed-events.coffee 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. # Подключение необходимых модулей
  2. CouchDB = require '../vue/app/core/CouchdbClass.coffee'
  3. debug = require('../../../utils/coffee/debug.coffee').default
  4. class EventSeeder
  5. constructor: ->
  6. @dbName = 'borbad_events'
  7. @baseUrl = 'http://oleg:631074@localhost:5984'
  8. @couch = new CouchDB(@baseUrl, @dbName)
  9. @designDoc =
  10. _id: '_design/app'
  11. views: {}
  12. lists: {}
  13. shows: {}
  14. # Версия design документа для контроля обновлений
  15. @designVersion = '1.0'
  16. # Проверка существования базы данных
  17. checkDatabase: ->
  18. try
  19. response = await fetch(@baseUrl+"/"+@dbName)
  20. if response.status == 404
  21. debug.log "База данных не найдена, создаем новую"
  22. await this.createDatabase()
  23. else if response.status == 200
  24. debug.log "База данных найдена"
  25. else
  26. debug.log "Ошибка при проверке базы: "+response.status
  27. catch error
  28. debug.log "Ошибка при проверке базы данных: "+error
  29. # Создание базы данных
  30. createDatabase: ->
  31. try
  32. response = await fetch(@baseUrl+"/"+@dbName,
  33. method: 'PUT'
  34. headers:
  35. 'Content-Type': 'application/json'
  36. )
  37. if response.status == 201
  38. debug.log "База данных успешно создана"
  39. else
  40. debug.log "Ошибка при создании базы: "+response.status
  41. catch error
  42. debug.log "Ошибка при создании базы данных: "+error
  43. # Проверка и создание/обновление design документов
  44. setupDesignDocuments: ->
  45. try
  46. # Получаем текущий design документ
  47. response = await fetch(@baseUrl+"/"+@dbName+"/_design/app")
  48. if response.status == 200
  49. existingDoc = await response.json()
  50. # Проверяем версию
  51. if existingDoc.version != @designVersion
  52. debug.log "Обновляем design документ до версии "+@designVersion
  53. @designDoc._rev = existingDoc._rev
  54. @designDoc.version = @designVersion
  55. await this.updateDesignDoc()
  56. else
  57. debug.log "Design документ актуален"
  58. else if response.status == 404
  59. debug.log "Design документ не найден, создаем новый"
  60. @designDoc.version = @designVersion
  61. await this.createDesignDoc()
  62. else
  63. debug.log "Ошибка при проверке design документа: "+response.status
  64. catch error
  65. debug.log "Ошибка при настройке design документов: "+error
  66. # Создание design документа
  67. createDesignDoc: ->
  68. try
  69. # Определяем views
  70. @designDoc.views =
  71. # Все записи блога
  72. all_blog_posts:
  73. map: """
  74. function(doc) {
  75. if (doc.type === 'blog_post' || doc.type === 'slide' || doc.type === 'event') {
  76. emit(doc.created_at, doc);
  77. }
  78. }
  79. """
  80. # Только мероприятия
  81. events_only:
  82. map: """
  83. function(doc) {
  84. if (doc.type === 'event') {
  85. emit(doc.event_date, doc);
  86. }
  87. }
  88. """
  89. # Только слайды
  90. slides_only:
  91. map: """
  92. function(doc) {
  93. if (doc.type === 'slide') {
  94. emit(doc.order, doc);
  95. }
  96. }
  97. """
  98. # Поиск по заголовку
  99. by_title:
  100. map: """
  101. function(doc) {
  102. if (doc.title) {
  103. emit(doc.title.toLowerCase(), doc);
  104. }
  105. }
  106. """
  107. # Поиск по тегам
  108. by_tags:
  109. map: """
  110. function(doc) {
  111. if (doc.tags && Array.isArray(doc.tags)) {
  112. doc.tags.forEach(function(tag) {
  113. emit(tag.toLowerCase(), doc);
  114. });
  115. }
  116. }
  117. """
  118. # Активные мероприятия (будущие)
  119. active_events:
  120. map: """
  121. function(doc) {
  122. if (doc.type === 'event' && doc.event_date) {
  123. var eventDate = new Date(doc.event_date);
  124. var now = new Date();
  125. if (eventDate >= now) {
  126. emit(doc.event_date, doc);
  127. }
  128. }
  129. }
  130. """
  131. response = await fetch(@baseUrl+"/"+@dbName+"/_design/app",
  132. method: 'PUT'
  133. headers:
  134. 'Content-Type': 'application/json'
  135. body: JSON.stringify(@designDoc)
  136. )
  137. if response.status == 201
  138. debug.log "Design документ успешно создан"
  139. else
  140. debug.log "Ошибка при создании design документа: "+response.status
  141. catch error
  142. debug.log "Ошибка при создании design документа: "+error
  143. # Обновление design документа
  144. updateDesignDoc: ->
  145. try
  146. response = await fetch(@baseUrl+"/"+@dbName+"/_design/app",
  147. method: 'PUT'
  148. headers:
  149. 'Content-Type': 'application/json'
  150. body: JSON.stringify(@designDoc)
  151. )
  152. if response.status == 201
  153. debug.log "Design документ успешно обновлен"
  154. else
  155. debug.log "Ошибка при обновлении design документа: "+response.status
  156. catch error
  157. debug.log "Ошибка при обновлении design документа: "+error
  158. # Добавление тестовых данных
  159. seedTestData: ->
  160. testData = [
  161. {
  162. _id: 'slide_welcome'
  163. type: 'slide'
  164. title: 'Добро пожаловать в Кохи Борбад'
  165. content: '# Концертный зал Борбад\n\nПриветствуем вас в самом современном концертном зале Душанбе!'
  166. image: '/assets/borbad.s5l.ru/welcome-slide.jpg'
  167. order: 1
  168. active: true
  169. created_at: new Date().toISOString()
  170. updated_at: new Date().toISOString()
  171. }
  172. {
  173. _id: 'event_concert_1'
  174. type: 'event'
  175. title: 'Симфонический оркестр'
  176. content: '## Концерт симфонического оркестра\n\nВ программе произведения классической музыки.'
  177. event_date: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()
  178. location: 'Большой зал'
  179. price: 150
  180. tags: ['концерт', 'классика', 'оркестр']
  181. image: '/assets/borbad.s5l.ru/concert-1.jpg'
  182. created_at: new Date().toISOString()
  183. updated_at: new Date().toISOString()
  184. }
  185. {
  186. _id: 'blog_about'
  187. type: 'blog_post'
  188. title: 'О нашем зале'
  189. content: '## История создания\n\nКонцертный зал Борбад был открыт в 2023 году...'
  190. tags: ['история', 'архитектура']
  191. created_at: new Date().toISOString()
  192. updated_at: new Date().toISOString()
  193. }
  194. ]
  195. for doc in testData
  196. try
  197. response = await fetch(@baseUrl+"/"+@dbName+"/"+doc._id,
  198. method: 'PUT'
  199. headers:
  200. 'Content-Type': 'application/json'
  201. body: JSON.stringify(doc)
  202. )
  203. if response.status == 201
  204. debug.log "Документ "+doc._id+" успешно создан"
  205. else
  206. debug.log "Ошибка при создании документа "+doc._id+": "+response.status
  207. catch error
  208. debug.log "Ошибка при создании тестового документа: "+error
  209. # Основной метод инициализации
  210. initialize: ->
  211. debug.log "Начало инициализации базы данных мероприятий"
  212. await this.checkDatabase()
  213. await this.setupDesignDocuments()
  214. await this.seedTestData()
  215. debug.log "Инициализация базы данных завершена"
  216. # Экспорт класса
  217. module.exports = EventSeeder
  218. # Если файл запускается напрямую
  219. if require.main == module
  220. seeder = new EventSeeder()
  221. seeder.initialize()