tutorial

18 Definisi Tipe Data User di Skema GraphQL

18 Definisi Tipe Data User di Skema GraphQL

Di era aplikasi modern yang membangun komunikasi client-server semakin cepat, GraphQL semakin menjadi primadona dalam mendefinisikan data. Salah satu kunci sukses dalam implementasi GraphQL di sisi server adalah mendefinisikan skema tipe data yang robust, jelas, dan tetap fleksibel. Pada artikel ini, kita akan mengupas tuntas 18 definisi tipe data pada entitas User yang umum digunakan pada skema GraphQL profesional, termasuk contoh kode, simulasi query, serta visualisasi alur data agar makin mudah dipahami.


Mengapa Definisi Tipe Data Sangat Penting di GraphQL?

GraphQL bekerja berdasarkan schema first, artinya kontrak antara back-end dan front-end sudah harus disepakati sebelum pengembangan lanjut. Definisi tipe data yang kuat membantu:

  • Menstandarisasi struktur payload melalui tipe yang jelas.
  • Memudahkan validasi data di sisi server dan client.
  • Mengurangi bug akibat salah interpretasi field.
  • Menyempurnakan API documentation otomatis.

18 Definisi Tipe Data User di GraphQL

Mari simulasikan bersama, inilah tipe data User yang kerap muncul dalam skema business logic modern:

#FieldTypeDeskripsi
1idID!User ID unik (tidak bisa null, biasanya UUID)
2usernameString!Username unik
3emailString!Email user (biasanya harus unik)
4fullNameStringNama lengkap
5phoneStringNomor telepon, opsional
6avatarUrlStringURL foto profil, opsional
7bioStringBiodata atau deskripsi singkat, opsional
8createdAtDateTime!Timestamp user dibuat
9updatedAtDateTime!Timestamp terakhir diperbarui
10lastLoginDateTimeTimestamp login terakhir, opsional
11roles[UserRole!]!Array peran user, minimal ["USER"]
12isActiveBoolean!User apakah aktif / suspend
13addressAddressAlamat terkait, opsional
14settingsUserSettingsPreferensi user, opsional (dark mode, dll)
15posts[Post!]!Daftar post milik user
16followersCountInt!Total followers
17followingCountInt!Total yang di-follow
18friends[User!]!Relasi dengan user lain; contoh: fitur pertemanan

Catatan: Field opsional tidak wajib dikembalikan server, sehingga perlu penanganan nullability yang kuat di client.


Contoh Definisi Skema GraphQL

Langsung saya tunjukkan definisi skema lengkapnya dalam GraphQL SDL (schema definition language):

scalar DateTime

enum UserRole {
  USER
  ADMIN
  MODERATOR
}

type Address {
  street: String
  city: String
  province: String
  postalCode: String
  country: String
}

type UserSettings {
  theme: String
  notifications: Boolean
}

type Post {
  id: ID!
  title: String!
  content: String!
  createdAt: DateTime!
}

type User {
  id: ID!
  username: String!
  email: String!
  fullName: String
  phone: String
  avatarUrl: String
  bio: String
  createdAt: DateTime!
  updatedAt: DateTime!
  lastLogin: DateTime
  roles: [UserRole!]!
  isActive: Boolean!
  address: Address
  settings: UserSettings
  posts: [Post!]!
  followersCount: Int!
  followingCount: Int!
  friends: [User!]!
}

Simulasi Query: Ambil Data User

Misalkan client ingin mengambil data user sekaligus detail postingan dan teman-temannya:

query {
  user(id: "user-123") {
    id
    username
    fullName
    email
    createdAt
    roles
    isActive
    posts {
      id
      title
      createdAt
    }
    friends {
      id
      username
    }
  }
}

Respons yang dikirim server bisa seperti:

{
  "data": {
    "user": {
      "id": "user-123",
      "username": "john_doe",
      "fullName": "John Doe",
      "email": "john@example.com",
      "createdAt": "2024-06-10T15:30:00Z",
      "roles": ["USER"],
      "isActive": true,
      "posts": [
        { "id": "p1", "title": "Hello GraphQL", "createdAt": "2024-05-01T09:00:00Z" }
      ],
      "friends": [
        { "id": "user-234", "username": "jane_smith" }
      ]
    }
  }
}

Diagram Relasi Antartipe: Mermaid

Agar lebih gamblang, berikut diagram relasi antartipe pada skema di atas:

erDiagram
    User ||..o| Post : creates
    User ||..|| Address : has
    User ||..|| UserSettings : owns
    User ||..o| User : friends-with
    User }o--|{ UserRole : has

Penjelasan:

  • UserPost: Satu user bisa punya banyak post.
  • UserAddress & UserSettings: Setiap user bisa memiliki satu alamat dan satu preferensi settings.
  • UserUser: Relasi teman antaruser.
  • UserUserRole: Satu user dapat punya beberapa peran.

Best Practice dalam Mendefinisikan Schema User

  1. Nullable Field: Gunakan field nullable (String, tanpa tanda !) untuk informasi tidak wajib (misal bio, avatarUrl).
  2. Enum dan Array: Untuk field seperti roles, gunakan enum agar hanya value tertentu yang diperbolehkan.
  3. Relasi Tipe Lain: Tipe User bisa memiliki relasi ke tipe lain (posts, address, settings) untuk normalisasi data.
  4. Count Field: Selalu pisahkan field relasi array (posts, friends) dengan count-nya (followersCount) agar efisien di front-end.
  5. Timestamp: Pakai scalar DateTime dengan standar ISO 8601.
  6. Recursive Field: Relasi friends: [User!]! mendukung fitur pertemanan mutual.
  7. Security: Jangan expose password atau token di schema!

Studi Kasus: Flow Registrasi User Baru

Mari kita simulasikan flow pendaftaran user baru dengan field minimum:

sequenceDiagram
    participant C as Client
    participant S as GraphQL Server
    C->>S: mutation { registerUser(username, email, password) }
    S-->>C: { id, username, email, createdAt, roles }

Pada flow di atas, server hanya mengembalikan field yang diperlukan client setelah registrasi. Field lain seperti friends, address, dan settings dapat dilengkapi nanti setelah login.


Penutup

Mendefinisikan tipe data pada skema GraphQL adalah fondasi utama untuk membangun API yang terstruktur, konsisten, dan scalable. Tipe User sangat penting karena hampir setiap produk digital modern—dari SaaS, marketplace, hingga social network—berbasis pada entitas user yang kaya informasi dan relasi.

Mulai dari 18 definisi field di atas, Anda dapat memperluas tipe User sesuai kebutuhan spesifik bisnis. Namun pastikan Anda selalu menjaga clean schema, strong typing, dan pikirkan nullability dari awal. Implementasi best practice pada schema GraphQL tidak hanya mempercepat development, tetapi juga meningkatkan pengalaman developer front-end maupun QA di masa depan.

Sudah waktunya bekerja dengan schema yang proper! 🚀


Sumber & Referensi:

comments powered by Disqus