Skip to content
Browse files

Konzept Fotoalbum ausgebaut und konsolidiert, Fotoalben-relevantes au…

…s Gästeliste entfernt
  • Loading branch information...
1 parent b94f7f7 commit ee69e3bd6c7870e37372d2b05651bae3515b0f8d @KyleRogers committed Oct 8, 2013
View
7 app/controllers/FotoVorfuehrer.scala
@@ -3,7 +3,7 @@ package controllers
import play.api.mvc.Controller
import jp.t2v.lab.play2.auth.AuthenticationElement
import java.io.File
-import model.{FotoImporter, Gästeliste, Benutzer}
+import model.{FotoalbenVerwalter, FotoImporter, Gästeliste}
import com.google.inject._
/**
@@ -13,11 +13,12 @@ import com.google.inject._
@Singleton
class FotoVorfuehrer @Inject()(
steliste: Gästeliste,
- fotoImporter: FotoImporter
+ fotoImporter: FotoImporter,
+ verwalter: FotoalbenVerwalter
) extends Controller with AuthenticationElement with WeddingAuthConfig {
def fotoalben = StackAction{ implicit request =>
- Ok(views.html.fotoalben(List[(Benutzer, Int)]()))
+ Ok(views.html.fotoalben(verwalter.alleFotoalben()))
}
def hochladen = StackAction(parse.multipartFormData){ implicit request =>
View
18 app/model/Foto.scala
@@ -1,8 +1,6 @@
package model
import anorm._
-import play.api.db.DB
-import play.api.Play.current
/**
*
@@ -15,20 +13,4 @@ case class Foto(id: Pk[Long] = NotAssigned) {
object Foto {
- def speichereFoto(foto: Array[Byte], besitzer: Benutzer) {
- DB.withConnection { implicit connection =>
- SQL(
- """
- insert into fotos
- (besitzer, foto) values
- ({besitzerid}, {foto})
- """
- ).on(
- 'besitzerid -> besitzer.id,
- 'foto -> foto
- ).executeUpdate()
- }
- }
-
-
}
View
7 app/model/FotoImporter.scala
@@ -14,9 +14,12 @@ trait FotoImporter {
}
@Singleton
-class FotoImporterImpl extends FotoImporter {
+class FotoImporterImpl @Inject()(
+ verwalter: FotoalbenVerwalter
+) extends FotoImporter {
def importiere(bild: File, besitzer: Benutzer) {
+ val fotoalbum = verwalter.findeFotoalbumVon(besitzer).getOrElse(Fotoalbum(besitzer, 0))
- Foto.speichereFoto(new Array[Byte](2), besitzer)
+ verwalter.speichereFoto(new Array[Byte](2), fotoalbum)
}
}
View
36 app/model/Fotoalbum.scala
@@ -18,7 +18,13 @@ case class Fotoalbum(
}
// TODO CLEAN UP ALL OTHER STUFF USING GÄSTELISTE TO USE FOTOALBUM
-object Fotoalbum {
+trait FotoalbenVerwalter {
+ def alleFotoalben(): List[Fotoalbum]
+ def findeFotoalbumVon(besitzer: Benutzer): Option[Fotoalbum]
+ def speichereFoto(foto: Array[Byte], fotoalbum: Fotoalbum)
+}
+
+class PersistenterFotoalbenVerwalter extends FotoalbenVerwalter {
def alleFotoalben(): List[Fotoalbum] = {
DB.withConnection { implicit connection =>
@@ -34,4 +40,32 @@ object Fotoalbum {
}
}
+ def speichereFoto(foto: Array[Byte], fotoalbum: Fotoalbum) {
+ DB.withConnection { implicit connection =>
+ SQL(
+ """
+ insert into fotos
+ (besitzer, foto) values
+ ({besitzerid}, {foto})
+ """
+ ).on(
+ 'besitzerid -> fotoalbum.besitzer.id,
+ 'foto -> foto
+ ).executeUpdate()
+ }
+ }
+
+ def findeFotoalbumVon(besitzer: Benutzer): Option[Fotoalbum] = {
+ DB.withConnection { implicit connection =>
+ SQL(
+ """
+ SELECT COUNT(u.id) as anzahlFotos, u.* FROM fotos f
+ LEFT JOIN users u ON f.besitzer = u.id
+ GROUP BY u.id
+ """
+ ).as((Benutzer.simple ~ long("anzahlFotos")).singleOpt) map {
+ case `besitzer`~anzahlFotos => Fotoalbum(besitzer, anzahlFotos)
+ }
+ }
+ }
}
View
12 app/model/Gaesteliste.scala
@@ -12,7 +12,6 @@ trait Gästeliste {
def gäste: List[Benutzer]
def vip: List[Benutzer]
def admins: List[Benutzer]
- def gästeMitFotoalbum: Set[Benutzer]
def findeGastMitName(name: BenutzerName): Option[Benutzer]
def findeGastMitId(id: Long): Option[Benutzer]
def findeGastMitEMail(email: EMail): Option[Benutzer]
@@ -89,15 +88,4 @@ class PersistenteGästeliste extends Gästeliste {
}
}
- def gästeMitFotoalbum: Set[Benutzer] = {
- DB.withConnection { implicit connection =>
- SQL(
- """
- SELECT u.* FROM users u
- WHERE EXISTS (SELECT * FROM fotos f WHERE f.besitzer = u.id)
- GROUP BY u.id
- """
- ).as(Benutzer.simple *).to[Set]
- }
- }
}
View
1 app/modules/Modules.scala
@@ -15,5 +15,6 @@ class ProductionModule extends ScalaModule {
bind[Hochzeitsplaner].to[HochzeitsplanerImpl]
bind[NewsletterSender].to[MailNewsletterSender]
bind[FotoImporter].to[FotoImporterImpl]
+ bind[FotoalbenVerwalter].to[PersistenterFotoalbenVerwalter]
}
}
View
6 app/views/fotoalben.scala.html
@@ -1,4 +1,4 @@
-@(gästeMitFotoalbum: List[(model.Benutzer, Int)])(implicit flash: Flash)
+@(fotoalben: List[model.Fotoalbum])(implicit flash: Flash)
@import helper._
@import helper.twitterBootstrap._
@@ -42,8 +42,8 @@
Folgende Benutzer haben bereits ein Fotoalbum angelegt:
<ul id="fotoalben">
- @for(gastMitFotos<-gästeMitFotoalbum) {
- <li><a href="/mara">@gastMitFotos._1.name.vorname (@gastMitFotos._2 Bilder)</a></li>
+ @for(fotoalbum<-fotoalben) {
+ <li><a href="/mara">@fotoalbum.besitzer.name.vorname (@fotoalbum.anzahlFotos Bilder)</a></li>
}
</ul>
</div>
View
16 test/net/cyphoria/weddingapp/model/FotoImporterImplTest.scala
@@ -2,8 +2,7 @@ package net.cyphoria.weddingapp.model
import org.specs2.mutable.Specification
import org.scalamock.specs2.MockFactory
-import model.{PersistenteGästeliste, FotoImporterImpl}
-import java.io.File
+import model.{Fotoalbum, FotoalbenVerwalter, PersistenteGästeliste, FotoImporterImpl}
/**
*
@@ -14,13 +13,16 @@ class FotoImporterImplTest extends Specification with MockFactory {
val einGast = KERSTIN
"FotoImporter" should {
- "ein neues Album anlegen, wenn ein Foto hochgeladen wird" in DatenbankMit("einemGast") {
+ val fotoalbum: Fotoalbum = Fotoalbum(einGast, 0)
+
+ "ein neues Foto zum Album des Benutzers hinzufügen, wenn ein Foto hochgeladen wird" in DatenbankMit("einemGast") {
val gästeliste = new PersistenteGästeliste()
- val tempfile = new File("/tmp/doesnotexist")
- val importer: FotoImporterImpl = new FotoImporterImpl()
+ val verwalter = mock[FotoalbenVerwalter]
+ val importer: FotoImporterImpl = new FotoImporterImpl(verwalter)
+ (verwalter.findeFotoalbumVon _).expects(einGast).returns(Option(fotoalbum)).anyNumberOfTimes()
+ (verwalter.speichereFoto _).expects(*, fotoalbum)
- importer.importiere(tempfile, einGast)
- gästeliste.gästeMitFotoalbum must contain(einGast)
+ importer.importiere(null, einGast)
}
}
View
26 test/net/cyphoria/weddingapp/model/FotoalbumTest.scala
@@ -1,26 +1,40 @@
package net.cyphoria.weddingapp.model
import org.specs2.mutable.Specification
-import model.Fotoalbum
+import model.{Fotoalbum, PersistenterFotoalbenVerwalter}
/**
*
* @author Stefan Penndorf <stefan@cyphoria.net>
*/
class FotoalbumTest extends Specification {
- "Fotoalbum" should {
+ val verwalter = new PersistenterFotoalbenVerwalter()
+
+ "PersistenterFotoalbenVerwalter" should {
"kein Fotoalbum finden, wenn noch kein Foto hochgeladen wurde" in DatenbankMit("einemGast") {
- Fotoalbum.alleFotoalben() must beEmpty
+ verwalter.alleFotoalben() must beEmpty
+ }
+
+ "Kerstins Fotoalbum nicht finden, wenn noch kein Foto hochgeladen wurde" in DatenbankMit("einemGast") {
+ verwalter.findeFotoalbumVon(KERSTIN) must beNone
}
- "Kerstins Fotoalbum finden, wenn Sie ein Foto hochgeladen hat" in DatenbankMit("einemGastMitEinemFoto") {
- Fotoalbum.alleFotoalben().map(_.besitzer) must contain(KERSTIN)
+
+ "findet alle Fotoalben von Benutzern, die ein Foto hochgeladen haben" in DatenbankMit("einemGastMitEinemFoto") {
+ verwalter.alleFotoalben().map(_.besitzer) must contain(KERSTIN)
}
+ "Kerstins Fotoalbum finden, wenn Sie ein Foto hochgeladen hat" in DatenbankMit("einemGast") {
+ verwalter.speichereFoto(new Array[Byte](3), Fotoalbum(KERSTIN, 0))
+ verwalter.findeFotoalbumVon(KERSTIN) must beSome(Fotoalbum(KERSTIN, 1))
+ }
+
+
"Kerstins Fotoalbum mit drei Fotos finden, wenn Sie drei Fotos hochgeladen hat" in DatenbankMit("einemGastMitDreiFotos") {
- Fotoalbum.alleFotoalben() must contain(Fotoalbum(KERSTIN, 3))
+ verwalter.findeFotoalbumVon(KERSTIN) must beSome(Fotoalbum(KERSTIN, 3))
+ verwalter.alleFotoalben() must contain(Fotoalbum(KERSTIN, 3))
}
View
12 test/net/cyphoria/weddingapp/model/GastModelTest.scala
@@ -49,18 +49,6 @@ class GastModelTest extends Specification {
"sich nicht authentifizieren können, wenn das Passwort falsch ist" in DatenbankMit("einemGast") {
Benutzer.authentifiziere(einGast.email, passwort = "falsch") must beNone
}
-
- "initial kein Album haben" in DatenbankMit("einemGast") {
- gästeliste.gästeMitFotoalbum must beEmpty
- }
-
- "ein Album haben wenn er ein Foto gespeichert hat" in DatenbankMit("einemGast") {
- val file = new Array[Byte](5)
- Foto.speichereFoto(file, einGast)
-
- gästeliste.gästeMitFotoalbum must contain(einGast)
- }
-
}
View
11 test/net/cyphoria/weddingapp/templates/FotoalbenTemplateTest.scala
@@ -3,8 +3,7 @@ package net.cyphoria.weddingapp.templates
import org.specs2.mutable.Specification
import play.api.test.Helpers._
import play.api.test.FakeApplication
-import model.{BenutzerName, Benutzer}
-import anorm.Id
+import model.Fotoalbum
import play.api.mvc.Flash
/**
@@ -13,13 +12,11 @@ import play.api.mvc.Flash
*/
class FotoalbenTemplateTest extends Specification {
- val IGNORED = None
-
val fotoalben = running(FakeApplication(additionalConfiguration = inMemoryDatabase())) {
views.html.fotoalben(List(
- (Benutzer(id=Id(1), name = BenutzerName("Teresa", "Merfert"), email = "teresa@cyphoria.net", passwort = IGNORED), 5),
- (Benutzer(id=Id(2), name = BenutzerName("Stephanie", "Geiler"), email = "steffi@cyphoria.net", passwort = IGNORED), 3),
- (Benutzer(id=Id(3), name = BenutzerName("Kerstin", "Albert"), email = "kerstin@cyphoria.net", passwort = IGNORED), 0)
+ Fotoalbum(TERESA, 5),
+ Fotoalbum(STEPHANIE, 3),
+ Fotoalbum(KERSTIN, 0)
))(Flash())
}
View
10 test/net/cyphoria/weddingapp/templates/GaestelisteTemplateTest.scala
@@ -3,23 +3,19 @@ package net.cyphoria.weddingapp.templates
import play.api.test.Helpers._
import play.api.test.FakeApplication
import org.specs2.mutable.Specification
-import model.{Benutzer, BenutzerName}
import play.api.mvc.Flash
-import anorm.Id
/**
*
* @author Stefan Penndorf <stefan@cyphoria.net>
*/
class GaestelisteTemplateTest extends Specification {
- val IGNORED = None
-
val gaesteliste = running(FakeApplication(additionalConfiguration = inMemoryDatabase())) {
views.html.gaesteliste(List(
- Benutzer(id=Id(1), name = BenutzerName("Teresa", "Merfert"), email = "teresa@cyphoria.net", passwort = IGNORED),
- Benutzer(id=Id(2), name = BenutzerName("Stephanie", "Geiler"), email = "steffi@cyphoria.net", passwort = IGNORED),
- Benutzer(id=Id(3), name = BenutzerName("Kerstin", "Albert"), email = "kerstin@cyphoria.net", passwort = IGNORED)
+ TERESA,
+ STEPHANIE,
+ KERSTIN
))(Flash())
}
View
18 test/net/cyphoria/weddingapp/templates/package.scala
@@ -0,0 +1,18 @@
+package net.cyphoria.weddingapp
+
+import _root_.model.{BenutzerName, Benutzer}
+import anorm.Id
+
+/**
+ *
+ * @author Stefan Penndorf <stefan@cyphoria.net>
+ */
+package object templates {
+
+ val IGNORED = None
+
+ val TERESA = Benutzer(id=Id(1), name = BenutzerName("Teresa", "Merfert"), email = "teresa@cyphoria.net", passwort = IGNORED)
+ val STEPHANIE = Benutzer(id=Id(2), name = BenutzerName("Stephanie", "Geiler"), email = "steffi@cyphoria.net", passwort = IGNORED)
+ val KERSTIN = Benutzer(id=Id(3), name = BenutzerName("Kerstin", "Albert"), email = "kerstin@cyphoria.net", passwort = IGNORED)
+
+}

0 comments on commit ee69e3b

Please sign in to comment.
Something went wrong with that request. Please try again.