Yesod - Web development mit Haskell und Shakespear
Go to file
2017-06-29 14:08:38 +02:00
ERModel.pdf first commit 2017-06-28 08:56:59 +02:00
LICENSE first commit 2017-06-28 08:56:59 +02:00
MyTypes.hs first commit 2017-06-28 08:56:59 +02:00
README.md Update README.md 2017-06-29 14:08:38 +02:00

Übungszettel 9

Pushen Sie nach der Bearbeitung jeder Aufgabe Ihre Ergebnisse.

Issue 1

a) Führen Sie in Ihrem Übungsverzeichnis die folgenden Befehle aus.

Yesod-Grundgerüst initialisieren:

  • $ stack new NAMEIHRESWEBPROJEKTS --bare yesod-sqlite

Kompilieren mit yesod:

  • $ stack build yesod-bin

Starten des Servers:

  • $ stack exec -- yesod devel

Öffnen Sie einen Browser mit der Domain http://localhost:3000/. Wenn alles geklappt hat, sollten Sie hier bereits die Möglichkeit haben, sich mit einem Dummy-Account einzuloggen und eine Profilseite zu öffnen.

b) In config/models werden alle Entitäten definiert, die Ihre Datenbank kennen soll. Diese soll nun im Hinblick auf Issue 2-4 angepasst werden. Die dafür nötigen Entitäten sind in einem Entity-relationship model festgehalten, welches Sie in der Datei ERModel.pdf finden.

  • Verschieben Sie das mitgegebene Modul MyTypes.hs in den src/-Ordner und importieren Sie es in der Model.hs

  • Pflegen Sie die Entitäten aus ERModel.pdf sinnvoll in config/models ein.

Hinweise:

  • Ganz ähnlich wie Sie es von der record syntax her kennen, hat hier jede Entität beliebig viele Felder, für die Sie Name und Typ festlegen müssen.

  • Für textuelle Felder, nutzen Sie den Typ Text. Falls ein Feld auch leer sein darf, fügen Sie ein Maybe hinzu.

  • Für jede Entität werden automatisch Id-Typen definiert (z.B. UserId für die Entität User), die Sie benutzen können, um bestimmte Kardinalitäten zu erzwingen.

  • Wenn Sie selber definierte Typen verwenden wollen, um die Ausprägungen eines Entity-Feldes festzulegen, definieren Sie diese in der mitgegebenen Datei MyTypes.hs.

Issue 2

Neues Feature: Timeline für alle Nutzer. Auf der Seite All Users werden alle jemals eingelogten Nutzer angezeigt. Mit einem Klick auf einen Nutzernamen wird man auf die zugehörige Timeline weitergeleitet. Auf der Timeline muss erst einmal nichts weiter stehen außer der Titel: "USERNAME's Timeline".

  • config/routes: Erstellen Sie die folgenden Routen.
/timeline/#UserId UserTimelineR GET
/userList UserListR GET
  • Foundation.hs:

    • Ergänzen Sie die Funktionen, in denen auf Routen-Konstruktoren pattern-gematcht wird.
    • Die Routen UserListR und UserTimelineR sollen nur für autorisierte (d.h. eingeloggte) Nutzer sichtbar sein.
    • Sorgen Sie dafür, dass UserListR über den Menüpunkt "All Users" erreichbar ist (siehe MenuItem in defaultLayout).
  • src/Handler/: Legen Sie die Handler-Module UserTimeline.hs und UserList.hs an.

  • cabal: Fügen Sie die Handler als exposed-module hinzu.

  • src/Application.hs: Importieren Sie die neuen Handler

  • src/Handler/UserList.hs/src/Handler/UserTimeline.hs:

    • Erstellen Sie für jede http-Methode, für die Sie die neue Route definiert haben, eine entsprechende Handler-Funktion in dem neuen Handler-Modul.
    • Bennenen Sie ihre Handler-Funktionen gemäß dem Schema: http-Methode + Routenkonstruktor.
    • Inhaltlich können Sie sich stark an der Vorlesung orientieren! Schauen Sie sich auch die vorgegeben Handler-Module an.
    • Man kann hamlet-Code etc. auch in template-Files auslagern. Sehen Sie sich hierzu beispielsweise src/Handler/Profile.hs und das eingebundene Template templates/profile.hamlet an.

Issue 3

Neues Feature: Posten auf der eigenen Timeline. Jeder Nutzer soll nun auf seiner eigenen Timeline-Seite Nachrichten mit anderen teilen können. Legen Sie hierfür in config/routes die neue Route an: ´´´ /timeline TimelineR GET POST ´´´ Gehen Sie weiterhin vor wie für Issue 2. Die Route TimelineR soll für autorisierte Nutzer über einen extra Menüpunkt "Your Timeline" erreichbar sein. Um Nachrichten eingeben und abspeichern zu können, benötigen Sie ein Formular. Auch hier können Sie sich wieder stark an der Vorlesung orientieren.

Issue 4: Never gonna give U up, never gonna let ya down Friendship :D

Die Seite All Users soll nun auch erlauben, Freundschaftsanfragen abzuschicken, abzulehnen. Auf dieser soll man einem Nutzer eine Freundschaftsanfrage stellen können. Es soll erkenntlich sein, mit wem man bereits befreundet ist. Man soll nur die Timelines befreundeter Nutzer besuchen können.