swagger: '2.0'
info:
  description: System API
  version: 1.0.0
  title: eBit Market API
  termsOfService: 'http://swagger.io/terms/'
  contact:
    email: apiteam@swagger.io
  license:
    name: Apache 2.0
    url: 'http://www.apache.org/licenses/LICENSE-2.0.html'
host: api
basePath: /v1/
tags:
  - name: user
    description: Operations about user
schemes:
  - http
paths:
  /users:
    post:
      tags:
        - user
      summary: Crea un usuario nuevo
      description: Esta acción la puede realizar cualquiera.
      operationId: users.store
      produces:
        - application/json
      parameters:
        - in: body
          name: body
          description: Datos del usuario
          required: true
          schema:
            $ref: '#/definitions/User'
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/UserData'
        '400':
          description: 'no se ha provisto [name, email, password]'
        '409':
          description: Correo ya existe
  /users/login:
    post:
      tags:
        - user
      summary: Autenticación de usuario
      description: Esta acción la puede realizar cualquiera.
      operationId: users.login
      produces:
        - application/json
      parameters:
        - in: body
          name: body
          description: >-
            -- Correo y contraseña si es manual<br> -- Correo, Proveedor e id
            del usuario si es via google o facebook
          required: true
          schema:
            $ref: '#/definitions/UserLogin'
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/UserDataLogin'
        '401':
          description: 'invalid_credentials, user_not_active, user_not_confirmed'
        '500':
          description: could_not_create_token
  '/users/{id}':
    get:
      tags:
        - user
      summary: Obtiene la información de un usuario específico
      description: >-
        Este método solo puede ser ejecutado por el mismo usuario o por un
        administrador.
      operationId: users.show
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID del usuario
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/UserDataLogin'
        '401':
          description: not_authorized
        '404':
          description: user_not_found
    patch:
      tags:
        - user
      summary: Actualiza la información del usuario
      description: >-
        Este método solo puede ser ejecutado por el mismo usuario o por un
        administrador.
      operationId: users.update
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID de usuario
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
        - in: body
          name: body
          description: Datos del usuario
          required: true
          schema:
            $ref: '#/definitions/UserUpdate'
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/UserDataLogin'
        '401':
          description: not_authorized
    put:
      tags:
        - user
      summary: Activa el usuario
      description: Este método solo puede ser ejecutado por un administrador.
      operationId: users.activate
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID del usuario
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/UserDataLogin'
        '401':
          description: not_authorized
    delete:
      tags:
        - user
      summary: Desactiva el usuario
      description: Este método solo puede ser ejecutado por un administrador.
      operationId: users.deactivate
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID del usuario
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/UserDataLogin'
        '401':
          description: not_authorized
  /users/confirm:
    post:
      tags:
        - user
      summary: Confirmación de usuario
      description: Esta acción la puede realizar cualquiera.
      operationId: users.confirm
      produces:
        - application/json
      parameters:
        - in: body
          name: body
          description: token de confirmación
          required: true
          schema:
            $ref: '#/definitions/UserConfirm'
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/UserDataLogin'
        '404':
          description: user_not_found
  /currencies:
    get:
      tags:
        - currencies
      summary: Lista todas las divisas
      description: Este método puede ser ejecutado por cualquier usuario.
      operationId: currencies.index
      produces:
        - application/json
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/CurrencyData'
    post:
      tags:
        - currencies
      summary: Agrega una divisa nueva
      description: Este método solo puede ser ejecutado por un administrador.
      operationId: currencies.store
      parameters:
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
        - in: body
          name: body
          description: asa
          required: true
          schema:
            $ref: '#/definitions/CurrencyPost'
      produces:
        - application/json
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/CurrencyData'
        '401':
          description: not_authorized
        '409':
          description: currency_already_exists
          schema:
            $ref: '#/definitions/CurrencyError'
  '/currencies/{id}':
    get:
      tags:
        - currencies
      summary: Obtiene la información de una divisa específica
      description: Este método puede ser ejecutado por cualquiera.
      operationId: currencies.show
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID de la divisa
          required: true
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/CurrencyData'
        '404':
          description: currency_not_found
    patch:
      tags:
        - currencies
      summary: Actualiza la información de una divisa específica
      description: Este método solo puede ser ejecutado por un administrador.
      operationId: currencies.update
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID de la divisa
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
        - in: body
          name: body
          description: Datos del usuario
          required: true
          schema:
            $ref: '#/definitions/CurrencyPost'
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/CurrencyData'
        '404':
          description: currency_not_found
    put:
      tags:
        - currencies
      summary: Activa la divisa
      description: Este método solo puede ser ejecutado por un administrador.
      operationId: currencies.activate
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID de la divisa
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/CurrencyData'
        '401':
          description: not_authorized
    delete:
      tags:
        - currencies
      summary: Desactiva la divisa
      description: Este método solo puede ser ejecutado por un administrador.
      operationId: currencies.deactivate
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID de la divisa
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/CurrencyData'
        '401':
          description: not_authorized
  '/currencies/refresh/{id}':
    get:
      tags:
        - currencies
      summary: >-
        Actualiza el valor de todas las divisas o de alguna específica según el
        dolar
      description: Este método solo puede ser ejecutado por un administrador.
      operationId: currencies.refresh
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: >-
            ID de la divisa, si no se proporciona se actualizarán todas las
            divisas
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/CurrencyData'
        '401':
          description: not_authorized
        '404':
          description: currency_not_found
  /banks:
    get:
      tags:
        - banks
      summary: Lista todos los bancos
      description: Este método puede ser ejecutado por cualquier usuario.
      operationId: banks.index
      produces:
        - application/json
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/BanksData'
    post:
      tags:
        - banks
      summary: Crea un banco nuevo
      description: Este método solo puede ser ejecutado por un administrador.
      operationId: banks.store
      parameters:
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
        - in: body
          name: body
          description: Datos del usuario
          required: true
          schema:
            $ref: '#/definitions/BanksPost'
      produces:
        - application/json
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/BanksData'
        '400':
          description: '[name, country_id]_not_provided'
        '401':
          description: not_authorized
        '409':
          description: bank_already_exists
  '/banks/{id}':
    get:
      tags:
        - banks
      summary: Obtiene la información de un banco específico
      description: Este método puede ser ejecutado por cualquiera.
      operationId: banks.show
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID del banco
          required: true
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/BanksData'
        '404':
          description: bank_not_found
    patch:
      tags:
        - banks
      summary: Actualiza la información del usuario
      description: Este método solo puede ser ejecutado por un administrador.
      operationId: banks.update
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID del banco
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
        - in: body
          name: body
          description: Datos del banco
          required: true
          schema:
            $ref: '#/definitions/BanksPost'
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/BanksData'
        '400':
          description: '[name, country]_not_provided'
        '401':
          description: not_authorized
        '404':
          description: bank_not_found
    put:
      tags:
        - banks
      summary: Activa el banco
      description: Este método solo puede ser ejecutado por un administrador.
      operationId: banks.activate
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID del banco
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/BanksData'
        '401':
          description: not_authorized
    delete:
      tags:
        - banks
      summary: Desactiva el banco
      description: Este método solo puede ser ejecutado por un administrador.
      operationId: banks.deactivate
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID del banco
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/BanksData'
        '401':
          description: not_authorized
  /accounts/:
    get:
      tags:
        - accounts
      summary: Muestra el listado de cuentas bancarias
      description: >-
        Este método puede ser ejecutado por un usuario o un administrador. Si el
        usuario es administrador se mostrarán todas las cuentas, si no lo es,
        solo se mostrarán las del usuario.
      operationId: accounts.show
      produces:
        - application/json
      parameters:
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/AccountData'
        '401':
          description: not_authorized
    post:
      tags:
        - accounts
      summary: Agrega una nueva cuenta bancaria
      description: Este método puede ser ejecutado por cualquier usuario.
      operationId: accounts.store
      produces:
        - application/json
      parameters:
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
        - in: body
          name: body
          description: Datos del banco
          required: true
          schema:
            $ref: '#/definitions/AccountPost'
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/AccountData'
        '400':
          description: '[bank_id, email, account_type, account_number]_not_provided'
        '401':
          description: not_authorized
        '409':
          description: account_already_exists
  '/accounts/{id}':
    get:
      tags:
        - accounts
      summary: Muestra una cuenta bancaria específica.
      description: >-
        si la cuenta no le pertenece al usuario que la pide y este no es
        administrados, no se mostrará.
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID de la cuenta bancaria
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/AccountData'
        '401':
          description: not_authorized
        '404':
          description: user_not_found
    patch:
      tags:
        - accounts
      summary: Actualiza una cuenta bancaria específica.
      operationId: accounts.update
      description: >-
        Este método lo puede realizar el usuario dueño de la cuenta o un
        administrador.
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID de la cuenta bancaria
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
        - in: body
          name: body
          description: Datos de la cuenta bancaria
          required: true
          schema:
            $ref: '#/definitions/AccountPost'
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/AccountData'
        '400':
          description: '[bank, email, account_type, account_number]_not_provided'
        '401':
          description: not_authorized
        '404':
          description: account_not_found
        '409':
          description: account_already_exists
    put:
      tags:
        - accounts
      summary: Activa la cuenta bancaria
      description: >-
        Este método lo puede realizar el usuario dueño de la cuenta o un
        administrador.
      operationId: accounts.activate
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID de la cuenta bancaria
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/AccountData'
        '401':
          description: not_authorized
    delete:
      tags:
        - accounts
      summary: Desactiva la cuenta bancaria
      description: >-
        Este método lo puede realizar el usuario dueño de la cuenta o un
        administrador.
      operationId: accounts.deactivate
      produces:
        - application/json
      parameters:
        - in: path
          name: id
          type: integer
          description: ID de la cuenta bancaria
          required: true
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/AccountData'
        '401':
          description: not_authorized
  /products:
    post:
      tags:
        - products
      summary: Agrega un nuevo producto
      description: Este método puede ser ejecutado por cualquier usuario.
      operationId: products.store
      produces:
        - application/json
      consumes:
        - multipart/form-data
      parameters:
        - in: header
          name: Authorization
          required: true
          description: 'Token de autorización [Bearer TOKEN]'
          type: string
          default: Bearer TOKEN
        - in: formData
          name: name
          required: true
          description: Nombre del producto
          type: string
        - in: formData
          name: description
          required: true
          description: Descripción del producto
          type: string
        - in: formData
          name: price
          required: true
          description: Precio del producto
          type: integer
        - in: formData
          name: 'categories[]'
          required: true
          description: IDs de las categorías
          type: file
        - in: formData
          name: 'photos[]'
          required: true
          description: Fotos del producto
          type: file
        - in: formData
          name: brand
          description: Marca del producto
          type: string
        - in: formData
          name: new
          description: Indica si el producto es nuevo
          required: true
          type: boolean
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/ProductData'
        '400':
          description: '[name, description, price, photos]_not_provided'
        '401':
          description: not_authorized
  '/products/photo/{filename}':
    get:
      tags:
        - products
      summary: Mustra la fotografía del producto seleccionado
      description: Este método puede ser ejecutado por cualquier usuario.
      operationId: products.photo
      produces:
        - application/json
      parameters:
        - in: path
          name: filename
          type: string
          description: nombre de archivo de la foto
          required: true
      responses:
        '200':
          description: Operación satisfactoria
  '/search/{keywords}':
    post:
      tags:
        - products
      summary: Mustra la fotografía del producto seleccionado
      description: Este método puede ser ejecutado por cualquier usuario.
      operationId: products.search
      produces:
        - application/json
      parameters:
        - in: path
          name: keywords
          type: string
          description: Palabras clave de la búsqueda
          required: true
        - in: body
          name: filters
          description: Filtros de busqueda
          required: true
          schema:
            $ref: '#/definitions/Filters'
      responses:
        '200':
          description: Operación satisfactoria
          schema:
            $ref: '#/definitions/SearchResult'
