mirror of
				https://github.com/advplyr/audiobookshelf.git
				synced 2025-10-27 11:18:14 +01:00 
			
		
		
		
	Merge pull request #3980 from advplyr/stringify_sequelize_query
Fix count cache by stringify Symbols #3979
This commit is contained in:
		
						commit
						b96226966b
					
				@ -5,7 +5,7 @@ const authorFilters = require('./authorFilters')
 | 
			
		||||
 | 
			
		||||
const ShareManager = require('../../managers/ShareManager')
 | 
			
		||||
const { profile } = require('../profiler')
 | 
			
		||||
 | 
			
		||||
const stringifySequelizeQuery = require('../stringifySequelizeQuery')
 | 
			
		||||
const countCache = new Map()
 | 
			
		||||
 | 
			
		||||
module.exports = {
 | 
			
		||||
@ -345,7 +345,7 @@ module.exports = {
 | 
			
		||||
  },
 | 
			
		||||
 | 
			
		||||
  async findAndCountAll(findOptions, limit, offset) {
 | 
			
		||||
    const findOptionsKey = JSON.stringify(findOptions)
 | 
			
		||||
    const findOptionsKey = stringifySequelizeQuery(findOptions)
 | 
			
		||||
    Logger.debug(`[LibraryItemsBookFilters] findOptionsKey: ${findOptionsKey}`)
 | 
			
		||||
 | 
			
		||||
    findOptions.limit = limit || null
 | 
			
		||||
@ -353,6 +353,7 @@ module.exports = {
 | 
			
		||||
 | 
			
		||||
    if (countCache.has(findOptionsKey)) {
 | 
			
		||||
      const rows = await Database.bookModel.findAll(findOptions)
 | 
			
		||||
 | 
			
		||||
      return { rows, count: countCache.get(findOptionsKey) }
 | 
			
		||||
    } else {
 | 
			
		||||
      const result = await Database.bookModel.findAndCountAll(findOptions)
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										34
									
								
								server/utils/stringifySequelizeQuery.js
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										34
									
								
								server/utils/stringifySequelizeQuery.js
									
									
									
									
									
										Normal file
									
								
							@ -0,0 +1,34 @@
 | 
			
		||||
function stringifySequelizeQuery(findOptions) {
 | 
			
		||||
  // Helper function to handle symbols in nested objects
 | 
			
		||||
  function handleSymbols(obj) {
 | 
			
		||||
    if (!obj || typeof obj !== 'object') return obj
 | 
			
		||||
 | 
			
		||||
    if (Array.isArray(obj)) {
 | 
			
		||||
      return obj.map(handleSymbols)
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const newObj = {}
 | 
			
		||||
    for (const [key, value] of Object.entries(obj)) {
 | 
			
		||||
      // Handle Symbol keys from Object.getOwnPropertySymbols
 | 
			
		||||
      Object.getOwnPropertySymbols(obj).forEach((sym) => {
 | 
			
		||||
        newObj[`__Op.${sym.toString()}`] = handleSymbols(obj[sym])
 | 
			
		||||
      })
 | 
			
		||||
 | 
			
		||||
      // Handle regular keys
 | 
			
		||||
      if (typeof key === 'string') {
 | 
			
		||||
        if (value && typeof value === 'object' && Object.getPrototypeOf(value) === Symbol.prototype) {
 | 
			
		||||
          // Handle Symbol values
 | 
			
		||||
          newObj[key] = `__Op.${value.toString()}`
 | 
			
		||||
        } else {
 | 
			
		||||
          // Recursively handle nested objects
 | 
			
		||||
          newObj[key] = handleSymbols(value)
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
    return newObj
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  const sanitizedOptions = handleSymbols(findOptions)
 | 
			
		||||
  return JSON.stringify(sanitizedOptions)
 | 
			
		||||
}
 | 
			
		||||
module.exports = stringifySequelizeQuery
 | 
			
		||||
		Loading…
	
		Reference in New Issue
	
	Block a user