Skip to content

Commit 5b37c8a

Browse files
committed
Converting to project for shared admin models
1 parent ec695dc commit 5b37c8a

File tree

84 files changed

+1185
-205
lines changed

Some content is hidden

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

84 files changed

+1185
-205
lines changed

app/com/kyleu/projectile/web/views/project/member/listModel.scala.html

+1-1
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ <h6><i class=" @com.kyleu.projectile.models.template.Icons.model"></i> @project.
1414
@project.models.sortBy(_.key).map { m =>
1515
<div class="collection-item">
1616
<div class="right">
17-
@if(m.pkg.isEmpty && com.kyleu.projectile.services.project.ProjectLoadService.Provided.models(m.key)) {
17+
@if(com.kyleu.projectile.services.project.ProjectLoadService.Provided.models.isDefinedAt(m.key)) {
1818
<em>provided</em>
1919
} else {
2020
@m.pkg.mkString(".")

build.sbt

+2
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,8 @@ lazy val `projectile-export` = ProjectileExport.`projectile-export`
2929
// SBT Plugin
3030
lazy val `projectile-sbt` = SbtExportPlugin.`projectile-sbt`
3131
lazy val `projectile-sbt-admin` = SbtExportPlugin.`projectile-sbt-admin`
32+
lazy val `projectile-lib-admin-models-jvm` = LibraryProjects.`projectile-lib-admin-models-jvm`
33+
lazy val `projectile-lib-admin-models-js` = LibraryProjects.`projectile-lib-admin-models-js`
3234

3335
// Play Web Application
3436
lazy val `projectile-server` = Server.`projectile-server`

examples/admin/app/models/module/ProjectileModule.scala

+6-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,12 @@ import models.search.SearchHelper
1111
import models.template.UserMenu
1212
import util.Version
1313

14-
class ProjectileModule extends AdminModule(projectName = Version.projectName, allowSignup = true, initialRole = "admin", menuProvider = UserMenu) {
14+
class ProjectileModule extends AdminModule {
15+
override def projectName = Version.projectName
16+
override def allowSignup = true
17+
override def initialRole = "admin"
18+
override def menuProvider = UserMenu
19+
1520
override protected def onStartup(app: Application, injector: Injector) = {
1621
AuditCallbackProvider.init(new AuditCallbacks(injector))
1722

examples/admin/app/models/search/SearchHelper.scala

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,8 @@ import java.util.UUID
44

55
import com.google.inject.Injector
66
import com.kyleu.projectile.models.module.Application
7-
import com.kyleu.projectile.services.Credentials
87
import com.kyleu.projectile.services.search.SearchProvider
8+
import com.kyleu.projectile.util.Credentials
99
import com.kyleu.projectile.util.tracing.TraceData
1010

1111
import scala.concurrent.ExecutionContext
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sbt.version=1.3.0-RC5
1+
sbt.version=1.3.0
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sbt.version=1.3.0-RC5
1+
sbt.version=1.3.0
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sbt.version=1.3.0-RC5
1+
sbt.version=1.3.0
+1-1
Original file line numberDiff line numberDiff line change
@@ -1 +1 @@
1-
sbt.version=1.3.0-RC5
1+
sbt.version=1.3.0

libraries/projectile-lib-admin/app/com/kyleu/projectile/models/audit/AuditRecordResult.scala libraries/projectile-lib-admin-models/src/main/scala/com/kyleu/projectile/models/audit/AuditRecordResult.scala

+18-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,24 @@ final case class AuditRecordResult(
1919
) extends BaseResult[AuditRecord]
2020

2121
object AuditRecordResult {
22-
implicit val jsonEncoder: Encoder[AuditRecordResult] = deriveEncoder
23-
implicit val jsonDecoder: Decoder[AuditRecordResult] = deriveDecoder
22+
implicit val jsonEncoder: Encoder[AuditRecordResult] = (r: AuditRecordResult) => io.circe.Json.obj(
23+
("filters", r.filters.asJson),
24+
("orderBys", r.orderBys.asJson),
25+
("totalCount", r.totalCount.asJson),
26+
("paging", r.paging.asJson),
27+
("results", r.results.asJson),
28+
("durationMs", r.durationMs.asJson),
29+
("occurred", r.occurred.asJson)
30+
)
31+
implicit val jsonDecoder: Decoder[AuditRecordResult] = (c: io.circe.HCursor) => for {
32+
filters <- c.downField("filters").as[Seq[Filter]]
33+
orderBys <- c.downField("orderBys").as[Seq[OrderBy]]
34+
totalCount <- c.downField("totalCount").as[Int]
35+
paging <- c.downField("paging").as[PagingOptions]
36+
results <- c.downField("results").as[Seq[AuditRecord]]
37+
durationMs <- c.downField("durationMs").as[Int]
38+
occurred <- c.downField("occurred").as[LocalDateTime]
39+
} yield AuditRecordResult(filters, orderBys, totalCount, paging, results, durationMs, occurred)
2440

2541
def fromRecords(
2642
q: Option[String], filters: Seq[Filter] = Nil, orderBys: Seq[OrderBy] = Nil, limit: Option[Int] = None, offset: Option[Int] = None,

libraries/projectile-lib-admin/app/com/kyleu/projectile/models/audit/AuditResult.scala libraries/projectile-lib-admin-models/src/main/scala/com/kyleu/projectile/models/audit/AuditResult.scala

+18-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,24 @@ final case class AuditResult(
1919
) extends BaseResult[Audit]
2020

2121
object AuditResult {
22-
implicit val jsonEncoder: Encoder[AuditResult] = deriveEncoder
23-
implicit val jsonDecoder: Decoder[AuditResult] = deriveDecoder
22+
implicit val jsonEncoder: Encoder[AuditResult] = (r: AuditResult) => io.circe.Json.obj(
23+
("filters", r.filters.asJson),
24+
("orderBys", r.orderBys.asJson),
25+
("totalCount", r.totalCount.asJson),
26+
("paging", r.paging.asJson),
27+
("results", r.results.asJson),
28+
("durationMs", r.durationMs.asJson),
29+
("occurred", r.occurred.asJson)
30+
)
31+
implicit val jsonDecoder: Decoder[AuditResult] = (c: io.circe.HCursor) => for {
32+
filters <- c.downField("filters").as[Seq[Filter]]
33+
orderBys <- c.downField("orderBys").as[Seq[OrderBy]]
34+
totalCount <- c.downField("totalCount").as[Int]
35+
paging <- c.downField("paging").as[PagingOptions]
36+
results <- c.downField("results").as[Seq[Audit]]
37+
durationMs <- c.downField("durationMs").as[Int]
38+
occurred <- c.downField("occurred").as[LocalDateTime]
39+
} yield AuditResult(filters, orderBys, totalCount, paging, results, durationMs, occurred)
2440

2541
def fromRecords(
2642
q: Option[String], filters: Seq[Filter] = Nil, orderBys: Seq[OrderBy] = Nil, limit: Option[Int] = None, offset: Option[Int] = None,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package com.kyleu.projectile.models.config
2+
3+
import com.kyleu.projectile.util.JsonSerializers._
4+
5+
object UserSettings {
6+
implicit val jsonEncoder: Encoder[UserSettings] = deriveEncoder
7+
implicit val jsonDecoder: Decoder[UserSettings] = deriveDecoder
8+
9+
val empty = UserSettings()
10+
}
11+
12+
case class UserSettings(
13+
theme: String = "default",
14+
15+
menuColor: Option[String] = Some("gradient-45deg-indigo-blue"),
16+
menuBackgroundColor: Option[String] = None,
17+
menuDark: Boolean = true,
18+
menuCollapsed: Boolean = false,
19+
menuSelection: Option[String] = None,
20+
21+
navbarColor: Option[String] = Some("gradient-45deg-indigo-blue"),
22+
navbarDark: Boolean = true,
23+
24+
buttonColor: Option[String] = None,
25+
accentColor: Option[String] = None,
26+
27+
avatarUrl: Option[String] = None
28+
) {
29+
val menuDarkClass = if (menuDark) { "sidenav-dark" } else { "sidenav-light" }
30+
31+
val logo = if (menuDark) { "/assets/images/logo-white.svg" } else { "/assets/images/logo-black.svg" }
32+
val navbarDarkClass = if (navbarDark) { "navbar-dark" } else { "navbar-light" }
33+
34+
val textColor = accentColor.map(_ + "-text").getOrElse("")
35+
}

libraries/projectile-lib-admin/app/com/kyleu/projectile/models/note/NoteResult.scala libraries/projectile-lib-admin-models/src/main/scala/com/kyleu/projectile/models/note/NoteResult.scala

+18-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,24 @@ final case class NoteResult(
1919
) extends BaseResult[Note]
2020

2121
object NoteResult {
22-
implicit val jsonEncoder: Encoder[NoteResult] = deriveEncoder
23-
implicit val jsonDecoder: Decoder[NoteResult] = deriveDecoder
22+
implicit val jsonEncoder: Encoder[NoteResult] = (r: NoteResult) => io.circe.Json.obj(
23+
("filters", r.filters.asJson),
24+
("orderBys", r.orderBys.asJson),
25+
("totalCount", r.totalCount.asJson),
26+
("paging", r.paging.asJson),
27+
("results", r.results.asJson),
28+
("durationMs", r.durationMs.asJson),
29+
("occurred", r.occurred.asJson)
30+
)
31+
implicit val jsonDecoder: Decoder[NoteResult] = (c: io.circe.HCursor) => for {
32+
filters <- c.downField("filters").as[Seq[Filter]]
33+
orderBys <- c.downField("orderBys").as[Seq[OrderBy]]
34+
totalCount <- c.downField("totalCount").as[Int]
35+
paging <- c.downField("paging").as[PagingOptions]
36+
results <- c.downField("results").as[Seq[Note]]
37+
durationMs <- c.downField("durationMs").as[Int]
38+
occurred <- c.downField("occurred").as[LocalDateTime]
39+
} yield NoteResult(filters, orderBys, totalCount, paging, results, durationMs, occurred)
2440

2541
def fromRecords(
2642
q: Option[String], filters: Seq[Filter] = Nil, orderBys: Seq[OrderBy] = Nil, limit: Option[Int] = None, offset: Option[Int] = None,
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package com.kyleu.projectile.models.user
2+
3+
import com.kyleu.projectile.util.JsonSerializers._
4+
5+
object LoginCredentials {
6+
implicit val jsonEncoder: Encoder[LoginCredentials] = deriveEncoder
7+
implicit val jsonDecoder: Decoder[LoginCredentials] = deriveDecoder
8+
}
9+
10+
case class LoginCredentials(providerID: String, providerKey: String)

libraries/projectile-lib-admin/app/com/kyleu/projectile/models/user/SystemUser.scala libraries/projectile-lib-admin-models/src/main/scala/com/kyleu/projectile/models/user/SystemUser.scala

+6-10
Original file line numberDiff line numberDiff line change
@@ -4,56 +4,52 @@ import java.time.LocalDateTime
44
import java.util.UUID
55

66
import com.kyleu.projectile.models.config.UserSettings
7-
import com.mohiva.play.silhouette.api.{Identity, LoginInfo}
87
import com.kyleu.projectile.models.result.data.{DataField, DataFieldModel, DataSummary}
98
import com.kyleu.projectile.util.DateUtils
109
import com.kyleu.projectile.util.JsonSerializers._
1110
import io.circe.JsonObject
1211

1312
object SystemUser {
14-
implicit val jsonLoginInfoEncoder: Encoder[LoginInfo] = deriveEncoder
15-
implicit val jsonLoginInfoDecoder: Decoder[LoginInfo] = deriveDecoder
16-
1713
implicit val jsonEncoder: Encoder[SystemUser] = deriveEncoder
1814
implicit val jsonDecoder: Decoder[SystemUser] = deriveDecoder
1915

2016
def empty() = SystemUser(
2117
id = UUID.randomUUID,
2218
username = "",
23-
profile = LoginInfo("anonymous", "guest"),
19+
profile = LoginCredentials("anonymous", "guest"),
2420
role = "user"
2521
)
2622

2723
val system = SystemUser(
2824
id = UUID.fromString("88888888-8888-8888-8888-888888888888"),
2925
username = "",
30-
profile = LoginInfo("anonymous", "system"),
26+
profile = LoginCredentials("anonymous", "system"),
3127
role = "admin"
3228
)
3329

3430
val guest = SystemUser(
3531
id = UUID.fromString("77777777-7777-7777-7777-777777777777"),
3632
username = "guest",
37-
profile = LoginInfo("anonymous", "guest"),
33+
profile = LoginCredentials("anonymous", "guest"),
3834
role = "user"
3935
)
4036

4137
val api = SystemUser(
4238
id = UUID.fromString("44444444-4444-4444-4444-444444444444"),
4339
username = "api",
44-
profile = LoginInfo("anonymous", "api"),
40+
profile = LoginCredentials("anonymous", "api"),
4541
role = "admin"
4642
)
4743
}
4844

4945
final case class SystemUser(
5046
id: UUID,
5147
username: String,
52-
profile: LoginInfo,
48+
profile: LoginCredentials,
5349
role: String,
5450
settings: Json = JsonObject.empty.asJson,
5551
created: LocalDateTime = DateUtils.now
56-
) extends Identity with DataFieldModel {
52+
) extends DataFieldModel {
5753

5854
val email = profile.providerKey
5955
val provider = profile.providerID

libraries/projectile-lib-admin/app/com/kyleu/projectile/models/user/SystemUserResult.scala libraries/projectile-lib-admin-models/src/main/scala/com/kyleu/projectile/models/user/SystemUserResult.scala

+18-2
Original file line numberDiff line numberDiff line change
@@ -19,8 +19,24 @@ final case class SystemUserResult(
1919
) extends BaseResult[SystemUser]
2020

2121
object SystemUserResult {
22-
implicit val jsonEncoder: Encoder[SystemUserResult] = deriveEncoder
23-
implicit val jsonDecoder: Decoder[SystemUserResult] = deriveDecoder
22+
implicit val jsonEncoder: Encoder[SystemUserResult] = (r: SystemUserResult) => io.circe.Json.obj(
23+
("filters", r.filters.asJson),
24+
("orderBys", r.orderBys.asJson),
25+
("totalCount", r.totalCount.asJson),
26+
("paging", r.paging.asJson),
27+
("results", r.results.asJson),
28+
("durationMs", r.durationMs.asJson),
29+
("occurred", r.occurred.asJson)
30+
)
31+
implicit val jsonDecoder: Decoder[SystemUserResult] = (c: io.circe.HCursor) => for {
32+
filters <- c.downField("filters").as[Seq[Filter]]
33+
orderBys <- c.downField("orderBys").as[Seq[OrderBy]]
34+
totalCount <- c.downField("totalCount").as[Int]
35+
paging <- c.downField("paging").as[PagingOptions]
36+
results <- c.downField("results").as[Seq[SystemUser]]
37+
durationMs <- c.downField("durationMs").as[Int]
38+
occurred <- c.downField("occurred").as[LocalDateTime]
39+
} yield SystemUserResult(filters, orderBys, totalCount, paging, results, durationMs, occurred)
2440

2541
def fromRecords(
2642
q: Option[String], filters: Seq[Filter] = Nil, orderBys: Seq[OrderBy] = Nil, limit: Option[Int] = None, offset: Option[Int] = None,

libraries/projectile-lib-admin/app/com/kyleu/projectile/controllers/AuthController.scala

+2-2
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ abstract class AuthController(name: String) extends com.kyleu.projectile.control
3333
app.silhouette.UserAwareAction.async { implicit request =>
3434
Instrumented.timeFuture(metricsName + "_request", "action", name + "_" + action) {
3535
app.tracing.trace(name + ".controller." + action) { td =>
36-
enhanceRequest(request, request.identity, td)
36+
enhanceRequest(request, request.identity.map(_.user), td)
3737
block(request)(td)
3838
}(getTraceData)
3939
}
@@ -50,7 +50,7 @@ abstract class AuthController(name: String) extends com.kyleu.projectile.control
5050
case Some(u) => permissions.map(p => PermissionService.check(u.role, p._1, p._2, p._3)).filter(!_._1).map(_._2).toList match {
5151
case Nil => Instrumented.timeFuture(metricsName + "_request", "action", name + "_" + action) {
5252
app.tracing.trace(name + ".controller." + action) { td =>
53-
enhanceRequest(request, Some(u), td)
53+
enhanceRequest(request, Some(u.user), td)
5454
val auth = request.authenticator.getOrElse(throw new IllegalStateException("No auth!"))
5555
block(SecuredRequest(u, auth, request))(td)
5656
}(getTraceData)

0 commit comments

Comments
 (0)