{"version":3,"sources":["../src/logger/index.ts","../src/util/ConnectionPool.ts","../src/v2/cache/Redis.ts","../src/v2/database/Firestore.ts"],"sourcesContent":["import winston, { Logger } from \"winston\";\n\nlet loggerInstance: winston.Logger | null = null;\n\nfunction GetLogger(): Logger {\n  if (!loggerInstance) {\n    loggerInstance = winston.createLogger({\n      level: process.env.LOG_LEVEL || \"info\",\n      format: winston.format.json(),\n      transports: [new winston.transports.Console()],\n    });\n  }\n  return loggerInstance;\n}\n\nexport const info = (message: string, rest: any) => {\n  log(\"info\", message, rest);\n};\n\nexport const warn = (message: string, rest: any) => {\n  log(\"warn\", message, rest);\n};\n\nexport const error = (message: string, rest: any) => {\n  log(\"error\", message, rest);\n};\n\nexport const debug = (message: string, rest: any) => {\n  log(\"debug\", message, rest);\n};\n\nconst log = (\n  severity: \"info\" | \"warn\" | \"error\" | \"debug\",\n  message: string,\n  rest: any\n) => {\n  const logger = GetLogger()[severity];\n  if (rest.error instanceof Error) {\n    rest.error = {\n      message: rest.error.message,\n      stack: rest.error.stack,\n    };\n  }\n  const metadata = {\n    ...rest,\n  };\n  if (rest.operation) {\n    logger(\n      `[Database] [${severity.toUpperCase()}] [${rest.operation}] - ${message}`,\n      { metadata }\n    );\n  } else {\n    logger(`[Database] [${severity.toUpperCase()}] - ${message}`, {\n      metadata,\n    });\n  }\n};\n\nexport default GetLogger;\n","import { createClient, RedisClientType } from \"redis\";\n\nconst endpoint = process.env.REDISCLOUD_URL;\n\nexport default class RedisPool {\n  private static readonly MAX_CONNECTION = 10;\n  private static pool: RedisClientType[] = [];\n\n  public static async GetConnection(): Promise<RedisClientType> {\n    if (RedisPool.pool.length > 0) {\n      const connection = RedisPool.pool.pop();\n\n      if (connection) return connection;\n    }\n\n    const newConnection: RedisClientType = createClient({ url: endpoint });\n    try {\n      await newConnection.connect();\n    } catch (err) {\n      throw new Error(`Erro ao conectar no Redis - ${err}`);\n    }\n\n    return newConnection;\n  }\n\n  public static releaseConnection(connection: RedisClientType): void {\n    if (!endpoint || !connection.isOpen) return;\n\n    if (RedisPool.pool.length < RedisPool.MAX_CONNECTION) {\n      RedisPool.pool.push(connection);\n    } else {\n      connection.quit();\n    }\n  }\n}\n","import { error } from \"../../logger\";\nimport RedisConnectionPool from \"../../util/ConnectionPool\";\nimport { Cache } from \"../types/\";\n\nexport class Redis implements Cache {\n  private logError(method: string, keyOrPattern: string, err: unknown) {\n    error(`Error in ${method} - Key/Pattern: ${keyOrPattern}\\n`, {\n      operation: method,\n      err,\n    });\n  }\n\n  async del(key: string): Promise<void> {\n    const conn = await RedisConnectionPool.GetConnection();\n    try {\n      await conn.del(key);\n    } catch (error) {\n      this.logError(\"del\", key, error);\n      throw error;\n    } finally {\n      RedisConnectionPool.releaseConnection(conn);\n    }\n  }\n\n  async get<T>(key: string): Promise<T | null> {\n    const conn = await RedisConnectionPool.GetConnection();\n    try {\n      const data = await conn.get(key);\n      return data ? (JSON.parse(data) as T) : null;\n    } catch (err) {\n      this.logError(\"get\", key, error);\n      throw error;\n    } finally {\n      RedisConnectionPool.releaseConnection(conn);\n    }\n  }\n\n  async set<T>(key: string, obj: T, ttl: number = 86400): Promise<void> {\n    if (!obj) return;\n    const conn = await RedisConnectionPool.GetConnection();\n    try {\n      await conn.setEx(key, ttl, JSON.stringify(obj));\n    } catch (error) {\n      this.logError(\"set\", key, error);\n      throw error;\n    } finally {\n      RedisConnectionPool.releaseConnection(conn);\n    }\n  }\n\n  async delPattern(pattern: string): Promise<void> {\n    const conn = await RedisConnectionPool.GetConnection();\n    try {\n      const keys = await conn.keys(pattern);\n      if (keys.length) await conn.del(keys);\n    } catch (error) {\n      this.logError(\"delPattern\", pattern, error);\n      throw error;\n    } finally {\n      RedisConnectionPool.releaseConnection(conn);\n    }\n  }\n\n  async getByPattern<T>(pattern: string): Promise<T[]> {\n    const conn = await RedisConnectionPool.GetConnection();\n    try {\n      let cursor: number = 0;\n      const keys = [];\n      const conn = await RedisConnectionPool.GetConnection();\n      do {\n        const reply = await conn.scan(cursor, {\n          MATCH: pattern,\n          COUNT: 100,\n        });\n        cursor = reply.cursor;\n        keys.push(...reply.keys);\n      } while (cursor !== 0);\n\n      const values: T[] = [];\n\n      for (const key of keys) {\n        const value = (await conn.get(key)) as T;\n        values.push(value);\n      }\n\n      RedisConnectionPool.releaseConnection(conn);\n      return values;\n    } catch (error) {\n      this.logError(\"getByPattern\", pattern, error);\n      return [];\n    } finally {\n      RedisConnectionPool.releaseConnection(conn);\n    }\n  }\n}\n","import {\n  Database,\n  Cache,\n  QueryWhere as Where,\n  QueryOptions,\n  QueryResponse as Response,\n} from \"../types\";\nimport { firestore } from \"firebase-admin\";\nimport { error as logErr, info } from \"../../logger\";\nimport { Redis } from \"../cache/Redis\";\nimport crypto from \"crypto\";\n\nexport class Firestore implements Database {\n  private _db: firestore.Firestore;\n  private _cache: Cache;\n\n  constructor(firestore: firestore.Firestore) {\n    this._cache = new Redis();\n    this._db = firestore;\n  }\n\n  async SaveBatch<T>(\n    collectionName: string,\n    data: (T & { id?: string })[]\n  ): Promise<void> {\n    const operation = \"SaveBatch\";\n    const timestamp = Date.now();\n\n    try {\n      const batch = this._db.batch();\n      const result: (T & { id: string })[] = [];\n\n      data.forEach((item) => {\n        const id = item.id || this._db.collection(collectionName).doc().id;\n        const docRef = this._db.collection(collectionName).doc(id);\n        batch.set(docRef, { ...item, modified: timestamp });\n        result.push({ ...item, id });\n      });\n\n      await batch.commit();\n\n      info(`Batch saved ${result.length} documents to ${collectionName}`, {\n        collectionName,\n        operation,\n      });\n\n      await this._cache.delPattern(`${collectionName}::*`);\n    } catch (error) {\n      logErr(\"Could not SaveBatch\", {\n        collectionName,\n        data,\n        operation,\n        error,\n      });\n      throw new Error(\"Could not batch save documents. Try again later.\");\n    }\n  }\n\n  async Save<T>(\n    collectionName: string,\n    data: { id?: string } & T\n  ): Promise<T & { id: string }> {\n    const operation = \"SaveDocument\";\n    const timestamp = Date.now();\n    try {\n      let docId: string;\n\n      if (data?.id) {\n        // Atualizando documento existente\n        await this._db\n          .collection(collectionName)\n          .doc(data.id)\n          .set({ ...data, modified: timestamp });\n        docId = data.id;\n\n        info(`Updating document [${docId}] in collection ${collectionName}.`, {\n          operation,\n          collectionName,\n          documentId: docId,\n        });\n      } else {\n        // Criando um novo documento\n        const docRef = await this._db\n          .collection(collectionName)\n          .add({ ...data, modified: timestamp });\n        docId = docRef.id;\n\n        info(\n          `Created new document with id ${docId} in collection ${collectionName}.`,\n          {\n            operation,\n            collectionName,\n            documentId: docId,\n          }\n        );\n      }\n\n      await this._cache.delPattern(`${collectionName}::*`);\n      return { ...data, id: docId };\n    } catch (error) {\n      logErr(`Could not Save Data in ${collectionName}`, {\n        collectionName,\n        data,\n        operation,\n        error,\n      });\n      throw new Error(`Could not save item in Database [${collectionName}]`);\n    }\n  }\n\n  async FindOne<T>(collectionName: string, id: string): Promise<T | null> {\n    const operation: string = \"FindOne\";\n    try {\n      const cacheKey = this.__getCacheKey(collectionName, id);\n      const cacheData = await this._cache.get<T>(cacheKey);\n\n      if (cacheData) return cacheData;\n\n      const docRef = this._db.collection(collectionName).doc(id);\n      const docSnapshot = await docRef.get();\n\n      if (docSnapshot.exists) {\n        const data = docSnapshot.data() as T;\n        this._cache.set<T>(cacheKey, data);\n        return data;\n      }\n\n      return null;\n    } catch (error) {\n      logErr(`Could not FindOne Data in ${collectionName}`, {\n        collectionName,\n        id,\n        operation,\n        error,\n      });\n\n      throw new Error(\"Could not fetch data. Try again later\");\n    }\n  }\n\n  async QueryData<T>(\n    collectionName: string,\n    query: QueryOptions<T>,\n    noCache?: boolean\n  ): Promise<Response<T>> {\n    const operation: string = \"QueryData\";\n\n    try {\n      let queryRef: FirebaseFirestore.Query =\n        this._db.collection(collectionName);\n\n      queryRef = queryRef.orderBy(\n        query.orderBy.field as string,\n        query.orderBy.direction\n      );\n\n      query.wheres?.forEach((where) => {\n        queryRef = queryRef.where(\n          where.field as string,\n          where.operation,\n          where.value\n        );\n      });\n\n      if (query.cursor) {\n        if (!query.orderBy) {\n          throw new Error(\"An orderBy field is required when using cursors\");\n        }\n\n        const cursorValue = query.cursor || \"modified\";\n        queryRef = queryRef.startAfter(cursorValue);\n      }\n\n      const cacheKey = this.__getCacheKey(collectionName, queryRef);\n      const cached = await this._cache.get<Response<T>>(cacheKey);\n\n      if (cached && !noCache) return cached;\n\n      const q0 = await queryRef.count().get();\n      const count = q0.data().count;\n\n      if (query.perPage) {\n        queryRef = queryRef.limit(query.perPage);\n      }\n\n      const querySnapshot = await queryRef.get();\n      const res = querySnapshot.docs.map((doc) => doc.data() as T);\n\n      const lastDoc = querySnapshot.docs[querySnapshot.docs.length - 1];\n      const cursor: string | number | null = lastDoc\n        ? lastDoc.get(query.orderBy?.field as string)\n        : null;\n\n      const result: Response<T> = {\n        count,\n        data: res,\n        cursor,\n        perPage: query.perPage,\n      };\n\n      if (!noCache) this._cache.set(cacheKey, result);\n      return result;\n    } catch (error) {\n      logErr(\"Could not Query Data\", {\n        collectionName,\n        error,\n        operation,\n        query,\n      });\n      throw new Error(\"Could not Query your Data. Try again later.\");\n    }\n  }\n\n  async Delete<T>(collectionName: string, query: Where<T>): Promise<boolean> {\n    const operation: string = \"DeleteData\";\n    try {\n      const idsDeleted: string[] = [];\n      const queryResult = this._db\n        .collection(collectionName)\n        .where(query.field as string, query.operation, query.value);\n      const snapshot = await queryResult.get();\n      const batch = this._db.batch();\n\n      snapshot.forEach((doc) => {\n        batch.delete(doc.ref);\n        idsDeleted.push(doc.id);\n      });\n\n      await batch.commit();\n      info(\n        `Deleting data in collection ${collectionName}. Ids deleted: ${idsDeleted}`,\n        { collectionName, operation }\n      );\n      await this._cache.delPattern(`${collectionName}::*`);\n      return true;\n    } catch (error) {\n      logErr(`Could not Delete Data`, {\n        collectionName,\n        query,\n        error,\n        operation,\n      });\n      throw new Error(\"Error while delete. Try again later\");\n    }\n  }\n\n  async Update<T>(\n    collectionName: string,\n    id: string,\n    data: Partial<T>\n  ): Promise<T> {\n    const operation: string = \"UpdateDocument\";\n    try {\n      const docRef = this._db.collection(collectionName).doc(id);\n      await docRef.update({ ...data, modified: Date.now() });\n      info(`Updating document ${id} in collection ${collectionName}`, {\n        operation,\n        documentId: id,\n        collectionName,\n      });\n      await this._cache.delPattern(`${collectionName}::*`); //Clear cache by pattern\n      const ref = await docRef.get();\n      return ref.data() as T;\n    } catch (error) {\n      logErr(`Could not Update Data`, {\n        collectionName,\n        documentId: id,\n        data,\n        operation,\n        error,\n      });\n      throw new Error(\"Error while Update data. Try again later.\");\n    }\n  }\n\n  private __getCacheKey = (collectionName: string, data: any) => {\n    const hashStr = crypto\n      .createHash(\"md5\")\n      .update(JSON.stringify(data))\n      .digest(\"hex\");\n    return `${collectionName}::${hashStr}`;\n  };\n}\n"],"mappings":"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","names":["error","conn","error"]}