Browse Source

Add option to force resync clients in admin panel

Daniel García 6 years ago
parent
commit
43f9038325
3 changed files with 37 additions and 5 deletions
  1. 6 0
      src/api/admin.rs
  2. 14 0
      src/db/models/user.rs
  3. 17 5
      src/static/templates/admin/page.hbs

+ 6 - 0
src/api/admin.rs

@@ -26,6 +26,7 @@ pub fn routes() -> Vec<Route> {
         invite_user,
         delete_user,
         deauth_user,
+        update_revision_users,
         post_config,
         delete_config,
     ]
@@ -177,6 +178,11 @@ fn deauth_user(uuid: String, _token: AdminToken, conn: DbConn) -> EmptyResult {
     user.save(&conn)
 }
 
+#[post("/users/update_revision")]
+fn update_revision_users(_token: AdminToken, conn: DbConn) -> EmptyResult {
+    User::update_all_revisions(&conn)
+}
+
 #[post("/config", data = "<data>")]
 fn post_config(data: Json<ConfigBuilder>, _token: AdminToken) -> EmptyResult {
     let data: ConfigBuilder = data.into_inner();

+ 14 - 0
src/db/models/user.rs

@@ -178,6 +178,20 @@ impl User {
         }
     }
 
+    pub fn update_all_revisions(conn: &DbConn) -> EmptyResult {
+        let updated_at = Utc::now().naive_utc();
+
+        crate::util::retry(
+            || {
+                diesel::update(users::table)
+                    .set(users::updated_at.eq(updated_at))
+                    .execute(&**conn)
+            },
+            10,
+        )
+        .map_res("Error updating revision date for all users")
+    }
+
     pub fn update_revision(&mut self, conn: &DbConn) -> EmptyResult {
         self.updated_at = Utc::now().naive_utc();
 

+ 17 - 5
src/static/templates/admin/page.hbs

@@ -37,9 +37,14 @@
 
         </div>
 
-        <small class="d-block text-right mt-3">
-            <a id="reload-btn" href="">Reload users</a>
-        </small>
+        <div class="mt-3">
+            <button type="button" class="btn btn-sm btn-link" onclick="updateRevisions();" title="Force all clients to fetch
+             new data next time they connect. Useful after restoring a backup to remove any stale data.">
+                Force clients to resync
+            </button>
+
+            <button type="button" class="btn btn-sm btn-primary float-right" onclick="reload();">Reload users</button>
+        </div>
     </div>
 
     <div id="invite-form-block" class="align-items-center p-3 mb-3 text-white-50 bg-secondary rounded shadow">
@@ -58,8 +63,9 @@
         <div>
             <h6 class="text-white mb-3">Configuration</h6>
             <div class="small text-white mb-3">
-            NOTE: The settings here override the environment variables. Once saved, it's recommended to stop setting them 
-            to avoid confusion. This does not apply to the read-only section, which can only be set through the environment.
+                NOTE: The settings here override the environment variables. Once saved, it's recommended to stop setting
+                them to avoid confusion. This does not apply to the read-only section, which can only be set through the
+                environment.
             </div>
             <form class="form accordion" id="config-form">
                 {{#each config}}
@@ -213,6 +219,12 @@
             "Error deauthorizing sessions");
         return false;
     }
+    function updateRevisions() {
+        _post("/admin/users/update_revision",
+            "Success, clients will sync next time they connect",
+            "Error forcing clients to sync");
+        return false;
+    }
     function inviteUser() {
         inv = $("#email-invite");
         data = JSON.stringify({ "email": inv.val() });