Display, search and update attributes from a JSON field
PreviousPrevent record updateNextAdd many existing records at the same time (hasMany-belongsTo relationship)
Last updated
Last updated
module.exports = (sequelize, DataTypes) => {
const { Sequelize } = sequelize;
const Users = sequelize.define('users', {
contact: {
type: DataTypes.JSONB,
},
}, {
tableName: 'users',
timestamps: false,
schema: process.env.DATABASE_SCHEMA,
});
Users.associate = (models) => {
};
return Users;
};const { collection } = require('forest-express-sequelize');
collection('users', {
actions: [],
fields: [
{
field: 'email',
type: 'String',
get: (object) => {
return object.contact ? object.contact.email : null;
},
search: (query, search) => {
// Add search on contact->email field of the JSONB
const searchCondition = {
'contact.email': { [Op.iLike]: `%${search}%` },
};
query.where[Op.and][0][Op.or].push(searchCondition);
return query;
},
set: (object, email) => {
return object;
},
}, {
field: 'phone',
type: 'String',
get: (object) => {
return object.contact ? object.contact.phone : null;
},
set: (object, phone) => {
return object;
},
},
],
segments: [],
});const express = require('express');
const { PermissionMiddlewareCreator, RecordGetter } = require('forest-express-sequelize');
const { users } = require('../models');
const router = express.Router();
const permissionMiddlewareCreator = new PermissionMiddlewareCreator('users');
//...
// Method to update a JSON object
function updateJson(record, formAttributes, jsonField, jsonAttributes) {
const json = record[jsonField] || {};
jsonAttributes.forEach((attribute) => {
json[attribute] = attribute in formAttributes ? formAttributes[attribute] : json[attribute];
});
return json;
}
// Update a User
router.put('/users/:recordId', permissionMiddlewareCreator.update(), (request, response, next) => {
const recordGetter = new RecordGetter(users, request.user, request.query);
const attr = request.body.data.attributes;
recordGetter.get(request.params.recordId).then((record => {
attr.contact = updateJson(record, attr, 'contact', ['email', 'phone']);
return record.update(attr);
}))
.then((recordUpdated) => recordGetter.serialize(recordUpdated))
.then((recordSerialized) => response.send(recordSerialized))
.catch(next);
});
//...
module.exports = router;