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