Un profil d’utilisateur dans l’application Reddit

Un profil d'utilisateur dans l'application Reddit

1. Vue d'ensemble

Dans cet article, nous allons créera Profile for the user of our Reddit application - pour leur permettre de configurer les préférences spécifiques à l'utilisateur.

L'objectif est simple - au lieu de demander à l'utilisateur de remplir les mêmes données à chaque fois qu'il planifie une nouvelle publication,they can set it once – in the preferences of their profile. Bien sûr, l'utilisateur peut toujours régler ces paramètres pour chaque publication, mais l'idée est qu'ils ne sont pas obligés de le faire.

2. L'entitéPreference

Dans l'ensemble, la plupart des éléments qui peuvent maintenant être configurés dans les applications vont devenirglobally configurable in the user profile.

Commençons par une entité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;
}

Alors, que pouvons-nous maintenant configurer? En termes simples -defaults for pretty much every setting in the application.

Nous stockons également l'e-mail de l'utilisateur pour lui permettre de recevoir des notifications sur ce qu'il advient de ses messages.

Maintenant, soyonslink the preferences to the user:

@Entity
public class User {
    ...

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

Comme vous pouvez le voir, nous avons une simple relation un-à-un entreUser etPreference.

3. Page de profil simple

Tout d'abord, créons notre page de profil simple:

...

Nothing fancy here - juste du HTML et du JavaScript simples.

Ajoutons également un lien rapide vers le nouveau profil:

Welcome, username

4. L'API __

Et voici le contrôleur, pour créer et modifier les préférences de l'utilisateur:

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

Enfin, nous devons nous assurer que, lorsque l'utilisateur est créé, ses préférences sont également inintialisées:

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

5. Load/Use Preferences

Voyons maintenant comment utiliser ces préférences et les renseigner chaque fois que cela est nécessaire.

Nous allons commencer par la page principale dePost Schedule - où nous allons charger dans les préférences de l'utilisateur:

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

6. Test et conclusion

Nous avons presque terminé. Il nous suffit de mettre en œuvre des tests d'intégration de base pour la nouvelle entité Profile que nous venons de présenter.

Pour la plupart, nous allons simplement étendre le test de persistance de base existant et en hériter une batterie de tests.

Enfin - nous pouvons conclure la nouvelle fonctionnalité de profil d’utilisateur - les utilisateurs sont désormais en mesure de définir leurs propres préférences.