File indexing completed on 2024-06-23 05:07:02

0001 /***************************************************************************
0002  *   SPDX-FileCopyrightText: 2014 Christian Mollekopf <mollekopf@kolabsys.com>    *
0003  *                                                                         *
0004  *   SPDX-License-Identifier: LGPL-2.0-or-later                            *
0005  ***************************************************************************/
0006 
0007 #include "relationfetchhandler.h"
0008 #include "connection.h"
0009 #include "handlerhelper.h"
0010 #include "storage/selectquerybuilder.h"
0011 
0012 #include "private/imapset_p.h"
0013 
0014 using namespace Akonadi;
0015 using namespace Akonadi::Server;
0016 
0017 RelationFetchHandler::RelationFetchHandler(AkonadiServer &akonadi)
0018     : Handler(akonadi)
0019 {
0020 }
0021 
0022 bool RelationFetchHandler::parseStream()
0023 {
0024     const auto &cmd = Protocol::cmdCast<Protocol::FetchRelationsCommand>(m_command);
0025 
0026     SelectQueryBuilder<Relation> relationQuery;
0027     if (cmd.side() > 0) {
0028         Query::Condition c;
0029         c.setSubQueryMode(Query::Or);
0030         c.addValueCondition(Relation::leftIdFullColumnName(), Query::Equals, cmd.side());
0031         c.addValueCondition(Relation::rightIdFullColumnName(), Query::Equals, cmd.side());
0032         relationQuery.addCondition(c);
0033     } else {
0034         if (cmd.left() > 0) {
0035             relationQuery.addValueCondition(Relation::leftIdFullColumnName(), Query::Equals, cmd.left());
0036         }
0037         if (cmd.right() > 0) {
0038             relationQuery.addValueCondition(Relation::rightIdFullColumnName(), Query::Equals, cmd.right());
0039         }
0040     }
0041 
0042     const auto cmdTypes = cmd.types();
0043     if (!cmdTypes.isEmpty()) {
0044         relationQuery.addJoin(QueryBuilder::InnerJoin, RelationType::tableName(), Relation::typeIdFullColumnName(), RelationType::idFullColumnName());
0045         QStringList types;
0046         types.reserve(cmdTypes.size());
0047         for (const QByteArray &type : cmdTypes) {
0048             types << QString::fromUtf8(type);
0049         }
0050         relationQuery.addValueCondition(RelationType::nameFullColumnName(), Query::In, types);
0051     }
0052     if (!cmd.resource().isEmpty()) {
0053         Resource res = Resource::retrieveByName(cmd.resource());
0054         if (!res.isValid()) {
0055             return failureResponse("Invalid resource");
0056         }
0057         Query::Condition condition;
0058         condition.setSubQueryMode(Query::Or);
0059         condition.addColumnCondition(PimItem::idFullColumnName(), Query::Equals, Relation::leftIdFullColumnName());
0060         condition.addColumnCondition(PimItem::idFullColumnName(), Query::Equals, Relation::rightIdFullColumnName());
0061         relationQuery.addJoin(QueryBuilder::InnerJoin, PimItem::tableName(), condition);
0062 
0063         relationQuery.addJoin(QueryBuilder::InnerJoin, Collection::tableName(), PimItem::collectionIdFullColumnName(), Collection::idFullColumnName());
0064 
0065         relationQuery.addValueCondition(Collection::resourceIdFullColumnName(), Query::Equals, res.id());
0066         relationQuery.addGroupColumns(QStringList() << Relation::leftIdFullColumnName() << Relation::rightIdFullColumnName()
0067                                                     << Relation::typeIdFullColumnName());
0068     }
0069 
0070     if (!relationQuery.exec()) {
0071         return failureResponse("Failed to query for existing relation");
0072     }
0073     const Relation::List existingRelations = relationQuery.result();
0074     for (const Relation &relation : existingRelations) {
0075         sendResponse(HandlerHelper::fetchRelationsResponse(relation));
0076     }
0077 
0078     return successResponse<Protocol::FetchRelationsResponse>();
0079 }