From c15e0f456ec49a6ca8e908b45bb64a0869381e7f Mon Sep 17 00:00:00 2001 From: pricelees Date: Thu, 11 Sep 2025 16:26:16 +0900 Subject: [PATCH] =?UTF-8?q?feat:=20=ED=9A=8C=EC=9B=90,=20=EA=B4=80?= =?UTF-8?q?=EB=A6=AC=EC=9E=90=20=EB=B0=8F=20=EC=83=81=ED=83=9C=20/=20?= =?UTF-8?q?=EB=A1=9C=EA=B7=B8=EC=9D=B8=20=EB=B3=80=EA=B2=BD=20=EC=9D=B4?= =?UTF-8?q?=EB=A0=A5=20Entity=20=EC=A0=95=EC=9D=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../infrastructure/persistence/AdminEntity.kt | 55 +++++++++++++++++++ .../persistence/AdminRepository.kt | 5 ++ .../persistence/LoginHistoryEntity.kt | 28 ++++++++++ .../persistence/LoginHistoryRepository.kt | 5 ++ .../persistence/UserEntities.kt | 46 ++++++++++++++++ .../persistence/UserRepositories.kt | 7 +++ 6 files changed, 146 insertions(+) create mode 100644 src/main/kotlin/roomescape/admin/infrastructure/persistence/AdminEntity.kt create mode 100644 src/main/kotlin/roomescape/admin/infrastructure/persistence/AdminRepository.kt create mode 100644 src/main/kotlin/roomescape/auth/infrastructure/persistence/LoginHistoryEntity.kt create mode 100644 src/main/kotlin/roomescape/auth/infrastructure/persistence/LoginHistoryRepository.kt create mode 100644 src/main/kotlin/roomescape/member/infrastructure/persistence/UserEntities.kt create mode 100644 src/main/kotlin/roomescape/member/infrastructure/persistence/UserRepositories.kt diff --git a/src/main/kotlin/roomescape/admin/infrastructure/persistence/AdminEntity.kt b/src/main/kotlin/roomescape/admin/infrastructure/persistence/AdminEntity.kt new file mode 100644 index 00000000..5f98745e --- /dev/null +++ b/src/main/kotlin/roomescape/admin/infrastructure/persistence/AdminEntity.kt @@ -0,0 +1,55 @@ +package roomescape.admin.infrastructure.persistence + +import jakarta.persistence.Entity +import jakarta.persistence.EntityListeners +import jakarta.persistence.EnumType +import jakarta.persistence.Enumerated +import jakarta.persistence.Table +import org.springframework.data.jpa.domain.support.AuditingEntityListener +import roomescape.common.entity.AuditingBaseEntity + +@Entity +@Table(name = "admin") +@EntityListeners(AuditingEntityListener::class) +class AdminEntity( + id: Long, + + val account: String, + var password: String, + val name: String, + var phone: String, + + @Enumerated(value = EnumType.STRING) + var permissionLevel: AdminPermissionLevel + +) : AuditingBaseEntity(id) + +enum class AdminPermissionLevel( + val privileges: Set +) { + FULL_ACCESS( + privileges = setOf(Privilege.MANAGE) + ), + WRITABLE( + privileges = (Privilege.entries.toSet() - Privilege.MANAGE) + ), + READ_ALL( + privileges = setOf(Privilege.READ_DETAIL, Privilege.READ_SUMMARY) + ), + READ_SUMMARY( + privileges = setOf(Privilege.READ_SUMMARY) + ); + + fun hasPrivilege(privilege: Privilege): Boolean { + return this == FULL_ACCESS || this.privileges.contains(privilege) + } +} + +enum class Privilege { + MANAGE, + CREATE, + UPDATE, + DELETE, + READ_DETAIL, + READ_SUMMARY, +} diff --git a/src/main/kotlin/roomescape/admin/infrastructure/persistence/AdminRepository.kt b/src/main/kotlin/roomescape/admin/infrastructure/persistence/AdminRepository.kt new file mode 100644 index 00000000..fd86eedf --- /dev/null +++ b/src/main/kotlin/roomescape/admin/infrastructure/persistence/AdminRepository.kt @@ -0,0 +1,5 @@ +package roomescape.admin.infrastructure.persistence + +import org.springframework.data.jpa.repository.JpaRepository + +interface AdminRepository : JpaRepository \ No newline at end of file diff --git a/src/main/kotlin/roomescape/auth/infrastructure/persistence/LoginHistoryEntity.kt b/src/main/kotlin/roomescape/auth/infrastructure/persistence/LoginHistoryEntity.kt new file mode 100644 index 00000000..126e6a9e --- /dev/null +++ b/src/main/kotlin/roomescape/auth/infrastructure/persistence/LoginHistoryEntity.kt @@ -0,0 +1,28 @@ +package roomescape.auth.infrastructure.persistence + +import jakarta.persistence.* +import org.springframework.data.annotation.CreatedDate +import org.springframework.data.jpa.domain.support.AuditingEntityListener +import roomescape.common.dto.PrincipalType +import roomescape.common.entity.PersistableBaseEntity +import java.time.LocalDateTime + +@Entity +@Table(name = "login_history") +@EntityListeners(AuditingEntityListener::class) +class LoginHistoryEntity( + id: Long, + + val principalId: Long, + + @Enumerated(value = EnumType.STRING) + val principalType: PrincipalType, + + val success: Boolean, + val ipAddress: String, + val userAgent: String, + + @Column(updatable = false) + @CreatedDate + var createdAt: LocalDateTime? = null, +) : PersistableBaseEntity(id) diff --git a/src/main/kotlin/roomescape/auth/infrastructure/persistence/LoginHistoryRepository.kt b/src/main/kotlin/roomescape/auth/infrastructure/persistence/LoginHistoryRepository.kt new file mode 100644 index 00000000..5f131468 --- /dev/null +++ b/src/main/kotlin/roomescape/auth/infrastructure/persistence/LoginHistoryRepository.kt @@ -0,0 +1,5 @@ +package roomescape.auth.infrastructure.persistence + +import org.springframework.data.jpa.repository.JpaRepository + +interface LoginHistoryRepository : JpaRepository \ No newline at end of file diff --git a/src/main/kotlin/roomescape/member/infrastructure/persistence/UserEntities.kt b/src/main/kotlin/roomescape/member/infrastructure/persistence/UserEntities.kt new file mode 100644 index 00000000..407a83a1 --- /dev/null +++ b/src/main/kotlin/roomescape/member/infrastructure/persistence/UserEntities.kt @@ -0,0 +1,46 @@ +package roomescape.member.infrastructure.persistence + +import jakarta.persistence.* +import roomescape.common.entity.AuditingBaseEntity + +@Entity +@Table(name = "users") +class UserEntity( + id: Long, + + val name: String, + + @Column(unique = true) + val email: String, + + var password: String, + + @Column(unique = true) + var phone: String, + + var regionCode: String?, + + @Enumerated(value = EnumType.STRING) + var status: UserStatus +): AuditingBaseEntity(id) { + + fun updateStatus(status: UserStatus) { + this.status = status + } +} + +@Entity +@Table(name = "user_status_history") +class UserStatusHistoryEntity( + id: Long, + + val userId: Long, + val reason: String, + + @Enumerated(value = EnumType.STRING) + val status: UserStatus, +) : AuditingBaseEntity(id) + +enum class UserStatus { + ACTIVE, DORMANT, WITHDRAWN, SUSPENDED +} diff --git a/src/main/kotlin/roomescape/member/infrastructure/persistence/UserRepositories.kt b/src/main/kotlin/roomescape/member/infrastructure/persistence/UserRepositories.kt new file mode 100644 index 00000000..e9aee97b --- /dev/null +++ b/src/main/kotlin/roomescape/member/infrastructure/persistence/UserRepositories.kt @@ -0,0 +1,7 @@ +package roomescape.member.infrastructure.persistence + +import org.springframework.data.jpa.repository.JpaRepository + +interface UserRepository : JpaRepository + +interface UserStatusHistoryRepository : JpaRepository