# Подключение необходимых модулей 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' # Проверка существования базы данных 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: -> try response = await fetch(@baseUrl+"/"+@dbName, method: 'PUT' headers: 'Content-Type': 'application/json' ) if response.status == 201 debug.log "База данных успешно создана" else debug.log "Ошибка при создании базы: "+response.status catch error debug.log "Ошибка при создании базы данных: "+error # Проверка и создание/обновление 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 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) ) 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' order: 1 active: true created_at: new Date().toISOString() updated_at: new Date().toISOString() } { _id: 'event_concert_1' type: 'event' title: 'Симфонический оркестр' content: '## Концерт симфонического оркестра\n\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' created_at: new Date().toISOString() updated_at: new Date().toISOString() } { _id: 'blog_about' type: 'blog_post' title: 'О нашем зале' content: '## История создания\n\nКонцертный зал Борбад был открыт в 2023 году...' tags: ['история', 'архитектура'] 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 # Основной метод инициализации initialize: -> debug.log "Начало инициализации базы данных мероприятий" await this.checkDatabase() await this.setupDesignDocuments() await this.seedTestData() debug.log "Инициализация базы данных завершена" # Экспорт класса module.exports = EventSeeder # Если файл запускается напрямую if require.main == module seeder = new EventSeeder() seeder.initialize()