Yomu
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

EndpointMethodKeterangan
/api/v1/users/meGETProfil pengguna saat ini
/api/v1/users/batchGETBatch lookup berdasarkan beberapa user ID
/api/v1/users/mePATCHPerbarui profil (nama, telepon, email)
/api/v1/users/me/passwordPATCHGanti password
/api/v1/users/me/login-identifiersPATCHPerbarui email atau nomor telepon
/api/v1/users/meDELETESoft 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

FieldTypeKeteranganConstraints
userIdUUIDPrimary keyAuto-generated, UUID v4
usernameStringIdentifier login unikNon-null, unik, case-sensitive
displayNameStringNama pengguna yang ditampilkanNon-null, dapat berisi spasi
emailStringAlamat emailUnik, nullable
phoneNumberStringNomor teleponUnik, nullable
passwordHashStringPassword yang di-hash dengan BCryptNullable (pengguna SSO-only)
roleRole enumTingkat otoritas penggunaPELAJAR atau ADMIN
googleSubStringSubjek autentikasi GoogleUnik, nullable
createdAtInstantTimestamp pembuatan akunAuto-set saat insert
updatedAtInstantTimestamp pembaruan terakhirAuto-set saat update
deletedAtInstantTimestamp soft deleteNULL = 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-null
  • phoneNumber: String, unik, opsional
  • email: String, unik, opsional

Ganti Password (PATCH /api/v1/users/me/password)

  • oldPassword: Password saat ini untuk verifikasi
  • newPassword: 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 unik
  • phoneNumber: Nomor telepon baru, harus unik
  • Pengguna SSO-only (passwordHash null) dapat memperbarui identifier

Perilaku Soft Delete

Ketika pengguna melakukan soft-delete:

  1. deleted_at diatur ke Instant saat ini
  2. Semua query memfilter dengan deletedAt IS NULL
  3. Pengguna tidak dapat login (query aktif mengembalikan tidak ditemukan)
  4. Pengguna Google OAuth SSO tetap dapat di-soft-delete
  5. Flag deleted tetap ada untuk audit trail

On this page