Java Backend
Manajemen Pengguna
Manajemen profil pengguna — lihat, perbarui, batch lookup, dan penghapusan akun
Modul manajemen pengguna menyediakan endpoint REST untuk operasi profil pengguna termasuk melihat, memperbarui, batch lookup, dan soft delete akun. Semua endpoint memerlukan autentikasi JWT.
Endpoint UserController
| Endpoint | Method | Keterangan |
|---|---|---|
/api/v1/users/me | GET | Profil pengguna saat ini |
/api/v1/users/batch | GET | Batch lookup berdasarkan beberapa user ID |
/api/v1/users/me | PATCH | Perbarui profil (nama, telepon, email) |
/api/v1/users/me/password | PATCH | Ganti password |
/api/v1/users/me/login-identifiers | PATCH | Perbarui email atau nomor telepon |
/api/v1/users/me | DELETE | Soft delete akun |
Endpoint /api/v1/users/batch memerlukan autentikasi JWT dan mendukung maksimal 100 user ID per request melalui query parameter ids=uuid1,uuid2,....
Model UserEntity
@Entity
@Table(name = "users")
public class UserEntity {
@Id
@GeneratedValue
@UuidGenerator
@Column(name = "user_id")
private UUID userId;
@Column(name = "username", nullable = false, unique = true)
private String username;
@Column(name = "display_name", nullable = false)
private String displayName;
@Column(name = "email", unique = true)
private String email;
@Column(name = "phone_number", unique = true)
private String phoneNumber;
@Column(name = "password_hash")
private String passwordHash;
@Enumerated(EnumType.STRING)
@Column(name = "role", nullable = false)
private Role role;
@Column(name = "google_sub", unique = true)
private String googleSub;
@Column(name = "created_at", nullable = false)
private Instant createdAt;
@Column(name = "updated_at", nullable = false)
private Instant updatedAt;
@Column(name = "deleted_at")
private Instant deletedAt;
}Deskripsi Field
| Field | Type | Keterangan | Constraints |
|---|---|---|---|
userId | UUID | Primary key | Auto-generated, UUID v4 |
username | String | Identifier login unik | Non-null, unik, case-sensitive |
displayName | String | Nama pengguna yang ditampilkan | Non-null, dapat berisi spasi |
email | String | Alamat email | Unik, nullable |
phoneNumber | String | Nomor telepon | Unik, nullable |
passwordHash | String | Password yang di-hash dengan BCrypt | Nullable (pengguna SSO-only) |
role | Role enum | Tingkat otoritas pengguna | PELAJAR atau ADMIN |
googleSub | String | Subjek autentikasi Google | Unik, nullable |
createdAt | Instant | Timestamp pembuatan akun | Auto-set saat insert |
updatedAt | Instant | Timestamp pembaruan terakhir | Auto-set saat update |
deletedAt | Instant | Timestamp soft delete | NULL = aktif, Instant = dihapus |
Enum Role
Pengguna memiliki salah satu dari dua role:
public enum Role {
PELAJAR, // Pelajar - default untuk pengguna biasa
ADMIN // Administrator - akses penuh
}Query JPA UserRepository
Repository menyediakan custom query berikut:
// Cari berdasarkan identifier dengan filter deleted
findByEmailAndDeletedAtIsNull(String email)
findByPhoneNumberAndDeletedAtIsNull(String phoneNumber)
findByUsernameAndDeletedAtIsNull(String username)
// Cari berdasarkan identifier termasuk yang di-soft-delete
findByEmail(String email)
findByPhoneNumber(String phoneNumber)
findByUsername(String username)
// Google OAuth
findByGoogleSub(String googleSub)
// Batch lookup
findAllByUserIdIn(List<UUID> userIds)Field deletedAt diperiksa dengan IS NULL untuk query aktif dan secara eksplisit diperiksa untuk pengguna yang di-soft-delete. Ini mencegah pengguna yang di-soft-delete dari login atau muncul dalam pencarian.
Batasan Pembaruan Profil
Perbarui Profil (PATCH /api/v1/users/me)
displayName: String, non-nullphoneNumber: String, unik, opsionalemail: String, unik, opsional
Ganti Password (PATCH /api/v1/users/me/password)
oldPassword: Password saat ini untuk verifikasinewPassword: Minimum 8 karakter- Hanya pengguna dengan
passwordHash(non-SSO) yang dapat mengganti password
Perbarui Login Identifiers (PATCH /api/v1/users/me/login-identifiers)
email: Email baru, harus unikphoneNumber: Nomor telepon baru, harus unik- Pengguna SSO-only (passwordHash null) dapat memperbarui identifier
Perilaku Soft Delete
Ketika pengguna melakukan soft-delete:
deleted_atdiatur keInstantsaat ini- Semua query memfilter dengan
deletedAt IS NULL - Pengguna tidak dapat login (query aktif mengembalikan tidak ditemukan)
- Pengguna Google OAuth SSO tetap dapat di-soft-delete
- Flag deleted tetap ada untuk audit trail