usuario.js 2.15 KB
import qs from 'query-string'
import { Observable } from 'rxjs'

import {
  pathOr,
  isEmpty,
  isNil,
  reject,
  merge,
  head,
  pick
} from 'ramda'

import {
  CAMBIAR_DATOS_USUARIO,
  cambiarDatosUsuario
} from '../actions/usuario'

import {
  seleccionarDistrito,
  seleccionarDepartamento
} from '../actions/auxiliares'

import { SENATICS_URL } from '../../constants'

// se usa esto por que no hay una API para consultar si existe el usuarios
const fetchSolicitudes = (token, data) => {
  const options = {
    method: 'GET',
    headers: {
      Accept: 'application/json',
      Authorization: `Bearer ${token}`
    },
  }

  const params = merge({
    page: 1,
  }, reject(isNil, data))
  const url = `${SENATICS_URL}/solicitudes?${qs.stringify(params)}`
  return fetch(url, options)
    .then(response => response.text())
    .then(JSON.parse)
}
/* eslint-disable max-len */
/* eslint-disable no-useless-escape */
const validateEmail = (email) => {
  const re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
  return re.test(String(email).toLowerCase())
}
/* eslint-enable no-useless-escape */
/* eslint-enable max-len */

const getToken = (store) => (store.getState().autenticacion.token)

export const getUserIfExists = (action$, store) =>
  action$.ofType(CAMBIAR_DATOS_USUARIO)
  .map(pathOr(null, ['datos', 'mail']))
  .filter((x) => !isNil(x) && !isEmpty(x) && validateEmail(x))
  .flatMap((email) => Observable.from(fetchSolicitudes(getToken(store), { by_usuario: email })))
  .map(pathOr(null, ['results']))
  .filter((x) => !isEmpty(x))
  .map(head)
  .map(pathOr(null, ['usuario']))
  .flatMap((usuario) => {
    const { distrito } = usuario
    const campos = [
      'nombre', 'apellido', 'domicilio',
      'telefono', 'sexo', 'nacionalidad',
    ]
    const data = merge(pick(campos, usuario), {
      distritoID: distrito.id,
      fechaNacimiento: new Date(usuario.fechaNacimiento)
    })

    return Observable.from([
      cambiarDatosUsuario(data),
      seleccionarDistrito(distrito.id),
      seleccionarDepartamento(distrito.departamento.id)
    ])
  })