|
|
@@ -1,246 +1,215 @@
|
|
|
-# Подключение необходимых модулей
|
|
|
-CouchDB = require '../vue/app/core/CouchdbClass.coffee'
|
|
|
-debug = require('../../../utils/coffee/debug.coffee').default
|
|
|
-class EventSeeder
|
|
|
- constructor: ->
|
|
|
- @dbName = 'borbad_events'
|
|
|
- @baseUrl = 'http://oleg:631074@localhost:5984'
|
|
|
- @couch = new CouchDB(@baseUrl, @dbName)
|
|
|
- @designDoc =
|
|
|
- _id: '_design/app'
|
|
|
- views: {}
|
|
|
- lists: {}
|
|
|
- shows: {}
|
|
|
-
|
|
|
- # Версия design документа для контроля обновлений
|
|
|
- @designVersion = '1.0'
|
|
|
-
|
|
|
+# Подключение PouchDB
|
|
|
+PouchDB = require 'pouchdb'
|
|
|
+debug = require('../../../utils/coffee/debug.coffee').default
|
|
|
+
|
|
|
+
|
|
|
+class DatabaseSeeder
|
|
|
+ constructor: (dbName, baseUrl = 'http://oleg:631074@localhost:5984') ->
|
|
|
+ @dbName = dbName
|
|
|
+ @baseUrl = baseUrl
|
|
|
+ @db = new PouchDB(@baseUrl+"/"+@dbName)
|
|
|
+ @designDoc = require './design-documents.coffee'
|
|
|
+
|
|
|
# Проверка существования базы данных
|
|
|
- checkDatabase: ->
|
|
|
- try
|
|
|
- response = await fetch(@baseUrl+"/"+@dbName)
|
|
|
- if response.status == 404
|
|
|
- debug.log "База данных не найдена, создаем новую"
|
|
|
- await this.createDatabase()
|
|
|
- else if response.status == 200
|
|
|
- debug.log "База данных найдена"
|
|
|
- else
|
|
|
- debug.log "Ошибка при проверке базы: "+response.status
|
|
|
- catch error
|
|
|
- debug.log "Ошибка при проверке базы данных: "+error
|
|
|
-
|
|
|
- # Создание базы данных
|
|
|
- createDatabase: ->
|
|
|
+ checkDatabaseExists: ->
|
|
|
try
|
|
|
- response = await fetch(@baseUrl+"/"+@dbName,
|
|
|
- method: 'PUT'
|
|
|
- headers:
|
|
|
- 'Content-Type': 'application/json'
|
|
|
- )
|
|
|
- if response.status == 201
|
|
|
- debug.log "База данных успешно создана"
|
|
|
- else
|
|
|
- debug.log "Ошибка при создании базы: "+response.status
|
|
|
+ info = await @db.info()
|
|
|
+ debug.log "База данных "+@dbName+" существует"
|
|
|
+ return true
|
|
|
catch error
|
|
|
- debug.log "Ошибка при создании базы данных: "+error
|
|
|
-
|
|
|
- # Проверка и создание/обновление design документов
|
|
|
+ debug.log "База данных "+@dbName+" не существует: "+error
|
|
|
+ return false
|
|
|
+
|
|
|
+ # Создание базы данных если не существует
|
|
|
+ createDatabaseIfNotExists: ->
|
|
|
+ exists = await @checkDatabaseExists()
|
|
|
+ if not exists
|
|
|
+ try
|
|
|
+ # Создаем базу через PUT запрос
|
|
|
+ response = await fetch(@baseUrl+"/"+@dbName, method: 'PUT')
|
|
|
+ if response.ok
|
|
|
+ debug.log "База данных "+@dbName+" создана"
|
|
|
+ else
|
|
|
+ debug.log "Ошибка создания базы: "+response.statusText
|
|
|
+ catch error
|
|
|
+ debug.log "Ошибка при создании базы: "+error
|
|
|
+ return exists
|
|
|
+
|
|
|
+ # Проверка и создание design документов
|
|
|
setupDesignDocuments: ->
|
|
|
try
|
|
|
- # Получаем текущий design документ
|
|
|
- response = await fetch(@baseUrl+"/"+@dbName+"/_design/app")
|
|
|
-
|
|
|
- if response.status == 200
|
|
|
- existingDoc = await response.json()
|
|
|
- # Проверяем версию
|
|
|
- if existingDoc.version != @designVersion
|
|
|
- debug.log "Обновляем design документ до версии "+@designVersion
|
|
|
- @designDoc._rev = existingDoc._rev
|
|
|
- @designDoc.version = @designVersion
|
|
|
- await this.updateDesignDoc()
|
|
|
- else
|
|
|
- debug.log "Design документ актуален"
|
|
|
- else if response.status == 404
|
|
|
- debug.log "Design документ не найден, создаем новый"
|
|
|
- @designDoc.version = @designVersion
|
|
|
- await this.createDesignDoc()
|
|
|
- else
|
|
|
- debug.log "Ошибка при проверке design документа: "+response.status
|
|
|
-
|
|
|
+ for designName, designDoc of @designDoc
|
|
|
+ docId = "_design/"+designName
|
|
|
+ try
|
|
|
+ # Пытаемся получить текущий документ
|
|
|
+ currentDoc = await @db.get(docId)
|
|
|
+
|
|
|
+ # Сравниваем версии
|
|
|
+ if currentDoc.version isnt designDoc.version
|
|
|
+ debug.log "Обновление design документа: "+designName
|
|
|
+ designDoc._id = docId
|
|
|
+ designDoc._rev = currentDoc._rev
|
|
|
+ await @db.put(designDoc)
|
|
|
+ debug.log "Design документ "+designName+" обновлен до версии "+designDoc.version
|
|
|
+ else
|
|
|
+ debug.log "Design документ "+designName+" актуален"
|
|
|
+
|
|
|
+ catch error
|
|
|
+ if error.status is 404
|
|
|
+ # Документ не существует, создаем новый
|
|
|
+ debug.log "Создание design документа: "+designName
|
|
|
+ designDoc._id = docId
|
|
|
+ await @db.put(designDoc)
|
|
|
+ debug.log "Design документ "+designName+" создан"
|
|
|
+ else
|
|
|
+ throw error
|
|
|
+
|
|
|
catch error
|
|
|
debug.log "Ошибка при настройке design документов: "+error
|
|
|
-
|
|
|
- # Создание design документа
|
|
|
- createDesignDoc: ->
|
|
|
- try
|
|
|
- # Определяем views
|
|
|
- @designDoc.views =
|
|
|
- # Все записи блога
|
|
|
- all_blog_posts:
|
|
|
- map: """
|
|
|
- function(doc) {
|
|
|
- if (doc.type === 'blog_post' || doc.type === 'slide' || doc.type === 'event') {
|
|
|
- emit(doc.created_at, doc);
|
|
|
- }
|
|
|
- }
|
|
|
- """
|
|
|
-
|
|
|
- # Только мероприятия
|
|
|
- events_only:
|
|
|
- map: """
|
|
|
- function(doc) {
|
|
|
- if (doc.type === 'event') {
|
|
|
- emit(doc.event_date, doc);
|
|
|
- }
|
|
|
- }
|
|
|
- """
|
|
|
-
|
|
|
- # Только слайды
|
|
|
- slides_only:
|
|
|
- map: """
|
|
|
- function(doc) {
|
|
|
- if (doc.type === 'slide') {
|
|
|
- emit(doc.order, doc);
|
|
|
- }
|
|
|
- }
|
|
|
- """
|
|
|
-
|
|
|
- # Поиск по заголовку
|
|
|
- by_title:
|
|
|
- map: """
|
|
|
- function(doc) {
|
|
|
- if (doc.title) {
|
|
|
- emit(doc.title.toLowerCase(), doc);
|
|
|
- }
|
|
|
- }
|
|
|
- """
|
|
|
-
|
|
|
- # Поиск по тегам
|
|
|
- by_tags:
|
|
|
- map: """
|
|
|
- function(doc) {
|
|
|
- if (doc.tags && Array.isArray(doc.tags)) {
|
|
|
- doc.tags.forEach(function(tag) {
|
|
|
- emit(tag.toLowerCase(), doc);
|
|
|
- });
|
|
|
- }
|
|
|
- }
|
|
|
- """
|
|
|
-
|
|
|
- # Активные мероприятия (будущие)
|
|
|
- active_events:
|
|
|
- map: """
|
|
|
- function(doc) {
|
|
|
- if (doc.type === 'event' && doc.event_date) {
|
|
|
- var eventDate = new Date(doc.event_date);
|
|
|
- var now = new Date();
|
|
|
- if (eventDate >= now) {
|
|
|
- emit(doc.event_date, doc);
|
|
|
- }
|
|
|
- }
|
|
|
- }
|
|
|
- """
|
|
|
-
|
|
|
- response = await fetch(@baseUrl+"/"+@dbName+"/_design/app",
|
|
|
- method: 'PUT'
|
|
|
- headers:
|
|
|
- 'Content-Type': 'application/json'
|
|
|
- body: JSON.stringify(@designDoc)
|
|
|
- )
|
|
|
-
|
|
|
- if response.status == 201
|
|
|
- debug.log "Design документ успешно создан"
|
|
|
- else
|
|
|
- debug.log "Ошибка при создании design документа: "+response.status
|
|
|
-
|
|
|
- catch error
|
|
|
- debug.log "Ошибка при создании design документа: "+error
|
|
|
-
|
|
|
- # Обновление design документа
|
|
|
- updateDesignDoc: ->
|
|
|
- try
|
|
|
- response = await fetch(@baseUrl+"/"+@dbName+"/_design/app",
|
|
|
- method: 'PUT'
|
|
|
- headers:
|
|
|
- 'Content-Type': 'application/json'
|
|
|
- body: JSON.stringify(@designDoc)
|
|
|
- )
|
|
|
+
|
|
|
+ # Создание тестовых данных
|
|
|
+ createSampleData: ->
|
|
|
+ sampleData = [
|
|
|
+ # Блог посты
|
|
|
+ {
|
|
|
+ _id: "blog_post_" + Math.floor(Math.random() * 9000) + 1000
|
|
|
+ type: "blog_post"
|
|
|
+ title: "Добро пожаловать в Кохи Борбад"
|
|
|
+ content: "# Добро пожаловать!\n\nМы рады приветствовать вас в нашем новом концертном зале."
|
|
|
+ excerpt: "Приветственное сообщение нового концертного зала"
|
|
|
+ image: "/assets/borbad.s5l.ru/welcome.jpg"
|
|
|
+ tags: ["новости", "приветствие"]
|
|
|
+ author: "Администрация"
|
|
|
+ status: "published"
|
|
|
+ created_at: new Date().toISOString()
|
|
|
+ updated_at: new Date().toISOString()
|
|
|
+ views: 0
|
|
|
+ }
|
|
|
|
|
|
- if response.status == 201
|
|
|
- debug.log "Design документ успешно обновлен"
|
|
|
- else
|
|
|
- debug.log "Ошибка при обновлении design документа: "+response.status
|
|
|
-
|
|
|
- catch error
|
|
|
- debug.log "Ошибка при обновлении design документа: "+error
|
|
|
-
|
|
|
- # Добавление тестовых данных
|
|
|
- seedTestData: ->
|
|
|
- testData = [
|
|
|
+ # Слайды
|
|
|
{
|
|
|
- _id: 'slide_welcome'
|
|
|
- type: 'slide'
|
|
|
- title: 'Добро пожаловать в Кохи Борбад'
|
|
|
- content: '# Концертный зал Борбад\n\nПриветствуем вас в самом современном концертном зале Душанбе!'
|
|
|
- image: '/assets/borbad.s5l.ru/welcome-slide.jpg'
|
|
|
+ _id: "slide_"+Math.floor(Math.random() * 9000) + 1000
|
|
|
+ type: "slide"
|
|
|
+ title: "Концертный зал Борбад"
|
|
|
+ content: "## Современное пространство для искусства\n\nЛучшие мероприятия города"
|
|
|
+ image: "/assets/borbad.s5l.ru/slide1.jpg"
|
|
|
order: 1
|
|
|
active: true
|
|
|
+ button_text: "Узнать больше"
|
|
|
+ button_link: "/about"
|
|
|
created_at: new Date().toISOString()
|
|
|
updated_at: new Date().toISOString()
|
|
|
}
|
|
|
+
|
|
|
+ # Мероприятия
|
|
|
{
|
|
|
- _id: 'event_concert_1'
|
|
|
- type: 'event'
|
|
|
- title: 'Симфонический оркестр'
|
|
|
- content: '## Концерт симфонического оркестра\n\nВ программе произведения классической музыки.'
|
|
|
+ _id: "event_"+Math.floor(Math.random() * 9000) + 1000
|
|
|
+ type: "event"
|
|
|
+ title: "Симфонический концерт"
|
|
|
+ content: "## Программа вечера\n\n- Бетховен Симфония №5\n- Чайковский Лебединое озеро"
|
|
|
event_date: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000).toISOString()
|
|
|
- location: 'Большой зал'
|
|
|
- price: 150
|
|
|
- tags: ['концерт', 'классика', 'оркестр']
|
|
|
- image: '/assets/borbad.s5l.ru/concert-1.jpg'
|
|
|
+ end_date: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000 + 2 * 60 * 60 * 1000).toISOString()
|
|
|
+ location: "Большой зал"
|
|
|
+ price: 500
|
|
|
+ currency: "TJS"
|
|
|
+ available_tickets: 100
|
|
|
+ total_tickets: 100
|
|
|
+ image: "/assets/borbad.s5l.ru/concert1.jpg"
|
|
|
+ gallery: [
|
|
|
+ "/assets/borbad.s5l.ru/gallery1.jpg"
|
|
|
+ "/assets/borbad.s5l.ru/gallery2.jpg"
|
|
|
+ ]
|
|
|
+ tags: ["концерт", "симфоническая музыка", "классика"]
|
|
|
+ status: "upcoming"
|
|
|
+ registration_required: true
|
|
|
+ created_at: new Date().toISOString()
|
|
|
+ updated_at: new Date().toISOString()
|
|
|
+ }
|
|
|
+
|
|
|
+ # Товары
|
|
|
+ {
|
|
|
+ _id: "product_"+Math.floor(Math.random() * 9000) + 1000
|
|
|
+ type: "product"
|
|
|
+ title: "Футболка с логотипом"
|
|
|
+ content: "## Качественная хлопковая футболка\n\nРазмеры: S, M, L, XL"
|
|
|
+ excerpt: "Фирменная футболка концертного зала"
|
|
|
+ image: "/assets/borbad.s5l.ru/tshirt.jpg"
|
|
|
+ price: 250
|
|
|
+ currency: "TJS"
|
|
|
+ category: "сувениры"
|
|
|
+ tags: ["одежда", "сувениры", "мерч"]
|
|
|
+ attributes:
|
|
|
+ sizes: ["S", "M", "L", "XL"]
|
|
|
+ colors: ["белый", "черный"]
|
|
|
+ material: "100% хлопок"
|
|
|
+ inventory: 50
|
|
|
+ status: "available"
|
|
|
created_at: new Date().toISOString()
|
|
|
updated_at: new Date().toISOString()
|
|
|
}
|
|
|
+
|
|
|
+ # Категории
|
|
|
{
|
|
|
- _id: 'blog_about'
|
|
|
- type: 'blog_post'
|
|
|
- title: 'О нашем зале'
|
|
|
- content: '## История создания\n\nКонцертный зал Борбад был открыт в 2023 году...'
|
|
|
- tags: ['история', 'архитектура']
|
|
|
+ _id: "category_"+Math.floor(Math.random() * 9000) + 1000
|
|
|
+ type: "category"
|
|
|
+ name: "Концерты"
|
|
|
+ slug: "concerts"
|
|
|
+ description: "Музыкальные мероприятия"
|
|
|
+ image: "/assets/borbad.s5l.ru/category-concerts.jpg"
|
|
|
+ parent: null
|
|
|
+ order: 1
|
|
|
+ created_at: new Date().toISOString()
|
|
|
+ updated_at: new Date().toISOString()
|
|
|
+ }
|
|
|
+
|
|
|
+ # Темы
|
|
|
+ {
|
|
|
+ _id: "theme_"+Math.floor(Math.random() * 9000) + 1000
|
|
|
+ type: "theme"
|
|
|
+ name: "Классическая музыка"
|
|
|
+ slug: "classical-music"
|
|
|
+ description: "Мероприятия классической музыки"
|
|
|
+ color: "#3B82F6"
|
|
|
created_at: new Date().toISOString()
|
|
|
updated_at: new Date().toISOString()
|
|
|
}
|
|
|
]
|
|
|
|
|
|
- for doc in testData
|
|
|
- try
|
|
|
- response = await fetch(@baseUrl+"/"+@dbName+"/"+doc._id,
|
|
|
- method: 'PUT'
|
|
|
- headers:
|
|
|
- 'Content-Type': 'application/json'
|
|
|
- body: JSON.stringify(doc)
|
|
|
- )
|
|
|
-
|
|
|
- if response.status == 201
|
|
|
- debug.log "Документ "+doc._id+" успешно создан"
|
|
|
- else
|
|
|
- debug.log "Ошибка при создании документа "+doc._id+": "+response.status
|
|
|
-
|
|
|
- catch error
|
|
|
- debug.log "Ошибка при создании тестового документа: "+error
|
|
|
-
|
|
|
+ try
|
|
|
+ for doc in sampleData
|
|
|
+ try
|
|
|
+ # Проверяем существует ли документ
|
|
|
+ existing = await @db.get(doc._id)
|
|
|
+ doc._rev = existing._rev
|
|
|
+ await @db.put(doc)
|
|
|
+ debug.log "Обновлен документ: "+doc._id
|
|
|
+ catch error
|
|
|
+ if error.status is 404
|
|
|
+ # Документ не существует, создаем новый
|
|
|
+ await @db.put(doc)
|
|
|
+ debug.log "Создан документ: "+doc._id
|
|
|
+ else
|
|
|
+ throw error
|
|
|
+
|
|
|
+ debug.log "Тестовые данные успешно созданы"
|
|
|
+ catch error
|
|
|
+ debug.log "Ошибка при создании тестовых данных: "+error
|
|
|
+
|
|
|
# Основной метод инициализации
|
|
|
initialize: ->
|
|
|
- debug.log "Начало инициализации базы данных мероприятий"
|
|
|
- await this.checkDatabase()
|
|
|
- await this.setupDesignDocuments()
|
|
|
- await this.seedTestData()
|
|
|
+ debug.log "Начало инициализации базы данных"
|
|
|
+
|
|
|
+ await @createDatabaseIfNotExists()
|
|
|
+ await @setupDesignDocuments()
|
|
|
+ await @createSampleData()
|
|
|
+
|
|
|
debug.log "Инициализация базы данных завершена"
|
|
|
|
|
|
# Экспорт класса
|
|
|
-module.exports = EventSeeder
|
|
|
+module.exports = DatabaseSeeder
|
|
|
|
|
|
-# Если файл запускается напрямую
|
|
|
-if require.main == module
|
|
|
- seeder = new EventSeeder()
|
|
|
- seeder.initialize()
|
|
|
+# Если файл запущен напрямую
|
|
|
+if require.main is module
|
|
|
+ seeder = new DatabaseSeeder('borbad_events')
|
|
|
+ seeder.initialize().catch (error) ->
|
|
|
+ debug.log "Критическая ошибка инициализации: "+error
|