openapi: 3.1.0
info:
  title: API dla systemu Krajowej Infolinii 19111
  description: Specyfikacja interfejsu umożliwiającego integrację z Systemem Centralnym
  version: '1.2'

servers:
  - url: https://system-centralny
tags:
  - name: call
    description: Odebrana rozmowa przychodząca lub wychodząca
  - name: call-event
    description: Zdarzenie związane z obsługą rozmowy
  - name: call-keyword
    description: Wykryte w rozmowie skategoryzowane słowo kluczowe 
paths:
  /incoming-calls:
    post:
      tags:
        - call
      summary: Zapisuje informację o odebraniu rozmowy przychodzącej
      description: Zapisuje informację o szczegółach odebranej rozmowy przychodzącej
      operationId: addIncomingCall
      requestBody:
        description: Tworzy nową odebraną rozmowę przychodzącą
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Call'
        required: true
      responses:
        '201':
          description: Operacja zakończyła się powodzeniem i doprowadziła do utworzenia rozmowy przychodzącej
        '400':
          description: Błędne żądanie np. brak wymaganych danych
        '401':
          description: Brak autoryzacji, błąd uwierzytelnienia
        '409':
          description: Wystąpienie konfliktu uniemożliwiającego obsługę żądania np. otrzymanie żądania utworzenia już istniejącej rozmowy przychodzącej
        '500':
          description: Wewnętrzny błąd serwera
      security:
        - sc_auth: []
  /outgoing-calls:
    post:
      tags:
        - call
      summary: Zapisuje informację o odebraniu rozmowy wychodzącej
      description: Zapisuje informację o szczegółach odebranej rozmowy wychodzącej
      operationId: addOutgoingCall
      requestBody:
        description: Tworzy nową odebraną rozmowę wychodzącą
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/Call'
        required: true
      responses:
        '201':
          description: Operacja zakończyła się powodzeniem i doprowadziła do utworzenia rozmowy wychodzącej
        '400':
          description: Błędne żądanie np. brak wymaganych danych
        '401':
          description: Brak autoryzacji, błąd uwierzytelnienia
        '409':
          description: Wystąpienie konfliktu uniemożliwiającego obsługę żądania np. otrzymanie żądania utworzenia już istniejącej rozmowy wychodzącej
        '500':
          description: Wewnętrzny błąd serwera
      security:
        - sc_auth: []
  /call-events:
    post:
      tags:
        - call-event
      summary: Zapisuje informację o zdarzeniach związanych z obsługą rozmowy
      description: Zapisuje informację o szczegółach zdarzenia związanego z obsługą rozmowy
      operationId: addCallEvent
      requestBody:
        description: Tworzy nowe zdarzenie związane z obsługą rozmowy
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CallEvent'
        required: true
      responses:
        '201':
          description: Operacja zakończyła się powodzeniem i doprowadziła do utworzenia zdarzenia
        '400':
          description: Błędne żądanie np. brak wymaganych danych
        '401':
          description: Brak autoryzacji, błąd uwierzytelnienia
        '404':
          description: Wskazany zasób nie istnieje np. Rozmowa o wskazanym identyfikatorze
        '409':
          description: Wystąpienie konfliktu uniemożliwiającego obsługę żądania np. otrzymanie żądania utworzenia już istniejącego zdarzenia np. zakończenia rozmowy
        '500':
          description: Wewnętrzny błąd serwera
      security:
        - sc_auth: []
  /call-keywords:
    post:
      tags:
        - call-keyword
      summary: Zapisuje informację o skategoryzowanych słowach kluczowych wypowiadanych przez rozmówcę
      description:  Zapisuje informację o skategoryzowanych słowach kluczowych wypowiadanych przez rozmówcę
      operationId: addCallKeyword
      requestBody:
        description: Tworzy nowe słowo kluczowe wykryte podczas rozmowy
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/CallKeyword'
        required: true
      responses:
        '201':
          description: Operacja zakończyła się powodzeniem i doprowadziła do zapisu wykrytego słowa kluczowego
        '400':
          description: Błędne żądanie np. brak wymaganych danych
        '401':
          description: Brak autoryzacji, błąd uwierzytelnienia
        '404':
          description: Wskazany zasób nie istnieje np. Rozmowa o wskazanym identyfikatorze
        '409':
          description: Wystąpienie konfliktu uniemożliwiającego obsługę żądania np. otrzymanie żądania utworzenia wykrytego słowa kluczowego w nieistniejącej kategorii
        '500':
          description: Wewnętrzny błąd serwera
      security:
        - sc_auth: []
