/*! * Переопределение запроса \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); }
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; }
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; }