Профиль пользователя в приложении Reddit

Профиль пользователя в приложении 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, который мы только что представили.

По большей части мы просто собираемся расширить существующий базовый тест устойчивости и унаследовать от него набор тестов.

И наконец - мы можем завершить новую функциональность профиля пользователя - пользователи теперь могут устанавливать свои собственные предпочтения.