+
Setup
-
+
+
+
+
+
+
);
diff --git a/package-lock.json b/package-lock.json
index 0f5471b..ea059af 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -36,6 +36,7 @@
"construct-style-sheets-polyfill": "3.1.0",
"formik": "^2.4.5",
"framer-motion": "^11.1.7",
+ "http-status-codes": "^2.3.0",
"lit": "3.1.0",
"next-themes": "^0.3.0",
"react": "^18.2.0",
@@ -9493,6 +9494,12 @@
"optional": true,
"peer": true
},
+ "node_modules/http-status-codes": {
+ "version": "2.3.0",
+ "resolved": "https://registry.npmjs.org/http-status-codes/-/http-status-codes-2.3.0.tgz",
+ "integrity": "sha512-RJ8XvFvpPM/Dmc5SV+dC4y5PCeOhT3x1Hq0NU3rjGeg5a/CqlhZ7uudknPwZFz4aeAXDcbAyaeP7GAo9lvngtA==",
+ "license": "MIT"
+ },
"node_modules/idb": {
"version": "7.1.1",
"resolved": "https://registry.npmjs.org/idb/-/idb-7.1.1.tgz",
diff --git a/package.json b/package.json
index fb63af0..ec73147 100644
--- a/package.json
+++ b/package.json
@@ -31,6 +31,7 @@
"construct-style-sheets-polyfill": "3.1.0",
"formik": "^2.4.5",
"framer-motion": "^11.1.7",
+ "http-status-codes": "^2.3.0",
"lit": "3.1.0",
"next-themes": "^0.3.0",
"react": "^18.2.0",
@@ -102,7 +103,8 @@
"@nextui-org/react": "$@nextui-org/react",
"framer-motion": "$framer-motion",
"@material-tailwind/react": "$@material-tailwind/react",
- "sonner": "$sonner"
+ "sonner": "$sonner",
+ "http-status-codes": "$http-status-codes"
},
"vaadin": {
"dependencies": {
@@ -146,6 +148,6 @@
"workbox-core": "7.0.0",
"workbox-precaching": "7.0.0"
},
- "hash": "3305a1ae01d771a26115b08f2597b5fbb020e6535692fd453407cba700f727ea"
+ "hash": "e078b3ecf381b7be4b804c8e2cd928faa9accb3412cfb55cfb649f9633cd1d41"
}
}
diff --git a/src/main/kotlin/de/grimsi/gameyfin/config/Roles.kt b/src/main/kotlin/de/grimsi/gameyfin/config/Roles.kt
index d75a4fa..8667e77 100644
--- a/src/main/kotlin/de/grimsi/gameyfin/config/Roles.kt
+++ b/src/main/kotlin/de/grimsi/gameyfin/config/Roles.kt
@@ -1,7 +1,16 @@
package de.grimsi.gameyfin.config
enum class Roles(val roleName: String) {
- SUPERADMIN("ROLE_SUPERADMIN"),
- ADMIN("ROLE_ADMIN"),
- USER("ROLE_USER")
+ SUPERADMIN(Names.SUPERADMIN),
+ ADMIN(Names.ADMIN),
+ USER(Names.USER);
+
+ // necessary for the ability to use the Roles class in the @RolesAllowed annotation
+ class Names {
+ companion object {
+ const val SUPERADMIN = "ROLE_SUPERADMIN"
+ const val ADMIN = "ROLE_ADMIN"
+ const val USER = "ROLE_USER"
+ }
+ }
}
\ No newline at end of file
diff --git a/src/main/kotlin/de/grimsi/gameyfin/setup/SetupDataLoader.kt b/src/main/kotlin/de/grimsi/gameyfin/setup/SetupDataLoader.kt
index 2edb4b4..bfe6bef 100644
--- a/src/main/kotlin/de/grimsi/gameyfin/setup/SetupDataLoader.kt
+++ b/src/main/kotlin/de/grimsi/gameyfin/setup/SetupDataLoader.kt
@@ -29,13 +29,16 @@ class SetupDataLoader(
log.info { "We will now set up some data..." }
setupRoles()
- //setupUsers()
+ setupUsers()
log.info { "Setup completed..." }
log.info { "Visit http://${InetAddress.getLocalHost().hostName}:${env.getProperty("server.port")}/setup to complete the setup" }
}
fun setupUsers() {
+
+ log.info { "Setting up users..." }
+
val superadmin = User(
username = "admin",
password = "admin"
@@ -49,6 +52,8 @@ class SetupDataLoader(
)
userService.registerUser(user, Roles.USER)
+
+ log.info { "User setup completed." }
}
fun setupRoles() {
diff --git a/src/main/kotlin/de/grimsi/gameyfin/system/SystemEndpoint.kt b/src/main/kotlin/de/grimsi/gameyfin/system/SystemEndpoint.kt
new file mode 100644
index 0000000..5e0153c
--- /dev/null
+++ b/src/main/kotlin/de/grimsi/gameyfin/system/SystemEndpoint.kt
@@ -0,0 +1,16 @@
+package de.grimsi.gameyfin.system
+
+import de.grimsi.gameyfin.config.Roles
+import dev.hilla.Endpoint
+import jakarta.annotation.security.RolesAllowed
+
+@Endpoint
+class SystemEndpoint(
+ private val systemService: SystemService
+) {
+
+ @RolesAllowed(Roles.Names.SUPERADMIN, Roles.Names.ADMIN)
+ fun restart() {
+ systemService.restart()
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/de/grimsi/gameyfin/system/SystemService.kt b/src/main/kotlin/de/grimsi/gameyfin/system/SystemService.kt
new file mode 100644
index 0000000..90ee884
--- /dev/null
+++ b/src/main/kotlin/de/grimsi/gameyfin/system/SystemService.kt
@@ -0,0 +1,13 @@
+package de.grimsi.gameyfin.system
+
+import org.springframework.cloud.context.restart.RestartEndpoint
+import org.springframework.stereotype.Service
+
+@Service
+class SystemService(
+ private val restartEndpoint: RestartEndpoint,
+) {
+ fun restart() {
+ restartEndpoint.restart()
+ }
+}
\ No newline at end of file
diff --git a/src/main/kotlin/de/grimsi/gameyfin/users/UserEndpoint.kt b/src/main/kotlin/de/grimsi/gameyfin/users/UserEndpoint.kt
index ee38448..da64547 100644
--- a/src/main/kotlin/de/grimsi/gameyfin/users/UserEndpoint.kt
+++ b/src/main/kotlin/de/grimsi/gameyfin/users/UserEndpoint.kt
@@ -12,8 +12,7 @@ import org.springframework.security.core.context.SecurityContextHolder
@Endpoint
class UserEndpoint(
- private val userService: UserService,
- private val roleService: RoleService,
+ private val userService: UserService
) {
@PermitAll
diff --git a/src/main/kotlin/de/grimsi/gameyfin/users/entities/Role.kt b/src/main/kotlin/de/grimsi/gameyfin/users/entities/Role.kt
index b2a802a..fbfa22c 100644
--- a/src/main/kotlin/de/grimsi/gameyfin/users/entities/Role.kt
+++ b/src/main/kotlin/de/grimsi/gameyfin/users/entities/Role.kt
@@ -7,6 +7,7 @@ import jakarta.validation.constraints.NotNull
@Entity
class Role(
@NotNull
+ @Column(unique = true)
var rolename: String,
@Id
diff --git a/src/main/kotlin/de/grimsi/gameyfin/users/entities/User.kt b/src/main/kotlin/de/grimsi/gameyfin/users/entities/User.kt
index e3b901c..ee8b3b9 100644
--- a/src/main/kotlin/de/grimsi/gameyfin/users/entities/User.kt
+++ b/src/main/kotlin/de/grimsi/gameyfin/users/entities/User.kt
@@ -8,23 +8,27 @@ import jakarta.validation.constraints.NotNull
@Entity
@Table(name = "users")
class User(
- @field:NotNull
+ @NotNull
+ @Column(unique = true)
var username: String,
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
var id: Long? = null,
- @field:NotNull
+ @NotNull
var password: String,
- @field:Nullable
+ @Nullable
+ @Column(unique = true)
var email: String? = null,
+ var email_confirmed: Boolean = false,
+
var enabled: Boolean = true,
@Embedded
- @field:Nullable
+ @Nullable
var avatar: Avatar? = null,
@ManyToMany(fetch = FetchType.EAGER)
diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml
index 2d84231..a96ae5c 100644
--- a/src/main/resources/application.yml
+++ b/src/main/resources/application.yml
@@ -7,6 +7,14 @@ server:
session:
tracking-modes: cookie
+management:
+ endpoints.web.exposure.include: '*'
+ endpoint:
+ pause:
+ enabled: false
+ restart:
+ enabled: true
+
spring:
# Workaround for https://github.com/vaadin/hilla/issues/842
devtools.restart.additional-exclude: dev/hilla/openapi.json