GithubHelp home page GithubHelp logo

backend_arrendamiento_jansel's Introduction

Hi 👋, I'm Jose Alberto Arango Sánchez

Data Scientist and Machine Learning Engineer

  • 👋 Hi, I’m @josearangos - Machine Learning Engineer
  • 🤖 Passionate about sciences that help improve people's lives.
  • 👀 My great passion is Artificial Intelligence and Innovation.
  • 📚 Interested in Data Science, ML, DL, Voice, science, and software.
  • 🌱 Currently learning about MLOps, LLMOps, unraveling the mysteries of AI models.
  • 🧠 My goal is to make science accessible to everyone!
  • 💡 I believe that big challenges bring out the best in you.
  • 💞️ Looking to collaborate on Machine Learning Open Source Tools to democratize the use of these.
  • 📫 Reach me at [email protected]
  • 🧠  I'm learning LLMs, LLMOps, MLOps, Langchain, AutoGen, LMMs
  • 🤝  I'm open to collaborating on NLP solutions, LLMs, Speech recognition, Emotion recognition, Diarization, Speech validation

Papers

Arango-Sánchez, Jose A., and Julián D. Arias-Londoño. "An enhanced conv-TasNet model for speech separation using a speaker distance-based loss function." arXiv preprint arXiv:2205.13657 (2022)

Skills

PythonJavaGitJavaScriptFast APIPostgreSQLFlaskMySQLMongoDBAmazon Web ServicesDockerLinuxMacOSPyTorchTensorFlowGoogle Cloud

Socials

Badges

My GitHub Stats

josearangos's GitHub stats

backend_arrendamiento_jansel's People

Contributors

cristianmarind avatar josearangos avatar lisudea avatar manilli avatar manugo-dev avatar sebasosorno avatar

Watchers

 avatar  avatar  avatar  avatar

Forkers

manilli

backend_arrendamiento_jansel's Issues

Unit testing

  • Crear las diferentes pruebas unitarias necesarias para el correcto funcionamiento de la aplicación.

removeBooking

  • Crear método DELETE con el End Point: V1/homes/removeBooking en routes/routes.js.
  • Validar que el Token el cual se envía en la cabecera sea valido haciendo uso del método verifyIdToken que se encuentra en externalServices/firebase.js.
  • Validar que el json Request de la petición, el cual es un bookingId sea de tipo String y que el formato sea el correcto, ejemplo de bookingId = "idHome*checkIn*checkOut" , se debe validar mínimamente que el checkIn < checkOut, y ambos tengan un formato de fecha DÍA-MES-AÑO ya que para validar el idHome se debe hacer una consulta. Nota: los métodos de validación debe ser creados dentro del archivo validations/validator.js e invocados en el método creado anteriormente ya que el controlador debe recibirlos en un formato correcto.
  • Crear un método llamado removeBooking dentro de controllers/userController.js que reciba el bookingId y el uid del usuario que desea eliminar la reserva, este debe retornar el siguiente JSON de respuesta:
{
    "agency": {
        "name": "Arrendamientos Santa Fé",
        "nit": "1123-1233-12313-51414"
    },
    "codigo": 1,
    "mensaje": "Cancelacion con exito!!!"
}
En el codigo se enviara un 1 en caso de que se realizo la cancelacion satisfactoriamente o 0 en caso contrario
  • Usar userModel para eliminar el bookingId del usuario identificado con el uid se recomienda primero buscar el usuario y luego borrar el bookingId.
  • Usar homeModel para eliminar dentro de la propiedad bookings de la home la reserva.

EJEMPLO

Un Front-End hace una petición a nuestra API a través del End point : V1/homes/removeBooking

Cabecera

Este envía en la cabecera lo siguiente

token: "124120fssdffsdffffslsgPROLvLSVKMF5DTaoRuNnMCdddhhythytfhf9907hjgh2"

Body

En el body envía lo siguiente

{
   "bookingId": "1*15-08-2018*25-08-2018"
}

Antes de ejecutarse el algoritmo de removeBooking la base de datos tiene lo siguiente:

En la colección users

{
    "uid": "9Mkgz46wmQX0nNSKqucrtkNaYJp1",
    "bookings": [
        {
            "bookingId": "1*12-06-2018*16-06-2018"
        },
        {
            "bookingId": "1*15-08-2018*25-08-2018"
        },
        {
            "bookingId": "4*17-09-2018*24-09-2018"
        }
    ]
}

Firebase Integration and Auth

