mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2025-02-19 00:18:56 +01:00
Merge pull request #3993 from mikiher/fix-stringify-sequelize-query
fix stringifySequelizeQuery and add tests
This commit is contained in:
commit
8b00c16062
@ -1,34 +1,25 @@
|
|||||||
function stringifySequelizeQuery(findOptions) {
|
function stringifySequelizeQuery(findOptions) {
|
||||||
// Helper function to handle symbols in nested objects
|
function isClass(func) {
|
||||||
function handleSymbols(obj) {
|
return typeof func === 'function' && /^class\s/.test(func.toString())
|
||||||
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)
|
function replacer(key, value) {
|
||||||
return JSON.stringify(sanitizedOptions)
|
if (typeof value === 'object' && value !== null) {
|
||||||
|
const symbols = Object.getOwnPropertySymbols(value).reduce((acc, sym) => {
|
||||||
|
acc[sym.toString()] = value[sym]
|
||||||
|
return acc
|
||||||
|
}, {})
|
||||||
|
|
||||||
|
return { ...value, ...symbols }
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isClass(value)) {
|
||||||
|
return `${value.name}`
|
||||||
|
}
|
||||||
|
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
|
||||||
|
return JSON.stringify(findOptions, replacer)
|
||||||
}
|
}
|
||||||
module.exports = stringifySequelizeQuery
|
module.exports = stringifySequelizeQuery
|
||||||
|
52
test/server/utils/stringifySequeslizeQuery.test.js
Normal file
52
test/server/utils/stringifySequeslizeQuery.test.js
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
const { expect } = require('chai')
|
||||||
|
const stringifySequelizeQuery = require('../../../server/utils/stringifySequelizeQuery')
|
||||||
|
const Sequelize = require('sequelize')
|
||||||
|
|
||||||
|
class DummyClass {}
|
||||||
|
|
||||||
|
describe('stringifySequelizeQuery', () => {
|
||||||
|
it('should stringify a sequelize query containing an op', () => {
|
||||||
|
const query = {
|
||||||
|
where: {
|
||||||
|
name: 'John',
|
||||||
|
age: {
|
||||||
|
[Sequelize.Op.gt]: 20
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = stringifySequelizeQuery(query)
|
||||||
|
expect(result).to.equal('{"where":{"name":"John","age":{"Symbol(gt)":20}}}')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should stringify a sequelize query containing a literal', () => {
|
||||||
|
const query = {
|
||||||
|
order: [[Sequelize.literal('libraryItem.title'), 'ASC']]
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = stringifySequelizeQuery(query)
|
||||||
|
expect(result).to.equal('{"order":{"0":{"0":{"val":"libraryItem.title"},"1":"ASC"}}}')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should stringify a sequelize query containing a class', () => {
|
||||||
|
const query = {
|
||||||
|
include: [
|
||||||
|
{
|
||||||
|
model: DummyClass
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = stringifySequelizeQuery(query)
|
||||||
|
expect(result).to.equal('{"include":{"0":{"model":"DummyClass"}}}')
|
||||||
|
})
|
||||||
|
|
||||||
|
it('should ignore non-class functions', () => {
|
||||||
|
const query = {
|
||||||
|
logging: (query) => console.log(query)
|
||||||
|
}
|
||||||
|
|
||||||
|
const result = stringifySequelizeQuery(query)
|
||||||
|
expect(result).to.equal('{}')
|
||||||
|
})
|
||||||
|
})
|
Loading…
Reference in New Issue
Block a user