[gnome-software] trivial: Allow reviews to have flags added



commit 6f7d1f1760ec0d45b580cd10ede3f85a3cb65838
Author: Richard Hughes <richard hughsie com>
Date:   Wed Feb 10 16:36:09 2016 +0000

    trivial: Allow reviews to have flags added
    
    In retrospect, 'state' was a bad name for this.

 src/gs-review-row.c                     |    2 +-
 src/gs-review.c                         |   48 +++++++++------
 src/gs-review.h                         |   18 +++---
 src/gs-shell-details.c                  |   17 +-----
 src/gs-utils.c                          |    2 +-
 src/plugins/gs-plugin-dummy.c           |    8 +-
 src/plugins/gs-plugin-xdg-app-reviews.c |  106 +++++++++++++++++++------------
 7 files changed, 112 insertions(+), 89 deletions(-)
---
diff --git a/src/gs-review-row.c b/src/gs-review-row.c
index 1143f6f..0e32275 100644
--- a/src/gs-review-row.c
+++ b/src/gs-review-row.c
@@ -78,7 +78,7 @@ gs_review_row_refresh (GsReviewRow *row)
                            gs_review_get_text (priv->review));
 
        /* if we voted, we can't do any actions */
-       if (gs_review_get_state (priv->review) & GS_REVIEW_STATE_VOTED)
+       if (gs_review_get_flags (priv->review) & GS_REVIEW_FLAG_VOTED)
                priv->actions = 0;
 
        /* set actions up */
diff --git a/src/gs-review.c b/src/gs-review.c
index 14a4a50..f4d4323 100644
--- a/src/gs-review.c
+++ b/src/gs-review.c
@@ -27,7 +27,7 @@ struct _GsReview
 {
        GObject                  parent_instance;
 
-       GsReviewState            state;
+       GsReviewFlags            flags;
        gchar                   *summary;
        gchar                   *text;
        gint                     karma;
@@ -48,7 +48,7 @@ enum {
        PROP_VERSION,
        PROP_REVIEWER,
        PROP_DATE,
-       PROP_STATE,
+       PROP_FLAGS,
        PROP_LAST
 };
 
@@ -160,23 +160,33 @@ gs_review_set_rating (GsReview *review, gint rating)
 }
 
 /**
- * gs_review_get_state:
+ * gs_review_get_flags:
  */
-GsReviewState
-gs_review_get_state (GsReview *review)
+GsReviewFlags
+gs_review_get_flags (GsReview *review)
 {
        g_return_val_if_fail (GS_IS_REVIEW (review), 0);
-       return review->state;
+       return review->flags;
 }
 
 /**
- * gs_review_set_state:
+ * gs_review_set_flags:
  */
 void
-gs_review_set_state (GsReview *review, GsReviewState state)
+gs_review_set_flags (GsReview *review, GsReviewFlags flags)
 {
        g_return_if_fail (GS_IS_REVIEW (review));
-       review->state = state;
+       review->flags = flags;
+}
+
+/**
+ * gs_review_add_flags:
+ */
+void
+gs_review_add_flags (GsReview *review, GsReviewFlags flags)
+{
+       g_return_if_fail (GS_IS_REVIEW (review));
+       review->flags |= flags;
 }
 
 /**
@@ -282,8 +292,8 @@ gs_review_get_property (GObject *object, guint prop_id,
        case PROP_RATING:
                g_value_set_int (value, review->rating);
                break;
-       case PROP_STATE:
-               g_value_set_uint64 (value, review->state);
+       case PROP_FLAGS:
+               g_value_set_uint64 (value, review->flags);
                break;
        case PROP_VERSION:
                g_value_set_string (value, review->version);
@@ -319,8 +329,8 @@ gs_review_set_property (GObject *object, guint prop_id,
        case PROP_RATING:
                gs_review_set_rating (review, g_value_get_int (value));
                break;
-       case PROP_STATE:
-               gs_review_set_state (review, g_value_get_uint64 (value));
+       case PROP_FLAGS:
+               gs_review_set_flags (review, g_value_get_uint64 (value));
                break;
        case PROP_VERSION:
                gs_review_set_version (review, g_value_get_string (value));
@@ -403,14 +413,14 @@ gs_review_class_init (GsReviewClass *klass)
        g_object_class_install_property (object_class, PROP_RATING, pspec);
 
        /**
-        * GsApp:state:
+        * GsApp:flags:
         */
