Как лучше всего получить данные, не связанные напрямую с моделью
У меня есть фреймворк для отслеживания приложений, установленных на устройствах.
На устройстве может быть установлено несколько приложений, а приложения могут быть на нескольких устройствах.
Каждое устройство принадлежит одному или нескольким проектам, и проекты могут иметь несколько устройств.
Каждый проект принадлежит пользователю.
Теперь, если я ищу проект, я могу включить устройство и пользователя, но не приложения, так как они принадлежат устройству. Я новичок в Sequelize, поэтому, возможно, упускаю что-то простое! Когда я выполняю запрос к проекту, могу ли я так же легко получить приложения, принадлежащие устройству? Или мне нужно создавать ассоциации между проектом и приложениями, которые мне не кажутся правильными, или выполнять какой-то вложенный поиск?
Надеюсь, это имеет смысл!
Спасибо
const Sequelize = require('sequelize')
const UserModel = require('./models/user')
const projectModel = require('./models/project')
const deviceModel = require('./models/device')
const applicationModel = require('./models/application')
const{user, host, database, userdatabase, password, port} = require('./secrets/db_configuration');
function propagateRequired(modelDescriptor) {
let include = modelDescriptor.include;
if (!include) return false;
if (!Array.isArray(include)) include = [include];
return include.reduce((isRequired, descriptor) => {
const hasRequiredChild = propogateRequired(descriptor);
if ((descriptor.where || hasRequiredChild) && descriptor.required === undefined) {
descriptor.required = true;
}
return descriptor.required || isRequired;
}, false);
}
const sequelize = new Sequelize(userdatabase, user, password, {
host: host,
port: port,
dialect: 'postgres',
pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000
},
//
http://docs.sequelizejs.com/manual/tutorial/querying.html#operators
define: {
hooks: {
// beforeFind: propagateRequired
}
},
operatorsAliases: false
});
const User = UserModel(sequelize, Sequelize)
const ProjectDevice = sequelize.define('project_device', {})
const DeviceApplication = sequelize.define('device_application', {})
const Project = projectModel(sequelize, Sequelize)
const Device = deviceModel(sequelize, Sequelize)
const Application = applicationModel(sequelize, Sequelize)
Application.belongsToMany(Device, { through: DeviceApplication, unique: false})
Device.belongsToMany(Application, { through: DeviceApplication, unique: false})
Project.belongsToMany(Device, { through: ProjectDevice, unique: false})
Device.belongsToMany(Project, { through: ProjectDevice, unique: false})
Project.belongsTo(User)
sequelize.sync({ force: false })
.then(() => {
console.log(`Database & tables created!`)
})
module.exports = {
User,
Application,
Device,
Project
}
index.js
const express = require('express')
const bodyParser = require('body-parser')
const { User,Project,Device,Application } = require('./sequelize')
const app = express()
app.use(bodyParser.json())
// create a user
app.post('/api/users', (req, res) => {
console.log(req.body)
User.create(req.body)
.then(user => res.json(user))
})
// get all users
app.get('/api/users', (req, res) => {
User.findAll().then(users => res.json(users))
})
// find project
app.get('/api/project/:project?', (req, res) => {
let query;
if(req.params.project) {
query = Project.findAll({ where: { id: req.params.project},
include: [
{ model: Device },
{ model: User }
]})
} else {
query = Project.findAll({ include: [Device, User]})
}
return query.then(devices => res.json(devices))
})
// find device
app.get('/api/device/:device?', (req, res) => {
let query;
if(req.params.device) {
query = Device.findAll({ where: { id: req.params.device },
include: [
{ model: Application }
]})
} else {
query = Project.findAll({ include: [Application]})
}
return query.then(devices => res.json(devices))
})
// find app
app.get('/api/application/:application?', (req, res) => {
let query;
if(req.params.application) {
query = Application.findAll({ where: { id: req.params.application },
include: [
{ model: Device }
]})
} else {
query = Project.findAll({ include: [Device, User]})
}
return query.then(devices => res.json(devices))
})
const port = 3000
app.listen(port, () => {
console.log(`Running on http://localhost:${port}`)
})