You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
66 lines
2.3 KiB
66 lines
2.3 KiB
const models = require('../models'); |
|
const { Op } = require("sequelize"); |
|
import * as api from '../../client/src/api'; |
|
import { EndpointError, EndpointHandler, catchUnhandledErrors } from './types'; |
|
|
|
const getSequelizeWhere = (queryElem: api.SongQueryElem) => { |
|
var and = []; |
|
|
|
var sequelizeOps:any = {}; |
|
sequelizeOps[api.SongQueryFilterOp.Eq] = Op.eq; |
|
sequelizeOps[api.SongQueryFilterOp.Ne] = Op.ne; |
|
sequelizeOps[api.SongQueryFilterOp.In] = Op.in; |
|
sequelizeOps[api.SongQueryFilterOp.NotIn] = Op.notIn; |
|
sequelizeOps[api.SongQueryElemOp.And] = Op.and; |
|
sequelizeOps[api.SongQueryElemOp.Or] = Op.or; |
|
|
|
var sequelizeProps:any = {}; |
|
sequelizeProps[api.SongQueryElemProperty.id] = "id"; |
|
sequelizeProps[api.SongQueryElemProperty.artistIds] = "artistIds"; |
|
sequelizeProps[api.SongQueryElemProperty.albumIds] = "albumIds"; |
|
|
|
if (queryElem.prop && queryElem.propOperator && queryElem.propOperand) { |
|
const prop = sequelizeProps[queryElem.prop]; |
|
const op = sequelizeOps[queryElem.propOperator]; |
|
var filter:any = {}; |
|
filter[op] = queryElem.propOperand; |
|
var where:any = {}; |
|
where[prop] = filter; |
|
and.push(where); |
|
} |
|
if (queryElem.childrenOperator && queryElem.children) { |
|
const children = queryElem.children.map((child: api.SongQueryElem) => getSequelizeWhere(child)); |
|
const op = sequelizeOps[queryElem.childrenOperator]; |
|
var where:any = {}; |
|
where[op] = children; |
|
and.push(where) |
|
} |
|
|
|
return { |
|
[Op.and]: and |
|
}; |
|
} |
|
|
|
export const QuerySongsEndpointHandler: EndpointHandler = async (req: any, res: any) => { |
|
if (!api.checkQuerySongsRequest(req)) { |
|
const e: EndpointError = { |
|
internalMessage: 'Invalid QuerySongs request: ' + JSON.stringify(req.body), |
|
httpStatus: 400 |
|
}; |
|
throw e; |
|
} |
|
const reqObject: api.QuerySongsRequest = req.body; |
|
|
|
await models.Song.findAll({ |
|
where: getSequelizeWhere(reqObject.query) |
|
}) |
|
.then((songs: any[]) => { |
|
const response: api.QuerySongsResponse = { |
|
ids: songs.map((song: any) => { |
|
return song.id; |
|
}) |
|
}; |
|
res.send(response); |
|
}) |
|
.catch(catchUnhandledErrors); |
|
} |