Skip to content

Commit

Permalink
Merge pull request #97 from innFactory/feature/innfactory-utils
Browse files Browse the repository at this point in the history
Feature/innfactory utils
  • Loading branch information
jona7o authored Nov 10, 2020
2 parents 9c76e24 + 5b3a17a commit 577a387
Show file tree
Hide file tree
Showing 72 changed files with 515 additions and 536 deletions.
1 change: 1 addition & 0 deletions .bsp/sbt.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"name":"sbt","version":"1.4.0","bspVersion":"2.0.0-M5","languages":["scala"],"argv":["/Applications/IntelliJ IDEA.app/Contents/jbr/Contents/Home/bin/java","-Xms100m","-Xmx100m","-classpath","/Users/patrickstadler/Library/Application Support/JetBrains/IntelliJIdea2020.2/plugins/Scala/launcher/sbt-launch.jar","xsbt.boot.Boot","-bsp"]}
15 changes: 15 additions & 0 deletions .deployment/runtest.sh
Original file line number Diff line number Diff line change
@@ -1,7 +1,22 @@
#!/bin/bash

RED='\033[0;31m'
ORANGE='\033[0;33m'
GREEN='\033[0;32m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

REMOVE=$GITHUB_TOKEN

if [ "$REMOVE" == "" ]; then
printf "${RED}NO GITHUB TOKEN SET! ${NC} \n" && exit 1
fi


docker run -d -p 5432:5432 -e POSTGRES_PASSWORD=test -e POSTGRES_DB=test -e POSTGRES_USER=test --name bootstrapPlay2PGTest mdillon/postgis:latest



