Modified TagsDialog.
[situare] / src / situareservice / situareservice.cpp
index 8a8a2c5..6493ad3 100644 (file)
@@ -23,7 +23,7 @@
 
 #include <QtAlgorithms>
 #include <QDebug>
-#include <QNetworkReply>
+#include <QtNetwork/QNetworkReply>
 #include <QPixmap>
 #include <QStringList>
 #include <QtGlobal>
 
 #include "situareservice.h"
 
-SituareService::SituareService(QObject *parent)
+SituareService::SituareService(NetworkAccessManager *networkManager, ImageFetcher *imageFetcher,
+                               QObject *parent)
         : QObject(parent),
         m_user(0)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    m_networkManager = new NetworkAccessManager(this);
+    m_networkManager = networkManager;
     connect(m_networkManager, SIGNAL(finished(QNetworkReply*)),
             this, SLOT(requestFinished(QNetworkReply*)), Qt::QueuedConnection);
 
-    m_imageFetcher = new ImageFetcher(new NetworkAccessManager(this), this);
+    m_imageFetcher = imageFetcher;
     connect(this, SIGNAL(fetchImage(QString, QUrl)),
             m_imageFetcher, SLOT(fetchImage(QString, QUrl)));
     connect(m_imageFetcher, SIGNAL(imageReceived(QString,QPixmap)),
@@ -75,24 +76,14 @@ SituareService::~SituareService()
     m_friendsList.clear();
 }
 
-void SituareService::fetchNotifications()
+void SituareService::fetchMessages()
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QList<Notification*> notifications = m_database->getNotifications(m_user->userId().toULongLong());
+    //Request sent to server does not need the UID
+    QByteArray arr = m_database->getNotifications(613374451);
 
