swagger: "2.0"
info:
  description: "This is a RESTful API to access world data, including countries, regions, and cities."
  version: "1.0.0"
  title: "World Data API"

host: "127.0.0.1:8443"
schemes:
- "http"

tags:
- name: "token"
  description: "Get a JWT for authorization"
- name: "countries"
  description: "Access the world countries"
- name: "regions"
  description: "Access the regions of countries"
- name: "cities"
  description: "Access the world cities"


paths:
  /gettoken:
    post:
      tags:
      - "token"
      summary: "Get a token to authorize future requests"
      consumes: 
        -  "application/x-www-form-urlencoded"
      produces:
        - text/plain
      parameters:
        - in: formData
          name: user
          required: true
          type: string
        - in: formData
          name: password
          required: true
          type: string
      responses:
        200:
          description: A valid token to use for other requests
        401:
          description: "Wrong user/password"

  /regions:
    get:
      tags:
      - "regions"
      summary: "Get all regions of all countries"
      produces:
        - application/json
      parameters:
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        200:
          description: "OK"
        401:
          description: "No token provided"
          
    post:
      tags:
      - "regions"
      summary: "Add a region to a given country"
      consumes: 
        -  "application/x-www-form-urlencoded"
      produces:
        - text/plain
      parameters:
        - in: formData
          name: name
          required: true
          type: string
          description: The new region's name.
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        201:
          description: "OK, created"
        400:
          description: "Name missing, region not created"
        401:
          description: "No token provided"
        403:
          description: "Country not found, region not created"
        409:
          description: "Other failure, region not created"  

  /regions/{country}:
    get:
      tags:
      - "regions"
      summary: "Get all regions of a given country"
      produces:
        - application/json
      parameters:
        - name: country
          in: path
          description: "Country (id) whose regions are required"
          type: string
          required: true  
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        200:
          description: "OK"
        401:
          description: "No token provided"
        404:
          description: "Country not found"

  /regions/{country}/{id}:
  
    get:
      tags:
      - "regions"
      summary: "Get a specific region of a given country"
      produces:
        - application/json
      parameters:
        - name: country
          in: path
          description: "Country (id) of the region"
          type: string
          required: true  
        - name: id
          in: path
          description: "Region (id) that is required"
          type: string
          required: true  
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        200:
          description: "OK"
        401:
          description: "No token provided"
        404:
          description: "Country not found"

    delete:
      tags:
      - "regions"
      summary: "Delete a specific region of a given country"
      description: ""
      parameters:
        - name: country
          in: path
          description: "Country (id) of the region"
          type: string
          required: true  
        - name: id
          in: path
          description: "Region (id) that is to be deleted"
          type: string
          required: true  
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        204:
          description: "OK, region was deleted"
        401:
          description: "No token provided"
        404:
          description: "Region does not exist"
        405:
          description: "Region has cities, cannot be deleted"

    put:
      tags:
      - "regions"
      summary: "Update a specific region of a given country"
      consumes: 
        -  "application/x-www-form-urlencoded"
      produces:
        - text/plain
      parameters:
        - name: country
          in: path
          description: "Country (id) of the region"
          type: string
          required: true  
        - name: id
          in: path
          description: "Region (id) that is to be deleted"
          type: string
          required: true  
        - in: formData
          name: name
          required: true
          type: string
          description: The region's new name.
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        204:
          description: "OK, region was updated"
        400:
          description: "Name missing, region not updated"
        401:
          description: "No token provided"
        404:
          description: "Country not found"

  /countries:
    get:
      tags:
      - "countries"
      summary: "Get all countries"
      produces:
        - application/json
      parameters:
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        200:
          description: "OK"
        401:
          description: "No token provided"
          
  /countries/{country}:
    get:
      tags:
      - "countries"
      summary: "Get a single country"
      produces:
        - application/json
      parameters:
        - name: country
          in: path
          description: "Required Country"
          type: string
          required: true  
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        200:
          description: "OK"
        401:
          description: "No token provided"
        404:
          description: "Country not found"

    delete:
      tags:
      - "countries"
      summary: "Delete a specific country"
      description: ""
      parameters:
        - name: country
          in: path
          description: "Country to delete"
          type: string
          required: true  
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        204:
          description: "OK, country was deleted"
        401:
          description: "No token provided"
        404:
          description: "Country does not exist"
        405:
          description: "Country has regions, cannot be deleted"

    put:
      tags:
      - "countries"
      summary: "Update or create a country"
      consumes: 
        -  "application/x-www-form-urlencoded"
      produces:
        - text/plain
      parameters:
        - name: country
          in: path
          description: "Country"
          type: string
          required: true  
        - in: formData
          name: name
          required: true
          type: string
          description: The region's new name.
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        204:
          description: "OK, coutry was updated"
        400:
          description: "Name missing, country not updated"
        401:
          description: "No token provided"

  /cities:
    post:
      tags:
      - "cities"
      summary: "Add a city"
      consumes: 
        -  "application/x-www-form-urlencoded"
      produces:
        - text/plain
      parameters:
        - in: formData
          name: name
          required: true
          type: string
          description: The new city's name.
        - in: formData
          name: latitude
          required: true
          type: number
          description: The new city's latitude.
        - in: formData
          name: longitude
          required: true
          type: number
          description: The new city's longitude.
        - in: formData
          name: population
          required: true
          type: number
          description: The new city's population.
        - in: formData
          name: countryCode
          required: true
          type: string
          description: The new city's country.
        - in: formData
          name: regionCode
          required: true
          type: string
          description: The new city's region.
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        201:
          description: "OK, created"
        400:
          description: "Name missing, city not created"
        401:
          description: "No token provided"
        403:
          description: "Region not found, city not created"
        409:
          description: "Other failure, city not created"  

  /cities/{cityId}:
    get:
      tags:
      - "cities"
      summary: "Get a specific city"
      produces:
        - application/json
      parameters:
        - name: cityId
          in: path
          description: "Id of the city"
          type: number
          required: true  
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        200:
          description: "OK"
        401:
          description: "No token provided"
        404:
          description: "City not found"

    delete:
      tags:
      - "cities"
      summary: "Delete a specific city"
      description: ""
      parameters:
        - name: cityId
          in: path
          description: "Id of the city"
          type: number
          required: true  
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        204:
          description: "OK, city was deleted"
        401:
          description: "No token provided"
        404:
          description: "City does not exist"

    put:
      tags:
      - "cities"
      summary: "Update a specific city"
      consumes: 
        -  "application/x-www-form-urlencoded"
      produces:
        - text/plain
      parameters:
        - name: cityId
          in: path
          description: "Id of the city"
          type: number
          required: true  
        - in: formData
          name: name
          required: true
          type: string
          description: The new city's name.
        - in: formData
          name: latitude
          required: true
          type: number
          description: The new city's latitude.
        - in: formData
          name: longitude
          required: true
          type: number
          description: The new city's longitude.
        - in: formData
          name: population
          required: true
          type: number
          description: The new city's population.
        - in: formData
          name: countryCode
          required: true
          type: string
          description: The new city's country.
        - in: formData
          name: regionCode
          required: true
          type: string
          description: The new city's region.
        - in: header
          name: "Authorization"
          required: true
          type: string
          description: Authorization Token
      responses:
        204:
          description: "OK, city was updated"
        400:
          description: "Name missing, city not updated"
        401:
          description: "No token provided"
        404:
          description: "City not found"
