Um perfil de usuário no aplicativo Reddit

Um perfil de usuário no aplicativo Reddit

1. Visão geral

Neste artigo, vamos construira Profile for the user of our Reddit application - para permitir que eles configurem as preferências específicas do usuário.

O objetivo é simples - em vez de fazer com que o usuário preencha os mesmos dados toda vez que agendar uma nova postagem,they can set it once – in the preferences of their profile. Claro que o usuário sempre pode ajustar essas configurações para cada postagem - mas a ideia é que eles não precisam.

2. A EntidadePreference

No geral, a maioria das coisas que agora podem ser configuradas nos aplicativos se tornarãoglobally configurable in the user profile.

Primeiro, vamos começar com uma entidadePreference:

@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;
}

Então, o que podemos agora configurar? Basta colocar -defaults for pretty much every setting in the application.

Também armazenamos o e-mail do usuário para permitir que ele receba notificações sobre o que está acontecendo com suas postagens.

Agora, vamoslink the preferences to the user:

@Entity
public class User {
    ...

    @OneToOne
    @JoinColumn(name = "preference_id")
    private Preference preference;
}

Como você pode ver, temos uma relação um-para-um simples entreUser ePreference.

3. Página de perfil simples

Primeiro, vamos criar nossa página de perfil simples:

...

Nothing fancy here - apenas um pouco de HTML e JavaScript simples.

Vamos também adicionar um link rápido para o novo perfil:

Welcome, username

4. A API __

E aqui o controlador, para criar e editar as preferências do usuário:

@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);
    }
}

Por fim, precisamos garantir que, quando o usuário for criado, suas preferências também sejam inicializadas:

public void loadAuthentication(String name, OAuth2AccessToken token) {
    ...
    Preference pref = new Preference();
    preferenceReopsitory.save(pref);
    user.setPreference(pref);
    userReopsitory.save(user);
    ...
}

5. Load/Use Preferences

Agora - vamos ver como usar essas preferências e preenchê-las sempre que necessário.

Começaremos com a página principalPost Schedule - onde carregaremos nas preferências do usuário:

$(function() {
    $.get("user/preference", function (data){
        $.each(data, function(key, value) {
            $('*[name="'+key+'"]').val(value);
        });
    });
});

6. Teste e Conclusão

Estamos quase terminando - só precisamos implementar alguns testes básicos de integração para a nova entidade de Perfil que acabamos de apresentar.

Na maioria das vezes, vamos simplesmente estender o teste de persistência de base existente e herdar uma bateria de testes disso.

Finalmente - podemos encerrar a nova funcionalidade de perfil de usuário - agora os usuários podem configurar suas próprias preferências.