Request Validation

Pada custom script dengan jenis trigger Remote function dan HTTP (Webhook & Raw), pengembang dapat menuliskan validation script (validation.gql) untuk melakukan validasi terhadap request data. Penulisan validation script menggunakan sintaks DSL dari GraphQL yang kemudian dikonversi secara otomatis menjadi JSON-Schema.

Terdapat dua buah default type yang digunakan dalam file validator:

  • query
    setiap property pada bagian ini mendefinisikan validasi pada query parameter (query string).
  • body
    setiap property pada bagian ini mendefinisikan validasi pada request body.

Built-in types

Scalar

Scalar merupakan tipe primitif seperti dalam bahasa pemrograman lainnya. Daftar scalar yang didukung adalah:

  • Int: bilangan bulat (Integer)
  • Float: bilangan riil (Floating)
  • String: baris karakter
  • Boolean: true or false
  • ID: ekivalen dengan string

Enum

Enum merupakan salah satu tipe data yang hanya bisa memiliki nilai sesuai dengan daftar elemen yang didefinisikan sebelumnya. Definisi yang dibuat menggunakan tipe string.

enum Warna {
MERAH
HIJAU
BIRU
}

List

List merupakan representasi sebuah array berisi tipe lain.

Misalnya pada contoh berikut:

  1. penulis adalah field berisi array of string dan tidak boleh memiliki element yang berisi null
  2. telepon adalah field berisi array of string atau null
penulis: [String!]
telepon: [String]!

Union

Union merupakan tipe di mana sebuah field dapat berisi lebih dari satu jenis tipe.

union Jenis = Buku | Penulis
type Buku {
judul: String
}
type Penulis {
nama: String
}

Validation directives

Pengembang dapat menambahkan directive @validate beserta argumen di dalam file validator untuk membuat validasi yang lebih spesifik. Argumen yang didukung merujuk pada spesifikasi JSON-Schema.

Penggunaan @validate tidak wajib. Pengembang dapat menambahkan jika memang diperlukan.

Int dan Float

argumentketerangan
minimumnilai minimum yang dibolehkan (number)
maximumnilai maksimum yang dibolehkan (number)

String

argumentketerangan
maxLengthpanjang string maksimum (number)
minLengthpanjang string minimum (number)
patternregex untuk validasi konten / format dengan format yang merujuk pada penggunaan RegExp
formatjenis format penulisan: date, time, date-time, uri, email, hostname, ipv4, ipv6, regex, uuid

List

argumentketerangan
maxItemsjumlah elemen maksimum dalam array/list (number)
minItemsjumlah elemen minimum dalam array/list (number)
uniqueItemselemen dalam list/array harus unik (boolean)

Contoh

Validasi pada data (body)

Pada contoh ini, field totalHalaman tidak wajib.

// HTTP request body dari client
// diakses via ctx.data
{
penulis:"Andi Rowling",
judul:"Hari Porter: Sapu Terbang",
totalHalaman:320
}
### Validator
type body {
penulis: String!
judul: String!
totalHalaman: Int
}

Validasi pada query parameter

// Query parameters dari HTTP request yang dikirimkan client
// diakses via ctx.query
"idBuku=ba943127-a737-4c17-9173-8381234c1382&lastPage=121";
### Validator
type query {
idBuku: ID! @validate(format: "uuid")
lastPage: Int!
}

Validasi dengan complex types & lists pada data (body)

// request object
{
judul: "Deep Learning for babbies",
penulis: [
{
nama: "wajib diisi",
email: "wajib@format-email.com"
}
],
totalHalaman: 50,
hakMilik: "NEGARA"
}
### Validator
type body {
judul: String!
penulis: [DataPenulis]! @validate(minItems: 1, uniqueItems: true)
tahunTerbit: String @validate(pattern: "\\d{4}")
totalHalaman: Int!
hakMilik: KepemilikanBuku!
}
type DataPenulis {
nama: String!
alias: String
alamat: String
email: String @validate(format: "email")
}
enum KepemilikanBuku {
PRIBADI
UMUM
NEGARA
}