From 2f448742ad99b4d1a54e8f48cf29cf9ad8343492 Mon Sep 17 00:00:00 2001 From: Thomas Rawyler Date: Tue, 27 Sep 2016 13:52:46 +0200 Subject: [PATCH] OO-152: manage rolle / weblogin in admin interface --- .../StammdatenAktionenService.scala | 11 +++++++++ .../stammdaten/StammdatenCommandHandler.scala | 23 +++++++++++++++++++ .../stammdaten/StammdatenInsertService.scala | 11 ++++++--- .../stammdaten/StammdatenJsonProtocol.scala | 2 +- .../stammdaten/StammdatenRoutes.scala | 18 +++++++++++++++ .../StammdatenEventStoreSerializer.scala | 4 +++- 6 files changed, 64 insertions(+), 5 deletions(-) diff --git a/src/main/scala/ch/openolitor/stammdaten/StammdatenAktionenService.scala b/src/main/scala/ch/openolitor/stammdaten/StammdatenAktionenService.scala index 0441ceffd..c7f9c1f58 100644 --- a/src/main/scala/ch/openolitor/stammdaten/StammdatenAktionenService.scala +++ b/src/main/scala/ch/openolitor/stammdaten/StammdatenAktionenService.scala @@ -93,6 +93,8 @@ class StammdatenAktionenService(override val sysConfig: SystemConfig, override v sendEinladung(meta, einladung) case PasswortResetGesendetEvent(meta, einladung) => sendPasswortReset(meta, einladung) + case RolleGewechseltEvent(meta, _, personId, rolle) => + changeRolle(meta, personId, rolle) case e => logger.warn(s"Unknown event:$e") } @@ -261,6 +263,15 @@ Summe [${projekt.waehrung}]: ${bestellung.preisTotal}""" } } + def changeRolle(meta: EventMetadata, personId: PersonId, rolle: Rolle)(implicit originator: PersonId = meta.originator) = { + DB localTx { implicit session => + stammdatenWriteRepository.getById(personMapping, personId) map { person => + val updated = person.copy(rolle = Some(rolle)) + stammdatenWriteRepository.updateEntity[Person, PersonId](updated) + } + } + } + def auslieferungAusgeliefert(meta: EventMetadata, id: AuslieferungId)(implicit personId: PersonId = meta.originator) = { DB autoCommit { implicit session => stammdatenWriteRepository.getById(depotAuslieferungMapping, id) map { auslieferung => diff --git a/src/main/scala/ch/openolitor/stammdaten/StammdatenCommandHandler.scala b/src/main/scala/ch/openolitor/stammdaten/StammdatenCommandHandler.scala index c0a27da4a..d736e1a36 100644 --- a/src/main/scala/ch/openolitor/stammdaten/StammdatenCommandHandler.scala +++ b/src/main/scala/ch/openolitor/stammdaten/StammdatenCommandHandler.scala @@ -52,6 +52,7 @@ object StammdatenCommandHandler { case class EinladungSendenCommand(originator: PersonId, kundeId: KundeId, personId: PersonId) extends UserCommand case class BestellungenAlsAbgerechnetMarkierenCommand(originator: PersonId, datum: DateTime, ids: Seq[BestellungId]) extends UserCommand case class PasswortResetCommand(originator: PersonId, personId: PersonId) extends UserCommand + case class RolleWechselnCommand(originator: PersonId, kundeId: KundeId, personId: PersonId, rolle: Rolle) extends UserCommand case class LieferplanungAbschliessenEvent(meta: EventMetadata, id: LieferplanungId) extends PersistentEvent with JSONSerializable case class LieferplanungAbrechnenEvent(meta: EventMetadata, id: LieferplanungId) extends PersistentEvent with JSONSerializable @@ -63,6 +64,7 @@ object StammdatenCommandHandler { case class AuslieferungAlsAusgeliefertMarkierenEvent(meta: EventMetadata, id: AuslieferungId) extends PersistentEvent with JSONSerializable case class BestellungAlsAbgerechnetMarkierenEvent(meta: EventMetadata, datum: DateTime, id: BestellungId) extends PersistentEvent with JSONSerializable case class PasswortResetGesendetEvent(meta: EventMetadata, einladung: EinladungCreate) extends PersistentEvent with JSONSerializable + case class RolleGewechseltEvent(meta: EventMetadata, kundeId: KundeId, personId: PersonId, rolle: Rolle) extends PersistentEvent with JSONSerializable } trait StammdatenCommandHandler extends CommandHandler with StammdatenDBMappings with ConnectionPoolContextAware { @@ -188,6 +190,9 @@ trait StammdatenCommandHandler extends CommandHandler with StammdatenDBMappings case PasswortResetCommand(originator, personId) => idFactory => meta => sendPasswortReset(idFactory, meta, personId) + case RolleWechselnCommand(originator, kundeId, personId, rolle) if originator.id != personId => idFactory => meta => + changeRolle(idFactory, meta, kundeId, personId, rolle) + /* * Insert command handling */ @@ -437,6 +442,24 @@ trait StammdatenCommandHandler extends CommandHandler with StammdatenDBMappings } } } + + def changeRolle(idFactory: IdFactory, meta: EventMetadata, kundeId: KundeId, personId: PersonId, rolle: Rolle) = { + DB readOnly { implicit session => + stammdatenWriteRepository.getById(personMapping, personId) map { person => + person.rolle map { existingRolle => + if (existingRolle != rolle) { + Success(Seq(RolleGewechseltEvent(meta, kundeId, personId, rolle))) + } else { + Failure(new InvalidStateException(s"Die Person mit der Id: $personId hat bereits die Rolle: $rolle.")) + } + } getOrElse { + Success(Seq(RolleGewechseltEvent(meta, kundeId, personId, rolle))) + } + } getOrElse { + Failure(new InvalidStateException(s"Person wurde nicht gefunden.")) + } + } + } } class DefaultStammdatenCommandHandler(override val sysConfig: SystemConfig, override val system: ActorSystem) extends StammdatenCommandHandler diff --git a/src/main/scala/ch/openolitor/stammdaten/StammdatenInsertService.scala b/src/main/scala/ch/openolitor/stammdaten/StammdatenInsertService.scala index 9834a8f76..cba08e422 100644 --- a/src/main/scala/ch/openolitor/stammdaten/StammdatenInsertService.scala +++ b/src/main/scala/ch/openolitor/stammdaten/StammdatenInsertService.scala @@ -248,18 +248,23 @@ class StammdatenInsertService(override val sysConfig: SystemConfig) extends Even } def createPerson(meta: EventMetadata, id: PersonId, create: PersonCreate)(implicit personId: PersonId = meta.originator) = { - val person = copyTo[PersonCreate, Person](create, "id" -> id, + val rolle: Option[Rolle] = Some(KundenZugang) + + val person = copyTo[PersonCreate, Person]( + create, + "id" -> id, "kundeId" -> create.kundeId, "sort" -> create.sort, "loginAktiv" -> FALSE, "letzteAnmeldung" -> None, "passwort" -> None, "passwortWechselErforderlich" -> FALSE, - "rolle" -> None, + "rolle" -> rolle, "erstelldat" -> meta.timestamp, "ersteller" -> meta.originator, "modifidat" -> meta.timestamp, - "modifikator" -> meta.originator) + "modifikator" -> meta.originator + ) DB autoCommit { implicit session => stammdatenWriteRepository.insertEntity[Person, PersonId](person) diff --git a/src/main/scala/ch/openolitor/stammdaten/StammdatenJsonProtocol.scala b/src/main/scala/ch/openolitor/stammdaten/StammdatenJsonProtocol.scala index cf86e69cc..fa20715a3 100644 --- a/src/main/scala/ch/openolitor/stammdaten/StammdatenJsonProtocol.scala +++ b/src/main/scala/ch/openolitor/stammdaten/StammdatenJsonProtocol.scala @@ -79,7 +79,7 @@ trait StammdatenJsonProtocol extends BaseJsonProtocol with LazyLogging with Auto } } - implicit val rolleFormat = new JsonFormat[Rolle] { + implicit val rolleFormat = new RootJsonFormat[Rolle] { def write(obj: Rolle): JsValue = obj match { case AdministratorZugang => JsString("Administrator") diff --git a/src/main/scala/ch/openolitor/stammdaten/StammdatenRoutes.scala b/src/main/scala/ch/openolitor/stammdaten/StammdatenRoutes.scala index 4ff089807..2fe0da811 100644 --- a/src/main/scala/ch/openolitor/stammdaten/StammdatenRoutes.scala +++ b/src/main/scala/ch/openolitor/stammdaten/StammdatenRoutes.scala @@ -201,6 +201,15 @@ trait StammdatenRoutes extends HttpService with ActorReferences path("kunden" / kundeIdPath / "personen" / personIdPath / "aktionen" / "einladungsenden") { (kundeId, personId) => (post)(sendEinladung(kundeId, personId)) } ~ + path("kunden" / kundeIdPath / "personen" / personIdPath / "aktionen" / "rollewechseln") { (kundeId, personId) => + post { + requestInstance { request => + entity(as[Rolle]) { rolle => + changeRolle(kundeId, personId, rolle) + } + } + } + } ~ path("kunden" / kundeIdPath / "rechnungen") { (kundeId) => get(list(buchhaltungReadRepository.getKundenRechnungen(kundeId))) } @@ -642,6 +651,15 @@ trait StammdatenRoutes extends HttpService with ActorReferences } } + def changeRolle(kundeId: KundeId, personId: PersonId, rolle: Rolle)(implicit idPersister: Persister[KundeId, _], subject: Subject) = { + onSuccess((entityStore ? StammdatenCommandHandler.RolleWechselnCommand(subject.personId, kundeId, personId, rolle))) { + case UserCommandFailed => + complete(StatusCodes.BadRequest, s"Die Rolle der Person konnte nicht gewechselt werden.") + case _ => + complete("") + } + } + def vorlagenRoute(implicit subject: Subject) = path("vorlagetypen") { get { diff --git a/src/main/scala/ch/openolitor/stammdaten/eventsourcing/StammdatenEventStoreSerializer.scala b/src/main/scala/ch/openolitor/stammdaten/eventsourcing/StammdatenEventStoreSerializer.scala index 03c2b330c..d8c455eed 100644 --- a/src/main/scala/ch/openolitor/stammdaten/eventsourcing/StammdatenEventStoreSerializer.scala +++ b/src/main/scala/ch/openolitor/stammdaten/eventsourcing/StammdatenEventStoreSerializer.scala @@ -140,6 +140,7 @@ trait StammdatenEventStoreSerializer extends StammdatenJsonProtocol with EntityS implicit val einladungCreatePersister = persister[EinladungCreate]("einladung-create") implicit val einladungGesendetEventPersister = persister[EinladungGesendetEvent]("einladung-gesendet") implicit val passwortResetGesendetEventPersister = persister[PasswortResetGesendetEvent]("passwort-reset-gesendet") + implicit val rolleGewechseltEventPersister = persister[RolleGewechseltEvent]("rolle-gewechselt-gesendet") val stammdatenPersisters = List( depotModifyPersister, @@ -222,6 +223,7 @@ trait StammdatenEventStoreSerializer extends StammdatenJsonProtocol with EntityS auslieferungAlsAusgeliefertMarkierenEventPersister, bestellungAlsAbgerechnetMarkierenEventPersister, einladungGesendetEventPersister, - passwortResetGesendetEventPersister + passwortResetGesendetEventPersister, + rolleGewechseltEventPersister ) } \ No newline at end of file