definitions:
  User:
    type: object
    properties:
      name:
        type: string
      email:
        type: string
      password:
        type: string
  UserConfirm:
    type: object
    properties:
      token:
        type: string
  UserLogin:
    type: object
    properties:
      name:
        type: string
      email:
        type: string
      password:
        type: string
      provider:
        type: string
      google_id:
        type: string
      facebook_id:
        type: string
  UserUpdate:
    type: object
    properties:
      name:
        type: string
      email:
        type: string
      password:
        type: string
  UserData:
    type: object
    properties:
      error:
        type: string
      user:
        type: object
        properties:
          id:
            type: integer
          name:
            type: string
          email:
            type: string
          token_password:
            type: string
            description: Token required to activate account
          created_at:
            type: string
            format: date-time
          updated_at:
            type: string
            format: date-time
  UserDataLogin:
    type: object
    properties:
      error:
        type: string
      user:
        type: object
        properties:
          id:
            type: integer
          name:
            type: string
          email:
            type: string
          confirmed:
            type: boolean
          token_password:
            type: string
            description: Token required to activate account
          token:
            type: string
            description: JWT
          ebits:
            type: integer
          admin:
            type: integer
          active:
            type: integer
          created_at:
            type: string
            format: date-time
          updated_at:
            type: string
            format: date-time
  CurrencyError:
    type: object
    properties:
      error:
        type: string
      currency:
        type: object
        properties:
          id:
            type: integer
          name:
            type: string
          symbol:
            type: string
          xe_code:
            type: string
            description: 'Currency code provided by http://www.xe.com'
          dolar_value:
            type: integer
          created_at:
            type: string
            format: date-time
          updated_at:
            type: string
            format: date-time
  CurrencyData:
    type: object
    properties:
      id:
        type: integer
      name:
        type: string
      symbol:
        type: string
      xe_code:
        type: string
        description: 'Currency code provided by http://www.xe.com'
      dolar_value:
        type: integer
      created_at:
        type: string
        format: date-time
      updated_at:
        type: string
        format: date-time
  CurrencyPost:
    type: object
    properties:
      name:
        type: string
      symbol:
        type: string
      xe_code:
        type: string
        description: 'Currency code provided by http://www.xe.com'
      dolar_value:
        type: integer
  BanksData:
    type: object
    properties:
      id:
        type: integer
      name:
        type: string
      country_id:
        type: integer
      country:
        type: string
  BanksPost:
    type: object
    properties:
      name:
        type: string
      country_id:
        type: integer
  AccountData:
    type: object
    properties:
      id:
        type: integer
      user_id:
        type: integer
      email:
        type: string
      account_number:
        type: integer
      account_type:
        type: string
      bank_id:
        type: integer
      bank:
        type: string
      country_id:
        type: integer
      country:
        type: string
  AccountPost:
    type: object
    properties:
      bank_id:
        type: integer
      email:
        type: string
      account_type:
        type: string
      account_number:
        type: integer
  ProductData:
    type: object
    properties:
      id:
        type: integer
      user_id:
        type: integer
      name:
        type: string
      description:
        type: string
      price:
        type: integer
      brand:
        type: string
      is_new:
        type: boolean
      photos:
        type: string
      categories:
        type: string
      active:
        type: boolean
      created_at:
        type: string
        format: date-time
      updated_at:
        type: string
        format: date-time
  Filters:
    type: object
    properties:
      categories:
        type: array
      new:
        type: boolean
      used:
        type: boolean
      min_price:
        type: integer
      max_price:
        type: integer
  SearchResult:
    type: object
    properties:
      products:
        type: object
        properties:
          id:
            type: integer
          name:
            type: string
          description:
            type: string
          price:
            type: integer
          created_at:
            type: string
            format: date-time
          categories:
            type: array
      categories:
        type: object
        properties:
          id:
            type: integer
          category:
            type: string
externalDocs:
  description: Find out more about Swagger
  url: 'http://swagger.io'
