diff --git a/api-gateway/src/main/kotlin/com/saveourtool/save/gateway/utils/StoringServerAuthenticationSuccessHandler.kt b/api-gateway/src/main/kotlin/com/saveourtool/save/gateway/utils/StoringServerAuthenticationSuccessHandler.kt
index 21005080d0..e1d6bc2a46 100644
--- a/api-gateway/src/main/kotlin/com/saveourtool/save/gateway/utils/StoringServerAuthenticationSuccessHandler.kt
+++ b/api-gateway/src/main/kotlin/com/saveourtool/save/gateway/utils/StoringServerAuthenticationSuccessHandler.kt
@@ -3,6 +3,7 @@ package com.saveourtool.save.gateway.utils
import com.saveourtool.save.domain.Role
import com.saveourtool.save.entities.User
import com.saveourtool.save.gateway.config.ConfigurationProperties
+import com.saveourtool.save.info.UserStatus
import org.slf4j.LoggerFactory
import org.springframework.http.MediaType
@@ -58,6 +59,6 @@ fun Authentication.toUser(): User = User(
authorities.joinToString(",") { it.authority },
toIdentitySource(),
null,
- isActive = false,
+ status = UserStatus.CREATED,
originalLogins = emptyList(),
)
diff --git a/authentication-service/src/main/kotlin/com/saveourtool/save/authservice/repository/AuthenticationUserRepository.kt b/authentication-service/src/main/kotlin/com/saveourtool/save/authservice/repository/AuthenticationUserRepository.kt
index bbb8f748c5..ea5636d62c 100644
--- a/authentication-service/src/main/kotlin/com/saveourtool/save/authservice/repository/AuthenticationUserRepository.kt
+++ b/authentication-service/src/main/kotlin/com/saveourtool/save/authservice/repository/AuthenticationUserRepository.kt
@@ -1,6 +1,7 @@
package com.saveourtool.save.authservice.repository
import com.saveourtool.save.entities.User
+import com.saveourtool.save.info.UserStatus
import com.saveourtool.save.utils.orNotFound
import org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate
import org.springframework.stereotype.Component
@@ -41,7 +42,7 @@ class AuthenticationUserRepository(
linkedin = record["linkedin"] as String?,
gitHub = record["git_hub"] as String?,
twitter = record["twitter"] as String?,
- isActive = record["is_active"] as Boolean,
+ status = UserStatus.valueOf(record["status"] as String),
rating = record["rating"] as Long,
).apply {
this.id = record["id"] as Long
diff --git a/db/test-data/sqlRequests/user.csv b/db/test-data/sqlRequests/user.csv
index 73f76bd5a7..0ad52f1470 100644
--- a/db/test-data/sqlRequests/user.csv
+++ b/db/test-data/sqlRequests/user.csv
@@ -1,14 +1,14 @@
-id;name;password;role;source;avatar;email;company;location;linkedin;git_hub;twitter;is_active;rating
-1;"admin";"{bcrypt}$2a$12$7jB6.fJ/uHZiti94w0.QOu0M/lPzKU1lvX9TLL3uZHFjLGIfz1gHq";"ROLE_SUPER_ADMIN";"basic";;;;;;;;true;999
-2;"JohnDoe";"{bcrypt}$2a$12$zjCjULtsSvapH5kt6KUq4eyTx3WluDwB3GepcbLA.mf/NcGZCLuvi";"ROLE_VIEWER";"basic";;;;;;;;false;-37
-3;"user";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;false;0
-4;"user1";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;false;-3
-5;"user2";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;false;0
-6;"user3";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;false;15
-7;"user4";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;false;34
-8;"user5";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;false;0
-9;"user6";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;false;54
-10;"user7";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;false;86
-11;"user8";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;false;0
-12;"user9";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;false;12
-13;"user10";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;false;24
+id;name;password;role;source;avatar;email;company;location;linkedin;git_hub;twitter;rating;status
+1;"admin";"{bcrypt}$2a$12$7jB6.fJ/uHZiti94w0.QOu0M/lPzKU1lvX9TLL3uZHFjLGIfz1gHq";"ROLE_SUPER_ADMIN";"basic";;;;;;;;999;"ACTIVE"
+2;"JohnDoe";"{bcrypt}$2a$12$zjCjULtsSvapH5kt6KUq4eyTx3WluDwB3GepcbLA.mf/NcGZCLuvi";"ROLE_VIEWER";"basic";;;;;;;;-37;"CREATED"
+3;"user";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;0;"CREATED"
+4;"user1";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;-3;"CREATED"
+5;"user2";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;0;"CREATED"
+6;"user3";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;15;"CREATED"
+7;"user4";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;34;"CREATED"
+8;"user5";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;0;"CREATED"
+9;"user6";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;54;"CREATED"
+10;"user7";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;86;"CREATED"
+11;"user8";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;0;"CREATED"
+12;"user9";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;12;"CREATED"
+13;"user10";"noop{123}";"ROLE_VIEWER";"basic";;;;;;;;24;"CREATED"
diff --git a/db/v-2/tables/user.xml b/db/v-2/tables/user.xml
index e4bd47f55e..91604026c5 100644
--- a/db/v-2/tables/user.xml
+++ b/db/v-2/tables/user.xml
@@ -71,4 +71,21 @@
+
+
+
+
+
+
+
+
+
+ UPDATE user SET status = 'ACTIVE' WHERE is_active = 1;
+
+
+
+
+
+
+
diff --git a/save-backend/src/main/kotlin/com/saveourtool/save/backend/controllers/UsersDetailsController.kt b/save-backend/src/main/kotlin/com/saveourtool/save/backend/controllers/UsersDetailsController.kt
index 7d7b876e68..072ae677f6 100644
--- a/save-backend/src/main/kotlin/com/saveourtool/save/backend/controllers/UsersDetailsController.kt
+++ b/save-backend/src/main/kotlin/com/saveourtool/save/backend/controllers/UsersDetailsController.kt
@@ -114,7 +114,7 @@ class UsersDetailsController(
gitHub = newUserInfo.gitHub
linkedin = newUserInfo.linkedin
twitter = newUserInfo.twitter
- isActive = newUserInfo.isActive
+ status = newUserInfo.status
}, newUserInfo.oldName)
} else {
UserSaveStatus.CONFLICT
diff --git a/save-backend/src/test/kotlin/com/saveourtool/save/backend/controller/UsersControllerTest.kt b/save-backend/src/test/kotlin/com/saveourtool/save/backend/controller/UsersControllerTest.kt
index 629e766bcc..180beafb58 100644
--- a/save-backend/src/test/kotlin/com/saveourtool/save/backend/controller/UsersControllerTest.kt
+++ b/save-backend/src/test/kotlin/com/saveourtool/save/backend/controller/UsersControllerTest.kt
@@ -6,6 +6,7 @@ import com.saveourtool.save.domain.Role
import com.saveourtool.save.entities.OriginalLogin
import com.saveourtool.save.entities.User
import com.saveourtool.save.info.UserInfo
+import com.saveourtool.save.info.UserStatus
import com.saveourtool.save.v1
import org.junit.jupiter.api.Assertions
import org.junit.jupiter.api.Test
@@ -36,7 +37,7 @@ class UsersControllerTest {
Role.VIEWER.asSpringSecurityRole(),
"basic2",
null,
- isActive = false,
+ status = UserStatus.CREATED,
).apply { id = 99 }
val originalLogin = OriginalLogin(
diff --git a/save-backend/src/test/kotlin/com/saveourtool/save/backend/controller/UsersDetailsControllerTest.kt b/save-backend/src/test/kotlin/com/saveourtool/save/backend/controller/UsersDetailsControllerTest.kt
index b9076e1f62..79141a0220 100644
--- a/save-backend/src/test/kotlin/com/saveourtool/save/backend/controller/UsersDetailsControllerTest.kt
+++ b/save-backend/src/test/kotlin/com/saveourtool/save/backend/controller/UsersDetailsControllerTest.kt
@@ -5,6 +5,7 @@ import com.saveourtool.save.backend.SaveApplication
import com.saveourtool.save.backend.utils.InfraExtension
import com.saveourtool.save.backend.utils.mutateMockedUser
import com.saveourtool.save.info.UserInfo
+import com.saveourtool.save.info.UserStatus
import com.saveourtool.save.v1
import org.junit.jupiter.api.Test
import org.junit.jupiter.api.extension.ExtendWith
@@ -34,7 +35,7 @@ class UsersDetailsControllerTest {
source = "basic",
email = "example@save.com",
company = "Example",
- isActive = true,
+ status = UserStatus.ACTIVE,
)
webClient.post()
@@ -58,7 +59,7 @@ class UsersDetailsControllerTest {
oldName = "admin",
email = "example@save.com",
company = "Example",
- isActive = true,
+ status = UserStatus.ACTIVE,
)
webClient.post()
diff --git a/save-cloud-common/src/commonMain/kotlin/com/saveourtool/save/info/UserInfo.kt b/save-cloud-common/src/commonMain/kotlin/com/saveourtool/save/info/UserInfo.kt
index 85482701e5..35bfc3c30a 100644
--- a/save-cloud-common/src/commonMain/kotlin/com/saveourtool/save/info/UserInfo.kt
+++ b/save-cloud-common/src/commonMain/kotlin/com/saveourtool/save/info/UserInfo.kt
@@ -23,7 +23,7 @@ import kotlinx.serialization.Serializable
* @property organizations
* @property globalRole
* @property id
- * @property isActive
+ * @property status
* @property oldName is always null except for the process of renaming the user.
* @property originalLogins
* @property rating
@@ -46,7 +46,7 @@ data class UserInfo(
val gitHub: String? = null,
val twitter: String? = null,
val globalRole: Role? = null,
- val isActive: Boolean = false,
+ val status: UserStatus = UserStatus.CREATED,
val rating: Long = 0,
) : Validatable {
/**
diff --git a/save-cloud-common/src/commonMain/kotlin/com/saveourtool/save/info/UserStatus.kt b/save-cloud-common/src/commonMain/kotlin/com/saveourtool/save/info/UserStatus.kt
new file mode 100644
index 0000000000..5426ebb613
--- /dev/null
+++ b/save-cloud-common/src/commonMain/kotlin/com/saveourtool/save/info/UserStatus.kt
@@ -0,0 +1,28 @@
+package com.saveourtool.save.info
+
+import kotlinx.serialization.Serializable
+
+/**
+ * Enum of user status
+ *
+ * The order of the elements is used for sorting
+ */
+@Serializable
+@Suppress("WRONG_DECLARATIONS_ORDER")
+enum class UserStatus {
+ /**
+ * User created
+ */
+ CREATED,
+
+ /**
+ * User active
+ */
+ ACTIVE,
+
+ /**
+ * User deleted
+ */
+ DELETED,
+ ;
+}
diff --git a/save-cloud-common/src/jvmMain/kotlin/com/saveourtool/save/entities/User.kt b/save-cloud-common/src/jvmMain/kotlin/com/saveourtool/save/entities/User.kt
index d521e712ea..2798f960f4 100644
--- a/save-cloud-common/src/jvmMain/kotlin/com/saveourtool/save/entities/User.kt
+++ b/save-cloud-common/src/jvmMain/kotlin/com/saveourtool/save/entities/User.kt
@@ -2,13 +2,12 @@ package com.saveourtool.save.entities
import com.saveourtool.save.domain.Role
import com.saveourtool.save.info.UserInfo
+import com.saveourtool.save.info.UserStatus
import com.saveourtool.save.spring.entity.BaseEntity
import com.fasterxml.jackson.annotation.JsonIgnore
-import javax.persistence.Entity
-import javax.persistence.FetchType
-import javax.persistence.OneToMany
+import javax.persistence.*
/**
* @property name
@@ -22,7 +21,7 @@ import javax.persistence.OneToMany
* @property linkedin
* @property gitHub
* @property twitter
- * @property isActive
+ * @property status
* @property originalLogins
* @property rating rating of user
*/
@@ -40,7 +39,8 @@ class User(
var linkedin: String? = null,
var gitHub: String? = null,
var twitter: String? = null,
- var isActive: Boolean = false,
+ @Enumerated(EnumType.STRING)
+ var status: UserStatus = UserStatus.CREATED,
@OneToMany(
fetch = FetchType.EAGER,
mappedBy = "user",
@@ -69,7 +69,7 @@ class User(
gitHub = gitHub,
twitter = twitter,
location = location,
- isActive = isActive,
+ status = status,
rating = rating,
)
}
diff --git a/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/App.kt b/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/App.kt
index 450b19ad1b..1309b4713b 100644
--- a/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/App.kt
+++ b/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/App.kt
@@ -14,6 +14,7 @@ import com.saveourtool.save.frontend.http.getUser
import com.saveourtool.save.frontend.routing.basicRouting
import com.saveourtool.save.frontend.utils.*
import com.saveourtool.save.info.UserInfo
+import com.saveourtool.save.info.UserStatus
import com.saveourtool.save.validation.FrontendRoutes
import react.*
@@ -107,7 +108,7 @@ class App : ComponentWithScope() {
requestModalHandler {
userInfo = state.userInfo
- if (state.userInfo?.isActive == false) {
+ if (state.userInfo?.status == UserStatus.CREATED) {
Navigate {
to = "/${FrontendRoutes.REGISTRATION}"
replace = false
diff --git a/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/components/views/RegistrationView.kt b/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/components/views/RegistrationView.kt
index 94cc7cb5bc..db30fa73d7 100644
--- a/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/components/views/RegistrationView.kt
+++ b/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/components/views/RegistrationView.kt
@@ -13,6 +13,7 @@ import com.saveourtool.save.frontend.components.modal.MAX_Z_INDEX
import com.saveourtool.save.frontend.http.postImageUpload
import com.saveourtool.save.frontend.utils.*
import com.saveourtool.save.info.UserInfo
+import com.saveourtool.save.info.UserStatus
import com.saveourtool.save.utils.AvatarType
import com.saveourtool.save.v1
import com.saveourtool.save.validation.isValidName
@@ -63,7 +64,7 @@ val registrationView: FC = FC { props ->
val saveUser = useDeferredRequest {
val newUserInfo = userInfo.copy(
oldName = props.userInfo?.name!!,
- isActive = true,
+ status = UserStatus.ACTIVE,
)
val response = post(
"$apiUrl/users/save",
@@ -91,7 +92,7 @@ val registrationView: FC = FC { props ->
}
}
- if (props.userInfo?.isActive != false) {
+ if (props.userInfo?.status == UserStatus.ACTIVE) {
navigate("/", jso { replace = true })
}
diff --git a/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/components/views/usersettings/UserSettingsView.kt b/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/components/views/usersettings/UserSettingsView.kt
index ff34ae2b33..1439cc1692 100644
--- a/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/components/views/usersettings/UserSettingsView.kt
+++ b/save-frontend/src/main/kotlin/com/saveourtool/save/frontend/components/views/usersettings/UserSettingsView.kt
@@ -320,7 +320,7 @@ abstract class UserSettingsView : AbstractView