openapi: 3.0.1
info:
  title: Airport Manager
  description: |
    Microservice Application for Airport Manager
  contact:
    name: Martin Slovik
    email: 540485@mail.muni.cz
    # insert your information as well
  license:
    name: Apache 2.0
    url: https://www.apache.org/licenses/LICENSE-2.0.html
  version: "1.1"
servers:
  - url: "{scheme}://{server}:{port}"
    description: my server
    variables:
      scheme:
        default: http
        enum:
          - http
          - https
      server:
        default: localhost
      port:
        default: "8080"
tags:
  - name: Core
    description: Microservice for core.
paths:
  /api/stewards:
    get:
      tags:
        - Steward
      summary: Get all stewards.
      description: |
        Returns an array of objects representing stewards.
      operationId: getAllStewards
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/StewardDto'
    post:
      tags:
        - Steward
      summary: Create a new steward.
      description: |
        Creates a new steward and returns it as a response.
      operationId: createSteward
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewStewardDtoRequest'
        required: true
      responses:
        "201":
          $ref: '#/components/responses/SingleStewardDtoResponse'
        "400":
          description: Input data not correct
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
  /api/stewards/{id}:
    get:
      tags:
        - Steward
      summary: Get steward by id
      description: Returns a steward by id.
      operationId: getSteward
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/StewardDto'
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
    delete:
      tags:
        - Steward
      summary: Delete steward by id.
      operationId: deleteSteward
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "204":
          description: Deleted
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
    put:
      tags:
        - Steward
      summary: Update steward by id.
      operationId: updateSteward
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      description: |
        Updates a steward by id and returns it as a response.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewStewardDtoRequest'
        required: true
      responses:
        "200":
          $ref: '#/components/responses/SingleStewardDtoResponse'
        "400":
          description: Input data not correct
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
  /api/stewards/{stewardId}/flights/{flightId}:
    post:
      tags:
        - Steward
      summary: Assign steward to a flight.
      operationId: createStewardFlights
      parameters:
        - name: stewardId
          in: path
          required: true
          schema:
            type: integer
            format: int64
        - name: flightId
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "201":
          $ref: '#/components/responses/SingleStewardDtoResponse'
        "400":
          description: Input data not correct
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
    put:
      tags:
        - Steward
      summary: Update assignment of steward to a flight.
      operationId: updateStewardFlights
      parameters:
        - name: stewardId
          in: path
          required: true
          schema:
            type: integer
            format: int64
        - name: flightId
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "200":
          $ref: '#/components/responses/SingleStewardDtoResponse'
        "400":
          description: Input data not correct
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
    delete:
      tags:
        - Steward
      summary: Delete assignment of steward to a flight.
      operationId: deleteStewardFlights
      parameters:
        - name: stewardId
          in: path
          required: true
          schema:
            type: integer
            format: int64
        - name: flightId
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "204":
          description: Deleted
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
  /api/stewards/paged:
    get:
      tags:
        - Steward
      summary: Paged stewards
      description: |
        Returns a page of stewards.
        The parameter `page` specifies zero-based index of the requested page,
        and the parameter `size` specifies the size of the page.
      operationId: getStewardsPaged
      parameters:
        - name: page
          in: query
          description: Zero-based page index (0..N)
          required: false
          schema:
            minimum: 0
            type: integer
            default: 0
        - name: size
          in: query
          description: The size of the page to be returned
          required: false
          schema:
            minimum: 1
            type: integer
            default: 20
        - name: sort
          in: query
          description: "Sorting criteria in the format: property,(asc|desc). Default\
          \ sort order is ascending. Multiple sort criteria are supported."
          required: false
          schema:
            type: array
            items:
              type: string
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/PageStewardDto'
  /api/flights:
    get:
      tags:
        - Flight
      summary: Get all flights.
      description: |
        Returns an array of objects representing flights.
      operationId: getAllFlights
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                type: array
                items:
                  $ref: '#/components/schemas/FlightDto'
    post:
      tags:
        - Flight
      summary: Create a new flight.
      description: |
        Creates a new flight and returns it as a response.
      operationId: createFlight
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewFlightDtoRequest'
        required: true
      responses:
        "201":
          description: Created
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FlightDto'
        "400":
          description: Input data not correct
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
  /api/flights/{id}:
    get:
      tags:
        - Flight
      summary: Get flight by id.
      description: |
        Returns an object representing a flight.
      operationId: getFlightById
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FlightDto'
    delete:
      tags:
        - Flight
      summary: Delete flight by id.
      operationId: deleteFlight
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      responses:
        "204":
          description: Deleted
        "404":
          description: Not Found
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
    put:
      tags:
        - Flight
      summary: Update flight by id.
      operationId: updateFlight
      parameters:
        - name: id
          in: path
          required: true
          schema:
            type: integer
            format: int64
      description: Updates a flight by id and returns it as a response.
      requestBody:
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/NewFlightDtoRequest'
        required: true
      responses:
        "200":
          description: OK
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/FlightDto'
        "400":
          description: Input data not correct
          content:
            application/json:
              schema:
                $ref: '#/components/schemas/ErrorMessage'
