pin method

void pin(
  1. String principalId,
  2. String messageId, {
  3. required bool pinned,
})

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,
  );
}