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.