Cosas a hacer

  • Leer como integrar Node con firebase, ver la siguiente guía : https://firebase.google.com/docs/admin/setup
  • instalar la dependencia de firebase -> npm install firebase-admin --save
  • importar la libreria con -> var admin = require('firebase-admin'); o tambien se puede usar -> import * as admin from 'firebase-admin';
  • crear un archivo en la ubicación globals/firebaseKeys.json donde se coloquen las credenciales de firebase, este debe llamarse -> firebaseKeys.json
  • Inicializar SDK en el archivo server/main.js de la siguiente forma:
    var admin = require('firebase-admin');
    var serviceAccount = require('globals/firebaseKeys.json');
    admin.initializeApp({
    credential: admin.credential.cert(serviceAccount)
    });
  • crear carpeta llamada externalServices y un archivo dentro de esta llamado firebase.js
  • Crear una funcion llamada verifyIdToken dentro de externalServices/firebase.js que se encargue de Verificar el token del usuario y retorne el uid del usuario conectado, ver la siguiente guía : https://firebase.google.com/docs/auth/admin/verify-id-tokens

PARA USAR ESTE SERVICIO DEBEN HACER LO SIGUIENTE

  1. Importar los servicios de firebase donde este el método verifyIdToken como se muestra acontinuación.
    const firebase = require ('../externalServices/firebase');
  2. Invoca la función verifyIdToken como se muestra a continuación:
firebase.verifyIdToken(idToken, function(error, data){
    if (!error) {
        console.log(data); // en esta viene el uid del usuario
    } else {
        console.log(data); // viene el error en este caso token no valido
    }      
});

En **error** viene un booleano **False** si no hay error y **True** sí lo hay, y en data viene lo mencionado en caso de exito el **uid** en caso contrario un json con el error que indica que el token no valido

searchHomes

Refactorizar con lo siguiente:

  • validar que las fechas que llegan el request sean mayor a la actual
  • busca las homes del type y ciudad solicitado y que esten disponibles en el rango de fechas solicitado en el request y retornar el siguiente JSON:

Response
{
"agency": {
"name": "Arrendamientos Santa Fé",
"nit": "1123-1233-12313-51414"
},
"homes": [
{
"id": 1 ,
"name": "Torre davivienda",
"description": "Apartamento muy comodito",
"location": {
"address": "Avenida siempre viva 123",
"latitude": "4.1231231",
"longitude": "-421213212"
},
"city": "Medellín",
"type": "Apartamento",
"rating": "4.9",
"totalAmount": "932.234",
"pricePerNight": "100.233",
"thumbnail": "https://goo.gl/sccYgg"
},
{
"id": 2 ,
"name": "La quinta porra",
"description": "Apartamento muy lejos",
"location": {
"address": "Cra 1 # 1 A 1",
"latitude": "5.12",
"longitude": "21213212"
},
"city": "Medellín",
"type": "Casa",
"rating": "2",
"totalAmount": "50.000",
"pricePerNight": "20.000",
"thumbnail": "https://goo.gl/sccYgg"
}
]
}

Add new city type

Add new city type:
CTG: Cartagena
CAL: Cali
SMR: Santa Marta
MDE: Medellín

Service tests

  • Crear las pruebas necesarias para los diferentes servicios ofrecidos por la API

Refactorizar codigo

Refactorizar el codigo del archivo routes/routes.js,
creando un unico metodo de validación en el archivo validations/validator.js
el objetivo es quitar el monton de if anidados que se presentan en routes.js
Nota: se recomienda hacer uso de la siguiente plataforma : https://www.kiuwan.com/ la cual realiza un analisis al codigo midiendo la calidad del mismo e informando las lineas donde existen errores

  • Cristian
  • Juan
  • Manuel
  • Jose
  • Sebastian

Book

  • Crear método POST con el End Point: `V1/homes/booking en routes/routes.js.

  • Crear las respectiva validaciones del request de la solicitud (Formato de fechas y el id del home sea numerico).

  • Validar que el Token el cual se envia en la cabecera, sea valido haciendo uso del metodo verifyIdToken que se encuentra en externalServices/firebase.js.

  • Validar que la home este disponible creando un metodo asincrono llamado homeAvailability dentro de controllers/homeController.js que reciba el Request de la peticion y retorne (1, "[error]") en caso de un error, si la casa esta ocupada o desocupada (0, "[false/true respectivamente]")

  • Crear el booking ID con la siguiente convención: idHomecheckincheckout
    Ejemplo "bookingId": "2*12-06-2018*16-06-2018"

  • Inserta en la colección de homes, en el documento correspondiente a la home, una nueva booking en el array con tag bookings.

  • Inserta en la colección users, en el documento -correspondiente al user que está haciendo la petición- el bookingId de la reserva dentro del array que tiene tag bookings.

  • Retorna el Response

Request

{
    "checkIn": "07-04-2018",
    "checkOut": "10-04-2018",
    "id": 1
}

el respectivo id enviado, es el id que identifica el home

Response

{
    "agency": {
        "name": "Arrendamientos Santa Fé",
        "nit": "1123-1233-12313-51414"
    },
    "codigo": 1,
    "mensaje": "Reserva con exito!!!"
}

En el codigo se enviara un 1 en caso de que se realizo la reserva satisfactoriamente o 0 en caso contrario

myBooking

Consular las reservas que un usuario tiene

  • Crear método POST con el End Point: `V1/homes/myBooking en routes/routes.js.
  • Validar que el Token el cual se envía en la cabecera sea valido haciendo uso del método verifyIdToken que se encuentra en externalServices/firebase.js
  • Crear el siguiente modelo de mongo en el archivo models/userModel.js
    **

