swagger: '2.0'
info:
  description: ViruSafe Backend REST API
  version: 1.0.0
  title: ViruSafe Backend REST API
# host: 'localhost:8080'
# basePath: /
tags:
  - name: location-controller
    description: Location Controller
  - name: personal-information-controller
    description: Personal Information Controller
  - name: questionnaire-controller
    description: Questionnaire Controller
  - name: registration-controller
    description: Registration Controller
  - name: static-info
    description: Static Information Pages
paths:
  /information/about-covid.html:
    get:
      tags:
        - static-info
      summary: Static HTML page with information about COVID-19
      operationId: aboutCovid
      produces:
        - 'text/html'
      responses:
        '200':
          description: OK
          examples:
            text/html: '<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <meta http-equiv="X-UA-Compatible" content="ie=edge" /> <title>COVID-19</title></head><style> * { box-sizing: border-box; } body { margin: 0; padding: 0; font-family: "Roboto", sans-serif; font-size: 14px; } h1 { display: block; text-align: center; } main { max-width: 800px; margin: 0 auto; padding: 20px; } a { color: #3c8ce7; } p, ul { color: #636363; } h2, h3:first-of-type { margin-top: 50px; }</style><body> <main> <h1>Въпроси и отговори относно COVID-19</h1> <h3> 1. Какво е COVID-19? Какво е SARS-CoV-2? </h3> <p> Новият коронавирус 2019 сега се нарича тежък остър респираторен синдром коронавирус2 (SARS-CoV-2), а заболяването, свързано с него - COVID-19. </p> <h3>2. Откъде идват коронавирусите?</h3> <p> Коронавирусите са вируси, които циркулират сред животните, но за някои от тях се знае, че засягат хората. След като заразят хората, те могат евентуално да се предават от човек на човек </p> <p> Известен е широк кръг от животни, които са източник на коронавируси. Например, вирусът, причиняващ Близкоизточен респираторен синдром (MERS-CoV), е коронавирус, произхождащ от камили, а тежкият остър респираторен синдром (ТОРС) произхожда от котки - циветки. </p> <p> Повече информация за коронавирусите може да намерите ни интернет страницата на Европейския център за превенция и контрол на заболяванията: <a href="https://www.ecdc.europa.eu/en/factsheet-health-professionals-coronaviruses"> https://www.ecdc.europa.eu/en/factsheet-health-professionals-coronaviruses </a> </p> <h3>3. Този вирус сравним ли е със SARS (ТОРС) или със сезонния грип?</h3> <p> Новият коронавирус, открит в Китай, е генетично тясно свързан с вируса на SARS (ТОРС) от 2003 г. и изглежда, че има подобни характеристики, въпреки че все още данните за този вирус са ограничени. </p> <p> ТОРС се появи в края на 2002 г. в Китай и в продължение на осем месеца са докладвани над 8 000 случая от 33 държави. Тогава един от всеки десет души, които са заразени с ТОРС, почина. </p> <p> Настоящата епидемия от COVID-19 причини около 10 000 случая в Китай само през първия месец от появата си (от края на декември 2019 г. - до края на януари 2020 г.). Впоследствие случаи са съобщени и от други държави, вкл. някои и от ЕС/ЕИП. На този етап има твърде малко налични данни, за да се каже със сигурност колко смъртоносен е COVID-19, но предварителни данни сочат, че той е по-малко фатален от SARS-CoV (ТОРС). </p> <p> Въпреки че двата вируса, както и грипните вируси, се предават от човек на човек и могат да причинят сходни симптоми, те са много различни и следователно се проявяват по различен начин. Все още е много рано да се направят заключения относно разпространението на SARS-CoV-2, но предварителната информация показва, че той се предава по същия начин, както причинителя на ТОРС и някои други пандемични грипни щамове. По данни на Европейския център за контрол на заболяванията (ECDC) всяка година до 40 000 души в ЕС/ЕИП умират преждевременно поради причини, свързани с грипа. </p> <h3>4. По какъв начин се предава инфекцията? Колко лесно се разпространява?</h3> <p> Въпреки че източник на инфекцията са животни, сега вирусът се предава от човек на човек. Към момента няма достатъчно епидемиологична информация, която да потвърди колко лесно и устойчиво вирусът се предава между хората. Изглежда вирусът се предава главно чрез въздушни капчици, когато хората кихат, кашлят или издишат. </p> <p> Инкубационният период за COVID-19 (т.е. времето от контакта с болен и появата на симптоми) понастоящем се изчислява на от 2 до 14 дни. До момента е ясно, че вирусът може да се предава от заразените лица, когато проявяват (грипоподобни) симптоми. Все още не е ясно дали лицата с леки клинични оплаквания, както и асимптоматичните носители могат да предават инфекцията. </p> <h2> МЕДИЦИНСКА ИНФОРМАЦИЯ </h2> <h3> 1. Какви са симптомите на COVID-19? </h3> <p>От известното досега, вирусът може да причини умерени грипоподобни симптоми като:</p> <ul> <li>треска</li> <li>кашлица</li> <li>затруднено дишане</li> <li>мускулни болки и отпадналост</li> </ul> <p> По-сериозните случаи развиват тежка пневмония, остър респираторен дистрес синдром, сепсис и септичен шок, които могат да доведат до смъртта на пациента. Хората със съществуващи хронични заболявания изглежда са по-предразположени към тежко протичане на заболяването. </p> <h3>2. Някои хора по-предразположени ли са към вируса?</h3> <p> Като цяло възрастните хора и тези със съпътстващи заболявания (например артериална хипертония, сърдечни заболявания, диабет, чернодробни заболявания и респираторни заболявания) се очаква да бъдат изложени на по-голям риск от развитие на тежки симптоми. </p> <h3>3. Има ли лечение за COVID-19?</h3> <p> Няма специфично лечение за това заболяване, така че подходът, използван за лечение на пациенти с инфекции, свързани с новия коронавирус, е за лечение на клиничните симптоми (например треска, затруднено дишане). Поддържащата грижа (например поддържаща терапия и мониторинг - кислородна терапия, поддържане на телесен баланс на течностите и антивирусни лекарства) може да бъде много ефективна за заболелите. </p> <h3>4. Кога трябва да се изследвам за COVID-19?</h3> <p>Ако имате:</p> <ul> <li> остра респираторна инфекция (внезапна поява на най-малко една проява: кашлица, повишена телесна температура или затруднено дишане </li> </ul> <p>Както и:</p> <p>В рамките на 14 дни преди появата на симптомите, поне един от следните епидемиологични критерии:</p> <ul> <li>близък контакт с вероятен или потвърден случай на COVID-19</li> <li>анамнеза за пътуване в Китай и Италия</li> </ul> <p>Близкият контакт се определя като:</p> <ul> <li>съжителство в едно домакинство с пациент с COVID-19</li> <li>директен физически контакт с пациент с COVID-19 (напр. ръкостискане)</li> <li> директен незащитен контакт с инфекциозни секрети на пациент с COVID-19 (напр.- при опръскване при кихане, допир до използвани от пациента кърпички с голи ръце) </li> <li> директен (лице в лице) контакт с пациент с COVID-19 на разстояние до 2 метра и продължителност над 15 мин. </li> <li> престой в затворено помещение (напр. класна стая, болнична стая, стая за срещи и др.) с пациент с COVID-19 за ≥ 15 мин. и на разстояние минимум 2 метра </li> <li> здравен работник или друго лице, полагащ директни грижи за пациент с COVID-19, или лабораторен персонал, обработващ клинични проби на пациент с COVID-19 без препоръчаните лични предпазни средства или с евентуално нарушена цялост на личните превозни средства </li> <li> пътуване в самолет в близост до лице с COVID-19 (до две места във всички посоки), придружител при пътуване или лица, полагащи грижи, членове на екипажа, обслужващи дадения сектор, където седи заболелият (ако тежестта на симптомите при заболелия или негово преместване/движение сочи, за по-голяма експозиция за близък контакт може да се определят и други или всички пътници в самолета) </li> </ul> <h2>ПРЕВЕНЦИЯ</h2> <h3>1. Как мога да се предпазя от заразяване?</h3> <p>При посещение в области или държави с регистрирани случаи на COVID-19:</p> <ul> <li>избягвайте контакт с болни хора, особено такива с кашлица</li> <li>избягвайте посещения на пазари и места, където има живи или мъртви животни</li> <li>прилагайте общите хигиенни правила по отношение на хигиената на ръцете и хигиената на храната</li> <li>измивайте ръцете си със сапун и вода ИЛИ използвайте дезинфекционен разтвор на алкохолна основа преди хранене, след използване на тоалетната и след всеки контакт с животни </li> <li>избягвайте контакт с животни, техните екскременти или изпражнения</li> </ul> <p>Където и да пътувате, прилагайте общите правила за хигиена на ръцете и храната.</p> <h3>2. Какво трябва да направя, ако съм имал контакт с някого с COVID-19?</h3> <p> Информирайте здравните власти за последващи напътствия. Наблюдавайте се от времето на контакта с този човек и ако развиете някакви симптоми, свържете се с личния си лекар за съвет, като посочите, че сте били в контакт с COVID-19 </p> <h3>3. Какви са правилата за инфекцията/миенето на ръцете?</h3> <p> Миенето и дезинфекцията на ръцете са ключът към предотвратяване на инфекция. Трябва да миете ръцете си често и обилно със сапун и вода за най-малко 20 секунди. Ако сапун и вода не са налични, можете да използвате и дезинфекциращ препарат за ръце на алкохолна основа с поне 60% алкохол. Вирусът навлиза в тялото ви през очите, носа и устата, така че избягвайте да ги докосвате с немити ръце. </p> <h3>4. Маските за лице ефективни ли са в предпазването от COVID-19?</h3> <p> Маските за лице помагат да се предотврати по-нататъшното разпространение на инфекция от тези, които са болни, към други хора около тях. Маските за лице изглежда не са толкова ефективни за защита на тези, които не са заразени </p> <h3>5. Има ли ваксина срещу SARS-CoV-2? </h3> <p> Понастоящем няма ваксина срещу коронавируси, включително щам SARS-CoV-2. Ето защо е много важно да се предпазим от инфекция или да задържим по-нататъшно разпространение на заразата. </p> <h3>6. Защитен ли съм от вируса SARS-CoV-2, ако съм се ваксинирал срещу грип тази година? </h3> <p>Грипът и 2019-nCoV са два много различни вируса и сезонната грипна ваксина не би защитила от болести, причинени от SARS-CoV-2.</p> <p> Източник: <a href="https://www.ecdc.europa.eu/en/novel-coronavirus-china/questions-answers"> https://www.ecdc.europa.eu/en/novel-coronavirus-china/questions-answers </a> </p> </main></body></html>'
      deprecated: false
  /location/gps:
    post:
      tags:
        - location-controller
      summary: Submit GPS coordinates
      operationId: gpsLocationUsingPOST
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: Authorization
          in: header
          description: JWT token
          required: true
          type: string
          x-example: Bearer eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVkT24iOiIxNTY3NjUyNDAwIiwidXNlckd1aWQiOiJiYTBkNDdhYS0yYjYwLTQ5OTAtOGU5MS04MDIwYWU3ZTRkMTAiLCJqd3RTZWNyZXQiOiI3NjFiOGEyNi03N2YxLTQxNDEtOWVjNy0wZmZkMmEwZThkNjkiLCJwaG9uZU51bWJlciI6IjU1NTU1NTU1NTUiLCJleHAiOjE1OTkyNzQ4MDB9.DHgcQA0NAa7nySMD02dhhQKrcYP7LvC9AgJYLp-S0nQ
        - name: clientId
          in: header
          description: Client ID
          required: true
          type: string
          x-example: 3b3d3b02-e052-4289-827b-6c2f2e2a0430
        - in: body
          name: locationGpsDTO
          description: locationGpsDTO
          required: true
          schema:
            $ref: '#/definitions/LocationGpsDTO'
      responses:
        '201':
          description: Submitted successfully
        '401':
          description: Access unauthorized
          schema:
            $ref: '#/definitions/ErrorDTO'
        '403':
          description: Access forbidden
          schema:
            $ref: '#/definitions/ErrorDTO'
        '404':
          description: No corresponding user was found
          schema:
            $ref: '#/definitions/ErrorDTO'
        '412':
          description: Request argument validation has failed
          schema:
            $ref: '#/definitions/ValidationErrorDTO'
        '429':
          description: Request rate limit has been exceeded
          schema:
            $ref: '#/definitions/ErrorDTO'
        '500':
          description: An unexpected server error has occurred
          schema:
            $ref: '#/definitions/ErrorDTO'
      deprecated: false
  /location/proximity:
    post:
      tags:
        - location-controller
      summary: Submit devices in proximity
      operationId: proximityLocationUsingPOST
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: Authorization
          in: header
          description: JWT token
          required: true
          type: string
          x-example: Bearer eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVkT24iOiIxNTY3NjUyNDAwIiwidXNlckd1aWQiOiJiYTBkNDdhYS0yYjYwLTQ5OTAtOGU5MS04MDIwYWU3ZTRkMTAiLCJqd3RTZWNyZXQiOiI3NjFiOGEyNi03N2YxLTQxNDEtOWVjNy0wZmZkMmEwZThkNjkiLCJwaG9uZU51bWJlciI6IjU1NTU1NTU1NTUiLCJleHAiOjE1OTkyNzQ4MDB9.DHgcQA0NAa7nySMD02dhhQKrcYP7LvC9AgJYLp-S0nQ
        - name: clientId
          in: header
          description: Client ID
          required: true
          type: string
          x-example: 3b3d3b02-e052-4289-827b-6c2f2e2a0430
        - in: body
          name: locationProximityDTO
          description: locationProximityDTO
          required: true
          schema:
            $ref: '#/definitions/LocationProximityDTO'
      responses:
        '201':
          description: Submitted successfully
        '401':
          description: Access unauthorized
          schema:
            $ref: '#/definitions/ErrorDTO'
        '403':
          description: Access forbidden
          schema:
            $ref: '#/definitions/ErrorDTO'
        '404':
          description: No corresponding user was found
          schema:
            $ref: '#/definitions/ErrorDTO'
        '412':
          description: Request argument validation has failed
          schema:
            $ref: '#/definitions/ValidationErrorDTO'
        '429':
          description: Request rate limit has been exceeded
          schema:
            $ref: '#/definitions/ErrorDTO'
        '500':
          description: An unexpected server error has occurred
          schema:
            $ref: '#/definitions/ErrorDTO'
      deprecated: false
  /personalinfo:
    get:
      tags:
        - personal-information-controller
      summary: Get the current user's personal information
      operationId: getPersonalInformationUsingGET
      produces:
        - 'application/json'
      parameters:
        - name: Authorization
          in: header
          description: JWT token
          required: true
          type: string
          x-example: Bearer eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVkT24iOiIxNTY3NjUyNDAwIiwidXNlckd1aWQiOiJiYTBkNDdhYS0yYjYwLTQ5OTAtOGU5MS04MDIwYWU3ZTRkMTAiLCJqd3RTZWNyZXQiOiI3NjFiOGEyNi03N2YxLTQxNDEtOWVjNy0wZmZkMmEwZThkNjkiLCJwaG9uZU51bWJlciI6IjU1NTU1NTU1NTUiLCJleHAiOjE1OTkyNzQ4MDB9.DHgcQA0NAa7nySMD02dhhQKrcYP7LvC9AgJYLp-S0nQ
        - name: clientId
          in: header
          description: Client ID
          required: true
          type: string
          x-example: 3b3d3b02-e052-4289-827b-6c2f2e2a0430
      responses:
        '200':
          description: OK
          schema:
            $ref: '#/definitions/PersonalInformationResponseDTO'
        '401':
          description: Access unauthorized
          schema:
            $ref: '#/definitions/ErrorDTO'
        '403':
          description: Access forbidden
          schema:
            $ref: '#/definitions/ErrorDTO'
        '404':
          description: No corresponding user was found
          schema:
            $ref: '#/definitions/ErrorDTO'
        '500':
          description: An unexpected server error has occurred
          schema:
            $ref: '#/definitions/ErrorDTO'
      deprecated: false
    post:
      tags:
        - personal-information-controller
      summary: Submit user personal information
      operationId: addPersonalInformationUsingPOST
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: Authorization
          in: header
          description: JWT token
          required: true
          type: string
          x-example: Bearer eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVkT24iOiIxNTY3NjUyNDAwIiwidXNlckd1aWQiOiJiYTBkNDdhYS0yYjYwLTQ5OTAtOGU5MS04MDIwYWU3ZTRkMTAiLCJqd3RTZWNyZXQiOiI3NjFiOGEyNi03N2YxLTQxNDEtOWVjNy0wZmZkMmEwZThkNjkiLCJwaG9uZU51bWJlciI6IjU1NTU1NTU1NTUiLCJleHAiOjE1OTkyNzQ4MDB9.DHgcQA0NAa7nySMD02dhhQKrcYP7LvC9AgJYLp-S0nQ
        - name: clientId
          in: header
          description: Client ID
          required: true
          type: string
          x-example: 3b3d3b02-e052-4289-827b-6c2f2e2a0430
        - in: body
          name: personalInformationDTO
          description: personalInformationDTO
          required: true
          schema:
            $ref: '#/definitions/PersonalInformationRequestDTO'
      responses:
        '201':
          description: Submitted successfully
        '401':
          description: Access unauthorized
          schema:
            $ref: '#/definitions/ErrorDTO'
        '403':
          description: Access forbidden
          schema:
            $ref: '#/definitions/ErrorDTO'
        '404':
          description: No corresponding user was found
          schema:
            $ref: '#/definitions/ErrorDTO'
        '412':
          description: Request argument validation has failed
          schema:
            $ref: '#/definitions/ValidationErrorDTO'
        '429':
          description: Request rate limit has been exceeded
          schema:
            $ref: '#/definitions/ErrorDTO'
        '500':
          description: An unexpected server error has occurred
          schema:
            $ref: '#/definitions/ErrorDTO'
      deprecated: false
    delete:
      tags:
        - personal-information-controller
      summary: Delete the current user's personal information
      operationId: deletePersonalInformationUsingDELETE
      produces:
        - 'application/json'
      parameters:
        - name: Authorization
          in: header
          description: JWT token
          required: true
          type: string
          x-example: Bearer eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVkT24iOiIxNTY3NjUyNDAwIiwidXNlckd1aWQiOiJiYTBkNDdhYS0yYjYwLTQ5OTAtOGU5MS04MDIwYWU3ZTRkMTAiLCJqd3RTZWNyZXQiOiI3NjFiOGEyNi03N2YxLTQxNDEtOWVjNy0wZmZkMmEwZThkNjkiLCJwaG9uZU51bWJlciI6IjU1NTU1NTU1NTUiLCJleHAiOjE1OTkyNzQ4MDB9.DHgcQA0NAa7nySMD02dhhQKrcYP7LvC9AgJYLp-S0nQ
        - name: clientId
          in: header
          description: Client ID
          required: true
          type: string
          x-example: 3b3d3b02-e052-4289-827b-6c2f2e2a0430
      responses:
        '200':
          description: OK
        '204':
          description: No Content
        '401':
          description: Access unauthorized
          schema:
            $ref: '#/definitions/ErrorDTO'
        '403':
          description: Access forbidden
          schema:
            $ref: '#/definitions/ErrorDTO'
        '404':
          description: No corresponding user was found
          schema:
            $ref: '#/definitions/ErrorDTO'
        '429':
          description: Request rate limit has been exceeded
          schema:
            $ref: '#/definitions/ErrorDTO'
        '500':
          description: An unexpected server error has occurred
          schema:
            $ref: '#/definitions/ErrorDTO'
      deprecated: false
  /pin:
    post:
      tags:
        - registration-controller
      summary: Generate a verification PIN and send it to the given phone number
      operationId: createPinUsingPOST
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: clientId
          in: header
          description: Client ID
          required: true
          type: string
          x-example: 3b3d3b02-e052-4289-827b-6c2f2e2a0430
        - in: body
          name: pinGenerationDTO
          description: pinGenerationDTO
          required: true
          schema:
            $ref: '#/definitions/PinGenerationDTO'
      responses:
        '201':
          description: PIN created and request sent to the SMS service
        '401':
          description: Unauthorized
        '403':
          description: Forbidden
        '404':
          description: Not Found
        '412':
          description: Request argument validation has failed
          schema:
            $ref: '#/definitions/ValidationErrorDTO'
        '429':
          description: Request rate limit has been exceeded
          schema:
            $ref: '#/definitions/ErrorDTO'
        '500':
          description: An unexpected server error has occurred
          schema:
            $ref: '#/definitions/ErrorDTO'
      deprecated: false
  /pushtoken:
    post:
      tags:
        - registration-controller
      summary: Register a new notification push token for the user
      operationId: addPushTokenUsingPOST
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: Authorization
          in: header
          description: JWT token
          required: true
          type: string
          x-example: Bearer eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVkT24iOiIxNTY3NjUyNDAwIiwidXNlckd1aWQiOiJiYTBkNDdhYS0yYjYwLTQ5OTAtOGU5MS04MDIwYWU3ZTRkMTAiLCJqd3RTZWNyZXQiOiI3NjFiOGEyNi03N2YxLTQxNDEtOWVjNy0wZmZkMmEwZThkNjkiLCJwaG9uZU51bWJlciI6IjU1NTU1NTU1NTUiLCJleHAiOjE1OTkyNzQ4MDB9.DHgcQA0NAa7nySMD02dhhQKrcYP7LvC9AgJYLp-S0nQ
        - name: clientId
          in: header
          description: Client ID
          required: true
          type: string
          x-example: 3b3d3b02-e052-4289-827b-6c2f2e2a0430
        - in: body
          name: pushTokenDTO
          description: pushTokenDTO
          required: true
          schema:
            $ref: '#/definitions/PushTokenDTO'
      responses:
        '200':
          description: Successfully registered push token
        '201':
          description: Created
        '401':
          description: Access unauthorized
          schema:
            $ref: '#/definitions/ErrorDTO'
        '403':
          description: Access forbidden
          schema:
            $ref: '#/definitions/ErrorDTO'
        '404':
          description: No corresponding user was found
          schema:
            $ref: '#/definitions/ErrorDTO'
        '412':
          description: Request argument validation has failed
          schema:
            $ref: '#/definitions/ValidationErrorDTO'
        '500':
          description: An unexpected server error has occurred
          schema:
            $ref: '#/definitions/ErrorDTO'
      deprecated: false
  /questionnaire:
    get:
      tags:
        - questionnaire-controller
      summary: Get all questionnaire questions
      operationId: getQuestionnaireUsingGET
      produces:
        - 'application/json'
      parameters:
        - name: Authorization
          in: header
          description: JWT token
          required: true
          type: string
          x-example: Bearer eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVkT24iOiIxNTY3NjUyNDAwIiwidXNlckd1aWQiOiJiYTBkNDdhYS0yYjYwLTQ5OTAtOGU5MS04MDIwYWU3ZTRkMTAiLCJqd3RTZWNyZXQiOiI3NjFiOGEyNi03N2YxLTQxNDEtOWVjNy0wZmZkMmEwZThkNjkiLCJwaG9uZU51bWJlciI6IjU1NTU1NTU1NTUiLCJleHAiOjE1OTkyNzQ4MDB9.DHgcQA0NAa7nySMD02dhhQKrcYP7LvC9AgJYLp-S0nQ
        - name: clientId
          in: header
          description: Client ID
          required: true
          type: string
          x-example: 3b3d3b02-e052-4289-827b-6c2f2e2a0430
        - name: language
          in: header
          description: Language
          required: false
          type: string
          x-example: en
      responses:
        '200':
          description: OK
          schema:
            type: array
            items:
              $ref: '#/definitions/QuestionDTO'
            example:
              - "id": 1
                "questionTitle": "Body temperature above 38C"
                "questionType": "BOOLEAN"
              - "id": 2
                "questionTitle": "Dry cough"
                "questionType": "BOOLEAN"
              - "id": 3
                "questionTitle": "Difficulty breathing or shortness of breath"
                "questionType": "BOOLEAN"
              - "id": 4
                "questionTitle": "Persistent pain or pressure in the chest"
                "questionType": "BOOLEAN"
              - "id": 5
                "questionTitle": "Bluish lips or face"
                "questionType": "BOOLEAN"
              - "id": 6
                "questionTitle": "Nausea, vomiting and/or diarrhoea"
                "questionType": "BOOLEAN"
              - "id": 7
                "questionTitle": "Lightheadedness or Vertigo"
                "questionType": "BOOLEAN"
        '401':
          description: Access unauthorized
          schema:
            $ref: '#/definitions/ErrorDTO'
        '403':
          description: Access forbidden
          schema:
            $ref: '#/definitions/ErrorDTO'
        '404':
          description: Not Found
        '500':
          description: An unexpected server error has occurred
          schema:
            $ref: '#/definitions/ErrorDTO'
      deprecated: false
    post:
      tags:
        - questionnaire-controller
      summary: Submit a user's questionnaire actions
      operationId: postQuestionnaireUsingPOST
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: Authorization
          in: header
          description: JWT token
          required: true
          type: string
          x-example: Bearer eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVkT24iOiIxNTY3NjUyNDAwIiwidXNlckd1aWQiOiJiYTBkNDdhYS0yYjYwLTQ5OTAtOGU5MS04MDIwYWU3ZTRkMTAiLCJqd3RTZWNyZXQiOiI3NjFiOGEyNi03N2YxLTQxNDEtOWVjNy0wZmZkMmEwZThkNjkiLCJwaG9uZU51bWJlciI6IjU1NTU1NTU1NTUiLCJleHAiOjE1OTkyNzQ4MDB9.DHgcQA0NAa7nySMD02dhhQKrcYP7LvC9AgJYLp-S0nQ
        - name: clientId
          in: header
          description: Client ID
          required: true
          type: string
          x-example: 3b3d3b02-e052-4289-827b-6c2f2e2a0430
        - in: body
          name: questionnairePostDTO
          description: questionnairePostDTO
          required: true
          schema:
            $ref: '#/definitions/QuestionnairePostDTO'
      responses:
        '201':
          description: Successfully submitted questionnaire
        '401':
          description: Access unauthorized
          schema:
            $ref: '#/definitions/ErrorDTO'
        '403':
          description: Access forbidden
          schema:
            $ref: '#/definitions/ErrorDTO'
        '404':
          description: No corresponding user was found
          schema:
            $ref: '#/definitions/ErrorDTO'
        '412':
          description: Request argument validation has failed
          schema:
            $ref: '#/definitions/ValidationErrorDTO'
        '429':
          description: Request rate limit has been exceeded
          schema:
            $ref: '#/definitions/ErrorDTO'
        '500':
          description: An unexpected server error has occurred
          schema:
            $ref: '#/definitions/ErrorDTO'
      deprecated: false
  /token:
    post:
      tags:
        - registration-controller
      summary: Verify that the passed PIN and phone number match and generate an access token
      operationId: createTokenUsingPOST
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: clientId
          in: header
          description: Client ID
          required: true
          type: string
          x-example: 3b3d3b02-e052-4289-827b-6c2f2e2a0430
        - in: body
          name: tokenGenerationDTO
          description: tokenGenerationDTO
          required: true
          schema:
            $ref: '#/definitions/TokenGenerationDTO'
      responses:
        '201':
          description: 'PIN matches, JWT generated'
          schema:
            $ref: '#/definitions/AccessTokenDTO'
        '401':
          description: Access unauthorized
          schema:
            $ref: '#/definitions/ErrorDTO'
        '403':
          description: Access forbidden
          schema:
            $ref: '#/definitions/ErrorDTO'
        '404':
          description: Not Found
        '412':
          description: Request argument validation has failed
          schema:
            $ref: '#/definitions/ValidationErrorDTO'
        '438':
          description: Could not verify matching PIN and phone number
          schema:
            $ref: '#/definitions/ErrorDTO'
        '500':
          description: An unexpected server error has occurred
          schema:
            $ref: '#/definitions/ErrorDTO'
      deprecated: false
  /token/refresh:
    post:
      tags:
        - registration-controller
      summary: Generate a new access token from a refresh token
      operationId: refreshTokenUsingPOST
      consumes:
        - application/json
      produces:
        - 'application/json'
      parameters:
        - name: clientId
          in: header
          description: Client ID
          required: true
          type: string
          x-example: 3b3d3b02-e052-4289-827b-6c2f2e2a0430
        - in: body
          name: tokenRefreshDTO
          description: tokenRefreshDTO
          required: true
          schema:
            $ref: '#/definitions/TokenRefreshDTO'
      responses:
        '201':
          description: 'Access token matches, JWT generated'
          schema:
            $ref: '#/definitions/AccessTokenDTO'
        '401':
          description: Access unauthorized
          schema:
            $ref: '#/definitions/ErrorDTO'
        '403':
          description: Access forbidden
          schema:
            $ref: '#/definitions/ErrorDTO'
        '404':
          description: Not Found
        '412':
          description: Request argument validation has failed
          schema:
            $ref: '#/definitions/ValidationErrorDTO'
        '438':
          description: Could not verify refresh token validity
          schema:
            $ref: '#/definitions/ErrorDTO'
        '500':
          description: An unexpected server error has occurred
          schema:
            $ref: '#/definitions/ErrorDTO'
      deprecated: false
