aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar Vitaly Takmazov2023-04-17 16:01:28 +0300
committerGravatar Vitaly Takmazov2023-04-17 16:01:28 +0300
commit106c53cce6725591337773d412c0fb74eaf81ed8 (patch)
treefe07a0136c63787d6e5f53349af16541faebaf89 /src
parentcf3a5d8c979b114fceef43b35541b941bcbd62a1 (diff)
Add/remove from whitelist on web
Diffstat (limited to 'src')
-rw-r--r--src/main/assets/scripts.js25
-rw-r--r--src/main/java/com/juick/service/PrivacyQueriesService.java2
-rw-r--r--src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java16
-rw-r--r--src/main/java/com/juick/www/api/Users.java21
-rw-r--r--src/main/java/com/juick/www/controllers/Site.java1
-rw-r--r--src/main/resources/templates/views/partial/usercolumn.html15
6 files changed, 73 insertions, 7 deletions
diff --git a/src/main/assets/scripts.js b/src/main/assets/scripts.js
index 6c5e987b..4422fdb3 100644
--- a/src/main/assets/scripts.js
+++ b/src/main/assets/scripts.js
@@ -492,6 +492,23 @@ function setPrivacy(e, mid) {
.catch(console.err);
return false;
}
+function toggleWL(e, name) {
+ fetch('/api/users/wl?name=' + name
+ + '&hash=' + document.getElementById('body').getAttribute('data-hash'), {
+ credentials: 'same-origin',
+ method: 'POST'
+ })
+ .then(handleErrors)
+ .then(function(response) {
+ if (response.ok) {
+ window.location.reload();
+ } else {
+ alert('Something went wrong :(');
+ }
+ })
+ .catch(console.err);
+ return false;
+}
function getTags() {
fetch('/api/tags?hash=' + document.getElementById('body').getAttribute('data-hash'), {
@@ -714,6 +731,14 @@ ready(() => {
e.preventDefault();
});
});
+ Array.from(document.querySelectorAll('.a-vip')).forEach(function(e) {
+ e.addEventListener('click', function(e) {
+ toggleWL(
+ e.target,
+ e.target.closest('[data-name]').getAttribute('data-name'));
+ e.preventDefault();
+ });
+ });
Array.from(document.querySelectorAll('.ir a[data-fname], .msg-media a[data-fname]')).forEach(function(el) {
el.addEventListener('click', function(e) {
let fname = /** @type {HTMLElement} */ (e.target).closest('[data-fname]').getAttribute('data-fname');
diff --git a/src/main/java/com/juick/service/PrivacyQueriesService.java b/src/main/java/com/juick/service/PrivacyQueriesService.java
index 68c157f6..f1b9915d 100644
--- a/src/main/java/com/juick/service/PrivacyQueriesService.java
+++ b/src/main/java/com/juick/service/PrivacyQueriesService.java
@@ -35,4 +35,6 @@ public interface PrivacyQueriesService {
@CacheEvict(value = { "discussions", "messages", "replies" }, allEntries = true)
PrivacyResult blacklistTag(User user, Tag tag);
+
+ PrivacyResult whiteListUser(User user, User target);
}
diff --git a/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java b/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java
index 437c9f8c..d954df09 100644
--- a/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java
+++ b/src/main/java/com/juick/service/PrivacyQueriesServiceImpl.java
@@ -60,4 +60,20 @@ public class PrivacyQueriesServiceImpl extends BaseJdbcService implements Privac
return PrivacyResult.Added;
}
+
+ @Override
+ public PrivacyResult whiteListUser(User user, User target) {
+ int result = getJdbcTemplate().update(
+ "DELETE FROM wl_users WHERE user_id = ? AND wl_user_id = ?",
+ user.getUid(), target.getUid());
+
+ if (result > 0)
+ return PrivacyResult.Removed;
+
+ getJdbcTemplate().update(
+ "INSERT INTO wl_users(user_id, wl_user_id) VALUES (?, ?)",
+ user.getUid(), target.getUid());
+
+ return PrivacyResult.Added;
+ }
}
diff --git a/src/main/java/com/juick/www/api/Users.java b/src/main/java/com/juick/www/api/Users.java
index afca7ee3..19075fe5 100644
--- a/src/main/java/com/juick/www/api/Users.java
+++ b/src/main/java/com/juick/www/api/Users.java
@@ -28,12 +28,7 @@ import javax.inject.Inject;
import com.juick.model.AnonymousUser;
import com.juick.model.ApplicationStatus;
import com.juick.model.User;
-import com.juick.service.EmailService;
-import com.juick.service.MessagesService;
-import com.juick.service.StorageService;
-import com.juick.service.TagService;
-import com.juick.service.TelegramService;
-import com.juick.service.UserService;
+import com.juick.service.*;
import com.juick.service.activities.UpdateUserEvent;
import com.juick.service.component.MailVerificationEvent;
import com.juick.util.HttpBadRequestException;
@@ -59,6 +54,8 @@ public class Users {
@Inject
private UserService userService;
@Inject
+ private PrivacyQueriesService privacyQueriesService;
+ @Inject
private MessagesService messagesService;
@Inject
private TelegramService telegramService;
@@ -222,6 +219,18 @@ public class Users {
throw new HttpNotFoundException();
}
+ @PostMapping("/api/users/wl")
+ public void toggleWL(@Parameter(hidden = true) User visitor, @RequestParam String name) {
+ if (!visitor.isAnonymous()) {
+ User user = userService.getUserByName(name);
+ if (!user.isAnonymous()) {
+ privacyQueriesService.whiteListUser(visitor, user);
+ }
+ } else {
+ throw new HttpBadRequestException();
+ }
+ }
+
@GetMapping("/api/info/{uname}")
public User getUserInfo(@Parameter(hidden = true) User visitor, @PathVariable String uname) {
User user = userService.getUserByName(uname);
diff --git a/src/main/java/com/juick/www/controllers/Site.java b/src/main/java/com/juick/www/controllers/Site.java
index 9773c098..834a2a25 100644
--- a/src/main/java/com/juick/www/controllers/Site.java
+++ b/src/main/java/com/juick/www/controllers/Site.java
@@ -83,6 +83,7 @@ public class Site {
model.addAttribute("user", user);
model.addAttribute("isSubscribed", userService.isSubscribed(visitor.getUid(), user.getUid()));
model.addAttribute("isInBL", userService.isInBL(visitor.getUid(), user.getUid()));
+ model.addAttribute("isInWL", userService.isInWL(visitor.getUid(), user.getUid()));
model.addAttribute("isInBLAny", userService.isInBLAny(user.getUid(), visitor.getUid()));
model.addAttribute("statsIRead", userService.getUserFriends(user.getUid()).size());
model.addAttribute("statsMyReaders", userService.getUserReaders(user.getUid()).size());
diff --git a/src/main/resources/templates/views/partial/usercolumn.html b/src/main/resources/templates/views/partial/usercolumn.html
index ee9ab267..aec72c58 100644
--- a/src/main/resources/templates/views/partial/usercolumn.html
+++ b/src/main/resources/templates/views/partial/usercolumn.html
@@ -19,7 +19,7 @@
{% if isInBL %}
<a href="/post?body=BL+%40{{ user.name }}" title="Разблокировать">
<i data-icon="ei-close-o" data-size="s"></i>
- <span class="dekstop">Unblock</span>
+ <span class="desktop">Unblock</span>
</a>
{% else %}
<a href="/post?body=BL+%40{{ user.name }}" title="Заблокировать">
@@ -27,6 +27,19 @@
<span class="desktop">Block</span>
</a>
{% endif %}
+ {% if visitor.premium or beans.userServiceImpl.isAdminUser(visitor) %}
+ {% if isInWL %}
+ <a href="/api/users/wl?nick={{ user.name }}" data-name={{ user.name }} class="a-vip">
+ <i data-icon="ei-unlock" data-size="s"></i>
+ <span class="desktop">Remove from VIP</span>
+ </a>
+ {% else %}
+ <a href="/api/users/wl?nick={{ user.name }}" data-name={{ user.name }} class="a-vip">
+ <i data-icon="ei-lock" data-size="s"></i>
+ <span class="desktop">Add to VIP</span>
+ </a>
+ {% endif %}
+ {% endif %}
{% if not isInBLAny %}
<a href="/pm/sent?uname={{ user.name }}" title="Написать приватное сообщение">
<i data-icon="ei-envelope" data-size="s"></i>