Soul extensions are a way to extend the functionality of Soul. Extensions are written in JavaScript and can be used to add new endpoints, modify existing endpoints, or add new functionality to Soul.
To follow the below examples we need to download a sample database and also install Soul CLI.
wget https://raw.githubusercontent.com/lerocha/chinook-database/master/ChinookDatabase/DataSources/Chinook_Sqlite.sqlite # Download sample sqlite database
npm install -g soul-cli
soul -d ./Chinook_Sqlite.sqlite -p 8000 -e "/absolute/path/to/_extensions/"
To create an extension, create a new folder named _extensions
. Then create a file named api.js
inside it. This file will contain the extension code.
const hello = {
method: 'GET',
path: '/api/hello-soul',
handler: (req, res, db) => {
res.status(200).json({
message: 'Hello Soul!'
});
},
};
const timestamp = {
method: 'GET',
path: '/api/timestamp',
handler: (req, res, db) => {
res.status(200).json({
timestamp: Date.now(),
});
},
};
const greetings = {
method: 'POST',
path: '/api/greetings/:name',
handler: (req, res, db) => {
const { name } = req.params;
const { greeting } = req.body;
res.status(200).json({
message: `${greeting} ${name}!`,
});
},
}
const searchTables = {
method: 'GET',
path: '/api/search-tables',
handler: (req, res, db) => {
const { q } = req.query;
const sql = `
SELECT name FROM sqlite_master
WHERE type='table'
AND name LIKE $searchQuery
`;
try {
const tables = db.prepare(sql).all({
searchQuery: `%${q}%`,
});
res.status(200).json({
tables,
});
} catch (error) {
res.status(500).json({
error: error.message,
});
}
},
};
module.exports = {
hello,
timestamp,
greetings,
searchTables,
};
Alright, now we can test if the extension is working:
curl http://localhost:8000/api/hello-soul
It should return:
{
"message": "Hello Soul!"
}
And the same for the timestamp
endpoint:
curl http://localhost:8000/api/timestamp
It should return:
{
"timestamp": 1620000000000
}
And greetings
endpoint:
curl -X POST -H "Content-Type: application/json" -d '{"greeting": "Hello"}' http://localhost:8000/api/greetings/John
It should return:
{
"message": "Hello John!"
}
And list-tables
endpoint:
curl http://localhost:8000/api/search-tables?q=al
It should return:
{
"tables": [
{
"name": "Album"
}
]
}