components:
  schemas:
    Call:
      description: Komunikat z informacją o odebranej rozmowie przychodzącej lub wychodzącej
      required:
        - idCall
        - phoneNumber
        - idAgent
        - answeredTimestamp
      type: object
      properties:
        idCall:
          description: Unikalny identyfikator połączenia z systemu Krajowej Infolinii 19111
          type: string
          examples: ['a961002e-41bf-49db-80e3-02406ad0391d']
        idCallForwardedFrom:
          description: Unikalny identyfikator połączenia z systemu Krajowej Infolinii 19111, z którego nastąpiło bezpośrednie przekierowanie
          type: string
          examples: ['a567098e-32bf-23db-84e5-75976ad0367a']
        phoneNumber:
          description: Numer telefonu rozmówcy
          type: string
          examples: ['+48123456789']
        contactName:
          description: Nazwa rozmówcy z książki kontaktowej
          type: string
          examples: ['Name from contacts']
        idAgent:
          description: Unikalny identyfikator użytkownika systemu Krajowej Infolinii 19111, który przeprowadza rozmowę
          type: string
          examples: ['1001']
        answeredTimestamp:
          description: Data i czas odebrania rozmowy
          type: string
          format: date-time
          examples: ['2025-02-21T14:25:05+01:00']
    CallEvent:
      description: Komunikat z informacją o zdarzeniu związanym z rozmową
      required:
        - idCall
        - eventType
        - eventTimestamp
      type: object
      properties:
        idCall:
          description: Unikalny identyfikator połączenia z systemu Krajowej Infolinii 19111
          type: string
          examples: ['a961002e-41bf-49db-80e3-02406ad0391d']
        eventType:
          description: Symbol typu zdarzenia
          type: string
          examples: ['CALL_ENDED']
          enum:
            - CALL_ENDED
            - CALL_FORWARDED
            - CALL_HELD
        eventTimestamp:
          description: Data i czas wystąpienia zdarzenia
          type: string
          format: date-time
          examples: ['2025-02-21T14:25:05+01:00']
    CallKeyword:
      description: Komunikat z informacją o wykrytym słowie kluczowym
      required:
        - idCall
        - category
        - keyword
        - timestamp
      type: object
      properties:
        idCall:
          description: Unikalny identyfikator połączenia z systemu Krajowej Infolinii 19111
          type: string
          examples: ['a961002e-41bf-49db-80e3-02406ad0391d']
        category:
          description: Kategoria przypisana do zarejestrowanego słowa kluczowego
          type: string
          $ref: "#/components/schemas/KeywordCategory"
          examples: ['ROAD_NUMBER']
        keyword:
          description: Słowo kluczowe
          type: string
          examples: ['A4']
        timestamp:
          description: Data i czas wystąpienia zdarzenia
          type: string
          format: date-time
          examples: ['2025-02-21T14:25:05+01:00']
    KeywordCategory:
      description: |
        Kategoria przypisana do zarejestrowanego słowa kluczowego: 
        - ROAD_NUMBER - Numer drogi (np. A1, S1, DK1)
        - ROAD_KILOMETERS - Kilometraż, kilometr drogi (np. 1, 10, 100)
        - ROAD_METERS - Kilometraż, metr drogi (np. 10, 100, 950)
        - ROAD_DIRECTION - Kierunek drogi (np. Warszawa, Gdańsk, Jezdnia prawa, Jezdnia lewa)
        - ROAD_INTERCHANGE - Numer lub nazwa węzła drogowego (np. Łódź Północ, Częstochowa Południe, węzeł 21, węzeł 34)
        - VOIVODESHIP - Nazwa województwa (np. mazowieckie, śląskie)
        - NEAREST_TOWN - Nazwa najbliższej miejscowości (np. Kutno, Tuszyn)
        - TOWNS_BETWEEN - Nazwy miejscowości, pomiędzy którymi wystąpiło zgłaszane zdarzenie (np. Tuszyn – Piotrków Trybunalski)
        - TRAFFIC_CONSTRICTION - Typ ograniczenia ruchu spowodowany zdarzeniem. Wartość pola 'keyword' w tej kategorii jest typem 'components/schemas/TrafficConstriction'
        - TRAFFIC_CONSTRICTION_OTHER - Typ ograniczenia ruchu spowodowany zdarzeniem, jeśli wartość jest poza słownikiem dla kategorii TRAFFIC_CONSTRICTION (np. Jednia częściowo zablokowana, Droga częściowo zablokowana)
        - PAVEMENT_TYPE - Typ jezdni, na której wystąpiło zdarzenie. Wartość pola 'keyword' w tej kategorii jest typem 'components/schemas/PavementType'
        - PAVEMENT_TYPE_OTHER - Typ jezdni, na której wystąpiło zdarzenie, jeśli wartość jest poza słownikiem dla kategorii PAVEMENT_TYPE (np. Jezdnia dojazdowa, Jezdnia wewnętrzna)
        - LANE - Pas ruchu, na którym występuje zdarzenie (np. prawy, lewy, awaryjny, pas 1, pas 2)
        - VEHICLE_TYPE - Typ pojazdu biorący udział w zdarzeniu. Wartość pola 'keyword' w tej kategorii jest typem 'components/schemas/VehicleType'
        - VEHICLE_TYPE_OTHER - Typ pojazdu biorący udział w zdarzeniu, jeśli wartość jest poza słownikiem dla kategorii VEHICLE_TYPE (np. karetka pogotowia, traktor)
        - TOTAL_NUMBER_OF_VEHICLES - Liczba pojazdów uczestniczących w zdarzeniu (np. 1, 2, 5)
        - TOTAL_NUMBER_OF_INJURED - Liczba poszkodowanych w zdarzeniu (np. 1, 2)
        - PARTICIPANTS_LOCATION - Miejsce, w którym znajdują się uczestnicy zdarzenia (np. jezdnia, pobocze, pas zieleni)
        - DETECTION_EVENT_TYPE - Rodzaj zgłoszenia. Wartość pola 'keyword' w tej kategorii jest typem 'components/schemas/DetectionEventType'
        - ACCIDENT - Wykryte słowa związane z wypadkiem drogowym (np. kolizja, zderzenie, najechanie, karambol, wypadnięcie z drogi)
        - OBSTRUCTION - Wykryte słowa związane z utrudnieniem na drodze (np. powalone drzewo, konar na drodze, zadymienie, zgubiony ładunek)
        - ROAD_CONDITION - Wykryte słowa związane z warunkami drogowymi (np. marznący deszcz, luźny śnieg, błoto pośniegowe, zalana droga)
        - ENVIRONMENT_CONDITION - Wykryte słowa związane z warunkami pogodowymi (np. grad, mgła, marznąca mgła, wichura)
        - ROADWORK - Wykryte słowa związane z robotami drogowymi (np. koszenie, malowanie pasów, odnawianie nawierzchni)
        - ABNORMAL_TRAFFIC - Wykryte słowa związane z płynnością ruchu (np. korek, kolejka, pojazd jadący za szybko)
      enum:
        - ROAD_NUMBER
        - ROAD_KILOMETERS
        - ROAD_METERS
        - ROAD_DIRECTION
        - ROAD_INTERCHANGE
        - VOIVODESHIP
        - NEAREST_TOWN
        - TOWNS_BETWEEN
        - TRAFFIC_CONSTRICTION
        - TRAFFIC_CONSTRICTION_OTHER
        - PAVEMENT_TYPE
        - PAVEMENT_TYPE_OTHER
        - LANE
        - VEHICLE_TYPE
        - VEHICLE_TYPE_OTHER
        - TOTAL_NUMBER_OF_VEHICLES
        - TOTAL_NUMBER_OF_INJURED
        - PARTICIPANTS_LOCATION
        - DETECTION_EVENT_TYPE
        - ACCIDENT
        - OBSTRUCTION
        - ROAD_CONDITION
        - ENVIRONMENT_CONDITION
        - ROADWORK
        - ABNORMAL_TRAFFIC
    TrafficConstriction:
      description: |
        Typ ograniczenia ruchu spowodowany zdarzeniem:
        - CARRIAGEWAY_BLOCKED - Jezdnia zablokowana
        - ROAD_BLOCKED - Droga zablokowana
      enum:
        - CARRIAGEWAY_BLOCKED
        - ROAD_BLOCKED
    PavementType:
      description: |
        Typ jezdni, na której wystąpiło zdarzenie:
        - MAIN_CARRIAGEWAY - Jezdnia zasadnicza
        - RIGHT_HAND_PARALLEL_CARRIAGEWAY - Jezdnia zbierająco-rozprowadzająca
        - ENTRY_SLIP_ROAD - Łącznica wjazdowa
        - EXIT_SLIP_ROAD - Łącznica zjazdowa
      enum:
        - MAIN_CARRIAGEWAY
        - RIGHT_HAND_PARALLEL_CARRIAGEWAY
        - ENTRY_SLIP_ROAD
        - EXIT_SLIP_ROAD
    VehicleType:
      description: |
        Typ pojazdu biorący udział w zdarzeniu:
        - CAR - Samochód osobowy
        -	LORRY - Samochód ciężarowy
        -	CAR_WITH_TRAILER - Samochód z przyczepą
        -	MOTORCYCLE - Motocykl
        -	TANKER - Cysterna
        -	BUS - Autobus
        -	BICYCLE -Rower
      enum:
        - CAR
        -	LORRY
        -	CAR_WITH_TRAILER
        -	MOTORCYCLE
        -	TANKER
        -	BUS
        -	BICYCLE
    DetectionEventType:
      description: |
        Rodzaj zgłoszenia:
        - VEHICLE_BREAKDOWN - Awaria pojazdu
        - VEHICLE_ACCIDENT - Wypadek
        - UPSTREAM_VEHICLE - Pojazd jadący pod prąd
        - SLOW_VEHICLE - Wolno poruszający się pojazd
        - OBJECT_ON_ROAD - Obiekt na drodze
        - PEDESTRIAN_ON_ROAD - Pieszy na drodze
        - PEDESTRIAN_ON_ROADSIDE - Pieszy na poboczu
        - ANIMAL_ON_ROAD - Zwierzę na drodze
        - CONGESTION - Zator
        - STRONG_WINDS - Silny wiatr
        - VISIBILITY_REDUCED - Ograniczona widoczność
        - HEAVY_RAIN - Intensywny opad
        - SLIPPERY_ROAD - Śliska droga
        - BLACK_ICE - Gołoledź
      enum:
        - VEHICLE_BREAKDOWN
        - VEHICLE_ACCIDENT
        - UPSTREAM_VEHICLE
        - SLOW_VEHICLE
        - OBJECT_ON_ROAD
        - PEDESTRIAN_ON_ROAD
        - PEDESTRIAN_ON_ROADSIDE
        - ANIMAL_ON_ROAD
        - CONGESTION
        - STRONG_WINDS
        - VISIBILITY_REDUCED
        - HEAVY_RAIN
        - SLIPPERY_ROAD
        - BLACK_ICE
  requestBodies:
    Call:
      description: Obiekt odebranej rozmowy przychodzącej lub wychodzącej
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/Call'
    CallEvent:
      description: Obiekt zdarzenia związanego z obsługą rozmowy
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/CallEvent'
    CallKeyword:
      description: Obiekt skategoryzowanego słowa kluczowego wypowiadanego przez rozmówcę
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/CallKeyword'
  securitySchemes:
    sc_auth:
      type: http
      scheme: basic