(
for i in `seq 1 10`;
do
Expand Down
9 changes: 5 additions & 4 deletions .github/workflows/test.yml
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
name: Run Tests
on:
push:
branches: [ master, v2 ]
branches: [ master ]
pull_request:
branches: [ master, v2 ]
branches: [ master ]
jobs:
test:
runs-on: ubuntu-latest
Expand Down Expand Up @@ -33,10 +33,10 @@ jobs:
with:
path: ~/.sbt
key: ${{ runner.os }}-sbt-${{ hashFiles('**/build.sbt') }}
- name: Set up JDK 11.0.6
- name: Set up JDK 11.0.9
uses: actions/setup-java@v1
with:
java-version: 11.0.6
java-version: 11.0.9
- name: Set up Environment
shell: bash
run: |
Expand All @@ -49,5 +49,6 @@ jobs:
bash <(curl -s https://codecov.io/bash)
env:
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
GITHUB_TOKEN: ${{ secrets.PUBLIC_GITHUB_TOKEN }}


12 changes: 9 additions & 3 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -8,15 +8,16 @@
[mergify-status]: https://img.shields.io/endpoint.svg?url=https://gh.mergify.io/badges/innFactory/bootstrap-play2&style=flat


###### Scala, Akka, Play2, Slick, Flyway, Insomnia
###### Scala, Akka, Play2, Slick, Flyway, Insomnia, Sangria, GraphQL, Firebase

Bootstrap a rest service with Play2, isolated Slick and isolated Flyway
Bootstrap a REST and/or GraphQL(Sangria) service with Play2, isolated Slick and isolated Flyway

This project is built with:
- Play Framework 2.8.X
- Slick 3.3.X
- Flyway-sbt & Flyway-Core 6.5.X
- Flyway-sbt & Flyway-Core 7.1.X
- Akka 2.6.X
- Sangria 2.0 for GraphQL
- Scala 2.13.X

A PostgreSQL Database with activated postgis extensions is needed (for geolocation queries)
Expand Down Expand Up @@ -48,6 +49,11 @@ This project is built with:

## Getting Started

#### IMPORTANT:

To load innFactory-scala-utils a Github-Personal-Access-Token with package:read has to be exported as GITHUB_TOKEN.
This is necessary to load the packages from Github-Package-Registry.

#### See [Quickstart Dev Guide](./doc/QuickstartDevGuide.md)

#### Insomnia:
Expand Down
51 changes: 14 additions & 37 deletions app/Module.scala
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,15 @@ import java.util.Properties

import javax.inject.{ Inject, Provider, Singleton }
import com.typesafe.config.Config
import firebaseAuth.{ FirebaseJWTValidator, JwtValidator, MockJWTValidator }
import play.api.inject.ApplicationLifecycle
import play.api.{ Configuration, Environment, Logger, Mode }
import slick.jdbc.JdbcBackend.Database
import com.google.inject.AbstractModule
import db.{ CompaniesDAO, LocationsDAO, SlickCompaniesSlickDAO, SlickLocationsDAO }
import org.flywaydb.core.internal.jdbc.DriverDataSource
import de.innfactory.auth.firebase.FirebaseBase
import de.innfactory.auth.firebase.validator.{ JWTValidatorMock, JwtValidator, JwtValidatorImpl }
import de.innfactory.bootstrapplay2.db.{ CompaniesDAO, LocationsDAO }
import de.innfactory.play.flyway.FlywayMigrator
import play.api.libs.concurrent.AkkaGuiceSupport
import play.api.mvc.AnyContent
import repositories.{ CompaniesRepository, CompaniesRepositoryImpl, LocationRepository, LocationRepositoryImpl }

import scala.concurrent.Future

/**
Expand All @@ -29,12 +27,8 @@ class Module(environment: Environment, configuration: Configuration) extends Abs
bind(classOf[Database]).toProvider(classOf[DatabaseProvider])
bind(classOf[firebaseCreationService]).asEagerSingleton()
bind(classOf[firebaseDeletionService]).asEagerSingleton()
bind(classOf[FlywayMigrator]).asEagerSingleton()
bind(classOf[LocationsDAO]).to(classOf[SlickLocationsDAO])
bind(classOf[LocationRepository]).to(classOf[LocationRepositoryImpl])
bind(classOf[CompaniesRepository]).to(classOf[CompaniesRepositoryImpl])
bind(classOf[FlywayMigratorImpl]).asEagerSingleton()
bind(classOf[LocationsDAOCloseHook]).asEagerSingleton()
bind(classOf[CompaniesDAO]).to(classOf[SlickCompaniesSlickDAO])
bind(classOf[CompaniesDAOCloseHook]).asEagerSingleton()

/**
Expand All @@ -43,49 +37,32 @@ class Module(environment: Environment, configuration: Configuration) extends Abs
if (environment.mode == Mode.Test) {
logger.info(s"- - - Binding Services for for Test Mode - - -")
bind(classOf[JwtValidator])
.to(classOf[MockJWTValidator]) // Bind Mock JWT Validator for Test Mode
.to(classOf[JWTValidatorMock]) // Bind Mock JWT Validator for Test Mode
} else {
logger.info(s"- - - Binding Services for for Prod/Dev Mode - - -")
bind(classOf[JwtValidator])
.to(classOf[FirebaseJWTValidator]) // Bind Prod JWT Validator for Prod/Dev Mode
.to(classOf[JwtValidatorImpl]) // Bind Prod JWT Validator for Prod/Dev Mode
}

}

}

/** Migrate Flyway on application start */
class FlywayMigrator @Inject() (env: Environment, configuration: Configuration) {
private val logger = Logger("application")
logger.info("Creating Flyway context")
private val driver = configuration.get[String]("bootstrap-play2.database.driver")
private val url = configuration.get[String]("bootstrap-play2.database.url")
private val user = configuration.get[String]("bootstrap-play2.database.user")
private val password =
configuration.get[String]("bootstrap-play2.database.password")

import org.flywaydb.core.Flyway

val flyway: Flyway = Flyway.configure
.dataSource(new DriverDataSource(env.classLoader, driver, url, user, password, new Properties()))
.schemas("postgis")
.baselineOnMigrate(true)
.locations("filesystem:conf/db/migration")
.load
logger.info("Flyway is migrating the database to the newest version")
flyway.migrate()
logger.info("Database migration complete")
}
class FlywayMigratorImpl @Inject() (env: Environment, configuration: Configuration)
extends FlywayMigrator(configuration, env, configIdentifier = "bootstrap-play2")

/** Creates FirebaseApp on Application creation */
class firebaseCreationService @Inject() (config: Config) {
FirebaseJWTValidator.instanciateFirebase(config.getString("firebase.file"), "")
class firebaseCreationService @Inject() (config: Config, env: Environment) {
if (env.mode == Mode.Prod || env.mode == Mode.Dev) {
FirebaseBase.instantiateFirebase(config.getString("firebase.file"))
}
}

/** Deletes FirebaseApp safely. Important on dev restart. */
class firebaseDeletionService @Inject() (lifecycle: ApplicationLifecycle) {
lifecycle.addStopHook { () =>
Future.successful(FirebaseJWTValidator.deleteFirebase())
Future.successful(FirebaseBase.deleteFirebase())
}
}

Expand Down
18 changes: 0 additions & 18 deletions app/common/GeoPointFactory/GeoPointFactory.scala

This file was deleted.

Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package actions
package de.innfactory.bootstrapplay2.actions

import com.google.inject.Inject
import common.authorization.FirebaseEmailExtractor
import db.CompaniesDAO
import models.api.Company
import de.innfactory.bootstrapplay2.common.authorization.FirebaseEmailExtractor
import de.innfactory.bootstrapplay2.db.CompaniesDAO
import de.innfactory.bootstrapplay2.models.api.Company
import play.api.mvc.{ ActionBuilder, ActionTransformer, AnyContent, BodyParsers, Request, WrappedRequest }

import scala.concurrent.{ ExecutionContext, Future }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
package actions
package de.innfactory.bootstrapplay2.actions

import com.google.inject.Inject
import com.nimbusds.jwt.proc.BadJWTException
import de.innfactory.auth.firebase.validator.{ JwtToken, JwtValidator }
import play.api.Environment
import play.api.mvc.Results.Forbidden
import play.api.mvc.Results.Unauthorized

import scala.concurrent.{ ExecutionContext, Future }
import play.api.mvc._
import firebaseAuth.{ JwtToken, JwtValidator }

class JwtValidationAction @Inject() (parser: BodyParsers.Default, jwtValidator: JwtValidator, environment: Environment)(
implicit ec: ExecutionContext
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package actorsystem.actors
package de.innfactory.bootstrapplay2.actorsystem.actors

import akka.actor.typed.scaladsl.{ ActorContext, Behaviors, StashBuffer }
import akka.actor.typed.Behavior
import play.api.Logger
import actorsystem.actors.commands.{
import de.innfactory.bootstrapplay2.actorsystem.actors.commands.{
Command,
QueryError,
QueryHelloWorld,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package actorsystem.actors.commands
package de.innfactory.bootstrapplay2.actorsystem.actors.commands

import akka.actor.typed.ActorRef

Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package actorsystem.controllers
import actorsystem.actors.commands.{ ResponseQueryHelloWorld, ResponseQueryHelloWorldError }
import actorsystem.services.HelloWorldService
package de.innfactory.bootstrapplay2.actorsystem.controllers
import de.innfactory.bootstrapplay2.actorsystem.actors.commands.{
ResponseQueryHelloWorld,
ResponseQueryHelloWorldError
}
import de.innfactory.bootstrapplay2.actorsystem.services.HelloWorldService
import javax.inject.{ Inject, Singleton }
import play.api.mvc._

Expand Down
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package actorsystem.services
package de.innfactory.bootstrapplay2.actorsystem.services

import actorsystem.actors.HelloWorldActor
import actorsystem.actors.commands.{ Command, QueryHelloWorld, Response }
import de.innfactory.bootstrapplay2.actorsystem.actors.HelloWorldActor
import de.innfactory.bootstrapplay2.actorsystem.actors.commands.{ Command, QueryHelloWorld, Response }
import akka.actor._
import akka.actor.typed.scaladsl.AskPattern._
import akka.util.Timeout
Expand Down
Original file line number Diff line number Diff line change
@@ -1,10 +1,10 @@
package common.authorization
import actions.RequestWithCompany
package de.innfactory.bootstrapplay2.common.authorization
import de.innfactory.bootstrapplay2.actions.RequestWithCompany
import com.google.inject.Inject
import common.results.Results.{ ErrorStatus, Result }
import common.results.errors.Errors.{ BadRequest, Forbidden }
import common.utils.{ CompanyIdEqualsId, OptionAndCompanyId }
import models.api.Company
import de.innfactory.bootstrapplay2.common.results.Results.{ ErrorStatus, Result }
import de.innfactory.bootstrapplay2.common.results.errors.Errors.{ BadRequest, Forbidden }
import de.innfactory.bootstrapplay2.common.utils.{ CompanyIdEqualsId, OptionAndCompanyId }
import de.innfactory.bootstrapplay2.models.api.Company
import play.api.mvc.BodyParsers
import play.api.Configuration

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
package common.authorization
package de.innfactory.bootstrapplay2.common.authorization

import java.util.Base64

import com.google.inject.Inject
import firebaseAuth.JwtToken
import de.innfactory.auth.firebase.validator.JwtToken
import play.api.{ Configuration, Environment, Logger }

import scala.concurrent.{ ExecutionContext, Future }
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
package common.authorization
package de.innfactory.bootstrapplay2.common.authorization

import java.util.UUID

import actions.RequestWithCompany
import de.innfactory.bootstrapplay2.actions.RequestWithCompany
import com.google.inject.Inject
import common.results.Results.Result
import common.results.errors.Errors.Forbidden
import models.api.{ Company, Location }
import de.innfactory.bootstrapplay2.common.results.Results.Result
import de.innfactory.bootstrapplay2.common.results.errors.Errors.Forbidden
import de.innfactory.bootstrapplay2.models.api.{ Company, Location }
import play.api.mvc.{ BodyParsers, Request }
import play.api.Configuration
import common.utils.{
import de.innfactory.bootstrapplay2.common.utils.{
CompanyAndLocation,
CompanyCompanyIdAndOldCompanyId,
CompanyIdEqualsId,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,24 +1,23 @@
package common.daos
package de.innfactory.bootstrapplay2.common.daos

import java.util.UUID

import common.utils.OptionUtils._
import de.innfactory.bootstrapplay2.common.utils.OptionUtils._
import cats.data.EitherT
import cats.implicits._
import com.vividsolutions.jts.geom.Geometry
import common.GeoPointFactory.GeoPointFactory
import common.results.Results.{ ErrorStatus, Result }
import common.results.errors.Errors.{ BadRequest, DatabaseError, NotFound }
import db.codegen.XPostgresProfile
import de.innfactory.common.geo.GeoPointFactory
import de.innfactory.play.db.codegen.XPostgresProfile
import de.innfactory.bootstrapplay2.common.results.Results.{ ErrorStatus, Result }
import de.innfactory.bootstrapplay2.common.results.errors.Errors.{ BadRequest, DatabaseError, NotFound }
import javax.inject.{ Inject, Singleton }
import slick.jdbc.JdbcBackend.Database
import play.api.libs.json.Json
import models.api.{ ApiBaseModel, Location => LocationObject }
import dbdata.Tables
import de.innfactory.bootstrapplay2.models.api.{ ApiBaseModel, Location => LocationObject }
import org.joda.time.DateTime
import slick.basic.BasicStreamingAction
import slick.lifted.{ CompiledFunction, Query, Rep, TableQuery }

import dbdata.Tables
import scala.reflect.runtime.{ universe => ru }
import ru._
import scala.concurrent.{ ExecutionContext, Future }
Expand Down Expand Up @@ -47,6 +46,15 @@ class BaseSlickDAO(db: Database)(implicit ec: ExecutionContext) extends Tables {
}
}

def lookupSequenceGenericRawSequence[R, T](
querySeq: DBIOAction[Seq[R], NoStream, Nothing]
)(implicit rowToObject: R => T): Future[Seq[T]] = {
val queryResult: Future[Seq[R]] = db.run(querySeq)
queryResult.map { res: Seq[R] =>
res.map(rowToObject)
}
}

def lookupSequenceGeneric[R, T](
querySeq: DBIOAction[Seq[R], NoStream, Nothing]
)(implicit rowToObject: R => T): Future[Result[Seq[T]]] = {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
package common.errorHandling
package de.innfactory.bootstrapplay2.common.errorHandling

import play.api.http.HttpErrorHandler
import play.api.mvc._
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
package common.results
import common.results.errors.Errors._
import models.api.ApiBaseModel
package de.innfactory.bootstrapplay2.common.results
import de.innfactory.bootstrapplay2.common.results.errors.Errors._
import de.innfactory.bootstrapplay2.models.api.ApiBaseModel
import play.api.Logger
import play.api.libs.json.{ JsValue, Json }
import play.api.mvc.{ Results => MvcResults }
Expand Down
Loading

0 comments on commit 577a387

Please sign in to comment.