Ein Benutzerprofil in der Reddit-App

Ein Benutzerprofil in der Reddit App

1. Überblick

In diesem Artikel werden wira Profile for the user of our Reddit application erstellen, damit sie benutzerspezifische Einstellungen konfigurieren können.

Das Ziel ist einfach: Anstatt dass der Benutzer jedes Mal, wenn er einen neuen Beitrag plant, dieselben Daten ausfüllt,they can set it once – in the preferences of their profile. Natürlich kann der Benutzer diese Einstellungen jederzeit für jeden Beitrag anpassen - aber die Idee ist, dass dies nicht erforderlich ist.

2. DiePreference-Entität

Insgesamt werden die meisten Dinge, die jetzt in den Anwendungen konfiguriert werden können, zuglobally configurable in the user profile.

Beginnen wir zunächst mit der EntitätPreference:

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

Was können wir nun konfigurieren? Einfach ausgedrückt -defaults for pretty much every setting in the application.

Wir speichern auch die E-Mail-Adresse des Benutzers, damit er Benachrichtigungen darüber erhalten kann, was mit seinen Posts passiert.

Lassen Sie uns nunlink the preferences to the user:

@Entity
public class User {
    ...

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

Wie Sie sehen können, haben wir eine einfache Eins-zu-Eins-Beziehung zwischenUser undPreference.

3. Einfache Profilseite

Erstellen wir zunächst unsere einfache Profilseite:

...

Nothing fancy here - nur einfaches HTML und JavaScript.

Fügen wir dem neuen Profil auch einen Schnelllink hinzu:

Welcome, username

4. Die API __

Und hier der Controller zum Erstellen und Bearbeiten von Benutzereinstellungen:

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

Schließlich müssen wir sicherstellen, dass beim Erstellen des Benutzers auch dessen Einstellungen initialisiert werden:

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

5. Load/Use Preferences

Lassen Sie uns nun sehen, wie Sie diese Einstellungen verwenden und sie bei Bedarf ausfüllen.

Wir beginnen mit der Hauptseite vonPost Schedule, auf der wir die Einstellungen des Benutzers laden:

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

6. Testen und Fazit

Wir sind fast fertig - wir müssen nur einige grundlegende Integrationstests für die neue Profilentität implementieren, die wir gerade eingeführt haben.

Zum größten Teil werden wir einfach den bestehenden Basis-Persistenztest erweitern und eine Reihe von Tests daraus erben.

Schließlich - wir können die neue Benutzerprofilfunktionalität abschließen - können Benutzer nun ihre eigenen Einstellungen vornehmen.