Skip to content

Agregar traducción de list.js en src/database/redis/list.ts#57

Open
AnyaMarcanito wants to merge 22 commits intoUSB-CI3715:f24from
AnyaMarcanito:fileTranscriptionJsToTs
Open

Agregar traducción de list.js en src/database/redis/list.ts#57
AnyaMarcanito wants to merge 22 commits intoUSB-CI3715:f24from
AnyaMarcanito:fileTranscriptionJsToTs

Conversation

@AnyaMarcanito
Copy link

@AnyaMarcanito AnyaMarcanito commented Oct 14, 2024

Traducción a TypeScript

Elaborado por

Anya Marcano
Carnet: 19-10336

Issue asociado

#13 (fixes #13)

Cambios implementados

Este Pull Request tiene como proposito general agregar el archivo src/database/redis/list.ts producto de una traduccion realizada a src/database/redis/list.js para lo cual, se siguieron los siguientes pasos:

1. Creación del Archivo list.ts en src/database/redis/list.ts
Se creó un nuevo archivo el cual inicialmente fue una copia de list.js.

2. Importación de Módulos
Se importaron los módulos necesarios utilizando la sintaxis de ES6.

import { execBatch } from './helpers';

3. Definición de Interfaces
Se definieron tres interfaces distintas para manejar cada uno de los diferentes tipos presentes dentro del archivo:

  • Interface RedisModule

    interface RedisModule {
        client: Redis;
        listPrepend(key: string, value: string[] | string): Promise<void>;
        listAppend(key: string, value: string[] | string): Promise<void>;
        listRemoveLast(key: string): Promise<string | null>;
        listRemoveAll(key: string, value: string[] | string): Promise<void>;
        listTrim(key: string, start: number, stop: number): Promise<void>;
        getListRange(key: string, start: number, stop: number): Promise<string[] | null>;
        listLength(key: string): Promise<number>;
    }
    

    Esta primera interfaz llamada RedisModule, fue definida con la finalidad de poder tipar el objeto que contiene los métodos para manipular listas en Redis, donde los metodos considerados son:

    • listPrepend
    • listAppend
    • listRemoveLast:
    • listRemoveAll
    • listTrim
    • getListRange
    • listLength
  • Interface Redis

    interface Redis {
       lpush(key: string, value: string[] | string): Promise<number>;
       rpush(key: string, value: string[] | string): Promise<number>;
       rpop(key: string): Promise<string | null>;
       lrem(key: string, count: number, value: string): Promise<number>;
       ltrim(key: string, start: number, stop: number): Promise<string>;
       lrange(key: string, start: number, stop: number): Promise<string[]>;
       llen(key: string): Promise<number>;
       pipeline(): batch;
       exec(): Promise<void>;
    }
    

    Una segunda interfaz llamada: Redis para manejar la conexión con el cliente Redis y poder definir las entradas y salidas de las funciones del mismo que son usadas dentro del archivo, las cuales son:

      -  lpush
      -  rpush
      -  rpop
      -  lrem
      -  ltrim
      -  lrange
      -  llen
      -  pipeline
      -  exec
    
  • Interface batch

    interface batch {
        lrem(key: string, count: number, value: string): batch;
    }
    
    Y finalmente, una última interfaz, llamada batch, con la que se logran manejar las entradas y salidas derivadas con el uso de la función pipeline
    

4. Exportación del Módulo
Se exportó una función que toma un objeto RedisModule y a este se le fueron agregando las distintas definiciones necesarias para manipular listas en Redis.

module.exports = function (module: RedisModule)

5. Implementación de Métodos
Se implementaron todos métodos para manipular listas en Redis que estaban originalmente en list.js, asegurando que cada método esté correctamente tipado y maneje errores adecuadamente.

  • listPrepend

    module.listPrepend = async function (key: string, value: string[] | string): Promise<void> 
    

    Método que añade un elemento al inicio de la lista.
    Parámetros:

    - key: La clave de la lista en Redis.
    - value: El valor a añadir a la lista.
    

    Retorna una promesa que se resuelve cuando la operación se completa.

  • listAppend

    module.listAppend = async function (key: string, value: string[] | string): Promise<void> 
    

    Método que añade un elemento al final de la lista.
    Parámetros:

    - key: La clave de la lista en Redis.
    - value: El valor a añadir a la lista.
    

    Retorna una promesa que se resuelve cuando la operación se completa.

  • listRemoveLast

    module.listRemoveLast = async function (key: string): Promise<string | null>
    

    Método que elimina el último elemento de la lista.
    Parámetro:

    - key: La clave de la lista en Redis.
    

    Retorna una promesa que se resuelve con el valor eliminado o null si la lista está vacía.

  • listRemoveAll

    module.listRemoveAll = async function (key: string, value: string[] | string): Promise<void>
    

    Método que elimina todos los elementos que coinciden con un valor dado.
    Parámetros:

    - key: La clave de la lista en Redis.
    - value: El valor o los valores a eliminar de la lista.
    

    Retorna una promesa que se resuelve cuando la operación se completa.

  • listTrim

    module.listTrim = async function (key: string, start: number, stop: number): Promise<void>
    

    Método que recorta la lista a un rango específico.
    Parámetros:

    - key: La clave de la lista en Redis.
    - start: El índice de inicio del rango.
    - stop: El índice de fin del rango.
    

    Retorna una promesa que se resuelve cuando la operación se completa.

  • getListRange

    module.getListRange = async function (key: string, start: number, stop: number): Promise<string[] | null> 
    

    Método que obtiene un rango de elementos de la lista.
    Parámetros:

    - key: La clave de la lista en Redis.
    - start: El índice de inicio del rango.
    - stop: El índice de fin del rango.
    

    Retorna una promesa que se resuelve con un array de valores del rango especificado.

  • listLength

    module.listLength = async function (key: string): Promise<number>
    

    Método que obtiene la longitud de la lista.
    Parámetro:

    - key: La clave de la lista en Redis.
    

    Retorna una promesa que se resuelve con la longitud de la lista.

Pruebas realizadas

En cuanto a las pruebas localmente se ejecutaron tanto npm run lint como npm run test, de los cuales el primero finalizó sin inconvenientes.
Por otra parte al ejecutar el test tanto local como desde github no fueron encontrados errores dentro del archivo traducido en TS, ni en el compilado generado por este en JS. No obstante persiste la aparición de error:

Error: Timeout of 50000ms exceeded. For async tests and hooks, ensure "done()" is called; if returning a Promise, ensure it resolves. (/home/runner/work/NodeBB/NodeBB/test/database.js)
      at listOnTimeout (node:internal/timers:581:17)
      at process.processTimers (node:internal/timers:519:7)

Haciendo cierta investigación y en algunos foros de la comunidad se recomendaba aumentar el tiempo para el timeout, sin embargo, aún duplicándolo el error sigue generándose por lo que pareciera que la falla puede que esté relacionada a la estructura de los tests, en especial considerando que el resultado de la covertura, pese a fallar por un error de timeOut, se mantienen en porcentajes aceptables:

image

…ist.ts + Agregado typeRoots en el tsconfig.json
… siendo cambios que localmente pasan el linter usando solo las excepciones permitidas: @typescript-eslint/no-unsafe-member-access y @typescript-eslint/no-unsafe-call
…lient.lPush is not a function durante la corrida de test
…a visualizar si se esta realizando la conexion con redis adecuadamente
…que hace que entre los logs se generen: Error initializing Redis client: Error: Redis is already connecting/connected
…tar problemas al compilar el proyecto + Archivo list.js compilado
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Convirtiendo src/database/redis/list.js de JS a TS

1 participant