From 77fc8a42f11bd6f2bfb277c762f2e189bb164cb2 Mon Sep 17 00:00:00 2001
From: Patrick Jentsch <p.jentsch@uni-bielefeld.de>
Date: Thu, 6 Apr 2023 08:42:21 +0200
Subject: [PATCH] Move the last bits of the settings package to the user
 package

---
 app/static/js/Requests/users/settings.js      | 16 ++++++++++
 app/static/js/Requests/users/users.js         | 19 ++----------
 app/templates/_scripts.html.j2                |  3 +-
 app/templates/users/settings/settings.html.j2 |  2 +-
 app/users/__init__.py                         |  2 +-
 app/users/json_routes.py                      | 29 +++++++++++++++--
 app/users/settings/json_routes.py             | 31 ++-----------------
 7 files changed, 52 insertions(+), 50 deletions(-)
 create mode 100644 app/static/js/Requests/users/settings.js

diff --git a/app/static/js/Requests/users/settings.js b/app/static/js/Requests/users/settings.js
new file mode 100644
index 00000000..0a92a09c
--- /dev/null
+++ b/app/static/js/Requests/users/settings.js
@@ -0,0 +1,16 @@
+/*****************************************************************************
+* Settings                                                                   *
+* Fetch requests for /users/<entity>/settings routes                         *
+*****************************************************************************/
+Requests.users.entity.settings = {};
+
+Requests.users.entity.settings.profilePrivacy = {};
+
+Requests.users.entity.settings.profilePrivacy.update = (userId, profilePrivacySetting, enabled) => {
+  let input = `/users/${userId}/settings/profile-privacy/${profilePrivacySetting}`;
+  let init = {
+    method: 'PUT',
+    body: JSON.stringify(enabled)
+  };
+  return Requests.JSONfetch(input, init);
+}
diff --git a/app/static/js/Requests/users/users.js b/app/static/js/Requests/users/users.js
index 9ed77cb0..053fd687 100644
--- a/app/static/js/Requests/users/users.js
+++ b/app/static/js/Requests/users/users.js
@@ -14,25 +14,12 @@ Requests.users.entity.delete = (userId) => {
   return Requests.JSONfetch(input, init);
 };
 
-Requests.users.entity.settings = {};
+Requests.users.entity.avatar = {};
 
-Requests.users.entity.settings.avatar = {};
-
-Requests.users.entity.settings.avatar.delete = (userId) => {
-  let input = `/users/${userId}/settings/avatar`;
+Requests.users.entity.avatar.delete = (userId) => {
+  let input = `/users/${userId}/avatar`;
   let init = {
     method: 'DELETE'
   };
   return Requests.JSONfetch(input, init);
 }
-
-Requests.users.entity.settings.profilePrivacy = {};
-
-Requests.users.entity.settings.profilePrivacy.update = (userId, profilePrivacySetting, enabled) => {
-  let input = `/users/${userId}/settings/profile-privacy/${profilePrivacySetting}`;
-  let init = {
-    method: 'PUT',
-    body: JSON.stringify(enabled)
-  };
-  return Requests.JSONfetch(input, init);
-}
diff --git a/app/templates/_scripts.html.j2 b/app/templates/_scripts.html.j2
index dbc26470..9dd81933 100644
--- a/app/templates/_scripts.html.j2
+++ b/app/templates/_scripts.html.j2
@@ -66,7 +66,8 @@
   'js/Requests/corpora/files.js',
   'js/Requests/corpora/followers.js',
   'js/Requests/jobs/jobs.js',
-  'js/Requests/users/users.js'
+  'js/Requests/users/users.js',
+  'js/Requests/users/settings.js'
 %}
 <script src="{{ ASSET_URL }}"></script>
 {%- endassets %}
