File indexing completed on 2024-05-12 05:22:10

0001 /*
0002     SPDX-FileCopyrightText: 2019 David Barchiesi <david@barchie.si>
0003 
0004     SPDX-License-Identifier: LGPL-2.1-only OR LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL
0005 */
0006 
0007 #include "mainwindow.h"
0008 
0009 #include "core/account.h"
0010 #include "core/authjob.h"
0011 #include "drive/file.h"
0012 #include "drive/filefetchjob.h"
0013 #include "drive/filesearchquery.h"
0014 #include "drive/teamdrive.h"
0015 #include "drive/teamdrivecreatejob.h"
0016 #include "drive/teamdrivedeletejob.h"
0017 #include "drive/teamdrivefetchjob.h"
0018 #include "drive/teamdrivemodifyjob.h"
0019 #include "drive/teamdrivesearchquery.h"
0020 
0021 #include <QListWidgetItem>
0022 #include <QUuid>
0023 
0024 MainWindow::MainWindow(QWidget *parent)
0025     : QMainWindow(parent)
0026 {
0027     /* Initialize GUI */
0028     ui.setupUi(this);
0029     ui.errorLabel->setVisible(false);
0030     connect(ui.authButton, &QAbstractButton::clicked, this, &MainWindow::authenticate);
0031     connect(ui.newTeamdriveButton, &QAbstractButton::clicked, this, &MainWindow::createTeamdrive);
0032     connect(ui.teamdriveListButton, &QAbstractButton::clicked, this, &MainWindow::fetchTeamdriveList);
0033     connect(ui.teamdriveSelectedDeleteButton, &QAbstractButton::clicked, this, &MainWindow::deleteSelectedTeamdrive);
0034     connect(ui.renameTeamdriveButton, &QAbstractButton::clicked, this, &MainWindow::renameSelectedTeamdrive);
0035     connect(ui.teamdriveList, &QListWidget::itemSelectionChanged, this, &MainWindow::teamdriveSelected);
0036     connect(ui.teamdrivePreviewList, &QListWidget::itemSelectionChanged, this, &MainWindow::teamdriveItemSelected);
0037 }
0038 
0039 void MainWindow::authenticate()
0040 {
0041     auto account = KGAPI2::AccountPtr::create();
0042     account->setScopes({KGAPI2::Account::driveScopeUrl()});
0043 
0044     /* Create AuthJob to retrieve OAuth tokens for the account */
0045     auto *authJob = new KGAPI2::AuthJob(account, QStringLiteral("554041944266.apps.googleusercontent.com"), QStringLiteral("mdT1DjzohxN3npUUzkENT0gO"));
0046     connect(authJob, &KGAPI2::Job::finished, this, [this, authJob]() {
0047         /* Always remember to delete the jobs, otherwise your application will
0048          * leak memory. */
0049         authJob->deleteLater();
0050 
0051         if (authJob->error() != KGAPI2::NoError) {
0052             ui.errorLabel->setText(QStringLiteral("Error: %1").arg(authJob->errorString()));
0053             ui.errorLabel->setVisible(true);
0054             return;
0055         }
0056 
0057         m_account = authJob->account();
0058 
0059         ui.authStatusLabel->setText(QStringLiteral("Authenticated"));
0060         ui.teamdriveListButton->setEnabled(true);
0061         ui.newTeamdriveEdit->setEnabled(true);
0062         ui.newTeamdriveButton->setEnabled(true);
0063         ui.authButton->setEnabled(false);
0064     });
0065 }
0066 
0067 void MainWindow::createTeamdrive()
0068 {
0069     const auto teamdriveName = ui.newTeamdriveEdit->text();
0070     if (teamdriveName.isEmpty()) {
0071         return;
0072     }
0073     const auto requestId = QUuid::createUuid().toString();
0074 
0075     auto teamdrive = KGAPI2::Drive::TeamdrivePtr::create();
0076     teamdrive->setName(teamdriveName);
0077 
0078     auto *createJob = new KGAPI2::Drive::TeamdriveCreateJob(requestId, teamdrive, m_account, this);
0079     connect(createJob, &KGAPI2::Job::finished, this, [this, createJob]() {
0080         createJob->deleteLater();
0081 
0082         if (createJob->error() != KGAPI2::NoError) {
0083             ui.errorLabel->setText(QStringLiteral("Error: %1").arg(createJob->errorString()));
0084             ui.errorLabel->setVisible(true);
0085             ui.teamdriveListButton->setEnabled(true);
0086             return;
0087         }
0088 
0089         ui.newTeamdriveEdit->clear();
0090         fetchTeamdriveList();
0091     });
0092 }
0093 
0094 void MainWindow::renameSelectedTeamdrive()
0095 {
0096     const auto teamdriveName = ui.renameTeamdriveEdit->text();
0097     if (teamdriveName.isEmpty()) {
0098         return;
0099     }
0100     const auto teamdriveId = ui.teamdriveList->selectedItems().at(0)->data(Qt::UserRole).toString();
0101 
0102     auto teamdrive = KGAPI2::Drive::TeamdrivePtr::create();
0103     teamdrive->setId(teamdriveId);
0104     teamdrive->setName(teamdriveName);
0105 
0106     auto *modifyJob = new KGAPI2::Drive::TeamdriveModifyJob(teamdrive, m_account, this);
0107     connect(modifyJob, &KGAPI2::Job::finished, this, [this, modifyJob]() {
0108         modifyJob->deleteLater();
0109 
0110         if (modifyJob->error() != KGAPI2::NoError) {
0111             ui.errorLabel->setText(QStringLiteral("Error: %1").arg(modifyJob->errorString()));
0112             ui.errorLabel->setVisible(true);
0113             ui.teamdriveListButton->setEnabled(true);
0114             return;
0115         }
0116 
0117         fetchTeamdriveList();
0118     });
0119 }
0120 
0121 void MainWindow::fetchTeamdriveList()
0122 {
0123     if (m_account.isNull()) {
0124         ui.errorLabel->setText(QStringLiteral("Error: Please authenticate first"));
0125         ui.errorLabel->setVisible(true);
0126         ui.authButton->setVisible(true);
0127         return;
0128     }
0129 
0130     auto *fetchJob = new KGAPI2::Drive::TeamdriveFetchJob(m_account, this);
0131     connect(fetchJob, &KGAPI2::Job::finished, this, [this, fetchJob]() {
0132         fetchJob->deleteLater();
0133 
0134         if (fetchJob->error() != KGAPI2::NoError) {
0135             ui.errorLabel->setText(QStringLiteral("Error: %1").arg(fetchJob->errorString()));
0136             ui.errorLabel->setVisible(true);
0137             ui.teamdriveListButton->setEnabled(true);
0138             return;
0139         }
0140 
0141         /* Get all items the job has retrieved */
0142         const auto objects = fetchJob->items();
0143         ui.teamdriveList->clear();
0144         for (const auto &object : objects) {
0145             const auto teamdrive = object.dynamicCast<KGAPI2::Drive::Teamdrive>();
0146 
0147             /* Convert the teamdrive to QListWidget item */
0148             auto *item = new QListWidgetItem(ui.teamdriveList);
0149             item->setText(teamdrive->name());
0150             item->setData(Qt::UserRole, teamdrive->id());
0151 
0152             ui.teamdriveList->addItem(item);
0153         }
0154 
0155         ui.teamdriveListButton->setEnabled(true);
0156     });
0157 
0158     ui.teamdriveListButton->setEnabled(false);
0159 }
0160 
0161 void MainWindow::deleteSelectedTeamdrive()
0162 {
0163     const auto teamdrive_id = ui.teamdriveList->selectedItems().at(0)->data(Qt::UserRole).toString();
0164 
0165     auto *deleteJob = new KGAPI2::Drive::TeamdriveDeleteJob(teamdrive_id, m_account, this);
0166     connect(deleteJob, &KGAPI2::Job::finished, this, [this, deleteJob]() {
0167         deleteJob->deleteLater();
0168 
0169         if (deleteJob->error() != KGAPI2::NoError) {
0170             ui.errorLabel->setText(QStringLiteral("Error: %1").arg(deleteJob->errorString()));
0171             ui.errorLabel->setVisible(true);
0172             ui.teamdriveListButton->setEnabled(true);
0173             return;
0174         }
0175 
0176         fetchTeamdriveList();
0177     });
0178 }
0179 
0180 void MainWindow::teamdriveSelected()
0181 {
0182     const bool hasSelection = (ui.teamdriveList->selectedItems().count() != 0);
0183 
0184     ui.teamdriveSelectedDeleteButton->setEnabled(hasSelection);
0185     ui.renameTeamdriveButton->setEnabled(hasSelection);
0186     ui.renameTeamdriveEdit->setEnabled(hasSelection);
0187 
0188     ui.teamdrivePreviewList->clear();
0189 
0190     if (!hasSelection) {
0191         ui.renameTeamdriveEdit->clear();
0192         return;
0193     }
0194 
0195     const auto id = ui.teamdriveList->selectedItems().at(0)->data(Qt::UserRole).toString();
0196     const auto name = ui.teamdriveList->selectedItems().at(0)->data(Qt::DisplayRole).toString();
0197 
0198     ui.renameTeamdriveEdit->setText(name);
0199 
0200     KGAPI2::Drive::FileSearchQuery query;
0201     query.addQuery(KGAPI2::Drive::FileSearchQuery::Trashed, KGAPI2::Drive::FileSearchQuery::Equals, false);
0202     query.addQuery(KGAPI2::Drive::FileSearchQuery::Parents, KGAPI2::Drive::FileSearchQuery::In, id);
0203 
0204     auto *fileFetchJob = new KGAPI2::Drive::FileFetchJob(query, m_account, nullptr);
0205     fileFetchJob->setFields({
0206         KGAPI2::Drive::File::Fields::Id,
0207         KGAPI2::Drive::File::Fields::Title,
0208     });
0209     connect(fileFetchJob, &KGAPI2::Job::finished, this, [this, fileFetchJob]() {
0210         fileFetchJob->deleteLater();
0211 
0212         if (fileFetchJob->error() != KGAPI2::NoError) {
0213             ui.errorLabel->setText(QStringLiteral("Error: %1").arg(fileFetchJob->errorString()));
0214             ui.errorLabel->setVisible(true);
0215             ui.teamdriveListButton->setEnabled(true);
0216             return;
0217         }
0218 
0219         /* Get all items we have received from Google */
0220         const auto objects = fileFetchJob->items();
0221 
0222         for (const auto &object : objects) {
0223             const auto file = object.dynamicCast<KGAPI2::Drive::File>();
0224 
0225             /* Convert the teamdrive to QListWidget item */
0226             auto *item = new QListWidgetItem(ui.teamdrivePreviewList);
0227             item->setText(file->title());
0228             item->setData(Qt::UserRole, file->id());
0229 
0230             ui.teamdrivePreviewList->addItem(item);
0231         }
0232     });
0233 }
0234 
0235 void MainWindow::teamdriveItemSelected()
0236 {
0237     const bool hasSelection = (ui.teamdrivePreviewList->selectedItems().count() != 0);
0238     if (!hasSelection) {
0239         return;
0240     }
0241 
0242     const auto id = ui.teamdrivePreviewList->selectedItems().at(0)->data(Qt::UserRole).toString();
0243 
0244     auto *fileFetchJob = new KGAPI2::Drive::FileFetchJob(id, m_account, nullptr);
0245     fileFetchJob->setFields({
0246         KGAPI2::Drive::File::Fields::Title,
0247         KGAPI2::Drive::File::Fields::FileSize,
0248     });
0249     connect(fileFetchJob, &KGAPI2::Job::finished, this, [this, fileFetchJob]() {
0250         fileFetchJob->deleteLater();
0251 
0252         if (fileFetchJob->error() != KGAPI2::NoError) {
0253             ui.errorLabel->setText(QStringLiteral("Error: %1").arg(fileFetchJob->errorString()));
0254             ui.errorLabel->setVisible(true);
0255             return;
0256         }
0257 
0258         const auto objects = fileFetchJob->items();
0259         if (objects.size() != 1) {
0260             return;
0261         }
0262 
0263         const auto object = objects.at(0);
0264         const auto file = object.dynamicCast<KGAPI2::Drive::File>();
0265         QStringList msgBuilder;
0266         msgBuilder << file->title();
0267         msgBuilder << QString::number(file->fileSize()) + QStringLiteral(" bytes");
0268         const auto msg = msgBuilder.join(QLatin1StringView(", "));
0269         ui.statusbar->showMessage(msg);
0270     });
0271 }
0272 
0273 #include "moc_mainwindow.cpp"