Ejemplo:

**

{
   "uid": "0lsgPROLvLSVKMF5DTaoRuNnMCd2",
    "bookings": [
        {
            "bookingId": "2*12-06-2018*16-06-2018"
        },
        {
            "bookingId": "5*24-08-2018*29-06-2018"
        },
        {
            "bookingId": "3*17-09-2018*24-09-2018"
        }
    ]
}
  • crear un archivo llamado userController.js dentro de la carpeta controllers este se encargara de toda la lógica del usuario.
  • Crear un método llamado myBookings dentro de controllers/userController.js que reciba el uid del usuario, el cual es retornado por el método verifyIdToken que se encuentra en externalServices/firebase.js y retorne un JSON con la información básica de las homes reservadas como se muestra en el siguiente ejemplo:
    NOTA: en el array de **booking** del JSON de respuesta solo deben ir las reservar hechas por el usuario solicitante
{
    "agency": {
        "name": "Arrendamientos Santa Fé",
        "nit": "1123-1233-12313-51414"
    },

    "homes": [
        {
            "id": 1 ,
            "name": "Torre davivienda",
            "description": "Apartamento muy comodito",
            "location": {
                "address": "Avenida siempre viva 123",
                "latitude": "4.1231231",
                "longitude": "-421213212"
            },
            "city": "Medellín",
            "type": "Apartamento",
            "rating": "4.9",
            "totalAmount": "932.234",
            "pricePerNight": "100.233",
            "thumbnail": "https://goo.gl/sccYgg",
            "booking":[
                {
                    "checkIn": "07-04-2018",
                    "checkOut": "10-04-2018",
                    "bookingId": "1*07-04-2018*10-04-2018" 
                },
                {
                    "checkIn": "03-06-2018",
                    "checkOut": "10-08-2018",
                    "bookingId": "1*03-06-2018*10-08-2018"
                }
            ]
        }, 
        {
            "id": 2 ,
            "name": "La quinta porra",
            "description": "Apartamento muy lejos",
            "location": {
                "address": "Cra 1 # 1 A 1",
                "latitude": "5.12",
                "longitude": "21213212"
            },
            "city": "Medellín",
            "type": "Casa",
            "rating": "2",
            "totalAmount": "50.000",
            "pricePerNight": "20.000",
            "thumbnail": "https://goo.gl/sccYgg",
            "booking":[
                {
                    "checkIn": "06-07-2018",
                    "checkOut": "10-04-2018",
                    "bookingId": "2*06-07-2018*10-04-2018"
                }
            ]
        }
    ]
}

RECOMENDACIÓN
Para la lógica del método mybookings que se encuentra dentro de
controllers/userController.js se recomienda el siguiente algoritmo:

  1. Acceda a la colección users usando el modelo userModel.js
  2. Busque el usuario identificado con el uid usando el metodo find de mongo, ejemplo
var query = {
    uid:uid
}
userModel.find(query,(err, user)=>{
          
});

Dentro de user vienen un JSON como el siguiente ejemplo:

{ 
    "uid": "9Mkgz46wmQX0nNSKqucrtkNaYJp1",
   "bookings": [
        {
            "bookingId": "1*12-06-2018*16-06-2018"
        },
        {
            "bookingId": "1*15-08-2018*25-08-2018"
        },
        {
            "bookingId": "4*17-09-2018*24-09-2018"
        }
    ]
}

Como se logra apreciar en cada bookingId es una PK (llave primaria) con el siguiente formato "idHome checkIncheckOut", por lo tanto para poder retornar la información de las homes debemos capturar todos los idHome de las homes que tiene en reserva, en la estructura de datos mas cómoda (vector, arrayList, string, etc) para el programador.

ejemplo: var idHomes = ["1","4"]

  1. Luego de saber los idHomes de las casa reservadas por el usuario, se procede a construir el QUERY de consulta para mongo la cual traiga las homes con los id previamente identificados, haciendo uso del operador lógico OR como el siguiente ejemplo:
