Merge pull request #842 from andresmrm/list-api-endpoints
Add API enpoints to create, delete and get lists.
This commit is contained in:
commit
ebfbe30aa0
4 changed files with 187 additions and 0 deletions
|
@ -121,6 +121,32 @@ async function getByCid(context, cid) {
|
|||
});
|
||||
}
|
||||
|
||||
async function getByNamespaceIdTx(tx, context, namespaceId) {
|
||||
// FIXME - this methods is rather suboptimal if there are many lists. It quite needs permission caching in shares.js
|
||||
|
||||
const rows = await tx('lists').where('namespace', namespaceId);
|
||||
await shares.enforceEntityPermissionTx(tx, context, 'namespace', namespaceId, 'view');
|
||||
|
||||
const allowed = [];
|
||||
|
||||
for (const list of rows) {
|
||||
try {
|
||||
await shares.enforceEntityPermissionTx(tx, context, 'list', list.id, 'view');
|
||||
} catch(e) {
|
||||
continue
|
||||
}
|
||||
allowed.push(list);
|
||||
}
|
||||
|
||||
return allowed;
|
||||
}
|
||||
|
||||
async function getByNamespaceId(context, namespaceId) {
|
||||
return await knex.transaction(async tx => {
|
||||
return getByNamespaceIdTx(tx, context, namespaceId);
|
||||
});
|
||||
}
|
||||
|
||||
async function _validateAndPreprocess(tx, entity) {
|
||||
await namespaceHelpers.validateEntity(tx, entity);
|
||||
enforce(entity.unsubscription_mode >= UnsubscriptionMode.MIN && entity.unsubscription_mode <= UnsubscriptionMode.MAX, 'Unknown unsubscription mode');
|
||||
|
@ -283,6 +309,7 @@ module.exports.getById = getById;
|
|||
module.exports.getByIdWithListFields = getByIdWithListFields;
|
||||
module.exports.getByCidTx = getByCidTx;
|
||||
module.exports.getByCid = getByCid;
|
||||
module.exports.getByNamespaceId = getByNamespaceId;
|
||||
module.exports.create = create;
|
||||
module.exports.updateWithConsistencyCheck = updateWithConsistencyCheck;
|
||||
module.exports.remove = remove;
|
||||
|
|
|
@ -140,6 +140,7 @@ router.postAsync('/delete/:listCid', passport.loggedIn, async (req, res) => {
|
|||
});
|
||||
|
||||
|
||||
// TODO: document endpoint
|
||||
router.getAsync('/subscriptions/:listCid', passport.loggedIn, async (req, res) => {
|
||||
const list = await lists.getByCid(req.context, req.params.listCid);
|
||||
const start = parseInt(req.query.start || 0, 10);
|
||||
|
@ -167,6 +168,57 @@ router.getAsync('/lists/:email', passport.loggedIn, async (req, res) => {
|
|||
});
|
||||
});
|
||||
|
||||
// get lists by namespace
|
||||
router.getAsync(
|
||||
"/lists-by-namespace/:namespaceId",
|
||||
passport.loggedIn,
|
||||
async (req, res) => {
|
||||
const _lists = await lists.getByNamespaceId(
|
||||
req.context,
|
||||
castToInteger(req.params.namespaceId),
|
||||
);
|
||||
|
||||
res.status(200);
|
||||
res.json({
|
||||
data: _lists.map(l => ({id: l.id, cid: l.cid, name: l.name}))
|
||||
});
|
||||
}
|
||||
);
|
||||
|
||||
// create list
|
||||
router.postAsync('/list', passport.loggedIn, async (req, res) => {
|
||||
const input = {};
|
||||
Object.keys(req.body).forEach(key => {
|
||||
input[(key || '').toString().trim().toLowerCase()] = (req.body[key] || '').toString().trim();
|
||||
});
|
||||
|
||||
if (input.fieldwizard) {
|
||||
input.fieldWizard = input.fieldwizard
|
||||
delete input.fieldwizard
|
||||
}
|
||||
|
||||
if (!input.namespace) {
|
||||
throw new APIError('Missing namespace', 400);
|
||||
}
|
||||
|
||||
var id = await lists.create(req.context, input);
|
||||
|
||||
var list = await lists.getById(req.context, id)
|
||||
|
||||
res.status(200);
|
||||
res.json({
|
||||
data: {id: list.cid}
|
||||
});
|
||||
});
|
||||
|
||||
// delete list
|
||||
router.deleteAsync('/list/:listCid', passport.loggedIn, async (req, res) => {
|
||||
const list = await lists.getByCid(req.context, req.params.listCid);
|
||||
await lists.remove(req.context, list.id);
|
||||
|
||||
res.status(200);
|
||||
res.json({});
|
||||
});
|
||||
|
||||
router.postAsync('/field/:listCid', passport.loggedIn, async (req, res) => {
|
||||
const list = await lists.getByCid(req.context, req.params.listCid);
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue