pin method
pinMessage and unpinMessage: pins or unpins messageId (05 pin.create,
pin.delete: manage); a repeat changes nothing. Throws 404, 403 forbidden without
manage, 410 message_deleted for a deleted message.
Implementation
void pin(String principalId, String messageId, {required bool pinned}) {
final m = visibleMessage(principalId, messageId);
final threadId = m['thread_id']! as String;
if (!manages(principalId, m['channel_id']! as String)) {
throw const FakeProblem(403, 'forbidden');
}
if (m['deleted_at'] != null) {
throw const FakeProblem(410, 'message_deleted');
}
if (m['pinned'] == pinned) return;
m['pinned'] = pinned;
final pin =
pins[messageId] ??
{
'message_id': messageId,
'thread_id': threadId,
'pinned_by': principalId,
'pinned_at': stamp(),
};
if (pinned) {
pins[messageId] = pin;
} else {
pins.remove(messageId);
}
append(
pinned ? 'pin.added' : 'pin.removed',
resource: {'kind': 'message', 'id': messageId},
scope: _scopeOf(threadId),
payload: {'pin': pin},
actor: principalId,
);
}