Ejemplo n.º 1
0
/*!
 * Переопределение запроса \b delete.
 *
 * Для этой операции требуются права на редактирование.
 */
FeedReply NodeInfoFeed::del(const QString &path, Channel *channel, const QByteArray &blob)
{
  Q_UNUSED(blob)

  const bool owner     = can(channel, Acl::Edit);
  const bool moderator = can(channel, Acl::SpecialWrite);
  if (!owner && !moderator)
    return Notice::Forbidden;

  if (path.startsWith(INFO_FEED_MOTD_KEY + LS("/"))) {
    ChatId id(path.mid(5));
    if (id.type() != ChatId::MessageId)
      return Notice::BadRequest;

    QVariantList list = m_data.value(INFO_FEED_MOTD_KEY).toList();
    list.removeAll(id.toString());

    m_data.insert(INFO_FEED_MOTD_KEY, list);
    return FeedReply(Notice::OK, DateTime::utc());
  }

  if (!owner)
    return Notice::Forbidden;

  return Feed::del(path, channel);
}
Ejemplo n.º 2
0
FeedReply NodeProfileFeed::post(const QString &path, const QVariantMap &json, Channel *channel, const QByteArray &blob)
{
  Q_UNUSED(channel);
  Q_UNUSED(blob)

  if (path.isEmpty() || path.contains(LC('*')) || !json.contains(LS("value")))
    return Notice::BadRequest;

  const QVariant& value = json[LS("value")];
  User *user = static_cast<ServerChannel *>(head().channel())->user();

  if (user->set(path, value)) {
    DataBase::add(user);
    return FeedReply(Notice::OK, DateTime::utc());
  }

  return Notice::NotModified;
}
Ejemplo n.º 3
0
FeedReply NodeInfoFeed::post(const QString &path, const QVariantMap &json, Channel *channel, const QByteArray &blob)
{
  Q_UNUSED(blob)

  const bool owner     = can(channel, Acl::Edit);
  const bool moderator = can(channel, Acl::SpecialWrite);
  if (!owner && !moderator)
    return Notice::Forbidden;

  if (!channel || path.isEmpty() || path.contains(FEED_WILDCARD_ASTERISK) || !json.contains(FEED_KEY_VALUE))
    return Notice::BadRequest;

  const QVariant& value = json[FEED_KEY_VALUE];
  const qint64 date = DateTime::utc();

  if (path == INFO_FEED_MOTD_KEY) {
    ChatId id(value.toString());
    if (id.type() != ChatId::MessageId)
      return Notice::BadRequest;

    QVariantList list = m_data.value(path).toList();
    list.removeAll(value.toString());
    list.prepend(value.toString());

    m_data.insert(path, list);
    return FeedReply(Notice::OK, date);
  }

  if (!owner)
    return Notice::Forbidden;

  // Установка текстового заголовка канала.
  if (path == INFO_FEED_TITLE_KEY) {
    QVariantMap data;
    data[INFO_FEED_TEXT_KEY]   = value.toString().left(200);
    data[INFO_FEED_AUTHOR_KEY] = SimpleID::encode(channel->id());
    data[INFO_FEED_DATE_KEY]   = date;

    m_data[path] = data;
    return FeedReply(Notice::OK, date);
  }

  if (path == INFO_FEED_VISIBILITY_KEY) {
    visibility(value.toInt());
    return FeedReply(Notice::OK, date);
  }

  if (path == INFO_FEED_PINNED_KEY) {
    if (!Ch::server()->feed(FEED_NAME_ACL)->can(channel, Acl::Edit))
      return Notice::Forbidden;

    m_data[path] = value.toBool();
    return FeedReply(Notice::OK, date);
  }

  if (!m_data.contains(path) || m_data.value(path) != value) {
    m_data[path] = value;
    return FeedReply(Notice::OK, date);
  }

  return Notice::NotModified;
}