-    foreach (Notification *notification, notifications) {
-        notification->setImage(AvatarImage::create(QPixmap(":/res/images/empty_avatar.png"),
-                                                  AvatarImage::Small));
-    }
-
-    foreach (User *user, m_friendsList) {
-        foreach (Notification *notification, notifications)
-            if (notification->senderId() == user->userId())
-                notification->setImage(user->profileImage());
-    }
-
-    emit notificationsReceived(notifications);
+    parseMessagesData(arr);
 }
 
 void SituareService::fetchPeopleWithSimilarInterest(const GeoCoordinate &southWestCoordinates,
@@ -100,13 +91,23 @@ void SituareService::fetchPeopleWithSimilarInterest(const GeoCoordinate &southWe
 {
     qDebug() << __PRETTY_FUNCTION__;
 
-    QByteArray arr = m_database->getInterestingPeople(m_user->userId().toULongLong(),
+    //Request sent to server does not need the UID
+    QByteArray arr = m_database->getInterestingPeople(613374451,
                                                       southWestCoordinates,
                                                       northEastCoordinates);
 
     parseInterestingPeopleData(arr);
 }
 
+void SituareService::fetchPopularTags()
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    QByteArray arr = m_database->getPopularTags();
+
+    parsePopularTagsData(arr);
+}
+
 void SituareService::fetchLocations()
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -262,6 +263,15 @@ QString SituareService::formUrlParameters(const GeoCoordinate &coordinates, QStr
     return parameters;
 }
 
+void SituareService::sendMessage(const QString &receiverId, const QString &message,
+                                 const GeoCoordinate &coordinates)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (m_database->sendMessage(613374451, receiverId.toULongLong(), message, coordinates))
+        emit updateWasSuccessful(SituareService::SuccessfulSendMessage);
+}
+
 void SituareService::sendRequest(const QUrl &url, const QString &cookieType, const QString &cookie)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -306,7 +316,7 @@ void SituareService::requestFinished(QNetworkReply *reply)
                 parseUserData(replyArray);
             } else if(replyArray.isEmpty()) {
                 if(reply->url().toString().contains(UPDATE_LOCATION.toAscii())) {
-                    emit updateWasSuccessful();
+                    emit updateWasSuccessful(SituareService::SuccessfulUpdateLocation);
                 } else {
                     // session credentials are invalid
                     emit error(ErrorContext::SITUARE, SituareError::SESSION_EXPIRED);
@@ -341,42 +351,156 @@ void SituareService::parseInterestingPeopleData(const QByteArray &jsonReply)
         emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
         return;
     } else {
-        QList<User> interestingPeople;
+        QVariant people = result["people"];
+
+        QList<User> friends;
+        QList<User> others;
+
+        foreach (QVariant personVariant, people.toMap().value("friends").toList()) {
+            User user;
+            QMap<QString, QVariant> person = personVariant.toMap();
+            user.setUserId(person["uid"].toString());
+            user.setName(person["name"].toString());
+            user.setProfileImage(AvatarImage::create(
+                    QPixmap(":/res/images/empty_avatar.png"), AvatarImage::Small));
+            user.setProfileImageUrl(person["image_url"].toUrl());
+            user.setTags(person["tags"].toList());
+
+            bool latOk;
+            qreal latitude = person["latitude"].toReal(&latOk);
+            bool lonOk;
+            qreal longitude = person["longitude"].toReal(&lonOk);
+
+            if (latOk && lonOk)
+                user.setCoordinates(GeoCoordinate(latitude, longitude));
 
-        foreach (QVariant personVariant, result["people"].toList()) {
+            friends.append(user);
+
+            //Remove comment when the actual server is used
+            //emit fetchImage(user.userId(), user.profileImageUrl());
+        }
+
+        foreach (QVariant personVariant, people.toMap().value("others").toList()) {
             User user;
             QMap<QString, QVariant> person = personVariant.toMap();
             user.setUserId(person["uid"].toString());
             user.setName(person["name"].toString());
+            user.setProfileImage(AvatarImage::create(
+                    QPixmap(":/res/images/empty_avatar.png"), AvatarImage::Small));
             user.setProfileImageUrl(person["image_url"].toUrl());
+            user.setTags(person["tags"].toList());
 
-            interestingPeople.append(user);
+            others.append(user);
 
-            emit fetchImage(user.userId(), user.profileImageUrl());
+            //Remove comment when the actual server is used
+            //emit fetchImage(user.userId(), user.profileImageUrl());
         }
 
-        emit interestingPeopleReceived(interestingPeople);
+        emit interestingPeopleReceived(friends, others);
     }
 }
 
-void SituareService::parseNotificationsData(const QByteArray &jsonReply)
+void SituareService::parseMessagesData(const QByteArray &jsonReply)
+{
+    QJson::Parser parser;
+    bool ok;
+
+    QVariantMap result = parser.parse(jsonReply, &ok).toMap();
+
+    if (!ok) {
+        emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
+        return;
+    } else {
+        QVariant messages = result["messages"];
+
+        QList<Message> received;
+        QList<Message> sent;
+
+        foreach (QVariant messageVariant, messages.toMap().value("received").toList()) {
+            Message message(Message::MessageTypeReceived);
+            QMap<QString, QVariant> messageMap = messageVariant.toMap();
+            message.setId(messageMap["id"].toString());
+            message.setSenderId(messageMap["sender_id"].toString());
+            message.setReceiverId(messageMap["receiver_id"].toString());
+            message.setSenderName(messageMap["sender_name"].toString());
+            uint timestampSeconds = messageMap["timestamp"].toUInt();
+            message.setTimestamp(QDateTime::fromTime_t(timestampSeconds));
+            message.setText(messageMap["text"].toString());
+            message.setImage(AvatarImage::create(
+                    QPixmap(":/res/images/empty_avatar.png"), AvatarImage::Small));
+
+            bool latOk;
+            qreal latitude = messageMap["latitude"].toReal(&latOk);
+            bool lonOk;
+            qreal longitude = messageMap["longitude"].toReal(&lonOk);
+
+            if (latOk && lonOk) {
+                message.setAddress(messageMap["address"].toString());
+                message.setCoordinates(GeoCoordinate(latitude, longitude));
+            }
+
+            received.append(message);
+
+            //emit fetchImage(message.id(), messageMap["image_url"].toString());
+        }
+
+        foreach (QVariant messageVariant, messages.toMap().value("sent").toList()) {
+            Message message(Message::MessageTypeSent);
+            QMap<QString, QVariant> messageMap = messageVariant.toMap();
+            message.setId(messageMap["id"].toString());
+            message.setSenderId(messageMap["sender_id"].toString());
+            message.setReceiverId(messageMap["receiver_id"].toString());
+            message.setSenderName(messageMap["sender_name"].toString());
+            uint timestampSeconds = messageMap["timestamp"].toUInt();
+            message.setTimestamp(QDateTime::fromTime_t(timestampSeconds));
+            message.setText(messageMap["text"].toString());
+            message.setImage(AvatarImage::create(
+                    QPixmap(":/res/images/empty_avatar.png"), AvatarImage::Small));
+
+            bool latOk;
+            qreal latitude = messageMap["latitude"].toReal(&latOk);
+            bool lonOk;
+            qreal longitude = messageMap["longitude"].toReal(&lonOk);
+
+            if (latOk && lonOk) {
+                message.setAddress(messageMap["address"].toString());
+                message.setCoordinates(GeoCoordinate(latitude, longitude));
+            }
+
+            sent.append(message);
+
+            //emit fetchImage(message.id(), messageMap["image_url"].toString());
+        }
+
+        emit messagesReceived(received, sent);
+    }
+}
+
+void SituareService::parsePopularTagsData(const QByteArray &jsonReply)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
     QJson::Parser parser;
     bool ok;
 
-    QVariantMap result = parser.parse (jsonReply, &ok).toMap();
+    QVariantMap result = parser.parse(jsonReply, &ok).toMap();
 
     if (!ok) {
         emit error(ErrorContext::SITUARE, SituareError::INVALID_JSON);
         return;
-    }
-    else {
+    } else {
+        QHash<QString, QString> popularTags;
+
+        foreach (QVariant tagVariant, result["popular_tags"].toList()) {
+            QMap<QString, QVariant> tag = tagVariant.toMap();
+            popularTags.insert(tag["id"].toString(), tag["name"].toString());
+        }
 
+        emit interestingPeopleReceived(friends, others);
     }
 }
 