components:
  schemas:
    DomainEntity:
      title: Domain Entity
      description: Represents a Domain Entity
      type: object
      required:
        - id
      properties:
        id:
          type: integer
          description: unique id
          format: int64
          example: 1
      discriminator:
        propertyName: objectType
    ErrorMessage:
      allOf:
        - $ref: '#/components/schemas/DomainEntity'
      title: Error Message
      description: Response body for HTML statuses.
      type: object
      properties:
        timestamp:
          type: string
          description: time in ISO format
          format: date-time
          example: 2022-12-21T18:52:10.757Z
        status:
          type: integer
          description: HTTP status code
          format: int32
          example: 404
        error:
          type: string
          description: HTTP status text
          example: Not Found
        message:
          type: string
          description: reason for error
          example: entity not found
        path:
          type: string
          description: URL path
          example: /api/stewards/1
    StewardDto:
      allOf:
        - $ref: '#/components/schemas/DomainEntity'
      type: object
      title: Steward
      description: Represents a steward on a flight.
      required:
        - id
        - firstName
        - lastName
      properties:
        firstName:
          type: string
          description: first name of a steward
          example: John
        lastName:
          type: string
          description: last name of a steward
          example: Doe
        flights:
          type: array
          description: flights assigned to a steward
          items:
            $ref: '#/components/schemas/FlightDto'
    NewStewardDtoRequest:
      allOf:
        - $ref: '#/components/schemas/DomainEntity'
      type: object
      title: New Steward Request
      description: Object for requesting a new Steward.
      required:
        - id
        - firstName
        - lastName
      properties:
        firstName:
          type: string
          description: first name of a steward
          example: John
        lastName:
          type: string
          description: last name of a steward
          example: Doe
    FlightDto:
      allOf:
        - $ref: '#/components/schemas/DomainEntity'
      type: object
      title: Flight
      description: Represents a flight.
      required:
        - id
        - departureTime
        - arrivalTime
        - stewards
        - airplane
      properties:
        departureTime:
          type: string
          description: time of flight departure
          format: date-time
          example: 2022-12-22T12:04:04.493908908+01:00
        arrivalTime:
          type: string
          description: time of flight arrival
          format: date-time
          example: 2022-12-22T12:04:04.493908908+01:00
        stewards:
          type: array
          description: stewards assigned to a flight
          items:
            $ref: '#/components/schemas/StewardDto'
        airplane:
          $ref: '#/components/schemas/AirplaneDto'
    NewFlightDtoRequest:
      allOf:
        - $ref: '#/components/schemas/DomainEntity'
      type: object
      title: New Flight Request
      description: Object for requesting a new Flight.
      required:
        - id
        - departureTime
        - arrivalTime
      properties:
        departureTime:
          type: string
          description: time of flight departure
          format: date-time
          example: 2022-12-22T12:04:04.493908908+01:00
        arrivalTime:
          type: string
          description: time of flight arrival
          format: date-time
          example: 2022-12-22T12:04:04.493908908+01:00
    AirplaneTypeDto:
      allOf:
        - $ref: '#/components/schemas/DomainEntity'
      type: object
      title: Airplane Type
      description: Represents an Airplane Type.
      required:
        - id
        - name
      properties:
        name:
          type: string
          description: airplane type name
          example: Boeing 747
    AirplaneDto:
      allOf:
        - $ref: '#/components/schemas/DomainEntity'
      type: object
      title: Airplane
      description: Represents an Airplane.
      required:
        - id
        - name
        - capacity
        - type
      properties:
        name:
          type: string
          description: airplane name
          example: Spitfire
        capacity:
          type: integer
          description: airplane seat capacity
          format: int32
          example: 150
        type:
          $ref: '#/components/schemas/AirplaneTypeDto'
    PageableObject:
      type: object
      title: Pageable Object
      properties:
        offset:
          type: integer
          format: int64
        sort:
          $ref: '#/components/schemas/SortObject'
        pageSize:
          type: integer
          format: int32
        pageNumber:
          type: integer
          format: int32
        paged:
          type: boolean
        unpaged:
          type: boolean
    SortObject:
      type: object
      title: Sort Object
      properties:
        empty:
          type: boolean
        sorted:
          type: boolean
        unsorted:
          type: boolean
    PageStewardDto:
      type: object
      title: Paged Stewards
      properties:
        totalPages:
          type: integer
          format: int32
        totalElements:
          type: integer
          format: int64
        first:
          type: boolean
        last:
          type: boolean
        size:
          type: integer
          format: int32
        content:
          type: array
          items:
            $ref: '#/components/schemas/StewardDto'
        number:
          type: integer
          format: int32
        sort:
          $ref: '#/components/schemas/SortObject'
        numberOfElements:
          type: integer
          format: int32
        pageable:
          $ref: '#/components/schemas/PageableObject'
        empty:
          type: boolean
    CountryDto:
      allOf:
        - $ref: '#/components/schemas/DomainEntity'
      type: object
      title: Country
      description: Represents a country.
      required:
        - id
        - name
      properties:
        name:
          type: string
          description: country name
          example: Canada
    CityDto:
      allOf:
        - $ref: '#/components/schemas/DomainEntity'
      type: object
      title: City
      description: Represents a City in a Country containing Airports.
      required:
        - id
        - name
      properties:
        name:
          type: string
          description: city name
          example: New York, London
        country:
          $ref: '#/components/schemas/CountryDto'
        airports:
          type: array
          items:
            $ref: '#/components/schemas/AirplaneDto'
    GPSLocationDto:
      type: object
      title: GPS Location
      description: Represents a GPS Location of latitude and longitude.
      required:
        - latitude
        - longitude
      properties:
        latitude:
          type: number
          format: double
          example: 41.40338
        longitude:
          type: number
          format: double
          example: 2.17403
    AirportDto:
      allOf:
        - $ref: '#/components/schemas/DomainEntity'
      type: object
      title: Airport
      description: Represents an Airport.
      required:
        - id
        - name
        - code
        - departingFlights
        - arrivingFlights
        - city
        - location
      properties:
        name:
          type: string
          description: airport name
          example: John F. Kennedy International Airport
        code:
          type: string
          description: airport code in IATA format
          example: JFK
        departingFlights:
          type: array
          items:
            $ref: '#/components/schemas/FlightDto'
        arrivingFlights:
          type: array
          items:
            $ref: '#/components/schemas/FlightDto'
        city:
          $ref: '#/components/schemas/CityDto'
        location:
          $ref: '#/components/schemas/GPSLocationDto'
  responses:
    SingleStewardDtoResponse:
      description: Response containing a single Steward.
      content:
        application/json:
          schema:
            $ref: '#/components/schemas/StewardDto'
      links:
        link_to_getSteward:
          operationId: getSteward
          parameters:
            id: $response.body#/id
          description: |
            The `id` value returned in the response can be used as
            the `id` parameter in `GET /stewards/{id}`.