Skip to content

HTTPS clone URL

Subversion checkout URL

You can clone with HTTPS or Subversion.

Download ZIP

Comparing changes

Choose two branches to see what's changed or to start a new pull request. If you need to, you can also compare across forks.

Open a pull request

Create a new pull request by comparing changes across two branches. If you need to, you can also compare across forks.
base fork: KyleRogers/wedding-app
base: 7718a80ca2
...
head fork: KyleRogers/wedding-app
compare: 04c21ffe07
Checking mergeability… Don't worry, you can still create the pull request.
  • 2 commits
  • 15 files changed
  • 0 commit comments
  • 1 contributor
View
37 app/controllers/FotoVorfuehrer.scala
@@ -2,31 +2,42 @@ 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 com.google.inject._
/**
*
* @author Stefan Penndorf <stefan@cyphoria.net>
*/
-object FotoVorfuehrer extends Controller with AuthenticationElement with WeddingAuthConfig {
+@Singleton
+class FotoVorfuehrer @Inject()(
+ gästeliste: Gästeliste,
+ fotoImporter: FotoImporter
+ ) extends Controller with AuthenticationElement with WeddingAuthConfig {
def fotoalben = StackAction{ implicit request =>
- Ok(views.html.fotoalben())
+ Ok(views.html.fotoalben(List[(Benutzer, Int)]()))
}
def hochladen = StackAction(parse.multipartFormData){ implicit request =>
+ val currentUser = loggedIn
request.body.file("bilddatei").map { picture =>
-// import java.io.File
- val filename = picture.filename
- picture.ref
-// val contentType = picture.contentType
-// picture.ref.moveTo(new File("/tmp/picture"))
- Redirect(routes.FotoVorfuehrer.fotoalben()).flashing(
- "erfolgsMeldung" -> "Bild erfolgreich zu deinem Album hinzugefügt."
- )
+ val tempfile = File.createTempFile("pic", "png")
+ try {
+ picture.ref.moveTo(tempfile, replace = true)
+ fotoImporter.importiere(tempfile, currentUser)
+ } finally {
+ tempfile.delete()
+ }
+
+ Redirect(routes.FotoVorfuehrer.fotoalben()).flashing(
+ "erfolgsMeldung" -> "Bild erfolgreich zu deinem Album hinzugefügt."
+ )
}.getOrElse {
- Redirect(routes.FotoVorfuehrer.fotoalben()).flashing(
- "fehlerMeldung" -> "Keine Datei ausgewählt."
- )
+ Redirect(routes.FotoVorfuehrer.fotoalben()).flashing(
+ "fehlerMeldung" -> "Keine Datei ausgewählt."
+ )
}
}
View
20 app/model/Benutzer.scala
@@ -53,27 +53,11 @@ case class Benutzer(
}
object Benutzer {
- def speichereFoto(benutzer: Benutzer, foto: Array[Byte]) {
- DB.withConnection { implicit connection =>
- SQL(
- """
- insert into fotoalben
- (besitzer, foto) values
- ({besitzerid}, {foto})
- """
- ).on(
- 'besitzerid -> benutzer.id,
- 'foto -> foto
- ).executeUpdate()
- }
- }
def authentifiziere(email: String, passwort: String): Option[Benutzer] = {
(new PersistenteGästeliste).findeGastMitEMail(email).filter {
- benutzer => benutzer match {
- case Benutzer(_,_,_, Some(benutzerPasswort),_) => BCrypt.checkpw(passwort, benutzer.passwort.get)
- case _ => false
- }
+ case benutzer@Benutzer(_, _, _, Some(benutzerPasswort), _) => BCrypt.checkpw(passwort, benutzer.passwort.get)
+ case _ => false
}
}
View
34 app/model/Foto.scala
@@ -0,0 +1,34 @@
+package model
+
+import anorm._
+import play.api.db.DB
+import play.api.Play.current
+
+/**
+ *
+ * @author Stefan Penndorf <stefan@cyphoria.net>
+ */
+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
22 app/model/FotoImporter.scala
@@ -0,0 +1,22 @@
+package model
+
+import com.google.inject._
+import java.io.File
+
+/**
+ *
+ * @author Stefan Penndorf <stefan@cyphoria.net>
+ */
+trait FotoImporter {
+
+ def importiere(bild: File, besitzer: Benutzer)
+
+}
+
+@Singleton
+class FotoImporterImpl extends FotoImporter {
+ def importiere(bild: File, besitzer: Benutzer) {
+
+ Foto.speichereFoto(new Array[Byte](2), besitzer)
+ }
+}
View
16 app/model/Fotoalbum.scala
@@ -1,16 +0,0 @@
-package model
-
-import anorm.{NotAssigned, Pk}
-
-/**
- *
- * @author Stefan Penndorf <stefan@cyphoria.net>
- */
-case class Fotoalbum(id: Pk[Long] = NotAssigned) {
-
-}
-
-
-object Fotoalben {
-
-}
View
2  app/model/Gaesteliste.scala
@@ -94,7 +94,7 @@ class PersistenteGästeliste extends Gästeliste {
SQL(
"""
SELECT u.* FROM users u
- WHERE EXISTS (SELECT * FROM fotoalben f WHERE f.besitzer = u.id)
+ 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
@@ -14,5 +14,6 @@ class ProductionModule extends ScalaModule {
bind[Gästeliste].to[PersistenteGästeliste]
bind[Hochzeitsplaner].to[HochzeitsplanerImpl]
bind[NewsletterSender].to[MailNewsletterSender]
+ bind[FotoImporter].to[FotoImporterImpl]
}
}
View
8 app/views/fotoalben.scala.html
@@ -1,4 +1,4 @@
-@()(implicit flash: Flash)
+@(gästeMitFotoalbum: List[(model.Benutzer, Int)])(implicit flash: Flash)
@import helper._
@import helper.twitterBootstrap._
@@ -42,10 +42,10 @@
Folgende Benutzer haben bereits ein Fotoalbum angelegt:
<ul id="fotoalben">
- <!--<li><a href="mara">Mara (5 Bilder)</a></li>-->
+ @for(gastMitFotos<-gästeMitFotoalbum) {
+ <li><a href="/mara">@gastMitFotos._1.name.vorname (@gastMitFotos._2 Bilder)</a></li>
+ }
</ul>
-
-
</div>
</div>
View
4 conf/evolutions/default/4.sql
@@ -1,7 +1,7 @@
# Neue Tabelle Fotoalben für die Fotos
# --- !Ups
-CREATE TABLE fotoalben (
+CREATE TABLE fotos (
id bigint(20) NOT NULL AUTO_INCREMENT,
besitzer bigint(20) NOT NULL,
foto LONGBLOB NOT NULL,
@@ -11,4 +11,4 @@ CREATE TABLE fotoalben (
# --- !Downs
-DROP TABLE fotoalben
+DROP TABLE fotos
View
4 conf/routes
@@ -20,8 +20,8 @@ GET /impressum controllers.Application.impressum
# VIP Area
GET /viparea controllers.VipArea.viparea
-GET /fotoalben controllers.FotoVorfuehrer.fotoalben
-POST /fotoalben controllers.FotoVorfuehrer.hochladen
+GET /fotoalben @controllers.FotoVorfuehrer.fotoalben
+POST /fotoalben @controllers.FotoVorfuehrer.hochladen
# ADMIN Area
GET /gaesteliste @controllers.AdminArea.gaesteliste
View
19 test/net/cyphoria/weddingapp/functional/FotoVorfuehrerControllerTest.scala
@@ -5,13 +5,8 @@ import org.scalamock.specs2.MockFactory
import controllers.WeddingAuthConfig
import play.api.test.Helpers._
import play.api.test.FakeRequest
-import model.{BenutzerName, Benutzer}
-import anorm.Id
import jp.t2v.lab.play2.auth.test.Helpers._
-import org.apache.http.entity.mime.MultipartEntity
-import java.io.File
-import org.apache.http.entity.mime.content.{FileBody, StringBody}
-import java.nio.charset.Charset
+import net.cyphoria.weddingapp.model._
/**
@@ -21,9 +16,7 @@ import java.nio.charset.Charset
class FotoVorfuehrerControllerTest extends Specification with MockFactory {
object config extends WeddingAuthConfig
-
- val einGast = Benutzer(Id(1L), BenutzerName("Kerstin", "Albert"), "kerstin@cyphoria.net", Some("$2a$10$k5TmtHnitQvFCNAp8SbuFeq1VlhlcSGkXl6JAcwZFX20mRZKgEgm."))
-
+ val einGast = KERSTIN
"FotoVorfuehrer" should {
@@ -35,14 +28,6 @@ class FotoVorfuehrerControllerTest extends Specification with MockFactory {
contentAsString(result) must contain("""<input type="file"""")
}
- def makeMultiPart(fileName: String, contentType: String) = {
- val entity = new MultipartEntity()
- val fileSaved = new File(fileName)
- entity.addPart("message", new StringBody("spreadsheet", Charset.forName("UTF-8")))
- entity.addPart("upload", new FileBody(fileSaved, contentType))
- entity
- }
-
}
}
View
29 test/net/cyphoria/weddingapp/model/FotoImporterImplTest.scala
@@ -0,0 +1,29 @@
+package net.cyphoria.weddingapp.model
+
+import org.specs2.mutable.Specification
+import org.scalamock.specs2.MockFactory
+import model.{PersistenteGästeliste, FotoImporterImpl}
+import java.io.File
+
+/**
+ *
+ * @author Stefan Penndorf <stefan@cyphoria.net>
+ */
+class FotoImporterImplTest extends Specification with MockFactory {
+
+ val einGast = KERSTIN
+
+ "FotoImporter" should {
+ "ein neues Album anlegen, 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()
+
+ importer.importiere(tempfile, einGast)
+ gästeliste.gästeMitFotoalbum must contain(einGast)
+ }
+
+ }
+
+
+}
View
6 test/net/cyphoria/weddingapp/model/GastModelTest.scala
@@ -2,7 +2,6 @@ package net.cyphoria.weddingapp.model
import org.specs2.mutable.Specification
import model._
-import anorm.Id
/**
*
@@ -10,7 +9,8 @@ import anorm.Id
*/
class GastModelTest extends Specification {
- val einGast = Benutzer(Id(1L), BenutzerName("Kerstin", "Albert"), "kerstin@cyphoria.net", Some("$2a$10$k5TmtHnitQvFCNAp8SbuFeq1VlhlcSGkXl6JAcwZFX20mRZKgEgm."))
+// val einGast = Benutzer(Id(1L), BenutzerName("Kerstin", "Albert"), "kerstin@cyphoria.net", Some("$2a$10$k5TmtHnitQvFCNAp8SbuFeq1VlhlcSGkXl6JAcwZFX20mRZKgEgm."))
+ val einGast = KERSTIN
val gästeliste = new PersistenteGästeliste
"Ein Gast" should {
@@ -56,7 +56,7 @@ class GastModelTest extends Specification {
"ein Album haben wenn er ein Foto gespeichert hat" in DatenbankMit("einemGast") {
val file = new Array[Byte](5)
- Benutzer.speichereFoto(einGast, file)
+ Foto.speichereFoto(file, einGast)
gästeliste.gästeMitFotoalbum must contain(einGast)
}
View
2  test/net/cyphoria/weddingapp/model/package.scala
@@ -11,7 +11,7 @@ import anorm.Id
package object model {
// TODO Refactor tests so dass Konstanten aus model benutzt werden.
- val KERSTIN = new Benutzer(Id(1L), BenutzerName("Kerstin", "Albert"), "kerstin@cyphoria.net")
+ val KERSTIN = new Benutzer(Id(1L), BenutzerName("Kerstin", "Albert"), "kerstin@cyphoria.net", Some("$2a$10$k5TmtHnitQvFCNAp8SbuFeq1VlhlcSGkXl6JAcwZFX20mRZKgEgm."))
def mitDatenbank[T](block: => T) = laufenderAnwendung(block)
View
40 test/net/cyphoria/weddingapp/templates/FotoalbenTemplateTest.scala
@@ -0,0 +1,40 @@
+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 play.api.mvc.Flash
+
+/**
+ *
+ * @author Stefan Penndorf <stefan@cyphoria.net>
+ */
+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)
+ ))(Flash())
+ }
+
+ "Die Fotoalbenübersicht" should {
+ "alle Gäste mit Fotoalbum anzeigen" in {
+ fotoalben.body must contain("Teresa")
+ fotoalben.body must contain("Stephanie")
+ fotoalben.body must contain("Kerstin")
+ }
+
+ "anzeigen wie viele Fotos ein Gast in sein Album hochgeladen hat" in {
+ fotoalben.body must contain("Teresa (5 Bilder)")
+ }
+
+
+ }
+
+}

No commit comments for this range

Something went wrong with that request. Please try again.