definitions:
  AccessTokenDTO:
    type: object
    properties:
      accessToken:
        type: string
        example: eyJhbGciOiJIUzI1NiJ9.eyJjcmVhdGVkT24iOiIxNTY3NjUyNDAwIiwidXNlckd1aWQiOiJiYTBkNDdhYS0yYjYwLTQ5OTAtOGU5MS04MDIwYWU3ZTRkMTAiLCJqd3RTZWNyZXQiOiI3NjFiOGEyNi03N2YxLTQxNDEtOWVjNy0wZmZkMmEwZThkNjkiLCJwaG9uZU51bWJlciI6IjU1NTU1NTU1NTUiLCJleHAiOjE1OTkyNzQ4MDB9.DHgcQA0NAa7nySMD02dhhQKrcYP7LvC9AgJYLp-S0nQ
      refreshToken:
        type: string
        example: eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyR3VpZCI6ImJhMGQ0N2FhLTJiNjAtNDk5MC04ZTkxLTgwMjBhZTdlNGQxMCJ9.fR0oWMwH0ew-TBJSlSae_ZFlB2ehqEWM7MJQ93ybOV8
    title: AccessTokenDTO
  AnswerDTO:
    type: object
    properties:
      answer:
        type: string
        example: 'TRUE'
        pattern: '^[a-zA-Z0-9 ,.()а-яА-Я-]+$'
      questionId:
        type: integer
        format: int32
        example: 3
    title: AnswerDTO
  ErrorDTO:
    type: object
    properties:
      message:
        type: string
        example: Invalid request!
    title: ErrorDTO
  FieldValidationErrorDTO:
    type: object
    properties:
      fieldName:
        type: string
    title: FieldValidationErrorDTO
  Location:
    type: object
    properties:
      lat:
        type: number
        format: double
        example: 42.71
        minimum: -90
        maximum: 90
        exclusiveMinimum: false
        exclusiveMaximum: false
      lng:
        type: number
        format: double
        example: 23.32
        minimum: -180
        maximum: 180
        exclusiveMinimum: false
        exclusiveMaximum: false
    title: Location
  LocationGpsDTO:
    type: object
    required:
      - location
    properties:
      location:
        $ref: '#/definitions/Location'
      timestamp:
        type: integer
        format: int64
        example: 1567652400
    title: LocationGpsDTO
  LocationProximityDTO:
    type: object
    properties:
      location:
        $ref: '#/definitions/Location'
      proximities:
        type: array
        items:
          $ref: '#/definitions/ProximityDTO'
      timestamp:
        type: integer
        format: int64
        example: 1567652400
    title: LocationProximityDTO
  PersonalInformationRequestDTO:
    type: object
    properties:
      age:
        type: integer
        format: int32
        example: 33
        minimum: 14
        maximum: 150
        exclusiveMinimum: false
        exclusiveMaximum: false
      gender:
        type: string
        example: FEMALE
        enum:
          - MALE
          - FEMALE
      identificationNumber:
        type: string
        example: BG12345678
      identificationType:
        type: string
        example: PASSPORT
        enum:
          - EGN
          - LNCH
          - PASSPORT
      preExistingConditions:
        type: string
        example: Pre-existing conditions
        pattern: '^[a-zA-Z0-9 ,.()а-яА-Я-]{0,100}$'
    title: PersonalInformationRequestDTO
  PersonalInformationResponseDTO:
    type: object
    properties:
      age:
        type: integer
        format: int32
        example: 33
      gender:
        type: string
        example: FEMALE
        enum:
          - MALE
          - FEMALE
      identificationNumber:
        type: string
        example: BG12345678
      identificationType:
        type: string
        example: PASSPORT
        enum:
          - EGN
          - LNCH
          - PASSPORT
      phoneNumber:
        type: string
        example: 5555555555
      preExistingConditions:
        type: string
        example: Pre-existing conditions
    title: PersonalInformationResponseDTO
  PinGenerationDTO:
    type: object
    properties:
      phoneNumber:
        type: string
        example: 5555555555
        pattern: '[\+]{0,1}[\d]{10,14}'
    title: PinGenerationDTO
  ProximityDTO:
    type: object
    properties:
      distance:
        type: string
        example: 3.8
        pattern: '^[\d]+[.]{0,1}[\d]+$'
      uuid:
        type: string
        example: d70d5c29-30c0-415a-af6a-f7a2ccaa8c76
        pattern: '^[a-zA-Z0-9-]+$'
    title: ProximityDTO
  PushTokenDTO:
    type: object
    properties:
      pushToken:
        type: string
        example: 9077218c-ad45-4ac0-b2d3-0a566f48b9b7
        pattern: '^[a-zA-Z0-9?=:_-]{0,255}$'
    title: PushTokenDTO
  QuestionDTO:
    type: object
    properties:
      id:
        type: integer
        format: int32
        example: 3
      questionTitle:
        type: string
        example: Difficulty breathing or shortness of breath
      questionType:
        type: string
        example: BOOLEAN
        enum:
          - BOOLEAN
          - OPEN_ANSWER
    title: QuestionDTO
  QuestionnairePostDTO:
    type: object
    properties:
      answers:
        type: array
        items:
          $ref: '#/definitions/AnswerDTO'
      location:
        $ref: '#/definitions/Location'
      timestamp:
        type: integer
        format: int64
        example: 1567652400
    title: QuestionnairePostDTO
  TokenGenerationDTO:
    type: object
    properties:
      phoneNumber:
        type: string
        example: 5555555555
        pattern: '[\+]{0,1}[\d]{10,14}'
      pin:
        type: string
        example: '000000'
        pattern: '[\d]{6}'
    title: TokenGenerationDTO
  TokenRefreshDTO:
    type: object
    properties:
      refreshToken:
        type: string
        example: eyJhbGciOiJIUzI1NiJ9.eyJ1c2VyR3VpZCI6ImJhMGQ0N2FhLTJiNjAtNDk5MC04ZTkxLTgwMjBhZTdlNGQxMCJ9.fR0oWMwH0ew-TBJSlSae_ZFlB2ehqEWM7MJQ93ybOV8
    title: TokenRefreshDTO
  ValidationErrorDTO:
    type: object
    properties:
      message:
        type: string
        example: Request arguments validation failed!
      validationErrors:
        type: array
        items:
          $ref: '#/definitions/FieldValidationErrorDTO'
    title: ValidationErrorDTO
# Added by API Auto Mocking Plugin
host: virtserver.swaggerhub.com
basePath: /ViruSafe/viru-safe_backend_rest_api/1.0.0
schemes:
 - https