-       pspec = g_param_spec_uint64 ("state", NULL, NULL,
-                                    GS_REVIEW_STATE_NONE,
-                                    GS_REVIEW_STATE_LAST,
-                                    GS_REVIEW_STATE_NONE,
+       pspec = g_param_spec_uint64 ("flags", NULL, NULL,
+                                    GS_REVIEW_FLAG_NONE,
+                                    GS_REVIEW_FLAG_LAST,
+                                    GS_REVIEW_FLAG_NONE,
                                     G_PARAM_READWRITE | G_PARAM_CONSTRUCT);
-       g_object_class_install_property (object_class, PROP_STATE, pspec);
+       g_object_class_install_property (object_class, PROP_FLAGS, pspec);
 
        /**
         * GsApp:version:
diff --git a/src/gs-review.h b/src/gs-review.h
index 73662d0..2d2edd2 100644
--- a/src/gs-review.h
+++ b/src/gs-review.h
@@ -40,11 +40,11 @@ typedef enum {
 } GsReviewAction;
 
 typedef enum {
-       GS_REVIEW_STATE_NONE    = 0,
-       GS_REVIEW_STATE_SELF    = 1 << 0,       /* user wrote the review themselves */
-       GS_REVIEW_STATE_VOTED   = 1 << 1,       /* user voted on the review */
-       GS_REVIEW_STATE_LAST
-} GsReviewState;
+       GS_REVIEW_FLAG_NONE     = 0,
+       GS_REVIEW_FLAG_SELF     = 1 << 0,       /* user wrote the review themselves */
+       GS_REVIEW_FLAG_VOTED    = 1 << 1,       /* user voted on the review */
+       GS_REVIEW_FLAG_LAST
+} GsReviewFlags;
 
 GsReview       *gs_review_new                          (void);
 
@@ -80,9 +80,11 @@ GDateTime    *gs_review_get_date                     (GsReview       *review);
 void            gs_review_set_date                     (GsReview       *review,
                                                         GDateTime      *date);
 
-GsReviewState   gs_review_get_state                    (GsReview       *review);
-void            gs_review_set_state                    (GsReview       *review,
-                                                        GsReviewState   state);
+GsReviewFlags   gs_review_get_flags                    (GsReview       *review);
+void            gs_review_set_flags                    (GsReview       *review,
+                                                        GsReviewFlags   state);
+void            gs_review_add_flags                    (GsReview       *review,
+                                                        GsReviewFlags   state);
 
 const gchar    *gs_review_get_metadata_item            (GsReview       *review,
                                                         const gchar    *key);
diff --git a/src/gs-shell-details.c b/src/gs-shell-details.c
index f8e95a4..d47eb2d 100644
--- a/src/gs-shell-details.c
+++ b/src/gs-shell-details.c
@@ -1058,7 +1058,7 @@ gs_shell_details_refresh_reviews (GsShellDetails *self)
 
                g_signal_connect (row, "button-clicked",
                                  G_CALLBACK (gs_shell_details_review_button_clicked_cb), self);
