Skip to content

Commit 1143026

Browse files
authored
Implement admin web (wiringbits#5)
* Implement admin web * Add readme and rename packages to spra * Minor changes * Missing change
1 parent c8b3ec9 commit 1143026

File tree

90 files changed

+344
-167
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+344
-167
lines changed

Diff for: README.md

+27
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,29 @@
11
# scala-postgres-react-admin
22
SPRA exposes your Postgres database through a nice React-Admin UI
3+
4+
## How to run
5+
- Add an AbstractModule that provides a DataExplorerSettings to your PlayFramework application, for example:
6+
```scala
7+
class DataExplorerModule extends AbstractModule {
8+
9+
@Provides()
10+
def dataExplorerSettings: DataExplorerSettings = DataExplorerSettings(settings)
11+
12+
val settings = List(
13+
TableSettings(
14+
tableName = "users",
15+
primaryKeyField = "user_id",
16+
hiddenColumns = List("password", "email"),
17+
nonEditableColumns = List("user_id", "email", "created_at", "verified_on", "name"),
18+
canBeDeleted = false,
19+
filterableColumns = List("name", "last_name")
20+
)
21+
)
22+
}
23+
```
24+
- Add the `AppRouter` routes to your `routes` file:
25+
```scala
26+
-> / net.wiringbits.spra.admin.AppRouter
27+
```
28+
- Run the PlayFramework application
29+
- Run `sbt spra-dev` to start the SPRA web

Diff for: build.sbt

+78-2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
1+
import java.nio.file.Files
2+
import java.nio.file.StandardCopyOption.REPLACE_EXISTING
3+
14
ThisBuild / versionScheme := Some("early-semver")
25
// For all Sonatype accounts created on or after February 2021
36
ThisBuild / sonatypeCredentialHost := "s01.oss.sonatype.org"
@@ -26,6 +29,8 @@ val sttp = "3.5.0"
2629

2730
val consoleDisabledOptions = Seq("-Xfatal-warnings", "-Ywarn-unused", "-Ywarn-unused-import")
2831

32+
lazy val build = TaskKey[File]("build")
33+
2934
// Used only by the server
3035
lazy val baseServerSettings: Project => Project = {
3136
_.settings(
@@ -194,15 +199,84 @@ lazy val bundlerSettings: Project => Project =
194199
Compile / fullOptJS / webpackDevServerExtraArgs += "--mode=production"
195200
)
196201

202+
lazy val spraWebBuildInfoSettings: Project => Project = _.enablePlugins(BuildInfoPlugin)
203+
.settings(
204+
buildInfoKeys := Seq[BuildInfoKey](name, version, scalaVersion, sbtVersion),
205+
buildInfoKeys ++= {
206+
val apiUrl = sys.env.get("API_URL")
207+
val values = Seq(
208+
"apiUrl" -> apiUrl
209+
)
210+
// Logging these values is useful to make sure that the necessary settings
211+
// are being overriden when packaging the app.
212+
sLog.value.info(s"BuildInfo settings:\n${values.mkString("\n")}")
213+
values.map(t => BuildInfoKey(t._1, t._2))
214+
},
215+
buildInfoPackage := "net.wiringbits",
216+
buildInfoUsePackageAsPath := true
217+
)
218+
219+
lazy val browserProject: Project => Project =
220+
_.settings(
221+
build := {
222+
val artifacts = (Compile / fullOptJS / webpack).value
223+
val artifactFolder = (Compile / fullOptJS / crossTarget).value
224+
val jsFolder = baseDirectory.value / "src" / "main" / "js"
225+
val distFolder = baseDirectory.value / "build"
226+
227+
distFolder.mkdirs()
228+
artifacts.foreach { artifact =>
229+
val target = artifact.data.relativeTo(artifactFolder) match {
230+
case None => distFolder / artifact.data.name
231+
case Some(relFile) => distFolder / relFile.toString
232+
}
233+
234+
Files.copy(artifact.data.toPath, target.toPath, REPLACE_EXISTING)
235+
}
236+
237+
// copy public resources
238+
Files
239+
.walk(jsFolder.toPath)
240+
.filter(x => !Files.isDirectory(x))
241+
.forEach(source => {
242+
source.toFile.relativeTo(jsFolder).foreach { relativeSource =>
243+
val dest = distFolder / relativeSource.toString
244+
dest.getParentFile.mkdirs()
245+
Files.copy(source, dest.toPath, REPLACE_EXISTING)
246+
}
247+
})
248+
249+
// link the proper js bundle
250+
val indexFrom = baseDirectory.value / "src/main/js/index.html"
251+
val indexTo = distFolder / "index.html"
252+
253+
val indexPatchedContent = {
254+
import collection.JavaConverters._
255+
Files
256+
.readAllLines(indexFrom.toPath, IO.utf8)
257+
.asScala
258+
.map(_.replaceAllLiterally("-fastopt", "-opt"))
259+
.mkString("\n")
260+
}
261+
262+
Files.write(indexTo.toPath, indexPatchedContent.getBytes(IO.utf8))
263+
distFolder
264+
}
265+
)
266+
197267
lazy val spraWeb = (project in file("spra-web"))
198-
.dependsOn(spraApi.js)
199-
.configure(bundlerSettings, baseLibSettings)
268+
.dependsOn(spraApi.js, spraPlayServer)
269+
.configure(bundlerSettings, baseLibSettings, browserProject, spraWebBuildInfoSettings)
200270
.configure(_.enablePlugins(ScalaJSPlugin, ScalaJSBundlerPlugin))
201271
.settings(
202272
scalaVersion := "2.13.8",
203273
crossScalaVersions := Seq("2.13.8", "3.1.2"),
204274
name := "spra-web",
205275
Test / fork := false, // sjs needs this to run tests
276+
scalaJSUseMainModuleInitializer := true,
277+
scalaJSLinkerConfig := scalaJSLinkerConfig.value.withSourceMap(false),
278+
webpackDevServerPort := 8081,
279+
webpackBundlingMode := BundlingMode.LibraryOnly(),
206280
libraryDependencies ++= Seq(
207281
"org.scala-js" %%% "scala-js-macrotask-executor" % "1.0.0",
208282
"me.shadaj" %%% "slinky-core" % "0.7.3",
@@ -238,3 +312,5 @@ lazy val root = (project in file("."))
238312
publishLocal := {},
239313
publish / skip := true
240314
)
315+
316+
addCommandAlias("spra-admin", ";spraWeb/fastOptJS::startWebpackDevServer;~spraWeb/fastOptJS")

Diff for: spra-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/AdminDataExplorerApiClient.scala renamed to spra-api/shared/src/main/scala/net/wiringbits/spra/api/AdminDataExplorerApiClient.scala

+10-3
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,13 @@
1-
package net.wiringbits.webapp.utils.api
2-
3-
import net.wiringbits.webapp.utils.api.models._
1+
package net.wiringbits.spra.api
2+
3+
import net.wiringbits.spra.api.models.{
4+
AdminCreateTable,
5+
AdminDeleteTable,
6+
AdminGetTables,
7+
AdminUpdateTable,
8+
PlayErrorResponse
9+
}
10+
import net.wiringbits.spra.api.models._
411
import play.api.libs.json._
512
import sttp.client3._
613
import sttp.model._

Diff for: spra-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminCreateTable.scala renamed to spra-api/shared/src/main/scala/net/wiringbits/spra/api/models/AdminCreateTable.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.wiringbits.webapp.utils.api.models
1+
package net.wiringbits.spra.api.models
22

33
import play.api.libs.json.{Format, Json}
44

Diff for: spra-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminDeleteTable.scala renamed to spra-api/shared/src/main/scala/net/wiringbits/spra/api/models/AdminDeleteTable.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.wiringbits.webapp.utils.api.models
1+
package net.wiringbits.spra.api.models
22

33
import play.api.libs.json.{Format, Json}
44

Diff for: spra-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminGetTables.scala renamed to spra-api/shared/src/main/scala/net/wiringbits/spra/api/models/AdminGetTables.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.wiringbits.webapp.utils.api.models
1+
package net.wiringbits.spra.api.models
22

33
import play.api.libs.json.{Format, Json}
44

Diff for: spra-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/AdminUpdateTable.scala renamed to spra-api/shared/src/main/scala/net/wiringbits/spra/api/models/AdminUpdateTable.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.wiringbits.webapp.utils.api.models
1+
package net.wiringbits.spra.api.models
22

33
import play.api.libs.json.{Format, Json}
44

Diff for: spra-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/PlayErrorResponse.scala renamed to spra-api/shared/src/main/scala/net/wiringbits/spra/api/models/PlayErrorResponse.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.wiringbits.webapp.utils.api.models
1+
package net.wiringbits.spra.api.models
22

33
import play.api.libs.json.{Format, Json}
44

Diff for: spra-api/shared/src/main/scala/net/wiringbits/webapp/utils/api/models/package.scala renamed to spra-api/shared/src/main/scala/net/wiringbits/spra/api/models/package.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.wiringbits.webapp.utils.api
1+
package net.wiringbits.spra.api
22

33
import play.api.libs.json._
44

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/AppRouter.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/AppRouter.scala

+5-10
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,8 @@
1-
package net.wiringbits.webapp.utils.admin
2-
3-
import net.wiringbits.webapp.utils.admin.controllers.{AdminController, ImagesController}
4-
import net.wiringbits.webapp.utils.admin.utils.StringToDataTypesExt
5-
import net.wiringbits.webapp.utils.admin.utils.models.{
6-
FilterParameter,
7-
PaginationParameter,
8-
QueryParameters,
9-
SortParameter
10-
}
1+
package net.wiringbits.spra.admin
2+
3+
import net.wiringbits.spra.admin.controllers.{AdminController, ImagesController}
4+
import net.wiringbits.spra.admin.utils.StringToDataTypesExt
5+
import net.wiringbits.spra.admin.utils.models.{FilterParameter, PaginationParameter, QueryParameters, SortParameter}
116
import play.api.routing.Router.Routes
127
import play.api.routing.SimpleRouter
138
import play.api.routing.sird.*

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/config/DataExplorerSettings.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/config/DataExplorerSettings.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.wiringbits.webapp.utils.admin.config
1+
package net.wiringbits.spra.admin.config
22

33
case class DataExplorerSettings(baseUrl: String, tables: List[TableSettings]) {
44
def unsafeFindByName(tableName: String): TableSettings = {

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/config/TableSettings.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/config/TableSettings.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.wiringbits.webapp.utils.admin.config
1+
package net.wiringbits.spra.admin.config
22

33
/** @param tableName
44
* name of table in database

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/AdminController.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/controllers/AdminController.scala

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
package net.wiringbits.webapp.utils.admin.controllers
1+
package net.wiringbits.spra.admin.controllers
22

3-
import net.wiringbits.webapp.utils.admin.config.DataExplorerSettings
4-
import net.wiringbits.webapp.utils.admin.services.AdminService
5-
import net.wiringbits.webapp.utils.admin.utils.models.QueryParameters
6-
import net.wiringbits.webapp.utils.api.models.*
3+
import net.wiringbits.spra.admin.config.DataExplorerSettings
4+
import net.wiringbits.spra.admin.services.AdminService
5+
import net.wiringbits.spra.admin.utils.models.QueryParameters
6+
import net.wiringbits.spra.api.models.*
77
import org.slf4j.LoggerFactory
88
import play.api.libs.json.Json
99
import play.api.mvc.{AbstractController, ControllerComponents}

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/ImagesController.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/controllers/ImagesController.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package net.wiringbits.webapp.utils.admin.controllers
1+
package net.wiringbits.spra.admin.controllers
22

3-
import net.wiringbits.webapp.utils.admin.services.AdminService
3+
import net.wiringbits.spra.admin.services.AdminService
44
import org.slf4j.LoggerFactory
55
import play.api.mvc.{AbstractController, ControllerComponents}
66

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/controllers/package.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/controllers/package.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package net.wiringbits.webapp.utils.admin
1+
package net.wiringbits.spra.admin
22

3-
import net.wiringbits.webapp.utils.api.models.ErrorResponse
3+
import net.wiringbits.spra.api.models.ErrorResponse
44
import org.slf4j.LoggerFactory
55
import play.api.libs.json.{JsValue, Json, Reads}
66
import play.api.mvc.Results.InternalServerError

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/executors/DatabaseExecutionContext.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/executors/DatabaseExecutionContext.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.wiringbits.webapp.utils.admin.executors
1+
package net.wiringbits.spra.admin.executors
22

33
import akka.actor.ActorSystem
44
import play.api.libs.concurrent.CustomExecutionContext

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/modules/AdminModule.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/modules/AdminModule.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
1-
package net.wiringbits.webapp.utils.admin.modules
1+
package net.wiringbits.spra.admin.modules
22

3-
import net.wiringbits.webapp.utils.admin.tasks.DataExplorerConfigValidatorTask
3+
import net.wiringbits.spra.admin.tasks.DataExplorerConfigValidatorTask
44
import play.api.inject
55
import play.api.inject.SimpleModule
66

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/modules/ExecutorsModule.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/modules/ExecutorsModule.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package net.wiringbits.webapp.utils.admin.modules
1+
package net.wiringbits.spra.admin.modules
22

33
import com.google.inject.AbstractModule
4-
import net.wiringbits.webapp.utils.admin.executors.DatabaseExecutionContext
4+
import net.wiringbits.spra.admin.executors.DatabaseExecutionContext
55

66
class ExecutorsModule extends AbstractModule {
77

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/DatabaseTablesRepository.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/DatabaseTablesRepository.scala

+6-6
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package net.wiringbits.webapp.utils.admin.repositories
1+
package net.wiringbits.spra.admin.repositories
22

3-
import net.wiringbits.webapp.utils.admin.config.{DataExplorerSettings, TableSettings}
4-
import net.wiringbits.webapp.utils.admin.executors.DatabaseExecutionContext
5-
import net.wiringbits.webapp.utils.admin.repositories.daos.DatabaseTablesDAO
6-
import net.wiringbits.webapp.utils.admin.repositories.models.{DatabaseTable, ForeignKey, TableColumn, TableData}
7-
import net.wiringbits.webapp.utils.admin.utils.models.QueryParameters
3+
import net.wiringbits.spra.admin.config.{DataExplorerSettings, TableSettings}
4+
import net.wiringbits.spra.admin.executors.DatabaseExecutionContext
5+
import net.wiringbits.spra.admin.repositories.daos.DatabaseTablesDAO
6+
import net.wiringbits.spra.admin.repositories.models.{DatabaseTable, ForeignKey, TableColumn, TableData}
7+
import net.wiringbits.spra.admin.utils.models.QueryParameters
88
import play.api.db.Database
99

1010
import javax.inject.Inject

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/daos/DatabaseTablesDAO.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/DatabaseTablesDAO.scala

+5-5
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
1-
package net.wiringbits.webapp.utils.admin.repositories.daos
1+
package net.wiringbits.spra.admin.repositories.daos
22

33
import anorm.{SqlParser, SqlStringInterpolation}
4-
import net.wiringbits.webapp.utils.admin.config.{CustomDataType, PrimaryKeyDataType, TableSettings}
5-
import net.wiringbits.webapp.utils.admin.repositories.models.*
6-
import net.wiringbits.webapp.utils.admin.utils.models.{FilterParameter, QueryParameters}
7-
import net.wiringbits.webapp.utils.admin.utils.{QueryBuilder, StringRegex}
4+
import net.wiringbits.spra.admin.config.{CustomDataType, PrimaryKeyDataType, TableSettings}
5+
import net.wiringbits.spra.admin.repositories.models.*
6+
import net.wiringbits.spra.admin.utils.models.{FilterParameter, QueryParameters}
7+
import net.wiringbits.spra.admin.utils.{QueryBuilder, StringRegex}
88

99
import java.sql.{Connection, Date, PreparedStatement, ResultSet}
1010
import java.time.LocalDate

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/daos/package.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/daos/package.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
1-
package net.wiringbits.webapp.utils.admin.repositories
1+
package net.wiringbits.spra.admin.repositories
22

33
import anorm.*
4-
import net.wiringbits.webapp.utils.admin.repositories.models.{DatabaseTable, ForeignKey, TableColumn}
4+
import net.wiringbits.spra.admin.repositories.models.{DatabaseTable, ForeignKey, TableColumn}
55

66
package object daos {
77
import anorm.{Column, MetaDataItem, TypeDoesNotMatch}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package net.wiringbits.spra.admin.repositories.models
2+
3+
case class Cell(
4+
value: String
5+
)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package net.wiringbits.spra.admin.repositories.models
2+
3+
case class DatabaseTable(
4+
name: String
5+
)
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
1-
package net.wiringbits.webapp.utils.admin.repositories.models
1+
package net.wiringbits.spra.admin.repositories.models
22

33
case class ForeignKey(foreignTable: String, primaryTable: String, foreignColumnName: String)

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/TableColumn.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/models/TableColumn.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.wiringbits.webapp.utils.admin.repositories.models
1+
package net.wiringbits.spra.admin.repositories.models
22

33
case class TableColumn(
44
name: String,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
package net.wiringbits.spra.admin.repositories.models
2+
3+
case class TableData(data: Map[String, String])

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/repositories/models/TableRow.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/repositories/models/TableRow.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package net.wiringbits.webapp.utils.admin.repositories.models
1+
package net.wiringbits.spra.admin.repositories.models
22

33
import scala.collection.immutable.ListMap
44

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/services/AdminService.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/services/AdminService.scala

+8-8
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,11 @@
1-
package net.wiringbits.webapp.utils.admin.services
2-
3-
import net.wiringbits.webapp.utils.admin.config.{CustomDataType, DataExplorerSettings, TableSettings}
4-
import net.wiringbits.webapp.utils.admin.repositories.DatabaseTablesRepository
5-
import net.wiringbits.webapp.utils.admin.repositories.models.{ForeignKey, TableData}
6-
import net.wiringbits.webapp.utils.admin.utils.models.QueryParameters
7-
import net.wiringbits.webapp.utils.admin.utils.{MapStringHideExt, contentRangeHeader}
8-
import net.wiringbits.webapp.utils.api.models.*
1+
package net.wiringbits.spra.admin.services
2+
3+
import net.wiringbits.spra.admin.config.{CustomDataType, DataExplorerSettings, TableSettings}
4+
import net.wiringbits.spra.admin.repositories.DatabaseTablesRepository
5+
import net.wiringbits.spra.admin.repositories.models.{ForeignKey, TableData}
6+
import net.wiringbits.spra.admin.utils.models.QueryParameters
7+
import net.wiringbits.spra.admin.utils.{MapStringHideExt, contentRangeHeader}
8+
import net.wiringbits.spra.api.models.*
99

1010
import java.awt.image.BufferedImage
1111
import java.io.{ByteArrayInputStream, File}

Diff for: spra-play-server/src/main/scala/net/wiringbits/webapp/utils/admin/tasks/DataExplorerConfigValidatorTask.scala renamed to spra-play-server/src/main/scala/net/wiringbits/spra/admin/tasks/DataExplorerConfigValidatorTask.scala

+4-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
1-
package net.wiringbits.webapp.utils.admin.tasks
1+
package net.wiringbits.spra.admin.tasks
22

3-
import net.wiringbits.webapp.utils.admin.config.{DataExplorerSettings, TableSettings}
4-
import net.wiringbits.webapp.utils.admin.repositories.daos.DatabaseTablesDAO
5-
import net.wiringbits.webapp.utils.admin.repositories.models.{DatabaseTable, TableColumn}
3+
import net.wiringbits.spra.admin.config.{DataExplorerSettings, TableSettings}
4+
import net.wiringbits.spra.admin.repositories.daos.DatabaseTablesDAO
5+
import net.wiringbits.spra.admin.repositories.models.{DatabaseTable, TableColumn}
66
import org.slf4j.LoggerFactory
77
import play.api.db.Database
88

0 commit comments

Comments
 (0)