diff --git a/autotests/CMakeLists.txt b/autotests/CMakeLists.txt --- a/autotests/CMakeLists.txt +++ b/autotests/CMakeLists.txt @@ -75,5 +75,6 @@ add_libkgapi2_test(drive filecopyjobtest) add_libkgapi2_test(drive filecreatejobtest) add_libkgapi2_test(drive filesearchquerytest) +add_libkgapi2_test(drive teamdrivecreatejobtest) add_libkgapi2_test(drive teamdrivefetchjobtest) add_libkgapi2_test(drive teamdrivesearchquerytest) diff --git a/autotests/drive/data/teamdrive_create_request.txt b/autotests/drive/data/teamdrive_create_request.txt new file mode 100644 --- /dev/null +++ b/autotests/drive/data/teamdrive_create_request.txt @@ -0,0 +1,7 @@ +POST https://www.googleapis.com/drive/v2/teamdrives?requestId=MockRequestId + +{ + "kind": "drive#teamDrive", + "id": "0APqEW6eViiMXUk9PVA", + "name": "First Team Drive" +} diff --git a/autotests/drive/data/teamdrive_create_response.txt b/autotests/drive/data/teamdrive_create_response.txt new file mode 100644 --- /dev/null +++ b/autotests/drive/data/teamdrive_create_response.txt @@ -0,0 +1,8 @@ +HTTP/1.1 200 OK +content-type: application/json; charset=UTF-8 + +{ + "kind": "drive#teamDrive", + "id": "0APqEW6eViiMXUk9PVA", + "name": "First Team Drive" +} diff --git a/autotests/drive/teamdrivecreatejobtest.cpp b/autotests/drive/teamdrivecreatejobtest.cpp new file mode 100644 --- /dev/null +++ b/autotests/drive/teamdrivecreatejobtest.cpp @@ -0,0 +1,92 @@ +/* + * Createright (C) 2019 David Barchiesi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a create of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +#include +#include + +#include "fakenetworkaccessmanagerfactory.h" +#include "testutils.h" +#include "drivetestutils.h" + +#include "types.h" +#include "teamdrivecreatejob.h" +#include "teamdrive.h" +#include "account.h" + +using namespace KGAPI2; + +Q_DECLARE_METATYPE(QList) +Q_DECLARE_METATYPE(KGAPI2::Drive::TeamdrivePtr) + +class TeamdriveCreateJobTest : public QObject +{ + Q_OBJECT +private Q_SLOTS: + void initTestCase() + { + NetworkAccessManagerFactory::setFactory(new FakeNetworkAccessManagerFactory); + } + + void testCreate_data() + { + QTest::addColumn>("scenarios"); + QTest::addColumn("sourceTeamdrive"); + QTest::addColumn("requestId"); + QTest::addColumn("expectedResult"); + + QTest::newRow("metadata only") + << QList{ + scenarioFromFile(QFINDTESTDATA("data/teamdrive_create_request.txt"), + QFINDTESTDATA("data/teamdrive_create_response.txt")) + } + << teamdriveFromFile(QFINDTESTDATA("data/teamdrive.json")) + << QStringLiteral("MockRequestId") + << teamdriveFromFile(QFINDTESTDATA("data/teamdrive.json")); + } + + void testCreate() + { + QFETCH(QList, scenarios); + QFETCH(Drive::TeamdrivePtr, sourceTeamdrive); + QFETCH(QString, requestId); + QFETCH(Drive::TeamdrivePtr, expectedResult); + + FakeNetworkAccessManagerFactory::get()->setScenarios(scenarios); + + auto account = AccountPtr::create(QStringLiteral("MockAccount"), QStringLiteral("MockToken")); + Drive::TeamdriveCreateJob *job = new Drive::TeamdriveCreateJob(requestId, sourceTeamdrive, account); + + QVERIFY(execJob(job)); + const auto items = job->items(); + QCOMPARE(items.count(), 1); + QVERIFY(*items.cbegin()); + QCOMPARE(**items.cbegin(), *expectedResult); + QCOMPARE(requestId, job->requestId()); + } +}; + +QTEST_GUILESS_MAIN(TeamdriveCreateJobTest) + +#include "teamdrivecreatejobtest.moc" + + + + + diff --git a/examples/teamdrive/mainwindow.h b/examples/teamdrive/mainwindow.h --- a/examples/teamdrive/mainwindow.h +++ b/examples/teamdrive/mainwindow.h @@ -55,6 +55,16 @@ */ void slotAuthJobFinished(KGAPI2::Job *job); + /** + * Creates the Team Drive with name in newTeamdriveEdit + */ + void createTeamdrive(); + + /** + * Team Drive was created. + */ + void slotTeamdriveCreateJobFinished(KGAPI2::Job *job); + /** * All Team Drives were fetched. */ diff --git a/examples/teamdrive/mainwindow.cpp b/examples/teamdrive/mainwindow.cpp --- a/examples/teamdrive/mainwindow.cpp +++ b/examples/teamdrive/mainwindow.cpp @@ -23,6 +23,7 @@ #include "ui_main.h" #include +#include #include #include #include @@ -32,6 +33,7 @@ #include #include +#include MainWindow::MainWindow(QWidget * parent): QMainWindow(parent), @@ -42,6 +44,8 @@ m_ui->errorLabel->setVisible(false); connect(m_ui->authButton, &QAbstractButton::clicked, this, &MainWindow::authenticate); + connect(m_ui->newTeamdriveButton, &QAbstractButton::clicked, + this, &MainWindow::createTeamdrive); connect(m_ui->teamdriveListButton, &QAbstractButton::clicked, this, &MainWindow::fetchTeamdriveList); connect(m_ui->teamdriveList, &QListWidget::itemSelectionChanged, @@ -88,6 +92,38 @@ m_ui->authButton->setEnabled(false); } +void MainWindow::createTeamdrive() +{ + QString teamdriveName = m_ui->newTeamdriveEdit->text(); + if (teamdriveName.isEmpty()) { + return; + } + QString requestId = QUuid::createUuid().toString(); + + KGAPI2::Drive::TeamdrivePtr teamdrive = KGAPI2::Drive::TeamdrivePtr::create(); + teamdrive->setName(teamdriveName); + KGAPI2::Drive::TeamdriveCreateJob *createJob = new KGAPI2::Drive::TeamdriveCreateJob(requestId, teamdrive, m_account, this); + connect(createJob, &KGAPI2::Job::finished, + this, &MainWindow::slotTeamdriveCreateJobFinished); +} + +void MainWindow::slotTeamdriveCreateJobFinished(KGAPI2::Job *job) +{ + KGAPI2::Drive::TeamdriveCreateJob *createJob = qobject_cast(job); + Q_ASSERT(createJob); + createJob->deleteLater(); + + if (createJob->error() != KGAPI2::NoError) { + m_ui->errorLabel->setText(QStringLiteral("Error: %1").arg(createJob->errorString())); + m_ui->errorLabel->setVisible(true); + m_ui->teamdriveListButton->setEnabled(true); + return; + } + + m_ui->newTeamdriveEdit->clear(); + fetchTeamdriveList(); +} + void MainWindow::fetchTeamdriveList() { if (m_account.isNull()) { @@ -97,10 +133,7 @@ return; } - KGAPI2::Drive::TeamdriveSearchQuery query; - query.addQuery(KGAPI2::Drive::TeamdriveSearchQuery::MemberCount, KGAPI2::Drive::TeamdriveSearchQuery::Less, 10); - - KGAPI2::Drive::TeamdriveFetchJob *fetchJob = new KGAPI2::Drive::TeamdriveFetchJob(query, m_account, this); + KGAPI2::Drive::TeamdriveFetchJob *fetchJob = new KGAPI2::Drive::TeamdriveFetchJob(m_account, this); connect(fetchJob, &KGAPI2::Job::finished, this, &MainWindow::slotFetchJobFinished); @@ -122,7 +155,7 @@ /* Get all items the job has retrieved */ const KGAPI2::ObjectsList objects = fetchJob->items(); - + m_ui->teamdriveList->clear(); for (const KGAPI2::ObjectPtr &object : objects) { const KGAPI2::Drive::TeamdrivePtr teamdrive = object.dynamicCast(); diff --git a/examples/teamdrive/ui/main.ui b/examples/teamdrive/ui/main.ui --- a/examples/teamdrive/ui/main.ui +++ b/examples/teamdrive/ui/main.ui @@ -7,7 +7,7 @@ 0 0 640 - 413 + 486 @@ -40,6 +40,20 @@ + + + + + + + + + Create + + + + + @@ -126,7 +140,7 @@ 0 0 640 - 25 + 30 @@ -144,8 +158,6 @@ - - diff --git a/src/drive/CMakeLists.txt b/src/drive/CMakeLists.txt --- a/src/drive/CMakeLists.txt +++ b/src/drive/CMakeLists.txt @@ -39,6 +39,7 @@ revisionfetchjob.cpp revisionmodifyjob.cpp teamdrive.cpp + teamdrivecreatejob.cpp teamdrivefetchjob.cpp teamdrivesearchquery.cpp user.cpp @@ -87,6 +88,7 @@ RevisionFetchJob RevisionModifyJob Teamdrive + TeamdriveCreateJob TeamdriveFetchJob TeamdriveSearchQuery User diff --git a/src/drive/teamdrive.h b/src/drive/teamdrive.h --- a/src/drive/teamdrive.h +++ b/src/drive/teamdrive.h @@ -289,6 +289,13 @@ */ QString name() const; + /** + * @brief Sets the name of the teamdrive. + * + * @param name + */ + void setName(const QString &name) const; + /** * @brief Returns the themeId of the teamdrive. */ diff --git a/src/drive/teamdrive.cpp b/src/drive/teamdrive.cpp --- a/src/drive/teamdrive.cpp +++ b/src/drive/teamdrive.cpp @@ -27,6 +27,8 @@ #include namespace { + static const QString ApiKind = QStringLiteral("drive#teamDrive"); + static const QString ApiKindList = QStringLiteral("drive#teamDriveList"); static const QString AdminManagedRestrictionsAttr = QStringLiteral("adminManagedRestrictions"); static const QString BackgroundImageFileAttr = QStringLiteral("backgroundImageFile"); static const QString BackgroundImageLinkAttr = QStringLiteral("backgroundImageLink"); @@ -358,56 +360,74 @@ TeamdrivePtr Teamdrive::Private::fromJSON(const QVariantMap &map) { if (!map.contains(KindAttr) || - map[KindAttr].toString() != QLatin1String("drive#teamDrive")) + map[KindAttr].toString() != ApiKind) { return TeamdrivePtr(); } auto teamdrive = TeamdrivePtr::create(); - teamdrive->d->id = map[IdAttr].toString(); - teamdrive->d->name = map[NameAttr].toString(); - teamdrive->d->themeId = map[ThemeIdAttr].toString(); - teamdrive->d->colorRgb = map[ColorRgbAttr].toString(); - teamdrive->d->backgroundImageLink = map[BackgroundImageLinkAttr].toString(); - teamdrive->d->createdDate = QDateTime::fromString(map[CreatedDateAttr].toString(), Qt::ISODate); - - const QVariantMap backgroundImageFileMap = map[BackgroundImageFileAttr].toMap(); - auto backgroundImageFile = BackgroundImageFilePtr::create(); - backgroundImageFile->d->id = backgroundImageFileMap[IdAttr].toString(); - backgroundImageFile->d->xCoordinate = backgroundImageFileMap[XCoordinateAttr].toReal(); - backgroundImageFile->d->yCoordinate = backgroundImageFileMap[YCoordinateAttr].toReal(); - backgroundImageFile->d->width = backgroundImageFileMap[WidthAttr].toReal(); - teamdrive->d->backgroundImageFile = backgroundImageFile; - - const QVariantMap capabilitiesMap = map[CapabilitiesAttr].toMap(); - auto capabilities = CapabilitiesPtr::create(); - capabilities->d->canAddChildren = capabilitiesMap[CanAddChildrenAttr].toBool(); - capabilities->d->canChangeCopyRequiresWriterPermissionRestriction = capabilitiesMap[CanChangeCopyRequiresWriterPermissionRestrictionAttr].toBool(); - capabilities->d->canChangeDomainUsersOnlyRestriction = capabilitiesMap[CanChangeDomainUsersOnlyRestrictionAttr].toBool(); - capabilities->d->canChangeTeamDriveBackground = capabilitiesMap[CanChangeTeamDriveBackgroundAttr].toBool(); - capabilities->d->canChangeTeamMembersOnlyRestriction = capabilitiesMap[CanChangeTeamMembersOnlyRestrictionAttr].toBool(); - capabilities->d->canComment = capabilitiesMap[CanCommentAttr].toBool(); - capabilities->d->canCopy = capabilitiesMap[CanCopyAttr].toBool(); - capabilities->d->canDeleteChildren = capabilitiesMap[CanDeleteChildrenAttr].toBool(); - capabilities->d->canDeleteTeamDrive = capabilitiesMap[CanDeleteTeamDriveAttr].toBool(); - capabilities->d->canDownload = capabilitiesMap[CanDownloadAttr].toBool(); - capabilities->d->canEdit = capabilitiesMap[CanEditAttr].toBool(); - capabilities->d->canListChildren = capabilitiesMap[CanListChildrenAttr].toBool(); - capabilities->d->canManageMembers = capabilitiesMap[CanManageMembersAttr].toBool(); - capabilities->d->canReadRevisions = capabilitiesMap[CanReadRevisionsAttr].toBool(); - capabilities->d->canRename = capabilitiesMap[CanRenameAttr].toBool(); - capabilities->d->canRenameTeamDrive = capabilitiesMap[CanRenameTeamDriveAttr].toBool(); - capabilities->d->canShare = capabilitiesMap[CanShareAttr].toBool(); - capabilities->d->canTrashChildren = capabilitiesMap[CanTrashChildrenAttr].toBool(); - teamdrive->d->capabilities = capabilities; - - const QVariantMap restrictionsMap = map[RestrictionsAttr].toMap(); - auto restrictions = RestrictionsPtr::create(); - restrictions->d->adminManagedRestrictions = restrictionsMap[AdminManagedRestrictionsAttr].toBool(); - restrictions->d->copyRequiresWriterPermission = restrictionsMap[CopyRequiresWriterPermissionAttr].toBool(); - restrictions->d->domainUsersOnly = restrictionsMap[DomainUsersOnlyAttr].toBool(); - restrictions->d->teamMembersOnly = restrictionsMap[TeamMembersOnlyAttr].toBool(); - teamdrive->d->restrictions = restrictions; + if (map.contains(IdAttr)) { + teamdrive->d->id = map[IdAttr].toString(); + } + if (map.contains(NameAttr)) { + teamdrive->d->name = map[NameAttr].toString(); + } + if (map.contains(ThemeIdAttr)) { + teamdrive->d->themeId = map[ThemeIdAttr].toString(); + } + if (map.contains(ColorRgbAttr)) { + teamdrive->d->colorRgb = map[ColorRgbAttr].toString(); + } + if (map.contains(BackgroundImageLinkAttr)) { + teamdrive->d->backgroundImageLink = map[BackgroundImageLinkAttr].toString(); + } + if (map.contains(CreatedDateAttr)) { + teamdrive->d->createdDate = QDateTime::fromString(map[CreatedDateAttr].toString(), Qt::ISODate); + } + + if (map.contains(BackgroundImageFileAttr)) { + const QVariantMap backgroundImageFileMap = map[BackgroundImageFileAttr].toMap(); + auto backgroundImageFile = BackgroundImageFilePtr::create(); + backgroundImageFile->d->id = backgroundImageFileMap[IdAttr].toString(); + backgroundImageFile->d->xCoordinate = backgroundImageFileMap[XCoordinateAttr].toReal(); + backgroundImageFile->d->yCoordinate = backgroundImageFileMap[YCoordinateAttr].toReal(); + backgroundImageFile->d->width = backgroundImageFileMap[WidthAttr].toReal(); + teamdrive->d->backgroundImageFile = backgroundImageFile; + } + + if (map.contains(CapabilitiesAttr)) { + const QVariantMap capabilitiesMap = map[CapabilitiesAttr].toMap(); + auto capabilities = CapabilitiesPtr::create(); + capabilities->d->canAddChildren = capabilitiesMap[CanAddChildrenAttr].toBool(); + capabilities->d->canChangeCopyRequiresWriterPermissionRestriction = capabilitiesMap[CanChangeCopyRequiresWriterPermissionRestrictionAttr].toBool(); + capabilities->d->canChangeDomainUsersOnlyRestriction = capabilitiesMap[CanChangeDomainUsersOnlyRestrictionAttr].toBool(); + capabilities->d->canChangeTeamDriveBackground = capabilitiesMap[CanChangeTeamDriveBackgroundAttr].toBool(); + capabilities->d->canChangeTeamMembersOnlyRestriction = capabilitiesMap[CanChangeTeamMembersOnlyRestrictionAttr].toBool(); + capabilities->d->canComment = capabilitiesMap[CanCommentAttr].toBool(); + capabilities->d->canCopy = capabilitiesMap[CanCopyAttr].toBool(); + capabilities->d->canDeleteChildren = capabilitiesMap[CanDeleteChildrenAttr].toBool(); + capabilities->d->canDeleteTeamDrive = capabilitiesMap[CanDeleteTeamDriveAttr].toBool(); + capabilities->d->canDownload = capabilitiesMap[CanDownloadAttr].toBool(); + capabilities->d->canEdit = capabilitiesMap[CanEditAttr].toBool(); + capabilities->d->canListChildren = capabilitiesMap[CanListChildrenAttr].toBool(); + capabilities->d->canManageMembers = capabilitiesMap[CanManageMembersAttr].toBool(); + capabilities->d->canReadRevisions = capabilitiesMap[CanReadRevisionsAttr].toBool(); + capabilities->d->canRename = capabilitiesMap[CanRenameAttr].toBool(); + capabilities->d->canRenameTeamDrive = capabilitiesMap[CanRenameTeamDriveAttr].toBool(); + capabilities->d->canShare = capabilitiesMap[CanShareAttr].toBool(); + capabilities->d->canTrashChildren = capabilitiesMap[CanTrashChildrenAttr].toBool(); + teamdrive->d->capabilities = capabilities; + } + + if (map.contains(RestrictionsAttr)) { + const QVariantMap restrictionsMap = map[RestrictionsAttr].toMap(); + auto restrictions = RestrictionsPtr::create(); + restrictions->d->adminManagedRestrictions = restrictionsMap[AdminManagedRestrictionsAttr].toBool(); + restrictions->d->copyRequiresWriterPermission = restrictionsMap[CopyRequiresWriterPermissionAttr].toBool(); + restrictions->d->domainUsersOnly = restrictionsMap[DomainUsersOnlyAttr].toBool(); + restrictions->d->teamMembersOnly = restrictionsMap[TeamMembersOnlyAttr].toBool(); + teamdrive->d->restrictions = restrictions; + } return teamdrive; } @@ -453,6 +473,11 @@ return d->name; } +void Teamdrive::setName(const QString &name) const +{ + d->name = name; +} + QString Teamdrive::themeId() const { return d->themeId; @@ -509,7 +534,7 @@ const QVariant data = document.toVariant(); const QVariantMap map = data.toMap(); if (!map.contains(KindAttr) || - map[KindAttr].toString() != QLatin1String("drive#teamDriveList")) { + map[KindAttr].toString() != ApiKindList) { return TeamdrivesList(); } @@ -536,47 +561,66 @@ QByteArray Teamdrive::toJSON(const TeamdrivePtr &teamdrive) { QVariantMap teamDriveMap; - teamDriveMap[IdAttr] = teamdrive->id(); - teamDriveMap[NameAttr] = teamdrive->name(); - teamDriveMap[ThemeIdAttr] = teamdrive->themeId(); - teamDriveMap[ColorRgbAttr] = teamdrive->colorRgb(); - teamDriveMap[BackgroundImageLinkAttr] = teamdrive->backgroundImageLink(); - teamDriveMap[CreatedDateAttr] = teamdrive->createdDate(); - - QVariantMap restrictionsMap; - restrictionsMap[AdminManagedRestrictionsAttr] = teamdrive->restrictions()->adminManagedRestrictions(); - restrictionsMap[CopyRequiresWriterPermissionAttr] = teamdrive->restrictions()->copyRequiresWriterPermission(); - restrictionsMap[DomainUsersOnlyAttr] = teamdrive->restrictions()->domainUsersOnly(); - restrictionsMap[TeamMembersOnlyAttr] = teamdrive->restrictions()->teamMembersOnly(); - teamDriveMap[RestrictionsAttr] = restrictionsMap; - - QVariantMap backgroundImageFileMap; - backgroundImageFileMap[IdAttr] = teamdrive->backgroundImageFile()->id(); - backgroundImageFileMap[XCoordinateAttr] = teamdrive->backgroundImageFile()->xCoordinate(); - backgroundImageFileMap[YCoordinateAttr] = teamdrive->backgroundImageFile()->yCoordinate(); - backgroundImageFileMap[WidthAttr] = teamdrive->backgroundImageFile()->width(); - teamDriveMap[BackgroundImageFileAttr] = backgroundImageFileMap; - - QVariantMap capabilitiesMap; - capabilitiesMap[CanAddChildrenAttr] = teamdrive->capabilities()->canAddChildren(); - capabilitiesMap[CanChangeCopyRequiresWriterPermissionRestrictionAttr] = teamdrive->capabilities()->canChangeCopyRequiresWriterPermissionRestriction(); - capabilitiesMap[CanChangeDomainUsersOnlyRestrictionAttr] = teamdrive->capabilities()->canChangeDomainUsersOnlyRestriction(); - capabilitiesMap[CanChangeTeamDriveBackgroundAttr] = teamdrive->capabilities()->canChangeTeamDriveBackground(); - capabilitiesMap[CanChangeTeamMembersOnlyRestrictionAttr] = teamdrive->capabilities()->canChangeTeamMembersOnlyRestriction(); - capabilitiesMap[CanCommentAttr] = teamdrive->capabilities()->canComment(); - capabilitiesMap[CanCopyAttr] = teamdrive->capabilities()->canCopy(); - capabilitiesMap[CanDeleteChildrenAttr] = teamdrive->capabilities()->canDeleteChildren(); - capabilitiesMap[CanDeleteTeamDriveAttr] = teamdrive->capabilities()->canDeleteTeamDrive(); - capabilitiesMap[CanDownloadAttr] = teamdrive->capabilities()->canDownload(); - capabilitiesMap[CanEditAttr] = teamdrive->capabilities()->canEdit(); - capabilitiesMap[CanListChildrenAttr] = teamdrive->capabilities()->canListChildren(); - capabilitiesMap[CanManageMembersAttr] = teamdrive->capabilities()->canManageMembers(); - capabilitiesMap[CanReadRevisionsAttr] = teamdrive->capabilities()->canReadRevisions(); - capabilitiesMap[CanRenameAttr] = teamdrive->capabilities()->canRename(); - capabilitiesMap[CanRenameTeamDriveAttr] = teamdrive->capabilities()->canRenameTeamDrive(); - capabilitiesMap[CanShareAttr] = teamdrive->capabilities()->canShare(); - capabilitiesMap[CanTrashChildrenAttr] = teamdrive->capabilities()->canTrashChildren(); - teamDriveMap[CapabilitiesAttr] = capabilitiesMap; + teamDriveMap[KindAttr] = ApiKind; + if (!teamdrive->id().isEmpty()) { + teamDriveMap[IdAttr] = teamdrive->id(); + } + if (!teamdrive->name().isEmpty()) { + teamDriveMap[NameAttr] = teamdrive->name(); + } + if (!teamdrive->themeId().isEmpty()) { + teamDriveMap[ThemeIdAttr] = teamdrive->themeId(); + } + if (!teamdrive->colorRgb().isEmpty()) { + teamDriveMap[ColorRgbAttr] = teamdrive->colorRgb(); + } + if (!teamdrive->backgroundImageLink().isEmpty()) { + teamDriveMap[BackgroundImageLinkAttr] = teamdrive->backgroundImageLink(); + } + if (teamdrive->createdDate().isValid()) { + teamDriveMap[CreatedDateAttr] = teamdrive->createdDate(); + } + + if (teamdrive->restrictions()) { + QVariantMap restrictionsMap; + restrictionsMap[AdminManagedRestrictionsAttr] = teamdrive->restrictions()->adminManagedRestrictions(); + restrictionsMap[CopyRequiresWriterPermissionAttr] = teamdrive->restrictions()->copyRequiresWriterPermission(); + restrictionsMap[DomainUsersOnlyAttr] = teamdrive->restrictions()->domainUsersOnly(); + restrictionsMap[TeamMembersOnlyAttr] = teamdrive->restrictions()->teamMembersOnly(); + teamDriveMap[RestrictionsAttr] = restrictionsMap; + } + + if (teamdrive->backgroundImageFile()) { + QVariantMap backgroundImageFileMap; + backgroundImageFileMap[IdAttr] = teamdrive->backgroundImageFile()->id(); + backgroundImageFileMap[XCoordinateAttr] = teamdrive->backgroundImageFile()->xCoordinate(); + backgroundImageFileMap[YCoordinateAttr] = teamdrive->backgroundImageFile()->yCoordinate(); + backgroundImageFileMap[WidthAttr] = teamdrive->backgroundImageFile()->width(); + teamDriveMap[BackgroundImageFileAttr] = backgroundImageFileMap; + } + + if (teamdrive->capabilities()) { + QVariantMap capabilitiesMap; + capabilitiesMap[CanAddChildrenAttr] = teamdrive->capabilities()->canAddChildren(); + capabilitiesMap[CanChangeCopyRequiresWriterPermissionRestrictionAttr] = teamdrive->capabilities()->canChangeCopyRequiresWriterPermissionRestriction(); + capabilitiesMap[CanChangeDomainUsersOnlyRestrictionAttr] = teamdrive->capabilities()->canChangeDomainUsersOnlyRestriction(); + capabilitiesMap[CanChangeTeamDriveBackgroundAttr] = teamdrive->capabilities()->canChangeTeamDriveBackground(); + capabilitiesMap[CanChangeTeamMembersOnlyRestrictionAttr] = teamdrive->capabilities()->canChangeTeamMembersOnlyRestriction(); + capabilitiesMap[CanCommentAttr] = teamdrive->capabilities()->canComment(); + capabilitiesMap[CanCopyAttr] = teamdrive->capabilities()->canCopy(); + capabilitiesMap[CanDeleteChildrenAttr] = teamdrive->capabilities()->canDeleteChildren(); + capabilitiesMap[CanDeleteTeamDriveAttr] = teamdrive->capabilities()->canDeleteTeamDrive(); + capabilitiesMap[CanDownloadAttr] = teamdrive->capabilities()->canDownload(); + capabilitiesMap[CanEditAttr] = teamdrive->capabilities()->canEdit(); + capabilitiesMap[CanListChildrenAttr] = teamdrive->capabilities()->canListChildren(); + capabilitiesMap[CanManageMembersAttr] = teamdrive->capabilities()->canManageMembers(); + capabilitiesMap[CanReadRevisionsAttr] = teamdrive->capabilities()->canReadRevisions(); + capabilitiesMap[CanRenameAttr] = teamdrive->capabilities()->canRename(); + capabilitiesMap[CanRenameTeamDriveAttr] = teamdrive->capabilities()->canRenameTeamDrive(); + capabilitiesMap[CanShareAttr] = teamdrive->capabilities()->canShare(); + capabilitiesMap[CanTrashChildrenAttr] = teamdrive->capabilities()->canTrashChildren(); + teamDriveMap[CapabilitiesAttr] = capabilitiesMap; + } QJsonDocument document = QJsonDocument::fromVariant(teamDriveMap); return document.toJson(QJsonDocument::Compact); diff --git a/src/drive/teamdrivecreatejob.h b/src/drive/teamdrivecreatejob.h new file mode 100644 --- /dev/null +++ b/src/drive/teamdrivecreatejob.h @@ -0,0 +1,68 @@ +/* + * This file is part of LibKGAPI library + * + * Copyright (C) 2019 David Barchiesi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +#ifndef KGAPI2_DRIVETEAMDRIVECREATEJOB_H +#define KGAPI2_DRIVETEAMDRIVECREATEJOB_H + +#include "createjob.h" +#include "kgapidrive_export.h" + +namespace KGAPI2 +{ + +namespace Drive +{ + +class KGAPIDRIVE_EXPORT TeamdriveCreateJob : public KGAPI2::CreateJob +{ + Q_OBJECT + + public: + TeamdriveCreateJob(const QString &requestId, + const TeamdrivePtr &teamdrive, + const AccountPtr &account, QObject *parent = nullptr); + TeamdriveCreateJob(const QString &requestId, + const TeamdrivesList &teamdrives, + const AccountPtr &account, QObject *parent = nullptr); + ~TeamdriveCreateJob() override; + + /** + * @brief Returns the requestId used in this create request. + */ + QString requestId() const; + + protected: + void start() override; + KGAPI2::ObjectsList handleReplyWithItems(const QNetworkReply *reply, + const QByteArray &rawData) override; + + private: + class Private; + QScopedPointer d; + friend class Private; +}; + +} // namespace Drive + +} // namespace KGAPI2 + +#endif // KGAPI2_DRIVETEAMDRIVECREATEJOB_H diff --git a/src/drive/teamdrivecreatejob.cpp b/src/drive/teamdrivecreatejob.cpp new file mode 100644 --- /dev/null +++ b/src/drive/teamdrivecreatejob.cpp @@ -0,0 +1,136 @@ +/* + * This file is part of LibKGAPI library + * + * Copyright (C) 2019 David Barchiesi + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; either + * version 2.1 of the License, or (at your option) version 3, or any + * later version accepted by the membership of KDE e.V. (or its + * successor approved by the membership of KDE e.V.), which shall + * act as a proxy defined in Section 6 of version 3 of the license. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library. If not, see . + */ + +#include "teamdrivecreatejob.h" +#include "account.h" +#include "driveservice.h" +#include "teamdrive.h" +#include "utils.h" + +#include +#include +#include + + +namespace { + static const QString RequestIdParam = QStringLiteral("requestId"); +} +using namespace KGAPI2; +using namespace KGAPI2::Drive; + +class Q_DECL_HIDDEN TeamdriveCreateJob::Private +{ + public: + Private(TeamdriveCreateJob *parent); + void processNext(); + + TeamdrivesList teamdrives; + QString requestId; + + private: + TeamdriveCreateJob *const q; +}; + +TeamdriveCreateJob::Private::Private(TeamdriveCreateJob *parent): + q(parent) +{ +} + +void TeamdriveCreateJob::Private::processNext() +{ + if (teamdrives.isEmpty()) { + q->emitFinished(); + return; + } + + const TeamdrivePtr teamdrive = teamdrives.takeFirst(); + + QUrl url = DriveService::fetchTeamdrivesUrl(); + + QNetworkRequest request; + request.setRawHeader("Authorization", "Bearer " + q->account()->accessToken().toLatin1()); + QUrlQuery query(url); + if (!requestId.isEmpty()) { + query.addQueryItem(RequestIdParam, requestId); + } + url.setQuery(query); + request.setUrl(url); + + const QByteArray rawData = Teamdrive::toJSON(teamdrive); + q->enqueueRequest(request, rawData, QStringLiteral("application/json")); +} + +TeamdriveCreateJob::TeamdriveCreateJob(const QString &requestId, + const TeamdrivePtr &teamdrive, + const AccountPtr &account, + QObject *parent): + CreateJob(account, parent), + d(new Private(this)) +{ + d->requestId = requestId; + d->teamdrives << teamdrive; +} + +TeamdriveCreateJob::TeamdriveCreateJob(const QString &requestId, + const TeamdrivesList &teamdrives, + const AccountPtr &account, + QObject *parent): + CreateJob(account, parent), + d(new Private(this)) +{ + d->requestId = requestId; + d->teamdrives = teamdrives; +} + +TeamdriveCreateJob::~TeamdriveCreateJob() = default; + +QString TeamdriveCreateJob::requestId() const +{ + return d->requestId; +} + +void TeamdriveCreateJob::start() +{ + d->processNext(); +} + +ObjectsList TeamdriveCreateJob::handleReplyWithItems(const QNetworkReply *reply, + const QByteArray &rawData) +{ + const QString contentType = reply->header(QNetworkRequest::ContentTypeHeader).toString(); + ContentType ct = Utils::stringToContentType(contentType); + ObjectsList items; + if (ct == KGAPI2::JSON) { + items << Teamdrive::fromJSON(rawData); + } else { + setError(KGAPI2::InvalidResponse); + setErrorString(tr("Invalid response content type")); + emitFinished(); + } + + // Enqueue next item or finish + d->processNext(); + + return items; +} + +