seed-events.coffee 39 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779
  1. # Подключение PouchDB
  2. PouchDB = require 'pouchdb'
  3. # Важно сохранять для seed-events.coffee
  4. debug = require('../../../utils/coffee/debug.coffee').default
  5. class DatabaseSeeder
  6. constructor: (dbName, baseUrl = 'http://oleg:631074@localhost:5984') ->
  7. @dbName = dbName
  8. @baseUrl = baseUrl
  9. @db = new PouchDB(@baseUrl+"/"+@dbName)
  10. @designDoc = require './design-documents.coffee'
  11. @orderCounter = 0
  12. @currentYear = new Date().getFullYear()
  13. # Генератор ID для категорий
  14. generateCategoryId: (name, parentId = null, domain = null) ->
  15. slug = name[0] # Берем первый язык для генерации slug
  16. .toLowerCase()
  17. .replace(/[^a-z0-9а-яё]/g, '_')
  18. .replace(/_+/g, '_')
  19. .replace(/^_|_$/g, '')
  20. id = "category_"+slug
  21. if parentId
  22. parentSlug = parentId.replace(/^category_/, '')
  23. id += "_"+parentSlug
  24. if domain
  25. domainPart = domain.replace(/\./g, '_')
  26. id += "_"+domainPart
  27. return id
  28. # Генератор ID для заказов
  29. generateOrderId: ->
  30. @orderCounter++
  31. return "order_"+@currentYear+"_"+@orderCounter.toString().padStart(3, '0')
  32. # Генератор ID для блог постов
  33. generateBlogPostId: (title, domain = null) ->
  34. slug = title[0] # Берем первый язык для генерации slug
  35. .toLowerCase()
  36. .replace(/[^a-z0-9а-яё]/g, '_')
  37. .replace(/_+/g, '_')
  38. .replace(/^_|_$/g, '')
  39. year = new Date().getFullYear()
  40. id = "blog_post_"+slug+"_"+year
  41. if domain
  42. domainPart = domain.replace(/\./g, '_')
  43. id += "_"+domainPart
  44. return id
  45. # Генератор ID для мероприятий
  46. generateEventId: (title, eventDate, domain = null) ->
  47. slug = title[0] # Берем первый язык для генерации slug
  48. .toLowerCase()
  49. .replace(/[^a-z0-9а-яё]/g, '_')
  50. .replace(/_+/g, '_')
  51. .replace(/^_|_$/g, '')
  52. date = new Date(eventDate)
  53. year = date.getFullYear()
  54. month = (date.getMonth() + 1).toString().padStart(2, '0')
  55. id = "event_"+slug+"_"+year+"_"+month
  56. if domain
  57. domainPart = domain.replace(/\./g, '_')
  58. id += "_"+domainPart
  59. return id
  60. # Генератор ID для товаров
  61. generateProductId: (title, domain = null) ->
  62. slug = title[0] # Берем первый язык для генерации slug
  63. .toLowerCase()
  64. .replace(/[^a-z0-9а-яё]/g, '_')
  65. .replace(/_+/g, '_')
  66. .replace(/^_|_$/g, '')
  67. year = new Date().getFullYear()
  68. id = "product_"+slug+"_"+year
  69. if domain
  70. domainPart = domain.replace(/\./g, '_')
  71. id += "_"+domainPart
  72. return id
  73. # Генератор ID для слайдов
  74. generateSlideId: (order, domain = null) ->
  75. id = "slide_"+order.toString().padStart(2, '0')
  76. if domain
  77. domainPart = domain.replace(/\./g, '_')
  78. id += "_"+domainPart
  79. return id
  80. # Проверка существования базы данных
  81. checkDatabaseExists: ->
  82. try
  83. info = await @db.info()
  84. debug.log "База данных "+@dbName+" существует"
  85. return true
  86. catch error
  87. debug.log "База данных "+@dbName+" не существует: "+error
  88. return false
  89. # Создание базы данных если не существует
  90. createDatabaseIfNotExists: ->
  91. exists = await @checkDatabaseExists()
  92. if not exists
  93. try
  94. response = await fetch(@baseUrl+"/"+@dbName, method: 'PUT')
  95. if response.ok
  96. debug.log "База данных "+@dbName+" создана"
  97. else
  98. debug.log "Ошибка создания базы: "+response.statusText
  99. catch error
  100. debug.log "Ошибка при создании базы: "+error
  101. return exists
  102. # Удаление старых версий документов
  103. cleanupOldDocuments: ->
  104. try
  105. debug.log "Начало очистки старых документов"
  106. allDocs = await @db.allDocs(include_docs: true)
  107. documentsToDelete = []
  108. documentsToKeep = new Set()
  109. documentsByType = {}
  110. for row in allDocs.rows
  111. doc = row.doc
  112. if doc._id.startsWith('_design/')
  113. continue
  114. docType = doc.type or 'unknown'
  115. if not documentsByType[docType]
  116. documentsByType[docType] = []
  117. documentsByType[docType].push(doc)
  118. for docType, docs of documentsByType
  119. if docs.length <= 6
  120. for doc in docs
  121. documentsToKeep.add(doc._id)
  122. continue
  123. sortedDocs = docs.sort (a, b) ->
  124. new Date(b.created_at) - new Date(a.created_at)
  125. for doc, index in sortedDocs
  126. if index < 6
  127. documentsToKeep.add(doc._id)
  128. else
  129. documentsToDelete.push({
  130. _id: doc._id
  131. _rev: doc._rev
  132. _deleted: true
  133. })
  134. if documentsToDelete.length > 0
  135. result = await @db.bulkDocs(documentsToDelete)
  136. debug.log "Удалено старых документов: "+documentsToDelete.length
  137. else
  138. debug.log "Старые документы для удаления не найдены"
  139. debug.log "Очистка старых документов завершена"
  140. catch error
  141. debug.log "Ошибка при очистке старых документов: "+error
  142. # Проверка и создание design документов
  143. setupDesignDocuments: ->
  144. try
  145. for designName, designDoc of @designDoc
  146. docId = "_design/"+designName
  147. try
  148. currentDoc = await @db.get(docId)
  149. if currentDoc.version isnt designDoc.version
  150. debug.log "Обновление design документа: "+designName
  151. designDoc._id = docId
  152. designDoc._rev = currentDoc._rev
  153. await @db.put(designDoc)
  154. debug.log "Design документ "+designName+" обновлен до версии "+designDoc.version
  155. else
  156. debug.log "Design документ "+designName+" актуален"
  157. catch error
  158. if error.status is 404
  159. debug.log "Создание design документа: "+designName
  160. designDoc._id = docId
  161. await @db.put(designDoc)
  162. debug.log "Design документ "+designName+" создан"
  163. else
  164. throw error
  165. catch error
  166. debug.log "Ошибка при настройке design документов: "+error
  167. # Создание иерархической структуры категорий с мультиязычностью
  168. createCategoryHierarchy: ->
  169. categories = [
  170. # Корневые категории
  171. {
  172. _id: @generateCategoryId(["Мероприятия", "Events", "Чорабиниҳо"], null, "borbad")
  173. type: "category"
  174. domain: ["borbad.s5l.ru", "concert-hall.tj"]
  175. language: ["ru", "en", "tj"]
  176. name: ["Мероприятия", "Events", "Чорабиниҳо"]
  177. slug: ["events", "events", "chorabinīho"]
  178. description: ["Все мероприятия концертного зала", "All concert hall events", "Ҳамаи чорабиниҳои ҳолли консерт"]
  179. image: [
  180. "/assets/borbad.s5l.ru/categories/events.jpg"
  181. "/assets/borbad.s5l.ru/categories/events.jpg"
  182. "/assets/borbad.s5l.ru/categories/events.jpg"
  183. ]
  184. icon: ["calendar", "calendar", "calendar"]
  185. parent_id: null
  186. parent_path: []
  187. level: 0
  188. order: 1
  189. children_count: 4
  190. meta_title: ["Мероприятия - Кохи Борбад", "Events - Borbad Concert Hall", "Чорабиниҳо - Ҳолли Борбад"]
  191. meta_description: ["Концерты, выставки и другие мероприятия в концертном зале Борбад", "Concerts, exhibitions and other events at Borbad Concert Hall", "Консертҳо, намоишҳо ва дигар чорабиниҳо дар ҳолли консертии Борбад"]
  192. active: true
  193. featured: true
  194. show_in_menu: true
  195. menu_order: 1
  196. color: ["#3B82F6", "#3B82F6", "#3B82F6"]
  197. created_at: new Date().toISOString()
  198. updated_at: new Date().toISOString()
  199. }
  200. {
  201. _id: @generateCategoryId(["Новости", "News", "Хабарҳо"], null, "borbad")
  202. type: "category"
  203. domain: ["borbad.s5l.ru"]
  204. language: ["ru", "en", "tj"]
  205. name: ["Новости", "News", "Хабарҳо"]
  206. slug: ["news", "news", "khabarho"]
  207. description: ["Новости и анонсы концертного зала", "News and announcements of the concert hall", "Хабарҳо ва эълонҳои ҳолли консерт"]
  208. image: [
  209. "/assets/borbad.s5l.ru/categories/news.jpg"
  210. "/assets/borbad.s5l.ru/categories/news.jpg"
  211. "/assets/borbad.s5l.ru/categories/news.jpg"
  212. ]
  213. icon: ["news", "news", "news"]
  214. parent_id: null
  215. parent_path: []
  216. level: 0
  217. order: 2
  218. children_count: 0
  219. meta_title: ["Новости - Кохи Борбад", "News - Borbad Concert Hall", "Хабарҳо - Ҳолли Борбад"]
  220. meta_description: ["Последние новости и анонсы концертного зала Борбад", "Latest news and announcements from Borbad Concert Hall", "Охирин хабарҳо ва эълонҳои ҳолли консертии Борбад"]
  221. active: true
  222. featured: false
  223. show_in_menu: true
  224. menu_order: 2
  225. color: ["#10B981", "#10B981", "#10B981"]
  226. created_at: new Date().toISOString()
  227. updated_at: new Date().toISOString()
  228. }
  229. # Подкатегории для "Мероприятия"
  230. {
  231. _id: @generateCategoryId(["Концерты", "Concerts", "Консертҳо"], "category_events_borbad", "borbad")
  232. type: "category"
  233. domain: ["borbad.s5l.ru", "concert-hall.tj"]
  234. language: ["ru", "en", "tj"]
  235. name: ["Концерты", "Concerts", "Консертҳо"]
  236. slug: ["concerts", "concerts", "konsert-ho"]
  237. description: ["Музыкальные концерты различных жанров", "Music concerts of various genres", "Консертҳои мусиқии навъҳои гуногун"]
  238. image: [
  239. "/assets/borbad.s5l.ru/categories/concerts.jpg"
  240. "/assets/borbad.s5l.ru/categories/concerts.jpg"
  241. "/assets/borbad.s5l.ru/categories/concerts.jpg"
  242. ]
  243. icon: ["music", "music", "music"]
  244. parent_id: "category_events_borbad"
  245. parent_path: ["category_events_borbad"]
  246. level: 1
  247. order: 1
  248. children_count: 3
  249. meta_title: ["Концерты - Кохи Борбад", "Concerts - Borbad Concert Hall", "Консертҳо - Ҳолли Борбад"]
  250. meta_description: ["Музыкальные концерты в концертном зале Борбад", "Music concerts at Borbad Concert Hall", "Консертҳои мусиқӣ дар ҳолли консертии Борбад"]
  251. active: true
  252. featured: true
  253. show_in_menu: true
  254. menu_order: 1
  255. color: ["#6366F1", "#6366F1", "#6366F1"]
  256. created_at: new Date().toISOString()
  257. updated_at: new Date().toISOString()
  258. }
  259. # Подкатегории для "Концерты"
  260. {
  261. _id: @generateCategoryId(["Классическая музыка", "Classical Music", "Мусиқии классикӣ"], "category_concerts_events_borbad", "borbad")
  262. type: "category"
  263. domain: ["borbad.s5l.ru", "concert-hall.tj"]
  264. language: ["ru", "en", "tj"]
  265. name: ["Классическая музыка", "Classical Music", "Мусиқии классикӣ"]
  266. slug: ["classical-music", "classical-music", "musiqii-klasikī"]
  267. description: ["Симфонические концерты и классические произведения", "Symphonic concerts and classical works", "Консертҳои симфонӣ ва осори классикӣ"]
  268. image: [
  269. "/assets/borbad.s5l.ru/categories/classical-music.jpg"
  270. "/assets/borbad.s5l.ru/categories/classical-music.jpg"
  271. "/assets/borbad.s5l.ru/categories/classical-music.jpg"
  272. ]
  273. icon: ["classical", "classical", "classical"]
  274. parent_id: "category_concerts_events_borbad"
  275. parent_path: ["category_events_borbad", "category_concerts_events_borbad"]
  276. level: 2
  277. order: 1
  278. children_count: 0
  279. meta_title: ["Классическая музыка - Кохи Борбад", "Classical Music - Borbad Concert Hall", "Мусиқии классикӣ - Ҳолли Борбад"]
  280. meta_description: ["Симфонические концерты и классические произведения", "Symphonic concerts and classical works", "Консертҳои симфонӣ ва осори классикӣ"]
  281. active: true
  282. featured: true
  283. show_in_menu: true
  284. menu_order: 1
  285. color: ["#3B82F6", "#3B82F6", "#3B82F6"]
  286. created_at: new Date().toISOString()
  287. updated_at: new Date().toISOString()
  288. }
  289. ]
  290. return categories
  291. # Создание тестовых данных для сайта с новой структурой
  292. createSampleData: ->
  293. currentDate = new Date().toISOString()
  294. sampleData = [
  295. # Доменные настройки
  296. {
  297. _id: "domain_settings_borbad_s5l_ru"
  298. type: "domain_settings"
  299. domain: "borbad.s5l.ru"
  300. name: ["Кохи Борбад - Концертный зал Душанбе", "Borbad Concert Hall - Dushanbe"]
  301. description: ["Официальный сайт концертного зала Борбад", "Official website of Borbad Concert Hall"]
  302. active: true
  303. priority: 1
  304. theme: "borbad"
  305. languages: ["ru", "en", "tj"]
  306. default_language: "ru"
  307. timezone: "Asia/Dushanbe"
  308. currency: "TJS"
  309. settings: {
  310. seo: {
  311. title_template: ["{page} - Кохи Борбад", "{page} - Borbad Concert Hall"]
  312. description: ["Концертный зал Борбад - культурный центр Душанбе", "Borbad Concert Hall - Dushanbe Cultural Center"]
  313. keywords: [["концерты", "мероприятия", "Душанбе", "культура"], ["concerts", "events", "Dushanbe", "culture"]]
  314. }
  315. social: {
  316. facebook: "https://facebook.com/borbad"
  317. instagram: "https://instagram.com/borbad"
  318. twitter: "https://twitter.com/borbad"
  319. }
  320. contact: {
  321. address: ["г. Душанбе, пр. Рудаки 22", "Rudaki Ave 22, Dushanbe"]
  322. phone: ["+992 37 123-45-67", "+992 37 123-45-67"]
  323. email: ["info@borbad.s5l.ru", "info@borbad.s5l.ru"]
  324. }
  325. features: {
  326. online_booking: true
  327. multi_language: true
  328. ecommerce: true
  329. }
  330. }
  331. created_at: currentDate
  332. updated_at: currentDate
  333. }
  334. # Добавляем иерархические категории
  335. ...@createCategoryHierarchy()
  336. # Блог посты с мультиязычными массивами
  337. {
  338. _id: @generateBlogPostId(["Открытие нового сезона 2024", "Opening of the new season 2024"], "borbad")
  339. type: "blog_post"
  340. domain: ["borbad.s5l.ru", "global"]
  341. language: ["ru", "en"]
  342. title: ["Открытие нового сезона 2024", "Opening of the new season 2024"]
  343. content: [
  344. "# Добро пожаловать в новый творческий сезон!\n\nМы рады объявить о начале нового сезона в концертном зале Борбад. В этом году нас ждут удивительные события и незабываемые впечатления.",
  345. "# Welcome to the new creative season!\n\nWe are pleased to announce the start of the new season at the Borbad Concert Hall. This year we have amazing events and unforgettable experiences awaiting us."
  346. ]
  347. excerpt: [
  348. "Новый творческий сезон 2024 года в концертном зале Борбад",
  349. "New creative season 2024 at the Borbad Concert Hall"
  350. ]
  351. seo: {
  352. description: [
  353. "Концертный зал Борбад открывает новый сезон 2024 года",
  354. "Borbad Concert Hall opens the 2024 season"
  355. ]
  356. keywords: [
  357. ["новости", "сезон", "анонс", "Борбад"],
  358. ["news", "season", "announcement", "Borbad"]
  359. ]
  360. title: [
  361. "Открытие нового сезона 2024 - Кохи Борбад",
  362. "Opening of the new season 2024 - Borbad Concert Hall"
  363. ]
  364. }
  365. image: [
  366. "/assets/borbad.s5l.ru/posts/season-opening.jpg"
  367. "/assets/borbad.s5l.ru/posts/season-opening.jpg"
  368. ]
  369. gallery: [
  370. [
  371. "/assets/borbad.s5l.ru/gallery/post1.jpg"
  372. "/assets/borbad.s5l.ru/gallery/post2.jpg"
  373. ],
  374. [
  375. "/assets/borbad.s5l.ru/gallery/post1.jpg"
  376. "/assets/borbad.s5l.ru/gallery/post2.jpg"
  377. ]
  378. ]
  379. tags: [
  380. ["новости", "сезон", "анонс"],
  381. ["news", "season", "announcement"]
  382. ]
  383. category_id: "category_news_borbad"
  384. category_path: ["category_news_borbad"]
  385. author: ["Администрация Борбад", "Borbad Administration"]
  386. status: "published"
  387. featured: true
  388. reading_time: [5, 5]
  389. created_at: currentDate
  390. updated_at: currentDate
  391. published_at: currentDate
  392. views: 156
  393. likes: 23
  394. shares: 45
  395. }
  396. # События (мероприятия) с мультиязычными данными
  397. {
  398. _id: @generateEventId(["Симфонический концерт: Бетховен и Чайковский", "Symphonic Concert: Beethoven and Tchaikovsky"], "2024-03-20T19:00:00.000Z", "borbad")
  399. type: "event"
  400. domain: ["borbad.s5l.ru", "concert-hall.tj"]
  401. language: ["ru", "en", "tj"]
  402. title: ["Симфонический концерт: Бетховен и Чайковский", "Symphonic Concert: Beethoven and Tchaikovsky", "Консерти симфонӣ: Бетховен ва Чайковский"]
  403. content: [
  404. "# Великие композиторы\n\n## Программа концерта\n\n- **Л. ван Бетховен** - Симфония №5\n- **П.И. Чайковский** - Лебединое озеро (сюита)\n- **П.И. Чайковский** - Щелкунчик (сюита)\n\n## Исполнители\n\nСимфонический оркестр Борбад под управлением дирижера Фарруха Саидова.",
  405. "# Great Composers\n\n## Concert Program\n\n- **L. van Beethoven** - Symphony No. 5\n- **P.I. Tchaikovsky** - Swan Lake (suite)\n- **P.I. Tchaikovsky** - The Nutcracker (suite)\n\n## Performers\n\nBorbad Symphony Orchestra conducted by Farrukh Saidov.",
  406. "# Оҳангсозони бузург\n\n## Барномаи консерт\n\n- **Л. ван Бетховен** - Симфония №5\n- **П.И. Чайковский** - Озори ҳоҷилагак (сюита)\n- **П.И. Чайковский** - Қозуқанд (сюита)\n\n## Иҷрокунандагон\n\nОркестри симфонии Борбад зери роҳбарии дирижёр Фаррух Саидов."
  407. ]
  408. excerpt: [
  409. "Симфонический концерт с произведениями Бетховена и Чайковского",
  410. "Symphonic concert with works by Beethoven and Tchaikovsky",
  411. "Консерти симфонӣ бо осори Бетховен ва Чайковский"
  412. ]
  413. seo: {
  414. description: [
  415. "Симфонический концерт в зале Борбад - классическая музыка",
  416. "Symphonic concert at Borbad Hall - classical music",
  417. "Консерти симфонӣ дар ҳолли Борбад - мусиқии классикӣ"
  418. ]
  419. keywords: [
  420. ["концерт", "симфоническая музыка", "классика", "Бетховен", "Чайковский"],
  421. ["concert", "symphonic music", "classical", "Beethoven", "Tchaikovsky"],
  422. ["консерт", "мусиқии симфонӣ", "классикӣ", "Бетховен", "Чайковский"]
  423. ]
  424. title: [
  425. "Симфонический концерт: Бетховен и Чайковский - Кохи Борбад",
  426. "Symphonic Concert: Beethoven and Tchaikovsky - Borbad Concert Hall",
  427. "Консерти симфонӣ: Бетховен ва Чайковский - Ҳолли Борбад"
  428. ]
  429. }
  430. image: [
  431. "/assets/borbad.s5l.ru/events/beethoven-concert.jpg"
  432. "/assets/borbad.s5l.ru/events/beethoven-concert.jpg"
  433. "/assets/borbad.s5l.ru/events/beethoven-concert.jpg"
  434. ]
  435. gallery: [
  436. [
  437. "/assets/borbad.s5l.ru/gallery/concert1.jpg"
  438. "/assets/borbad.s5l.ru/gallery/concert2.jpg"
  439. ],
  440. [
  441. "/assets/borbad.s5l.ru/gallery/concert1.jpg"
  442. "/assets/borbad.s5l.ru/gallery/concert2.jpg"
  443. ],
  444. [
  445. "/assets/borbad.s5l.ru/gallery/concert1.jpg"
  446. "/assets/borbad.s5l.ru/gallery/concert2.jpg"
  447. ]
  448. ]
  449. tags: [
  450. ["концерт", "симфоническая музыка", "классика", "Бетховен", "Чайковский"],
  451. ["concert", "symphonic music", "classical", "Beethoven", "Tchaikovsky"],
  452. ["консерт", "мусиқии симфонӣ", "классикӣ", "Бетховен", "Чайковский"]
  453. ]
  454. category_id: "category_classical_music_concerts_events_borbad"
  455. category_path: ["category_events_borbad", "category_concerts_events_borbad", "category_classical_music_concerts_events_borbad"]
  456. author: ["Симфонический оркестр Борбад", "Borbad Symphony Orchestra", "Оркестри симфонии Борбад"]
  457. status: "published"
  458. featured: true
  459. reading_time: [4, 4, 4]
  460. # Дополнительные поля для событий
  461. event_data: {
  462. event_date: "2024-03-20T19:00:00.000Z"
  463. end_date: "2024-03-20T21:00:00.000Z"
  464. location: ["Большой зал", "Main Hall", "Ҳолли асосӣ"]
  465. venue_id: "venue_main_hall_borbad"
  466. address: {
  467. street: ["пр. Рудаки 22", "Rudaki Ave 22", "хиёбони Рӯдакӣ 22"]
  468. city: ["Душанбе", "Dushanbe", "Душанбе"]
  469. country: ["Таджикистан", "Tajikistan", "Тоҷикистон"]
  470. }
  471. coordinates: {
  472. lat: 38.5732
  473. lng: 68.7734
  474. }
  475. price: [500, 500, 500]
  476. currency: "TJS"
  477. available_tickets: 45
  478. total_tickets: 300
  479. status: "upcoming"
  480. registration_required: true
  481. max_attendees: 300
  482. age_restriction: ["6+", "6+", "6+"]
  483. organizer: ["Симфонический оркестр Борбад", "Borbad Symphony Orchestra", "Оркестри симфонии Борбад"]
  484. performers: [
  485. ["Фаррух Саидов (дирижер)", "Солисты оркестра"],
  486. ["Farrukh Saidov (conductor)", "Orchestra soloists"],
  487. ["Фаррух Саидов (дирижёр)", "Солистони оркестр"]
  488. ]
  489. duration: 120
  490. }
  491. created_at: currentDate
  492. updated_at: currentDate
  493. published_at: currentDate
  494. views: 289
  495. }
  496. # Товары с мультиязычными данными
  497. {
  498. _id: @generateProductId(["Футболка с логотипом Борбад", "Borbad Logo T-shirt"], "borbad")
  499. type: "product"
  500. domain: ["shop.borbad.s5l.ru", "borbad.s5l.ru"]
  501. language: ["ru", "en"]
  502. title: ["Футболка с логотипом Борбад", "Borbad Logo T-shirt"]
  503. content: [
  504. "## Качественная хлопковая футболка\n\nРазмеры: S, M, L, XL\n\nМатериал: 100% хлопок\n\nУход: машинная стирка при 30°C",
  505. "## High-quality cotton t-shirt\n\nSizes: S, M, L, XL\n\nMaterial: 100% cotton\n\nCare: machine wash at 30°C"
  506. ]
  507. excerpt: [
  508. "Фирменная футболка концертного зала с логотипом",
  509. "Official concert hall t-shirt with logo"
  510. ]
  511. seo: {
  512. description: [
  513. "Футболка с логотипом концертного зала Борбад - сувениры",
  514. "T-shirt with Borbad concert hall logo - souvenirs"
  515. ]
  516. keywords: [
  517. ["футболка", "сувениры", "мерч", "Борбад"],
  518. ["t-shirt", "souvenirs", "merch", "Borbad"]
  519. ]
  520. title: [
  521. "Футболка с логотипом Борбад - Сувениры",
  522. "Borbad Logo T-shirt - Souvenirs"
  523. ]
  524. }
  525. image: [
  526. "/assets/borbad.s5l.ru/products/tshirt.jpg"
  527. "/assets/borbad.s5l.ru/products/tshirt.jpg"
  528. ]
  529. gallery: [
  530. [
  531. "/assets/borbad.s5l.ru/products/tshirt-front.jpg"
  532. "/assets/borbad.s5l.ru/products/tshirt-back.jpg"
  533. ],
  534. [
  535. "/assets/borbad.s5l.ru/products/tshirt-front.jpg"
  536. "/assets/borbad.s5l.ru/products/tshirt-back.jpg"
  537. ]
  538. ]
  539. tags: [
  540. ["одежда", "сувениры", "мерч"],
  541. ["clothing", "souvenirs", "merch"]
  542. ]
  543. category_id: "category_souvenirs_borbad"
  544. category_path: ["category_shop_borbad", "category_souvenirs_borbad"]
  545. author: ["Магазин Борбад", "Borbad Shop"]
  546. status: "published"
  547. featured: true
  548. reading_time: [2, 2]
  549. # Дополнительные поля для товаров
  550. product_data: {
  551. price: [250, 250]
  552. currency: "TJS"
  553. compare_price: [350, 350]
  554. sku: "TSH-BRB-001"
  555. inventory: 50
  556. status: "available"
  557. attributes: {
  558. sizes: [["S", "M", "L", "XL"], ["S", "M", "L", "XL"]]
  559. colors: [["белый", "черный", "красный"], ["white", "black", "red"]]
  560. material: [["100% хлопок"], ["100% cotton"]]
  561. brand: [["Борбад"], ["Borbad"]]
  562. }
  563. weight: 0.3
  564. dimensions: {
  565. length: 70
  566. width: 50
  567. height: 5
  568. }
  569. shipping: {
  570. free_shipping: [false, false]
  571. shipping_cost: [50, 50]
  572. }
  573. }
  574. created_at: currentDate
  575. updated_at: currentDate
  576. published_at: currentDate
  577. views: 134
  578. }
  579. # Слайдеры с мультиязычными данными
  580. {
  581. _id: @generateSlideId(1, "borbad")
  582. type: "slide"
  583. domain: ["borbad.s5l.ru", "concert-hall.tj"]
  584. language: ["ru", "en"]
  585. title: ["Добро пожаловать в Кохи Борбад", "Welcome to Borbad Concert Hall"]
  586. content: [
  587. "## Современный концертный зал в сердце Душанбе\n\nМесто, где встречаются искусство и культура",
  588. "## Modern concert hall in the heart of Dushanbe\n\nA place where art and culture meet"
  589. ]
  590. excerpt: [
  591. "Концертный зал Борбад - культурный центр Душанбе",
  592. "Borbad Concert Hall - Dushanbe Cultural Center"
  593. ]
  594. seo: {
  595. description: [
  596. "Концертный зал Борбад в Душанбе",
  597. "Borbad Concert Hall in Dushanbe"
  598. ]
  599. }
  600. image: [
  601. "/assets/borbad.s5l.ru/sliders/main-hall.jpg"
  602. "/assets/borbad.s5l.ru/sliders/main-hall.jpg"
  603. ]
  604. gallery: [[], []]
  605. tags: [
  606. ["слайдер", "главная"],
  607. ["slider", "main"]
  608. ]
  609. category_id: "category_sliders_borbad"
  610. category_path: ["category_sliders_borbad"]
  611. author: ["Администрация Борбад", "Borbad Administration"]
  612. status: "published"
  613. featured: false
  614. reading_time: [1, 1]
  615. # Дополнительные поля для слайдеров
  616. slide_data: {
  617. order: 1
  618. active: true
  619. button_text: ["Узнать больше", "Learn More"]
  620. button_link: ["/about", "/about"]
  621. button_style: "primary"
  622. text_color: ["#ffffff", "#ffffff"]
  623. text_position: ["center", "center"]
  624. overlay: [true, true]
  625. overlay_opacity: [0.4, 0.4]
  626. mobile_image: [
  627. "/assets/borbad.s5l.ru/sliders/main-hall-mobile.jpg"
  628. "/assets/borbad.s5l.ru/sliders/main-hall-mobile.jpg"
  629. ]
  630. start_date: "2024-01-01T00:00:00.000Z"
  631. end_date: "2024-12-31T23:59:59.000Z"
  632. target_audience: [["all"], ["all"]]
  633. }
  634. created_at: "2024-01-01T00:00:00.000Z"
  635. updated_at: currentDate
  636. published_at: "2024-01-01T00:00:00.000Z"
  637. views: 0
  638. }
  639. # Пользователи
  640. {
  641. _id: "user_admin_main"
  642. type: "user"
  643. domain: "global"
  644. email: "admin@borbad.s5l.ru"
  645. name: ["Администратор Борбад", "Borbad Administrator"]
  646. role: "admin"
  647. active: true
  648. permissions: ["read", "write", "delete", "admin"]
  649. profile: {
  650. avatar: [
  651. "/assets/borbad.s5l.ru/avatars/admin.jpg"
  652. "/assets/borbad.s5l.ru/avatars/admin.jpg"
  653. ]
  654. phone: ["+992 37 123-45-67", "+992 37 123-45-67"]
  655. position: ["Системный администратор", "System Administrator"]
  656. bio: ["Ответственный за техническую часть сайта", "Responsible for the technical part of the site"]
  657. }
  658. preferences: {
  659. language: "ru"
  660. notifications: true
  661. theme: "dark"
  662. timezone: "Asia/Dushanbe"
  663. }
  664. security: {
  665. last_password_change: "2024-01-01T00:00:00.000Z"
  666. two_factor_enabled: true
  667. login_attempts: 0
  668. }
  669. domains_access: ["borbad.s5l.ru", "concert-hall.tj"]
  670. created_at: "2024-01-01T00:00:00.000Z"
  671. updated_at: currentDate
  672. last_login: "2024-01-15T09:30:00.000Z"
  673. }
  674. ]
  675. try
  676. createdCount = 0
  677. updatedCount = 0
  678. for doc in sampleData
  679. try
  680. existing = await @db.get(doc._id)
  681. doc._rev = existing._rev
  682. await @db.put(doc)
  683. updatedCount++
  684. debug.log "Обновлен документ: "+doc._id
  685. catch error
  686. if error.status is 404
  687. await @db.put(doc)
  688. createdCount++
  689. debug.log "Создан документ: "+doc._id
  690. else
  691. throw error
  692. debug.log "Тестовые данные успешно созданы: создано "+createdCount+", обновлено "+updatedCount
  693. catch error
  694. debug.log "Ошибка при создании тестовых данных: "+error
  695. # Основной метод инициализации
  696. initialize: ->
  697. debug.log "Начало инициализации базы данных"
  698. await @createDatabaseIfNotExists()
  699. await @cleanupOldDocuments()
  700. await @setupDesignDocuments()
  701. await @createSampleData()
  702. debug.log "Инициализация базы данных завершена"
  703. # Экспорт класса
  704. module.exports = DatabaseSeeder
  705. # Если файл запущен напрямую
  706. if require.main is module
  707. seeder = new DatabaseSeeder('borbad_events')
  708. seeder.initialize().catch (error) ->
  709. debug.log "Критическая ошибка инициализации: "+error