60 lines
1.7 KiB
JavaScript
60 lines
1.7 KiB
JavaScript
|
const mongoose = require('mongoose');
|
||
|
|
||
|
// Типы вопросов
|
||
|
const QUESTION_TYPES = {
|
||
|
SINGLE_CHOICE: 'single_choice', // Один вариант
|
||
|
MULTIPLE_CHOICE: 'multiple_choice', // Несколько вариантов
|
||
|
TEXT: 'text', // Текстовый ответ
|
||
|
RATING: 'rating', // Оценка по шкале
|
||
|
TAG_CLOUD: 'tag_cloud' // Облако тегов
|
||
|
};
|
||
|
|
||
|
// Типы отображения
|
||
|
const DISPLAY_TYPES = {
|
||
|
DEFAULT: 'default',
|
||
|
TAG_CLOUD: 'tag_cloud',
|
||
|
VOTING: 'voting',
|
||
|
POLL: 'poll'
|
||
|
};
|
||
|
|
||
|
// Схема варианта ответа
|
||
|
const optionSchema = new mongoose.Schema({
|
||
|
text: { type: String, required: true },
|
||
|
count: { type: Number, default: 0 } // счетчик голосов
|
||
|
});
|
||
|
|
||
|
// Схема вопроса
|
||
|
const questionSchema = new mongoose.Schema({
|
||
|
text: { type: String, required: true },
|
||
|
type: {
|
||
|
type: String,
|
||
|
enum: Object.values(QUESTION_TYPES),
|
||
|
required: true
|
||
|
},
|
||
|
options: [optionSchema],
|
||
|
required: { type: Boolean, default: false }
|
||
|
});
|
||
|
|
||
|
// Схема опроса
|
||
|
const questionnaireSchema = new mongoose.Schema({
|
||
|
title: { type: String, required: true },
|
||
|
description: { type: String },
|
||
|
questions: [questionSchema],
|
||
|
displayType: {
|
||
|
type: String,
|
||
|
enum: Object.values(DISPLAY_TYPES),
|
||
|
default: DISPLAY_TYPES.DEFAULT
|
||
|
},
|
||
|
createdAt: { type: Date, default: Date.now },
|
||
|
updatedAt: { type: Date, default: Date.now },
|
||
|
adminLink: { type: String, required: true }, // ссылка для редактирования
|
||
|
publicLink: { type: String, required: true } // ссылка для голосования
|
||
|
});
|
||
|
|
||
|
const Questionnaire = mongoose.model('Questionnaire', questionnaireSchema);
|
||
|
|
||
|
module.exports = {
|
||
|
Questionnaire,
|
||
|
QUESTION_TYPES,
|
||
|
DISPLAY_TYPES
|
||
|
};
|