openapi: 3.0.0 info: title: Анонимные опросы API description: API для работы с системой анонимных опросов version: 1.0.0 servers: - url: /questioneer/api description: Базовый URL API paths: /questionnaires: get: summary: Получить список опросов пользователя description: Возвращает список всех опросов, сохраненных в локальном хранилище браузера operationId: getQuestionnaires responses: '200': description: Успешный запрос content: application/json: schema: $ref: '#/components/schemas/QuestionnairesResponse' post: summary: Создать новый опрос description: Создает новый опрос с указанными параметрами operationId: createQuestionnaire requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/QuestionnaireCreate' responses: '200': description: Опрос успешно создан content: application/json: schema: $ref: '#/components/schemas/QuestionnaireResponse' /questionnaires/public/{publicLink}: get: summary: Получить опрос для участия description: Возвращает данные опроса по публичной ссылке operationId: getPublicQuestionnaire parameters: - name: publicLink in: path required: true schema: type: string responses: '200': description: Успешный запрос content: application/json: schema: $ref: '#/components/schemas/QuestionnaireResponse' '404': description: Опрос не найден content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /questionnaires/admin/{adminLink}: get: summary: Получить опрос для редактирования и просмотра результатов description: Возвращает данные опроса по административной ссылке operationId: getAdminQuestionnaire parameters: - name: adminLink in: path required: true schema: type: string responses: '200': description: Успешный запрос content: application/json: schema: $ref: '#/components/schemas/QuestionnaireResponse' '404': description: Опрос не найден content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' put: summary: Обновить опрос description: Обновляет существующий опрос operationId: updateQuestionnaire parameters: - name: adminLink in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/QuestionnaireUpdate' responses: '200': description: Опрос успешно обновлен content: application/json: schema: $ref: '#/components/schemas/QuestionnaireResponse' '404': description: Опрос не найден content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' delete: summary: Удалить опрос description: Удаляет опрос вместе со всеми ответами operationId: deleteQuestionnaire parameters: - name: adminLink in: path required: true schema: type: string responses: '200': description: Опрос успешно удален content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '404': description: Опрос не найден content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /vote/{publicLink}: post: summary: Отправить ответы на опрос description: Отправляет ответы пользователя на опрос operationId: submitVote parameters: - name: publicLink in: path required: true schema: type: string requestBody: required: true content: application/json: schema: $ref: '#/components/schemas/VoteRequest' responses: '200': description: Ответы успешно отправлены content: application/json: schema: $ref: '#/components/schemas/SuccessResponse' '404': description: Опрос не найден content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' /results/{publicLink}: get: summary: Получить результаты опроса description: Возвращает текущие результаты опроса operationId: getResults parameters: - name: publicLink in: path required: true schema: type: string responses: '200': description: Успешный запрос content: application/json: schema: $ref: '#/components/schemas/ResultsResponse' '404': description: Опрос не найден content: application/json: schema: $ref: '#/components/schemas/ErrorResponse' components: schemas: QuestionnaireCreate: type: object required: - title - questions properties: title: type: string description: Название опроса description: type: string description: Описание опроса questions: type: array description: Список вопросов items: $ref: '#/components/schemas/Question' displayType: type: string description: Тип отображения опроса enum: [standard, step_by_step] default: standard QuestionnaireUpdate: type: object properties: title: type: string description: Название опроса description: type: string description: Описание опроса questions: type: array description: Список вопросов items: $ref: '#/components/schemas/Question' displayType: type: string description: Тип отображения опроса enum: [standard, step_by_step] Question: type: object required: - text - type properties: text: type: string description: Текст вопроса type: type: string description: Тип вопроса enum: [single, multiple, text, scale, rating, tagcloud] required: type: boolean description: Является ли вопрос обязательным default: false options: type: array description: Варианты ответа (для single, multiple) items: $ref: '#/components/schemas/Option' tags: type: array description: Список тегов (для tagcloud) items: $ref: '#/components/schemas/Tag' scaleMin: type: integer description: Минимальное значение шкалы (для scale) default: 0 scaleMax: type: integer description: Максимальное значение шкалы (для scale) default: 10 scaleMinLabel: type: string description: Метка для минимального значения шкалы default: "Минимум" scaleMaxLabel: type: string description: Метка для максимального значения шкалы default: "Максимум" Option: type: object required: - text properties: text: type: string description: Текст варианта ответа votes: type: integer description: Количество голосов за этот вариант default: 0 Tag: type: object required: - text properties: text: type: string description: Текст тега count: type: integer description: Количество выборов данного тега default: 0 VoteRequest: type: object required: - answers properties: answers: type: array description: Список ответов пользователя items: $ref: '#/components/schemas/Answer' Answer: type: object required: - questionIndex properties: questionIndex: type: integer description: Индекс вопроса optionIndices: type: array description: Индексы выбранных вариантов (для single, multiple) items: type: integer textAnswer: type: string description: Текстовый ответ пользователя (для text) scaleValue: type: integer description: Значение шкалы (для scale, rating) tagTexts: type: array description: Тексты выбранных или введенных тегов (для tagcloud) items: type: string QuestionnairesResponse: type: object properties: success: type: boolean description: Успешность запроса data: type: array description: Список опросов items: $ref: '#/components/schemas/QuestionnaireInfo' QuestionnaireResponse: type: object properties: success: type: boolean description: Успешность запроса data: $ref: '#/components/schemas/QuestionnaireData' QuestionnaireInfo: type: object properties: title: type: string description: Название опроса description: type: string description: Описание опроса adminLink: type: string description: Административная ссылка publicLink: type: string description: Публичная ссылка createdAt: type: string format: date-time description: Дата создания опроса updatedAt: type: string format: date-time description: Дата последнего обновления опроса QuestionnaireData: type: object properties: _id: type: string description: Идентификатор опроса title: type: string description: Название опроса description: type: string description: Описание опроса questions: type: array description: Список вопросов items: $ref: '#/components/schemas/QuestionData' displayType: type: string description: Тип отображения опроса enum: [standard, step_by_step] adminLink: type: string description: Административная ссылка publicLink: type: string description: Публичная ссылка createdAt: type: string format: date-time description: Дата создания опроса updatedAt: type: string format: date-time description: Дата последнего обновления опроса QuestionData: type: object properties: _id: type: string description: Идентификатор вопроса text: type: string description: Текст вопроса type: type: string description: Тип вопроса required: type: boolean description: Является ли вопрос обязательным options: type: array description: Варианты ответа (для single, multiple) items: $ref: '#/components/schemas/OptionData' tags: type: array description: Список тегов (для tagcloud) items: $ref: '#/components/schemas/TagData' scaleMin: type: integer description: Минимальное значение шкалы (для scale) scaleMax: type: integer description: Максимальное значение шкалы (для scale) scaleMinLabel: type: string description: Метка для минимального значения шкалы scaleMaxLabel: type: string description: Метка для максимального значения шкалы answers: type: array description: Текстовые ответы (для text) items: type: string scaleValues: type: array description: Значения шкалы от пользователей (для scale, rating) items: type: integer textAnswers: type: array description: Текстовые ответы (для text) items: type: string responses: type: array description: Значения шкалы от пользователей (для scale, rating) items: type: integer OptionData: type: object properties: _id: type: string description: Идентификатор варианта ответа text: type: string description: Текст варианта ответа votes: type: integer description: Количество голосов за этот вариант count: type: integer description: Альтернативное поле для количества голосов TagData: type: object properties: _id: type: string description: Идентификатор тега text: type: string description: Текст тега count: type: integer description: Количество выборов данного тега ResultsResponse: type: object properties: success: type: boolean description: Успешность запроса data: $ref: '#/components/schemas/ResultsData' ResultsData: type: object properties: questions: type: array description: Список вопросов с результатами items: $ref: '#/components/schemas/QuestionResults' QuestionResults: type: object properties: text: type: string description: Текст вопроса type: type: string description: Тип вопроса options: type: array description: Варианты ответа с количеством голосов (для single, multiple) items: type: object properties: text: type: string description: Текст варианта ответа count: type: integer description: Количество голосов tags: type: array description: Список тегов с количеством выборов (для tagcloud) items: type: object properties: text: type: string description: Текст тега count: type: integer description: Количество выборов scaleValues: type: array description: Значения шкалы от пользователей (для scale, rating) items: type: integer scaleAverage: type: number description: Среднее значение шкалы (для scale, rating) answers: type: array description: Текстовые ответы (для text) items: type: string responses: type: array description: Значения шкалы от пользователей (для scale, rating) items: type: integer SuccessResponse: type: object properties: success: type: boolean description: Успешность запроса example: true message: type: string description: Сообщение об успешном выполнении ErrorResponse: type: object properties: success: type: boolean description: Успешность запроса example: false error: type: string description: Сообщение об ошибке