| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447 |
- # Design документы для CouchDB с поддержкой мультидоменности
- module.exports =
- # Design документ для настроек доменов
- domains:
- version: "2.0"
- views:
- # Все настройки доменов
- all_domains:
- map: ((doc) ->
- if doc.type is 'domain_settings'
- emit(doc.domain, doc)
- ).toString()
-
- # Активные домены
- active_domains:
- map: ((doc) ->
- if doc.type is 'domain_settings' and doc.active is true
- emit(doc.domain, doc)
- ).toString()
-
- # Домены по приоритету
- by_priority:
- map: ((doc) ->
- if doc.type is 'domain_settings' and doc.active is true
- emit(doc.priority or 0, doc)
- ).toString()
- # Design документ для блог постов с мультидоменностью
- blog_posts:
- version: "2.0"
- views:
- # Все опубликованные блог посты с фильтром по домену
- published:
- map: ((doc) ->
- if doc.type is 'blog_post' and doc.status is 'published'
- domain = doc.domain or 'default'
- emit([domain, doc.created_at], doc)
- ).toString()
-
- # Блог посты по тегам с фильтром по домену
- by_tag:
- map: ((doc) ->
- if doc.type is 'blog_post' and doc.status is 'published' and doc.tags
- domain = doc.domain or 'default'
- for tag in doc.tags
- emit([domain, tag, doc.created_at], doc)
- ).toString()
-
- # Блог посты по автору с фильтром по домену
- by_author:
- map: ((doc) ->
- if doc.type is 'blog_post' and doc.status is 'published'
- domain = doc.domain or 'default'
- emit([domain, doc.author, doc.created_at], doc)
- ).toString()
-
- # Поиск по заголовку и содержанию с фильтром по домену
- search:
- map: ((doc) ->
- if doc.type is 'blog_post' and doc.status is 'published'
- domain = doc.domain or 'default'
- text = (doc.title + " " + doc.content + " " + doc.excerpt).toLowerCase()
- words = text.split(/\W+/).filter (word) -> word.length > 2
-
- for word in words
- emit([domain, word], {
- _id: doc._id
- title: doc.title
- excerpt: doc.excerpt
- created_at: doc.created_at
- domain: doc.domain
- })
- ).toString()
- # Design документ для мероприятий с мультидоменностью
- events:
- version: "2.0"
- views:
- # Все мероприятия по дате с фильтром по домену
- by_date:
- map: ((doc) ->
- if doc.type is 'event'
- domain = doc.domain or 'default'
- emit([domain, doc.event_date], doc)
- ).toString()
-
- # Предстоящие мероприятия с фильтром по домену
- upcoming:
- map: ((doc) ->
- if doc.type is 'event' and doc.status is 'upcoming'
- domain = doc.domain or 'default'
- emit([domain, doc.event_date], doc)
- ).toString()
-
- # Активные мероприятия с фильтром по домену
- ongoing:
- map: ((doc) ->
- if doc.type is 'event' and doc.status is 'ongoing'
- domain = doc.domain or 'default'
- emit([domain, doc.event_date], doc)
- ).toString()
-
- # Мероприятия по тегам с фильтром по домену
- by_tag:
- map: ((doc) ->
- if doc.type is 'event' and doc.tags
- domain = doc.domain or 'default'
- for tag in doc.tags
- emit([domain, tag, doc.event_date], doc)
- ).toString()
-
- # Мероприятия по местоположению с фильтром по домену
- by_location:
- map: ((doc) ->
- if doc.type is 'event'
- domain = doc.domain or 'default'
- emit([domain, doc.location, doc.event_date], doc)
- ).toString()
- # Design документ для слайдов с мультидоменностью
- slides:
- version: "2.0"
- views:
- # Активные слайды по порядку с фильтром по домену
- active_ordered:
- map: ((doc) ->
- if doc.type is 'slide' and doc.active is true
- domain = doc.domain or 'default'
- emit([domain, doc.order], doc)
- ).toString()
- # Design документ для товаров с мультидоменностью
- products:
- version: "2.0"
- views:
- # Все доступные товары с фильтром по домену
- available:
- map: ((doc) ->
- if doc.type is 'product' and doc.status is 'available'
- domain = doc.domain or 'default'
- emit([domain, doc.created_at], doc)
- ).toString()
-
- # Товары по категориям с фильтром по домену
- by_category:
- map: ((doc) ->
- if doc.type is 'product' and doc.status is 'available'
- domain = doc.domain or 'default'
- emit([domain, doc.category, doc.created_at], doc)
- ).toString()
-
- # Товары по тегам с фильтром по домену
- by_tag:
- map: ((doc) ->
- if doc.type is 'product' and doc.tags
- domain = doc.domain or 'default'
- for tag in doc.tags
- emit([domain, tag, doc.created_at], doc)
- ).toString()
-
- # Товары по цене с фильтром по домену
- by_price:
- map: ((doc) ->
- if doc.type is 'product' and doc.status is 'available'
- domain = doc.domain or 'default'
- emit([domain, doc.price], doc)
- ).toString()
- # Design документ для категорий и тем с мультидоменностью
- categories_themes:
- version: "2.0"
- views:
- # Все категории по порядку с фильтром по домену
- categories_ordered:
- map: ((doc) ->
- if doc.type is 'category'
- domain = doc.domain or 'default'
- emit([domain, doc.order], doc)
- ).toString()
-
- # Категории по родителю с фильтром по домену
- categories_by_parent:
- map: ((doc) ->
- if doc.type is 'category'
- domain = doc.domain or 'default'
- parent = doc.parent or 'root'
- emit([domain, parent, doc.order], doc)
- ).toString()
-
- # Все темы с фильтром по домену
- themes:
- map: ((doc) ->
- if doc.type is 'theme'
- domain = doc.domain or 'default'
- emit([domain, doc.name], doc)
- ).toString()
- # Design документ для страниц с мультидоменностью
- pages:
- version: "2.0"
- views:
- # Все страницы по slug с фильтром по домену
- by_slug:
- map: ((doc) ->
- if doc.type is 'page'
- domain = doc.domain or 'default'
- emit([domain, doc.slug], doc)
- ).toString()
-
- # Опубликованные страницы с фильтром по домену
- published:
- map: ((doc) ->
- if doc.type is 'page' and doc.status is 'published'
- domain = doc.domain or 'default'
- emit([domain, doc.order or 0], doc)
- ).toString()
- # Design документ для меню с мультидоменностью
- menus:
- version: "2.0"
- views:
- # Меню по локации с фильтром по домену
- by_location:
- map: ((doc) ->
- if doc.type is 'menu'
- domain = doc.domain or 'default'
- emit([domain, doc.location], doc)
- ).toString()
-
- # Активные меню с фильтром по домену
- active:
- map: ((doc) ->
- if doc.type is 'menu' and doc.active is true
- domain = doc.domain or 'default'
- emit([domain, doc.location], doc)
- ).toString()
- # Design документ для настроек с мультидоменностью
- settings:
- version: "2.0"
- views:
- # Настройки по ключу с фильтром по домену
- by_key:
- map: ((doc) ->
- if doc.type is 'setting'
- domain = doc.domain or 'default'
- emit([domain, doc.key], doc)
- ).toString()
- # Design документ для пользователей
- users:
- version: "2.0"
- views:
- # Пользователи по email
- by_email:
- map: ((doc) ->
- if doc.type is 'user'
- emit(doc.email, doc)
- ).toString()
-
- # Пользователи по роли
- by_role:
- map: ((doc) ->
- if doc.type is 'user'
- emit(doc.role, doc)
- ).toString()
-
- # Активные пользователи
- active:
- map: ((doc) ->
- if doc.type is 'user' and doc.active is true
- emit(doc.email, doc)
- ).toString()
- # Design документ для заказов с мультидоменностью
- orders:
- version: "2.0"
- views:
- # Заказы по статусу с фильтром по домену
- by_status:
- map: ((doc) ->
- if doc.type is 'order'
- domain = doc.domain or 'default'
- emit([domain, doc.status, doc.created_at], doc)
- ).toString()
-
- # Заказы по пользователю с фильтром по домену
- by_user:
- map: ((doc) ->
- if doc.type is 'order'
- domain = doc.domain or 'default'
- emit([domain, doc.user_id, doc.created_at], doc)
- ).toString()
- # Design документ для глобального поиска с мультидоменностью
- global_search:
- version: "2.0"
- views:
- # Глобальный поиск по всем типам документов с фильтром по домену
- all_content:
- map: ((doc) ->
- searchFields = {}
- domain = doc.domain or 'default'
-
- switch doc.type
- when 'blog_post'
- if doc.status is 'published'
- searchFields =
- title: doc.title
- content: doc.content
- excerpt: doc.excerpt
- author: doc.author
- tags: doc.tags
- type: 'blog_post'
-
- when 'event'
- searchFields =
- title: doc.title
- content: doc.content
- location: doc.location
- tags: doc.tags
- type: 'event'
-
- when 'product'
- if doc.status is 'available'
- searchFields =
- title: doc.title
- content: doc.content
- excerpt: doc.excerpt
- category: doc.category
- tags: doc.tags
- type: 'product'
-
- when 'category', 'theme'
- searchFields =
- name: doc.name
- description: doc.description
- type: doc.type
-
- when 'page'
- if doc.status is 'published'
- searchFields =
- title: doc.title
- content: doc.content
- type: 'page'
-
- # Создаем поисковый индекс
- if searchFields.title
- text = (
- searchFields.title + " " +
- (searchFields.content or "") + " " +
- (searchFields.excerpt or "") + " " +
- (searchFields.author or "") + " " +
- (searchFields.location or "") + " " +
- (searchFields.description or "")
- ).toLowerCase()
-
- # Добавляем теги
- if searchFields.tags
- text += " " + searchFields.tags.join(" ")
-
- words = text.split(/\W+/).filter (word) -> word.length > 2
-
- for word in words
- emit([domain, word], {
- _id: doc._id
- type: searchFields.type
- title: searchFields.title
- excerpt: searchFields.excerpt
- created_at: doc.created_at
- domain: domain
- })
- ).toString()
- # Design документ для статистики с мультидоменностью
- statistics:
- version: "2.0"
- views:
- # Статистика по типам документов с фильтром по домену
- by_type:
- map: ((doc) ->
- domain = doc.domain or 'default'
- emit([domain, doc.type], 1)
- ).toString()
- reduce: ((keys, values) ->
- sum values
- ).toString()
-
- # Статистика просмотров блог постов с фильтром по домену
- blog_views:
- map: ((doc) ->
- if doc.type is 'blog_post'
- domain = doc.domain or 'default'
- emit([domain, doc._id], doc.views or 0)
- ).toString()
- reduce: ((keys, values) ->
- sum values
- ).toString()
-
- # Статистика мероприятий по статусу с фильтром по домену
- events_by_status:
- map: ((doc) ->
- if doc.type is 'event'
- domain = doc.domain or 'default'
- emit([domain, doc.status], 1)
- ).toString()
- reduce: ((keys, values) ->
- sum values
- ).toString()
-
- # Статистика продаж товаров с фильтром по домену
- product_sales:
- map: ((doc) ->
- if doc.type is 'order' and doc.items
- domain = doc.domain or 'default'
- for item in doc.items
- emit([domain, item.product_id], item.quantity)
- ).toString()
- reduce: ((keys, values) ->
- sum values
- ).toString()
- # Design документ для ревизий и аудита
- audit:
- version: "2.0"
- views:
- # Логи изменений по дате
- by_date:
- map: ((doc) ->
- if doc.type is 'audit_log'
- emit(doc.created_at, doc)
- ).toString()
-
- # Логи по пользователю
- by_user:
- map: ((doc) ->
- if doc.type is 'audit_log'
- emit([doc.user_id, doc.created_at], doc)
- ).toString()
-
- # Логи по действию
- by_action:
- map: ((doc) ->
- if doc.type is 'audit_log'
- emit([doc.action, doc.created_at], doc)
- ).toString()
|