-               if (gs_review_get_state (review) & GS_REVIEW_STATE_SELF) {
+               if (gs_review_get_flags (review) & GS_REVIEW_FLAG_SELF) {
                        actions = possible_actions & 1 << GS_REVIEW_ACTION_REMOVE;
                        show_review_button = FALSE;
                } else {
@@ -1416,17 +1416,6 @@ gs_shell_details_app_set_ratings_cb (GObject *source,
 }
 
 /**
- * gs_shell_details_sanitize_version:
- */
-static gchar *
-gs_shell_details_sanitize_version (const gchar *version)
-{
-       gchar *tmp = g_strdup (version);
-       g_strdelimit (tmp, "-", '\0');
-       return tmp;
-}
-
-/**
  * gs_shell_details_write_review_cb:
  **/
 static void
@@ -1444,15 +1433,13 @@ gs_shell_details_write_review_cb (GtkButton *button,
                g_autoptr(GsReview) review = NULL;
                g_autoptr(GDateTime) now = NULL;
                g_autofree gchar *text = NULL;
-               g_autofree gchar *version = NULL;
 
                review = gs_review_new ();
                gs_review_set_summary (review, gs_review_dialog_get_summary (GS_REVIEW_DIALOG (dialog)));
                text = gs_review_dialog_get_text (GS_REVIEW_DIALOG (dialog));
                gs_review_set_text (review, text);
                gs_review_set_rating (review, gs_review_dialog_get_rating (GS_REVIEW_DIALOG (dialog)));
-               version = gs_shell_details_sanitize_version (gs_app_get_version (self->app));
-               gs_review_set_version (review, version);
+               gs_review_set_version (review, gs_app_get_version (self->app));
                now = g_date_time_new_now_local ();
                gs_review_set_date (review, now);
 
diff --git a/src/gs-utils.c b/src/gs-utils.c
index 5709f9f..9b2e7e7 100644
--- a/src/gs-utils.c
+++ b/src/gs-utils.c
@@ -496,7 +496,7 @@ gs_utils_get_user_hash (GError **error)
        if (!g_file_get_contents ("/etc/machine-id", &data, NULL, error))
                return NULL;
 
-       salted = g_strdup_printf ("gnome-software[%s:%s]",
+       salted = g_strdup_printf ("XXXYYgnome-software[%s:%s]",
                                  g_get_user_name (), data);
        return g_compute_checksum_for_string (G_CHECKSUM_SHA1, salted, -1);
 }
diff --git a/src/plugins/gs-plugin-dummy.c b/src/plugins/gs-plugin-dummy.c
index 00324d8..b22a206 100644
--- a/src/plugins/gs-plugin-dummy.c
+++ b/src/plugins/gs-plugin-dummy.c
@@ -189,7 +189,7 @@ gs_plugin_refine (GsPlugin *plugin,
                        gs_review_set_text (review2, "I'm not very wordy myself.");
                        gs_review_set_version (review2, "3.16.3");
                        gs_review_set_date (review2, dt);
-                       gs_review_set_state (review2, GS_REVIEW_STATE_SELF);
+                       gs_review_set_flags (review2, GS_REVIEW_FLAG_SELF);
                        gs_app_add_review (app, review2);
                }
        }
@@ -283,7 +283,7 @@ gs_plugin_review_report (GsPlugin *plugin,
                         GError **error)
 {
        g_debug ("Reporting dummy review");
-       gs_review_set_state (review, GS_REVIEW_STATE_VOTED);
+       gs_review_add_flags (review, GS_REVIEW_FLAG_VOTED);
        return TRUE;
 }
 
@@ -298,7 +298,7 @@ gs_plugin_review_upvote (GsPlugin *plugin,
                         GError **error)
 {
        g_debug ("Upvoting dummy review");
-       gs_review_set_state (review, GS_REVIEW_STATE_VOTED);
+       gs_review_add_flags (review, GS_REVIEW_FLAG_VOTED);
        return TRUE;
 }
 
@@ -313,7 +313,7 @@ gs_plugin_review_downvote (GsPlugin *plugin,
                           GError **error)
 {
        g_debug ("Downvoting dummy review");
-       gs_review_set_state (review, GS_REVIEW_STATE_VOTED);
+       gs_review_add_flags (review, GS_REVIEW_FLAG_VOTED);
        return TRUE;
 }
 
diff --git a/src/plugins/gs-plugin-xdg-app-reviews.c b/src/plugins/gs-plugin-xdg-app-reviews.c
index 8d2ea1c..636c7f7 100644
--- a/src/plugins/gs-plugin-xdg-app-reviews.c
+++ b/src/plugins/gs-plugin-xdg-app-reviews.c
@@ -140,25 +140,29 @@ xdg_app_review_parse_review_object (JsonObject *item)
                gs_review_set_karma (rev, json_object_get_int_member (item, "karma"));
 
        /* add extra metadata for the plugin */
-       if (json_object_has_member (item, "user_id")) {
+       if (json_object_has_member (item, "user_hash")) {
                gs_review_add_metadata (rev, "user_hash",
-                                       json_object_get_string_member (item, "user_id"));
+                                       json_object_get_string_member (item, "user_hash"));
        }
-       if (json_object_has_member (item, "user_key")) {
-               gs_review_add_metadata (rev, "user_key",
-                                       json_object_get_string_member (item, "user_key"));
+       if (json_object_has_member (item, "user_skey")) {
+               gs_review_add_metadata (rev, "user_skey",
+                                       json_object_get_string_member (item, "user_skey"));
        }
-       if (json_object_has_member (item, "appid")) {
-               gs_review_add_metadata (rev, "appid",
-                                       json_object_get_string_member (item, "appid"));
+       if (json_object_has_member (item, "app_id")) {
+               gs_review_add_metadata (rev, "app_id",
+                                       json_object_get_string_member (item, "app_id"));
        }
-       if (json_object_has_member (item, "dbid")) {
-               g_autofree gchar *dbid = NULL;
-               dbid = g_strdup_printf ("%" G_GINT64_FORMAT,
-                                       json_object_get_int_member (item, "dbid"));
-               gs_review_add_metadata (rev, "dbid", dbid);
+       if (json_object_has_member (item, "review_id")) {
+               g_autofree gchar *review_id = NULL;
+               review_id = g_strdup_printf ("%" G_GINT64_FORMAT,
+                                       json_object_get_int_member (item, "review_id"));
+               gs_review_add_metadata (rev, "review_id", review_id);
        }
 
+       /* don't allow multiple votes */
+       if (json_object_has_member (item, "vote_id"))
+               gs_review_add_flags (rev, GS_REVIEW_FLAG_VOTED);
+
        return rev;
 }
 
@@ -587,9 +591,9 @@ xdg_app_review_fetch_for_app (GsPlugin *plugin, GsApp *app, GError **error)
        /* create object with review data */
        builder = json_builder_new ();
        json_builder_begin_object (builder);
-       json_builder_set_member_name (builder, "user_id");
+       json_builder_set_member_name (builder, "user_hash");
        json_builder_add_string_value (builder, plugin->priv->user_hash);
-       json_builder_set_member_name (builder, "appid");
+       json_builder_set_member_name (builder, "app_id");
        json_builder_add_string_value (builder, gs_app_get_id (app));
        json_builder_set_member_name (builder, "locale");
        json_builder_add_string_value (builder, plugin->locale);
@@ -677,14 +681,14 @@ gs_plugin_refine_reviews (GsPlugin *plugin,
                /* save this on the application object so we can use it for
                 * submitting a new review */
                if (i == 0) {
-                       gs_app_set_metadata (app, "XdgAppReviews::user_key",
-                                            gs_review_get_metadata_item (review, "user_key"));
+                       gs_app_set_metadata (app, "XdgAppReviews::user_skey",
+                                            gs_review_get_metadata_item (review, "user_skey"));
                }
 
-               /* the user_id matches, so mark this as our own review */
+               /* the user_hash matches, so mark this as our own review */
                if (g_strcmp0 (gs_review_get_metadata_item (review, "user_hash"),
                               plugin->priv->user_hash) == 0) {
-                       gs_review_set_state (review, GS_REVIEW_STATE_SELF);
+                       gs_review_set_flags (review, GS_REVIEW_FLAG_SELF);
                }
                gs_app_add_review (app, review);
        }
@@ -744,6 +748,19 @@ gs_plugin_refine (GsPlugin *plugin,
 }
 
 /**
+ * xdg_app_review_sanitize_version:
+ */
+static gchar *
+xdg_app_review_sanitize_version (const gchar *version)
+{
+       gchar *tmp = g_strdup (version);
+       if (tmp == NULL)
+               return g_strdup ("unknown");
+       g_strdelimit (tmp, "-", '\0');
+       return tmp;
+}
+
+/**
  * gs_plugin_review_submit:
  */
 gboolean
@@ -755,34 +772,37 @@ gs_plugin_review_submit (GsPlugin *plugin,
 {
        g_autofree gchar *data = NULL;
        g_autofree gchar *uri = NULL;
+       g_autofree gchar *version = NULL;
        g_autoptr(JsonBuilder) builder = NULL;
        g_autoptr(JsonGenerator) json_generator = NULL;
        g_autoptr(JsonNode) json_root = NULL;
 
        /* save as we don't re-request the review from the server */
-       gs_review_add_metadata (review, "appid", gs_app_get_id (app));
-       gs_review_add_metadata (review, "user_key",
-                               gs_app_get_metadata_item (app, "XdgAppReviews::user_key"));
+       gs_review_set_reviewer (review, g_get_real_name ());
+       gs_review_add_metadata (review, "app_id", gs_app_get_id (app));
+       gs_review_add_metadata (review, "user_skey",
+                               gs_app_get_metadata_item (app, "XdgAppReviews::user_skey"));
 
        /* create object with review data */
        builder = json_builder_new ();
        json_builder_begin_object (builder);
-       json_builder_set_member_name (builder, "user_id");
+       json_builder_set_member_name (builder, "user_hash");
        json_builder_add_string_value (builder, plugin->priv->user_hash);
-       json_builder_set_member_name (builder, "user_key");
+       json_builder_set_member_name (builder, "user_skey");
        json_builder_add_string_value (builder,
-                                      gs_review_get_metadata_item (review, "user_key"));
-       json_builder_set_member_name (builder, "appid");
+                                      gs_review_get_metadata_item (review, "user_skey"));
+       json_builder_set_member_name (builder, "app_id");
        json_builder_add_string_value (builder,
-                                      gs_review_get_metadata_item (review, "appid"));
+                                      gs_review_get_metadata_item (review, "app_id"));
        json_builder_set_member_name (builder, "locale");
        json_builder_add_string_value (builder, plugin->locale);
        json_builder_set_member_name (builder, "distro");
        json_builder_add_string_value (builder, plugin->priv->distro);
        json_builder_set_member_name (builder, "version");
-       json_builder_add_string_value (builder, gs_review_get_version (review));
+       version = xdg_app_review_sanitize_version (gs_review_get_version (review));
+       json_builder_add_string_value (builder, version);
        json_builder_set_member_name (builder, "user_display");
-       json_builder_add_string_value (builder, g_get_real_name ());
+       json_builder_add_string_value (builder, gs_review_get_reviewer (review));
        json_builder_set_member_name (builder, "summary");
        json_builder_add_string_value (builder, gs_review_get_summary (review));
        json_builder_set_member_name (builder, "description");
@@ -799,7 +819,7 @@ gs_plugin_review_submit (GsPlugin *plugin,
        data = json_generator_to_data (json_generator, NULL);
 
        /* POST */
-       uri = g_strdup_printf ("%s/add", plugin->priv->review_server);
+       uri = g_strdup_printf ("%s/submit", plugin->priv->review_server);
        return gs_plugin_xdg_app_reviews_json_post (plugin->priv->session,
                                                    uri, data, error);
 }
@@ -820,7 +840,7 @@ gs_plugin_xdg_app_reviews_invalidate_cache (GsReview *review, GError **error)
                return FALSE;
        cachefn = g_strdup_printf ("%s/%s.json",
                                   cachedir,
-                                  gs_review_get_metadata_item (review, "appid"));
+                                  gs_review_get_metadata_item (review, "app_id"));
        cachefn_file = g_file_new_for_path (cachefn);
        if (!g_file_query_exists (cachefn_file, NULL))
                return TRUE;
@@ -834,7 +854,7 @@ static gboolean
 gs_plugin_xdg_app_reviews_vote (GsPlugin *plugin, GsReview *review,
                                const gchar *uri, GError **error)
 {
-       guint64 dbid;
+       const gchar *tmp;
        g_autofree gchar *data = NULL;
        g_autoptr(JsonBuilder) builder = NULL;
        g_autoptr(JsonGenerator) json_generator = NULL;
@@ -844,17 +864,21 @@ gs_plugin_xdg_app_reviews_vote (GsPlugin *plugin, GsReview *review,
        builder = json_builder_new ();
        json_builder_begin_object (builder);
 
-       json_builder_set_member_name (builder, "user_id");
+       json_builder_set_member_name (builder, "user_hash");
        json_builder_add_string_value (builder, plugin->priv->user_hash);
-       json_builder_set_member_name (builder, "user_key");
+       json_builder_set_member_name (builder, "user_skey");
        json_builder_add_string_value (builder,
-                                      gs_review_get_metadata_item (review, "user_key"));
-       json_builder_set_member_name (builder, "appid");
+                                      gs_review_get_metadata_item (review, "user_skey"));
+       json_builder_set_member_name (builder, "app_id");
        json_builder_add_string_value (builder,
-                                      gs_review_get_metadata_item (review, "appid"));
-       json_builder_set_member_name (builder, "dbid");
-       dbid = g_ascii_strtoull (gs_review_get_metadata_item (review, "dbid"), NULL, 10);
-       json_builder_add_int_value (builder, dbid);
+                                      gs_review_get_metadata_item (review, "app_id"));
+       tmp = gs_review_get_metadata_item (review, "review_id");
+       if (tmp != NULL) {
+               guint64 review_id;
+               json_builder_set_member_name (builder, "review_id");
+               review_id = g_ascii_strtoull (tmp, NULL, 10);
+               json_builder_add_int_value (builder, review_id);
+       }
        json_builder_end_object (builder);
 
        /* export as a string */
@@ -876,7 +900,7 @@ gs_plugin_xdg_app_reviews_vote (GsPlugin *plugin, GsReview *review,
                return FALSE;
 
        /* mark as voted */
-       gs_review_set_state (review, GS_REVIEW_STATE_VOTED);
+       gs_review_add_flags (review, GS_REVIEW_FLAG_VOTED);
 
        /* success */
        return TRUE;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]