Skip to content

Commit 08e5070

Browse files
authored
fix(addressregister): ZMS-268: add new addressregister endpoint to disable an entry or edit it (#873)
* add new addressregister endpoint to disable an entry or edit it * readOwn,readAny -> createOwn, createAny for addressregister updates. Fix indexes. Make query more constraint * remove unused indexes
1 parent 63811c7 commit 08e5070

File tree

3 files changed

+152
-5
lines changed

3 files changed

+152
-5
lines changed

indexes.yaml

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -413,11 +413,19 @@ indexes:
413413

414414
- collection: addressregister
415415
index:
416-
name: by_name
416+
name: by_user_disabled_partial
417417
key:
418418
user: 1
419-
name: 1
420419
updated: -1
420+
partialFilterExpression:
421+
disabled: false
422+
423+
- collection: addressregister
424+
index:
425+
name: by_user_disabled
426+
key:
427+
user: 1
428+
disabled: 1
421429

422430
# indexes for deleted messages
423431
- collection: archived

lib/api/addresses.js

Lines changed: 138 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1413,7 +1413,8 @@ module.exports = (db, server, userHandler, settingsHandler) => {
14131413
$options: 'i'
14141414
}
14151415
}
1416-
]
1416+
],
1417+
disabled: false // get addresses that are not disabled
14171418
},
14181419
{
14191420
sort: { updated: -1 },
@@ -1460,6 +1461,142 @@ module.exports = (db, server, userHandler, settingsHandler) => {
14601461
})
14611462
);
14621463

1464+
server.put(
1465+
{
1466+
path: '/users/:user/addressregister/:id',
1467+
summary: 'Update an address in the addressregister',
1468+
name: 'updateAddressAddressregister',
1469+
tags: ['Addresses'],
1470+
validationObjs: {
1471+
requestBody: {
1472+
disabled: booleanSchema
1473+
.required()
1474+
.description(
1475+
'Disable the address in the register. Disabled addresses are not updated on email receival and sending. Disabled addresses are not included in the response for listing addresses in the register.'
1476+
),
1477+
name: Joi.string().max(255).description('Address header name')
1478+
},
1479+
queryParams: {
1480+
sess: sessSchema,
1481+
ip: sessIPSchema
1482+
},
1483+
pathParams: {
1484+
user: userId,
1485+
id: addressId
1486+
},
1487+
response: {
1488+
200: {
1489+
description: 'Success',
1490+
model: Joi.object({
1491+
success: successRes
1492+
}).$_setFlag('objectName', 'SuccessResponse')
1493+
}
1494+
}
1495+
}
1496+
},
1497+
tools.responseWrapper(async (req, res) => {
1498+
res.charSet('utf-8');
1499+
1500+
const { pathParams, requestBody, queryParams } = req.route.spec.validationObjs;
1501+
1502+
const schema = Joi.object({
1503+
...pathParams,
1504+
...queryParams,
1505+
...requestBody
1506+
});
1507+
1508+
const result = schema.validate(req.params, {
1509+
abortEarly: false,
1510+
convert: true
1511+
});
1512+
1513+
if (result.error) {
1514+
res.status(400);
1515+
return res.json({
1516+
error: result.error.message,
1517+
code: 'InputValidationError',
1518+
details: tools.validationErrors(result)
1519+
});
1520+
}
1521+
1522+
let user = new ObjectId(result.value.user);
1523+
let addressId = new ObjectId(result.value.id);
1524+
1525+
// permissions check
1526+
if (req.user && req.user === result.value.user) {
1527+
req.validate(roles.can(req.role).createOwn('addresses'));
1528+
} else {
1529+
req.validate(roles.can(req.role).createAny('addresses'));
1530+
}
1531+
1532+
let userData;
1533+
try {
1534+
userData = await db.users.collection('users').findOne(
1535+
{
1536+
_id: user
1537+
},
1538+
{
1539+
projection: {
1540+
_id: true
1541+
}
1542+
}
1543+
);
1544+
} catch (err) {
1545+
res.status(500);
1546+
return res.json({
1547+
error: 'MongoDB Error: ' + err.message,
1548+
code: 'InternalDatabaseError'
1549+
});
1550+
}
1551+
1552+
if (!userData) {
1553+
res.status(404);
1554+
return res.json({
1555+
error: 'This user does not exist',
1556+
code: 'UserNotFound'
1557+
});
1558+
}
1559+
1560+
const update = {
1561+
disabled: result.value.disabled,
1562+
updated: new Date()
1563+
};
1564+
1565+
if (result.value.name) {
1566+
update.name = result.value.name;
1567+
try {
1568+
// try to decode
1569+
update.name = libmime.decodeWords(update.name);
1570+
} catch {
1571+
// ignore
1572+
}
1573+
}
1574+
1575+
let response;
1576+
try {
1577+
response = await db.database.collection('addressregister').updateOne(
1578+
{
1579+
user: userData._id,
1580+
_id: addressId
1581+
},
1582+
{
1583+
$set: update
1584+
}
1585+
);
1586+
} catch (err) {
1587+
res.status(500);
1588+
return res.json({
1589+
error: 'MongoDB Error: ' + err.message,
1590+
code: 'InternalDatabaseError'
1591+
});
1592+
}
1593+
1594+
return res.json({
1595+
success: !!response.matchedCount
1596+
});
1597+
})
1598+
);
1599+
14631600
server.post(
14641601
{
14651602
path: '/addresses/forwarded',

lib/message-handler.js

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -170,14 +170,16 @@ class MessageHandler {
170170
await this.database.collection('addressregister').findOneAndUpdate(
171171
{
172172
user,
173-
addrview: addr.addrview
173+
addrview: addr.addrview,
174+
disabled: false // if disabled then do not update
174175
},
175176
{
176177
$set: updates,
177178
$setOnInsert: {
178179
user,
179180
address: addr.address,
180-
addrview: addr.addrview
181+
addrview: addr.addrview,
182+
disabled: false
181183
}
182184
},
183185
{ upsert: true, projection: { _id: true } }

0 commit comments

Comments
 (0)