core/openapi.yaml

1211 lines
41 KiB
YAML
Raw Normal View History

2024-03-13 18:23:46 +00:00
openapi: 3.0.3
info:
title: QUIZ service api
description: Title
version: 1.0.0
components:
requestBodies:
GetQuizResultsReq:
content:
'application/json':
schema:
type: object
properties:
to:
description: таймштамп времени, до которого выбирать статистику. если 0 или не передано - этого ограничения нет. верхняя граница времени
type: integer
from:
description: таймштамп времени, после которого выбирать статистику. если 0 или не передано - этого ограничения нет. нижняя граница времени
new:
description: флаг, по которому вернутся только новые результаты, ещё не просмотренные пользователем
type: boolean
page:
description: номер страницы для пагинации
type: integer
require: true
limit:
description: размер страницы для пагинации
type: integer
require: true
QuizCreateReq:
content:
'application/json':
schema:
type: object
properties:
fingerprinting:
description: set true for save deviceId
type: boolean
repeatable:
description: set true for allow user to repeat quiz
type: boolean
note_prevented:
description: set true for save statistic of incomplete quiz passing
type: boolean
mail_notifications:
description: set true for mail notification for each quiz passing
type: boolean
unique_answers:
description: set true for save statistics only for unique quiz passing
type: boolean
name:
description: name of quiz. max 280 length
type: string
description:
description: description of quiz
type: string
config:
description: config of quiz. serialized json for rules of quiz flow
type: string
status:
description: status of quiz. allow only '', 'draft', 'template', 'stop', 'start'
type: string
limit:
description: limit is count of max quiz passing
type: integer
due_to:
description: last time when quiz is valid. timestamp in seconds
type: integer
time_of_passing:
description: seconds to pass quiz
type: integer
pausable:
description: true if it is allowed for pause quiz
type: boolean
question_cnt:
description: count of questions
type: integer
super:
description: set true if squiz realize group functionality
type: boolean
group_id:
description: group of new quiz
type: integer
QuizGetListReq:
content:
'application/json':
schema:
type: object
properties:
limit:
description: max items on page
type: integer
offset:
description: page number
type: integer
from:
description: start time of time period. timestamp in seconds
type: integer
to:
description: end time of time period. timestamp in seconds
type: integer
search:
description: string for fulltext search in titles of quizes
type: string
status:
description: allow only - draft, template, timeout, stop, start, offlimit
type: string
deleted:
description: get deleted quizes
type: boolean
archived:
description: get archived quizes
type: boolean
super:
description: set true if squiz realize group functionality
type: boolean
group_id:
description: group of new quiz
type: integer
QuestionCreateReq:
content:
'application/json':
schema:
type: object
properties:
quiz_id:
description: id of quiz for what question is creating
type: integer
title:
description: title of question. max length 512
type: string
description:
description: description of question. html/text
type: string
type:
description: type of question. allow only text, select, file, variant, images, varimg, emoji, date, number, page, rating
type: string
required:
description: set true if user MUST answer this question
type: boolean
page:
description: page of question
type: integer
content:
description: json serialized of question content settings
type: string
QuestionGetListReq:
content:
'application/json':
schema:
type: object
properties:
limit:
description: max items on page
type: integer
offset:
description: page number
type: integer
from:
description: start time of time period. timestamp in seconds
type: integer
to:
description: end time of time period. timestamp in seconds
type: integer
search:
description: string for fulltext search in titles of questions
type: string
type:
description: allow only - text, select, file, variant, images, varimg, emoji, date, number, page, rating or empty string
type: string
deleted:
description: get deleted quizes
type: boolean
required:
description: get only require questions
type: boolean
quiz_id:
description: relation to quiz
type: integer
GetQuizReq:
content:
'application/json':
schema:
type: object
properties:
quiz_id:
type: string
description: secret string id for customer activity
limit:
type: integer
description: page size
page:
type: integer
description: page of questions
need_config:
type: boolean
description: make true if you need all quiz settings with questions page
UpdateQuestionReq:
content:
'application/json':
schema:
type: object
properties:
id:
type: integer
description: id of question for update
required: true
title:
type: string
description: new title of question
desc:
type: string
description: new fulltext plain/html description
type:
type: string
description: new type of question
content:
type: string
description: new content of question
required:
type: boolean
description: set true if this question must be answered
page:
type: integer
description: page of question
UpdateQuizReq:
content:
'application/json':
schema:
type: object
properties:
id:
type: integer
description: id of question for update
required: true
fp:
type: boolean
description: set true for storing fingerprints
required: true
rep:
type: boolean
description: set true for allow to repeat quiz after passing
required: true
note_prevented:
type: boolean
description: set true for store unfinished passing
required: true
mailing:
type: boolean
description: set true if we should send passing result on every passing
required: true
uniq:
type: boolean
description: set true if we allow only one user quiz passing
required: true
name:
type: string
description: new name of the quiz
desc:
type: string
description: new descriptions of the quiz
conf:
type: string
description: new config of the quiz
status:
type: string
description: new status. only draft,template,stop,start allowed
limit:
type: integer
description: max amount of quiz passing
required: true
due_to:
type: integer
description: max time of quiz passing
required: true
time_of_passing:
type: integer
description: max time to pass quiz
required: true
pausable:
type: boolean
description: allow to pause quiz to user
required: true
question_cnt:
description: count of questions
type: integer
super:
description: set true if squiz realize group functionality
type: boolean
group_id:
description: group of new quiz
type: integer
CopyQuestionReq:
content:
'application/json':
schema:
type: object
properties:
id:
type: integer
description: id of copying question
required: true
quiz_id:
type: integer
description: quiz id for copy question to another quiz
CopyQuizReq:
content:
'application/json':
schema:
type: object
properties:
id:
type: integer
description: id of copied quiz
required: true
GetQuizHistoryReq:
content:
'application/json':
schema:
type: object
properties:
id:
type: integer
description: id of quiz for history
required: true
l:
type: integer
description: naumber of quiz due page
p:
type: integer
description: number of page
DeactivateReq:
content:
'application/json':
schema:
type: object
properties:
id:
type: integer
description: id of deactivating struct
required: true
responses:
GetQuizResultsResp:
description: список результатов, уместившийся на запрошенной странице
content:
'application/json':
schema:
type: object
properties:
total_count:
description: общее количество элементов удволетворяющее фильтру. нужно для формирования логики пагинации
type: integer
results:
description: список результатов
type: array
items:
type: object
properties:
content:
description: содержимое ответа
type: string
id:
description: айдишник ответа
type: integer
new:
description: статус, был ли просмотрен ответ
type: boolean
created_at:
description: время создания этого результата
type: string
QuizModel:
description: object of created quiz
content:
'application/json':
schema:
type: object
properties:
id:
description: Id of created quiz
type: integer
qid:
description: string id for customers
type: string
deleted:
description: true if quiz deleted
type: boolean
archived:
description: true if quiz archived
type: boolean
fingerprinting:
description: set true for save deviceId
type: boolean
repeatable:
description: set true for allow user to repeat quiz
type: boolean
note_prevented:
description: set true for save statistic of incomplete quiz passing
type: boolean
mail_notifications:
description: set true for mail notification for each quiz passing
type: boolean
unique_answers:
description: set true for save statistics only for unique quiz passing
type: boolean
name:
description: name of quiz. max 280 length
type: string
description:
description: description of quiz
type: string
config:
description: config of quiz. serialized json for rules of quiz flow
type: string
status:
description: status of quiz. allow only '', 'draft', 'template', 'stop', 'start'
type: string
limit:
description: limit is count of max quiz passing
type: integer
due_to:
description: last time when quiz is valid. timestamp in seconds
type: integer
time_of_passing:
description: seconds to pass quiz
type: integer
pausable:
description: true if it is allowed for pause quiz
type: boolean
version:
description: version of quiz
type: integer
version_comment:
description: version comment to version of quiz
type: string
parent_ids:
description: array of previous versions of quiz
type: array
items:
type: integer
created_at:
description: time of creating
type: string
updated_at:
description: time of last updating
type: string
question_cnt:
description: count of questions
type: integer
passed_count:
description: count passings
type: integer
average_time:
description: average time of passing
type: integer
super:
description: set true if squiz realize group functionality
type: boolean
group_id:
description: group of new quiz
type: integer
QuizListGetResp:
description: list of quizes with all filtered quizes count
content:
'application/json':
schema:
type: object
properties:
count:
description: count of all filtered items
type: integer
items:
description: count of all filtered items
type: array
items:
$ref: '#/components/responses/QuizModel'
QuestionModel:
description: object of created question
content:
'application/json':
schema:
type: object
properties:
id:
description: Id of created question
type: integer
quiz_id:
description: relation to quiz
type: integer
title:
description: title of question. max 512 length
type: string
description:
description: description of question
type: string
type:
description: status of question. allow only text, select, file, variant, images, varimg, emoji, date, number, page, rating
type: string
required:
description: user must pass this question
type: boolean
deleted:
description: true if question is deleted
type: boolean
page:
description: page if question
type: integer
content:
description: serialized json of created question
type: string
version:
description: version of quiz
type: integer
parent_ids:
description: array of previous versions of quiz
type: array
items:
type: integer
created_at:
description: time of creating
type: string
updated_at:
description: time of last updating
type: string
QuestionListGetResp:
description: list of quizes with all filtered quizes count
content:
'application/json':
schema:
type: object
properties:
count:
description: count of all filtered items
type: integer
items:
description: count of all filtered items
type: array
items:
$ref: '#/components/responses/QuizModel'
QuizGetResp:
description: short response for customer
content:
'application/json':
schema:
type: object
properties:
cnt:
type: integer
description: count of all questions in quiz
settings:
type: object
properties:
fp:
type: boolean
description: store fingerprint if true
rep:
type: boolean
description: allow repeat after end of quiz passing
name:
type: string
description: title of quiz
cfg:
type: string
description: serialized json of quiz graph
lim:
type: integer
description: max amount of passing
due:
type: integer
description: last time of new ansvers are valid
delay:
type: integer
description: time that given to customer for pass quiz
pausable:
type: boolean
description: allow user to pause quiz passing
items:
type: array
description: array of xhort items of quiestions for quiz
items:
type: object
properties:
id:
type: integer
description: identificator of question
title:
type: string
description: title of question
desc:
type: string
description: description of question html plaintext
typ:
type: string
description: type of question such as text, select, file, variant, images, varimg, emoji, date, number, page, rating
req:
type: boolean
description: mark question as required
p:
type: integer
description: page of quiz
c:
type: string
description: config of question. such as variants for select
UpdateResp:
description: id of new version of question
content:
'application/json':
schema:
type: object
properties:
updated:
type: integer
DeactivateResp:
description: id of deleted structure
content:
'application/json':
schema:
type: object
properties:
deactivated:
type: integer
schemas:
Answer:
type: object
properties:
Id:
type: integer
description: id ответа
Content:
type: string
description: контент ответа
QuestionId:
type: integer
description: id вопроса к которому ответ
QuizId:
type: integer
description: id опроса к которому ответ
Fingerprint:
type: string
description: fingerprint
Session:
type: string
description: сессия
Result:
type: boolean
description: true or false?
CreatedAt:
type: string
format: date-time
description: таймшап когда ответ создан
New:
type: boolean
description: новый ответ?
Deleted:
type: boolean
description: удален?
paths:
/liveness:
get:
description: Check that service is running
responses:
'200':
description: healthcheck. if it non 200, that service is not running
/readiness:
get:
description: Check that service is ready for handle requests
responses:
'200':
description: healthcheck. if it non 200, that service is not running
/quiz/create:
post:
description: Create quiz
requestBody:
$ref: '#/components/requestBodies/QuizCreateReq'
responses:
'201':
$ref: '#/components/responses/QuizModel'
'422':
description: name field should have less then 280 chars
content:
'application/json':
schema:
type: string
default: name field should have less then 280 chars
'406':
description: not acceptable input data
content:
'application/json':
schema:
type: string
default: status on creating must be only draft,template,stop,start or due to time must be lesser then now
'409':
description: not logical entry
content:
'application/json':
schema:
type: string
default: you can pause quiz only if it has deadline for passing
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
/quiz/getList:
post:
description: method for obtain page of quiz list for paginated list
requestBody:
$ref: '#/components/requestBodies/QuizGetListReq'
responses:
'200':
$ref: '#/components/responses/QuizListGetResp'
'406':
description: inappropriate status, allowed only '', 'stop','start','draft', 'template','timeout','offlimit'
content:
'application/json':
schema:
type: string
default: inappropriate status
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
/question/create:
post:
description: method for creating question for quiz
requestBody:
$ref: '#/components/requestBodies/QuestionCreateReq'
responses:
'200':
$ref: '#/components/responses/QuestionModel'
'422':
description: not valid data
content:
'application/json':
schema:
type: string
default: title field should have less then 512 chars
'406':
description: not acceptable data
content:
'application/json':
schema:
type: string
default: type must be only test,button,file,checkbox,select, none
'424':
description: failed relation to quiz
content:
'application/json':
schema:
type: string
default: failed relation to quiz
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
/question/getList:
post:
description: method for obtain page of question list for paginated list
requestBody:
$ref: '#/components/requestBodies/QuestionGetListReq'
responses:
'200':
$ref: '#/components/responses/QuestionListGetResp'
'406':
description: inappropriate type, allowed only '','test','none','file', 'button','select','checkbox'
content:
'application/json':
schema:
type: string
default: inappropriate status
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
/quiz/get:
post:
description: method for obtaining settings of quiz and question page
requestBody:
$ref: '#/components/requestBodies/GetQuizReq'
responses:
'200':
$ref: '#/components/responses/QuizGetResp'
'206':
$ref: '#/components/responses/QuizGetResp'
'400':
description: you cat get quiz only if you know it's uuid
content:
'application/json':
schema:
type: string
default: no quiz id provided
'411':
description: limit should not be 0 when no aettings is need
content:
'application/json':
schema:
type: string
default: no data requested
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
'423':
description: you can not get data for inactive quiz
content:
'application/json':
schema:
type: string
default: quiz is inactive
'410':
description: you can not get timeouted quiz
content:
'application/json':
schema:
type: string
default: quiz timeouted
/question/edit:
patch:
description: method for update question. delete old question and create new with increment version
requestBody:
$ref: '#/components/requestBodies/UpdateQuestionReq'
responses:
'200':
$ref: '#/components/responses/UpdateResp'
'424':
description: return when no question id was send
content:
'application/json':
schema:
type: string
default: need id of question for update
'422':
description: too large new title
content:
'application/json':
schema:
type: string
default: title field should have less then 512 chars
'406':
description: inappropriate status sent
content:
'application/json':
schema:
type: string
default: type must be only test,button,file,checkbox,select, none or empty string
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
/quiz/edit:
patch:
description: method for update quiz
requestBody:
$ref: '#/components/requestBodies/UpdateQuizReq'
responses:
'200':
$ref: '#/components/responses/UpdateResp'
'424':
description: return when no quiz id was send
content:
'application/json':
schema:
type: string
default: need id of quiz for update
'422':
description: too large new title
content:
'application/json':
schema:
type: string
default: name field should have less then 280 chars
'406':
description: inappropriate status sent
content:
'application/json':
schema:
type: string
default: status on creating must be only draft,template,stop,start or due to time must be lesser then now
'409':
description: impossible state creating
content:
'application/json':
schema:
type: string
default: you can pause quiz only if it has deadline for passing
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
/question/copy:
post:
description: method for copy question to another quiz or to duplicate quiz
requestBody:
$ref: '#/components/requestBodies/CopyQuestionReq'
responses:
'201':
$ref: '#/components/responses/UpdateResp'
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
'424':
description: return when no question id was send
content:
'application/json':
schema:
type: string
default: no id provided
/quiz/copy:
post:
description: method for copy question to another quiz or to duplicate quiz
requestBody:
$ref: '#/components/requestBodies/CopyQuizReq'
responses:
'201':
$ref: '#/components/responses/UpdateResp'
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
'424':
description: return when no quiz id was send
content:
'application/json':
schema:
type: string
default: no id provided
/quiz/history:
post:
description: method for obtain page of quiz history for paginated list
requestBody:
$ref: '#/components/requestBodies/GetQuizHistoryReq'
responses:
'200':
description: page of history quiz changes
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/responses/QuizModel'
'424':
description: no id provided
content:
'application/json':
schema:
type: string
default: no id provided
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
/question/history:
post:
description: method for obtain page of question history for paginated list
requestBody:
$ref: '#/components/requestBodies/GetQuizHistoryReq'
responses:
'200':
description: page of history question changes
content:
'application/json':
schema:
type: array
items:
$ref: '#/components/responses/QuestionModel'
'424':
description: no id provided
content:
'application/json':
schema:
type: string
default: no id provided
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
/quiz/delete:
delete:
description: method for mark quiz as deleted
requestBody:
$ref: '#/components/requestBodies/DeactivateReq'
responses:
'200':
$ref: '#/components/responses/DeactivateResp'
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
'424':
description: return when no quiz id was send
content:
'application/json':
schema:
type: string
default: no id provided
/quiz/archive:
patch:
description: method for mark quiz as archived
requestBody:
$ref: '#/components/requestBodies/DeactivateReq'
responses:
'200':
$ref: '#/components/responses/DeactivateResp'
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
'424':
description: return when no quiz id was send
content:
'application/json':
schema:
type: string
default: no id provided
/question/delete:
delete:
description: method for mark question as deleted
requestBody:
$ref: '#/components/requestBodies/DeactivateReq'
responses:
'200':
$ref: '#/components/responses/DeactivateResp'
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
'424':
description: return when no question id was send
content:
'application/json':
schema:
type: string
default: no id provided
/results/getResults/{quizId}:
post:
description: получение списка результатов респондентов проходивших опрос
requestBody:
$ref: '#/components/requestBodies/GetQuizResultsReq'
responses:
'200':
$ref: '#/components/responses/GetQuizResultsResp'
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
/results/delete/{resultId}:
delete:
description: мягкое удаление результата. не удаляет, но помечает удаленным
responses:
'200':
description: если все хорошо,то и отправлять нечего
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
/results/seen:
patch:
description: устаревает результаты, т.е. делает их new = false
requestBody:
content:
'application/json':
schema:
type: object
properties:
answers:
description: список айдишников результатов, которые надо устареть
type: array
items:
type: integer
responses:
'200':
description: если все хорошо,то и отправлять нечего
'500':
description: not mentioned error
content:
'application/json':
schema:
type: string
default: if you get any content string send it to developer
/results/{quizID}/export:
post:
summary: экспорт результатов quiz в csv
description: экспорт результатов quiz в csv
parameters:
- in: path
name: quizID
description: id quiz, из которого нужно экспортировать результаты
required: true
schema:
type: integer
format: uint64
requestBody:
required: false
content:
application/json:
schema:
type: object
properties:
to:
type: string
format: date
description: Дата окончания диапазона времени для экспорта результатов
from:
type: string
format: date
description: Дата начала временного диапазона для экспорта результатов
new:
type: boolean
description: Экспортировать ли только новые результаты?
responses:
"200":
description: CSV-файл, содержащий результаты теста
content:
text/csv:
schema:
type: string
format: binary
"400":
description: Bad request. Invalid quiz ID or request body.
"500":
description: Internal server error. Failed to export quiz results.
/result/{resultID}:
get:
summary: возвращает все ответы по resultID (answerID) в рамках сессии resultID
description: возвращает все ответы по resultID (answerID) в рамках сессии resultID
parameters:
- in: path
name: resultID
required: true
description: resultID (answerID), в рамках сессии которого нужно вернуть все ответы
schema:
type: string
responses:
'200':
description: Successful
content:
application/json:
schema:
type: array
items:
$ref: '#/components/schemas/Answer'
'400':
description: Invalid result ID provided
content:
application/json:
schema:
type: object
properties:
message:
type: string
'500':
description: Failed to retrieve result answers
content:
application/json:
schema:
type: object
properties:
message:
type: string