diff --git a/app/templates/users/settings/settings.html.j2 b/app/templates/users/settings/settings.html.j2
index 91b2864d..f862840d 100644
--- a/app/templates/users/settings/settings.html.j2
+++ b/app/templates/users/settings/settings.html.j2
@@ -213,7 +213,7 @@ avatarUploadElement.addEventListener('change', () => {
 });
 
 document.querySelector('#delete-avatar').addEventListener('click', () => {
-  Requests.users.entity.settings.avatar.delete({{ user.hashid|tojson }})
+  Requests.users.entity.avatar.delete({{ user.hashid|tojson }})
     .then(
       (response) => {
         avatarPreviewElement.src = {{ url_for('static', filename='images/user_avatar.png')|tojson }};
diff --git a/app/users/__init__.py b/app/users/__init__.py
index 11a38f25..a1ed4f2e 100644
--- a/app/users/__init__.py
+++ b/app/users/__init__.py
@@ -2,5 +2,5 @@ from flask import Blueprint
 
 
 bp = Blueprint('users', __name__)
-from . import events, routes
+from . import events, json_routes, routes
 from . import settings
diff --git a/app/users/json_routes.py b/app/users/json_routes.py
index d228f8f3..571fa78c 100644
--- a/app/users/json_routes.py
+++ b/app/users/json_routes.py
@@ -3,7 +3,7 @@ from flask_login import current_user, login_required, logout_user
 from threading import Thread
 from app import db
 from app.decorators import content_negotiation
-from app.models import User
+from app.models import Avatar, User
 from . import bp
 
 
@@ -22,7 +22,7 @@ def delete_user(user_id):
         abort(403)
     thread = Thread(
         target=_delete_user,
-        args=(current_app._get_current_object(), user_id)
+        args=(current_app._get_current_object(), user.id)
     )
     if user == current_user:
         logout_user()
@@ -31,3 +31,28 @@ def delete_user(user_id):
         'message': f'User "{user.username}" marked for deletion'
     }
     return response_data, 202
+
+
+@bp.route('/<hashid:user_id>/avatar', methods=['DELETE'])
+@content_negotiation(produces='application/json')
+def delete_user_avatar(user_id):
+    def _delete_avatar(app, avatar_id):
+        with app.app_context():
+            avatar = Avatar.query.get(avatar_id)
+            avatar.delete()
+            db.session.commit()
+
+    user = User.query.get_or_404(user_id)
+    if user.avatar is None:
+        abort(404)
+    if not (user == current_user or current_user.is_administrator()):
+        abort(403)
+    thread = Thread(
+        target=_delete_avatar,
+        args=(current_app._get_current_object(), user.avatar.id)
+    )
+    thread.start()
+    response_data = {
+        'message': f'Avatar marked for deletion'
+    }
+    return response_data, 202
diff --git a/app/users/settings/json_routes.py b/app/users/settings/json_routes.py
index 7fdfa7fc..1d0c4d9e 100644
--- a/app/users/settings/json_routes.py
+++ b/app/users/settings/json_routes.py
@@ -1,38 +1,11 @@
-from flask import abort, current_app, request
+from flask import abort, request
 from flask_login import current_user, login_required
-from threading import Thread
-import os
 from app import db
 from app.decorators import content_negotiation
-from app.models import Avatar, User, ProfilePrivacySettings
+from app.models import User, ProfilePrivacySettings
 from . import bp
 
 
-@bp.route('/<hashid:user_id>/settings/avatar', methods=['DELETE'])
-@content_negotiation(produces='application/json')
-def delete_user_avatar(user_id):
-    def _delete_avatar(app, avatar_id):
-        with app.app_context():
-            avatar = Avatar.query.get(avatar_id)
-            avatar.delete()
-            db.session.commit()
-
-    user = User.query.get_or_404(user_id)
-    if user.avatar is None:
-        abort(404)
-    if not (user == current_user or current_user.is_administrator()):
-        abort(403)
-    thread = Thread(
-        target=_delete_avatar,
-        args=(current_app._get_current_object(), user.avatar.id)
-    )
-    thread.start()
-    response_data = {
-        'message': f'Avatar marked for deletion'
-    }
-    return response_data, 202
-
-
 @bp.route('/<hashid:user_id>/settings/profile-privacy/is-public', methods=['PUT'])
 @login_required
 @content_negotiation(consumes='application/json', produces='application/json')
-- 
GitLab