var queryidHomes={ 
    $or :[
           {"id":idHomes[0] },
           {"id":idHomes[1] }
          ] 
}  
  1. Luego introducimos la QUERY creada dentro del método find de mongo haciendo uso del modelo Homes como se muestra en el siguiente ejemplo:
homeModel.find(queryidHomes,(err, homes)=>{
              
});        

Dentro del objeto homes viene un array de JSON's con la información de las casa reservadas por el usuario, sin embarga en la propiedad bookings trae también las reservas hechas por otros usuarios, por lo tanto este JSON se debe modificar en este atributo, para que solo tenga las reservas hechas por el usuario que esta consultando. a continuación se muestra el JSON que viene en homes y el JSON que debería ser retornado por la función myBookings

JSON QUE VIENE EN HOMES:

[
 {
     "id": 1,
    "type": "Apartamento",
    "name": "Torre davivienda",
    "description": "Apartamento muy comodito",
    "location": {
        "address": "Cl. 32c #66a-2",
        "latitude": "6.2371963",
        "longitude": "-75.5863614"
    },
    "city": "Medellín",
    "rating": "4.9",
    "totalAmount": 0,
    "pricePerNight": "100.233",
    "thumbnail": "https://www.constructoracapital.com/uploads/proyectos/1492813439_DSC_0093_EDI.jpg",
    "bookings": [
        {
            "checkIn": "12-06-2018",
            "checkOut": "16-06-2018",
            "bookingId": "1*12-06-2018*16-06-2018"
        },
        {
            "checkIn": "12-07-2018",
            "checkOut": "16-07-2018",
            "bookingId": "1*12-07-2018*16-07-2018"
        },
        {
            "checkIn": "15-08-2018",
            "checkOut": "25-08-2018",
            "bookingId": "1*15-08-2018*25-08-2018"
        },
        {
            "checkIn": "24-08-2018",
            "checkOut": "30-08-2018",
            "bookingId": "1*24-08-2018*30-08-2018"
        }
    ]
},
{
      "id": 4,
    "type": "Apartamento",
    "name": "Torre jacinto",
    "description": "Apartamento muy loquillo",
    "location": {
        "address": "Cl. 30c #52-2 a 52-88",
        "latitude": "10.4015888",
        "longitude": "-75.5010922"
    },
    "city": "Cartagena",
    "rating": "4.9",
    "totalAmount": 0,
    "pricePerNight": "220.233",
    "thumbnail": "https://d15jm47acbjce0.cloudfront.net/s838x629_-428663469.jpg",
    "bookings": [
        {
            "checkIn": "12-06-2018",
            "checkOut": "16-06-2018",
            "bookingId": "4*12-06-2018*16-06-2018"
        },
        {
            "checkIn": "17-09-2018",
            "checkOut": "24-09-2018",
            "bookingId": "4*17-09-2018*24-09-2018"
        }
    ]
}
]

JSON QUE SE ESPERA SEA RETORNADO

[
 {
     "id": 1,
    "type": "Apartamento",
    "name": "Torre davivienda",
    "description": "Apartamento muy comodito",
    "location": {
        "address": "Cl. 32c #66a-2",
        "latitude": "6.2371963",
        "longitude": "-75.5863614"
    },
    "city": "Medellín",
    "rating": "4.9",
    "totalAmount": 0,
    "pricePerNight": "100.233",
    "thumbnail": "https://www.constructoracapital.com/uploads/proyectos/1492813439_DSC_0093_EDI.jpg",
    "bookings": [
        {
            "checkIn": "12-06-2018",
            "checkOut": "16-06-2018",
            "bookingId": "1*12-06-2018*16-06-2018"
        },       
        {
            "checkIn": "15-08-2018",
            "checkOut": "25-08-2018",
            "bookingId": "1*15-08-2018*25-08-2018"
        }
    ]
},
{
      "id": 4,
    "type": "Apartamento",
    "name": "Torre jacinto",
    "description": "Apartamento muy loquillo",
    "location": {
        "address": "Cl. 30c #52-2 a 52-88",
        "latitude": "10.4015888",
        "longitude": "-75.5010922"
    },
    "city": "Cartagena",
    "rating": "4.9",
    "totalAmount": 0,
    "pricePerNight": "220.233",
    "thumbnail": "https://d15jm47acbjce0.cloudfront.net/s838x629_-428663469.jpg",
    "bookings": [   
          {
            "checkIn": "17-09-2018",
            "checkOut": "24-09-2018",
            "bookingId": "4*17-09-2018*24-09-2018"
        }
    ]
}
]

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.