+
 void SituareService::parseUserData(const QByteArray &jsonReply)
 {
     qDebug() << __PRETTY_FUNCTION__;
@@ -421,7 +545,8 @@ void SituareService::parseUserData(const QByteArray &jsonReply)
             if(imageUrl.isEmpty()) {
                 // user doesn't have profile image, so we need to get him a silhouette image
                 m_defaultImage = true;
-                user.setProfileImage(QPixmap(":/res/images/empty_avatar_big.png"));
+                user.setProfileImage(AvatarImage::create(
+                        QPixmap(":/res/images/empty_avatar_big.png"), AvatarImage::Large));
             }
 
             QList<User> tmpFriendsList;
@@ -581,17 +706,44 @@ void SituareService::clearUserData()
     emit userDataChanged(m_user, m_friendsList);
 }
 
-QStringList SituareService::getTags(const QString &userId)
+QHash<QString, QString> SituareService::getTags(const QString &userId)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
     return m_database->getTags(userId.toInt());
 }
 
-void SituareService::updateTags(const QString &userId, const QStringList &tags)
+void SituareService::removeTags(const QStringList &tags)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (m_database->removeTags(613374451, tags))
+        emit updateWasSuccessful(SituareService::SuccessfulRemoveTags);
+}
+
+void SituareService::removeMessage(const QString &id)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    if (m_database->removeMessage(613374451, id))
+        emit updateWasSuccessful(SituareService::SuccessfulRemoveMessage);
+}
+
+void SituareService::addTags(const QStringList &tags)
 {
     qDebug() << __PRETTY_FUNCTION__;
 
     foreach (QString tag, tags)
-        m_database->addTag(userId.toInt(), tag);
+        m_database->addTag(613374451, tag);
+
+    emit updateWasSuccessful(SituareService::SuccessfulAddTags);
+}
+
+void SituareService::searchPeopleByTag(const QString &tag)
+{
+    qDebug() << __PRETTY_FUNCTION__;
+
+    QByteArray arr = m_database->getInterestingPeopleByTag(613374451, tag);
+
+    parseInterestingPeopleData(arr);
 }