swagger: "2.0"
info:
  title: Mainflux users service
  description: HTTP API for managing platform users.
  version: "1.0.0"
consumes:
  - "application/json"
produces:
  - "application/json"
paths:
  /users:
    post:
      summary: Registers user account
      description: |
        Registers new user account given email and password. New account will
        be uniquely identified by its email address.
      tags:
        - users
      parameters:
        - name: user
          description: JSON-formatted document describing the new user.
          in: body
          schema:
            $ref: "#/definitions/User"
          required: true
      responses:
        201:
          description: Registered new user.
        400:
          description: Failed due to malformed JSON.
        409:
          description: Failed due to using an existing email address.
        415:
          description: Missing or invalid content type.
        500:
          $ref: "#/responses/ServiceError"
  /users:
    get:
      summary: Gets info on currently logged in user.
      description: |
        Gets info on currently logged in user. Info is obtained using
        authorization token
      tags:
        - users
      parameters:
        - $ref: "#/parameters/Authorization"
      responses:
        200:
          description: Data retrieved.
          schema:
            $ref: "#/definitions/UsersPage"
        400:
          description: Failed due to malformed query parameters.
        403:
          description: Missing or invalid access token provided.
        500:
          $ref: "#/responses/ServiceError"
  /users:
    put:
      summary: Updates info on currently logged in user.
      description: |
        Updates info on currently logged in user. Info is updated using
        authorization token and the new received info.
      tags:
        - users
      parameters:
        - $ref: "#/parameters/Authorization"
        - name: metadata
          description: JSON-formatted document containing user info.
          in: body
          schema:
            $ref: "#/definitions/CreateThingReq"
          required: true
      responses:
        200:
          description: User updated.
        400:
          description: Failed due to malformed JSON.
        403:
          description: Missing or invalid access token provided.
        500:
          $ref: "#/responses/ServiceError"
  /tokens:
    post:
      summary: User authentication
      description: |
        Generates an access token when provided with proper credentials.
      tags:
        - users
      parameters:
        - name: credentials
          description: JSON-formatted document containing user credentials.
          in: body
          schema:
            $ref: "#/definitions/User"
          required: true
      responses:
        201:
          description: User authenticated.
          schema:
            $ref: "#/definitions/Token"
        400:
          description: |
            Failed due to malformed JSON.
          schema:
            $ref: "#/definitions/Error"
        403:
          description: |
            Failed due to using invalid credentials.
          schema:
            $ref: "#/definitions/Error"
        415:
          description: Missing or invalid content type.
          schema:
            $ref: "#/definitions/Error"
        500:
          $ref: "#/responses/ServiceError"
  /password/reset-request:
    post:
      summary: User password reset request
      description: |
        Generates a reset token and sends and email with link for resetting password.
      tags:
        - users
      parameters:
        - name: email
          description: JSON-formatted document containing user email.
          in: body
          schema:
            $ref: "#/parameters/Authorization"
            $ref: "#/definitions/PasswordResetRequest"
          required: true
      responses:
        201:
          description: User link .
        400:
          description: |
            Failed due to malformed JSON.
        415:
          description: Missing or invalid content type.
        500:
          $ref: "#/responses/ServiceError"
  /password/reset:
    put:
      summary: User password reset endpoint
      description: |
        When user gets reset token posting a new password along to this endpoint will change password.
      tags:
        - users
      parameters:
        - name: password
          description: JSON-formatted document containing user email, token and new password.
          in: body
          schema:
            $ref: "#/definitions/PasswordReset"
          required: true
      responses:
        201:
          description: User link .
        400:
          description: |
            Failed due to malformed JSON.
        415:
          description: Missing or invalid content type.
        500:
          $ref: "#/responses/ServiceError"
  /password:
    patch:
      summary: User password change endpoint
      description: |
        When authenticated user wants to change password.
      tags:
        - users
      parameters:
        - name: password
          description: JSON-formatted document containing user email, token and new password.
          in: body
          schema:
            $ref: "#/parameters/Authorization"
            $ref: "#/definitions/PasswordChange"
          required: true
      responses:
        201:
          description: User link .
        400:
          description: |
            Failed due to malformed JSON.
        415:
          description: Missing or invalid content type.
        500:
          $ref: "#/responses/ServiceError"
responses:
  ServiceError:
    description: Unexpected server-side error occurred.
definitions:
  Token:
    type: object
    properties:
      token:
        type: string
        description: Generated access token.
    required:
      - token
  User:
    type: object
    properties:
      email:
        type: string
        format: email
        example: "test@example.com"
        description: User's email address will be used as its unique identifier
      password:
        type: string
        format: password
        minimum: 8
        description: Free-form account password used for acquiring auth token(s).
    required:
      - email
      - password
  Email:
    properties:
      email:
        type: string
        format: email
        example: "test@example.com"
        description: User's email address will be used as its unique identifier
    required:
      - email


parameters:
  Authorization:
    name: Authorization
    description: User's access token.
    in: header
    type: string
    required: true
  Referer:
    name: Referer
    description: Host being sent by browser.
    in: header
    type: string
    required: true
  Metadata:
    name: metadata
    description: Metadata filter. Filtering is performed matching the parameter with metadata on top level. Parameter is json.
    in: query
    type: string
    minimum: 0
    required: false

responses:
  ServiceError:
    description: Unexpected server-side error occurred.

definitions:
  UsersPage:
    type: object
    properties:
      email:
        type: string
        description: ID of the user
      metadata:
        type: object
        description: Custom metadata related to User
  updateUserReq:
    type: object
    description: Arbitrary, object-encoded user's data.
  PasswordResetRequest:
    type: object
    properties:
      email:
        type: string
        description: Email of the user
  PasswordReset:
    type: object
    properties:
      password:
        type: string
        description: New password
        minimum: 8
      confirm_password:
        type: string
        description: New password confirmed
        minimum: 8
      token:
        type: string
        description: Reset token generated and sent in email
  PasswordChange:
    type: object
    properties:
      password:
        type: string
        description: New password
      old_password:
        type: string
        description: Confirm password
  Error:
    type: object
    properties:
      error:
        type: string
        description: Error message
