Профиль пользователя в приложении Reddit
1. обзор
В этой статье мы собираемся создатьa Profile for the user of our Reddit application, чтобы позволить им настраивать пользовательские предпочтения.
Цель проста - вместо того, чтобы заставлять пользователя вводить одни и те же данные каждый раз, когда они планируют новую публикацию,they can set it once – in the preferences of their profile. Конечно, пользователь всегда может настроить эти параметры для каждого сообщения, но идея в том, что это не обязательно.
2. СущностьPreference
В целом, большинство вещей, которые теперь можно настроить в приложениях, станутglobally configurable in the user profile.
Во-первых, давайте начнем с объектаPreference:
@Entity
public class Preference {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Long id;
private String email;
private String subreddit;
private boolean sendReplies;
// for post re-submission
private int noOfAttempts;
private int timeInterval;
private int minScoreRequired;
private int minUpvoteRatio;
private boolean keepIfHasComments;
private boolean deleteAfterLastAttempt;
}
Итак, что мы можем сейчас настроить? Проще говоря -defaults for pretty much every setting in the application.
Мы также сохраняем электронную почту пользователей, чтобы они могли получать уведомления о том, что происходит с их сообщениями.
Теперь давайтеlink the preferences to the user:
@Entity
public class User {
...
@OneToOne
@JoinColumn(name = "preference_id")
private Preference preference;
}
Как видите, междуUser иPreference. существует простая однозначная связь.
3. Простая страница профиля
Во-первых, давайте создадим нашу простую страницу профиля:
Nothing fancy here - простой HTML и JavaScript.
Давайте также добавим быструю ссылку на новый профиль:
Welcome, username
4. API __
А вот контроллер для создания и редактирования пользовательских настроек:
@Controller
@RequestMapping(value = "/user/preference")
public class UserPreferenceController {
@Autowired
private PreferenceRepository preferenceReopsitory;
@RequestMapping(method = RequestMethod.GET)
@ResponseBody
public Preference getCurrentUserPreference() {
return getCurrentUser().getPreference();
}
@RequestMapping(value = "/{id}", method = RequestMethod.PUT)
@ResponseStatus(HttpStatus.OK)
public void updateUserPreference(@RequestBody Preference pref) {
preferenceReopsitory.save(pref);
getCurrentUser().setPreference(pref);
}
}
Наконец, нам нужно убедиться, что при создании пользователя его настройки также инициализируются:
public void loadAuthentication(String name, OAuth2AccessToken token) {
...
Preference pref = new Preference();
preferenceReopsitory.save(pref);
user.setPreference(pref);
userReopsitory.save(user);
...
}
5. Load/Use Preferences
А теперь давайте посмотрим, как использовать эти настройки и заполнять их всякий раз, когда они необходимы.
Мы начнем с основной страницыPost Schedule, на которой мы загрузим настройки пользователя:
$(function() {
$.get("user/preference", function (data){
$.each(data, function(key, value) {
$('*[name="'+key+'"]').val(value);
});
});
});
6. Тестирование и заключение
Мы почти закончили - нам просто нужно реализовать несколько базовых интеграционных тестов для нового объекта Profile, который мы только что представили.
По большей части мы просто собираемся расширить существующий базовый тест устойчивости и унаследовать от него набор тестов.
И наконец - мы можем завершить новую функциональность профиля пользователя - пользователи теперь могут устанавливать свои собственные предпочтения.