Content
Sebuah Content adalah satu data nyata yang dicetak dari Content Type (cetakannya). Ambil contoh toko pakaian: Content Type "Produk" menetapkan susunan atribut seperti nama produk, harga, dan deskripsi, sedangkan satu "Stainless Tumbler 500ml" adalah satu Content yang mengikuti kerangka tersebut.
Sebuah Content terdiri dari dua bagian. fields memuat nilai nyata dari setiap field, dan sys memuat status seperti publikasi, versi, dan pengarsipan. Pada CMA, Content adalah sub-resource dari Space. Jalur baca dan hapus mengacu pada /spaces/{spaceId}/contents, sedangkan jalur buat dan ubah mengacu pada /spaces/{spaceId}/content-types/{contentTypeId}/contents yang berada di bawah Content Type. Operasi pengelolaan dilakukan pada CMA, dan snapshot yang dipublikasikan dikirim melalui CDA.
Struktur resource
Berikut adalah respons baca tunggal untuk Content "Stainless Tumbler 500ml" yang sudah dipublikasikan. Bersama dengan sys (properti sistem), ia memiliki fields (nilai field) dan metadata (informasi tambahan seperti tag).
{
"sys": {
"id": "3trmXRM3RqbgSnifyg7PUl8DzDgDzP",
"type": "Content",
"space": { "sys": { "id": "HnQ32YiH", "type": "Refer", "targetType": "Space" } },
"contentType": { "sys": { "id": "3trmXRLdJF4GBlAjtcuoZ7Pnxj8dlA", "type": "Refer", "targetType": "ContentType" } },
"publish": {
"version": 1,
"at": "2026-06-18T09:51:44.128Z",
"firstAt": "2026-06-18T09:51:44.128Z",
"counter": 1,
"by": { "sys": { "id": "3p4tcFbQRwz503VXdtHXNI5dZH5TVB", "type": "Refer", "targetType": "User" } }
},
"createdBy": { "sys": { "id": "3p4tcFbQRwz503VXdtHXNI5dZH5TVB", "type": "Refer", "targetType": "User" } },
"createdAt": "2026-06-18T09:51:14.597Z",
"updatedBy": { "sys": { "id": "3p4tcFbQRwz503VXdtHXNI5dZH5TVB", "type": "Refer", "targetType": "User" } },
"updatedAt": "2026-06-18T09:51:44.128Z",
"version": 2,
"status": "Published"
},
"fields": {
"price": { "en-US": 18000 },
"productName": { "en-US": "Stainless Tumbler 500ml", "ko-KR": "스테인리스 텀블러 500ml" }
},
"metadata": { "tags": [] }
}Properti utama:
sys.id: Pengidentifikasi unik dari Content. Nilai ini masuk ke{contentId}pada jalur baca tunggal, ubah, hapus, dan publikasi.sys.contentType: SebuahReferyang menunjuk ke Content Type yang diikuti Content ini.fields: Nilai dari setiap field. Kuncinya adalahapiNamedari field, dan nilainya adalah peta per-locale. Hal ini dijelaskan di Kunci field adalah apiName di bawah.metadata.tags: Daftar Tag yang dilampirkan ke Content ini. Setiap entri berbentukRefer<Tag>, dan berupa array kosong[]jika tidak ada tag yang dilampirkan.
Kunci field adalah apiName
Kunci dari objek fields adalah apiName dari masing-masing field. Bukan id internal dari Content Type, bukan pula nama field yang ditampilkan di studio konten (mis. Nama Produk). Jadi saat membuat atau membaca Content, Anda harus memakai apiName yang didefinisikan pada Content Type sebagai kunci.
Field dari Content Type "Produk" demo dan pemetaan apiName-nya adalah sebagai berikut.
| Nama studio konten | apiName | type | localized | required |
|---|---|---|---|---|
| Nama Produk | productName | ShortText | true | true |
| Harga | price | Long | false | false |
| Deskripsi | description | RichText | true | false |
| Foto Utama | photo | Refer<Media> | false | false |
| Merek | brand | Refer | false | false |
Setiap nilai field adalah peta per-locale. Bentuk nilainya bergantung pada localized.
- Field
localized: truedapat menyimpan nilai untuk beberapa locale dalam bentuk{ "<locale>": nilai }. Contoh:"productName": { "en-US": "Stainless Tumbler 500ml", "ko-KR": "스테인리스 텀블러 500ml" }. - Field
localized: false(field non-lokalisasi) hanya menerima nilai di bawah satu kunci Locale default dari Space. Kunci locale lain tidak diperbolehkan. Karena Locale default Space demo adalahen-US, harga hanya memiliki satu kuncien-US, seperti pada"price": { "en-US": 18000 }.
Apa itu Locale default, hingga locale mana sebuah field required harus diisi, dan aturan fallback saat nilai tidak ada dibahas di Multibahasa (konsep).
Bentuk nilai per tipe
Bentuk nilai yang masuk ke dalam kunci locale mengikuti type dari field. Sebagian besar tipe menyimpan nilai dari tipe tersebut apa adanya (tipe teks berupa string, Number dan Long berupa angka, Boolean berupa true/false). Tipe yang nilainya berbentuk objek atau array sehingga mudah membingungkan adalah sebagai berikut.
Location: Berupa objek{ "latitude": <angka>, "longitude": <angka> }.latitudebernilai antara -90 dan 90,longitudeantara -180 dan 180, dan kedua kunci itu wajib ada. Selain kunci yang didefinisikan, tidak ada yang diterima, sehingga kunci singkat sepertilat,lng, ataulonakan ditolak.Refer: Nilainya adalah objekReferyang menunjuk ke target, dan Anda tidak memasukkan string id saja melainkan objeksysapa adanya. Jika menunjuk ke Content lain,targetType-nya adalahContent; jika menunjuk ke Media, nilainyaMedia. BentukReferitu sendiri didefinisikan di Bentuk Refer pada properti sistem (sys).Array: Berupa array JSON yang memuat nilai dari tipe elemennya. Jika elemennya teks, ia berupa array string; jika elemennyaRefer(Content atau Media), ia berupa array dari objekRefer. Bukan array dari string id.
Berikut adalah contoh nilai yang masuk ke dalam fields (saat Locale default Space adalah en-US).
{
"location": { "en-US": { "latitude": 37.5662, "longitude": 126.9910 } },
"tags": { "en-US": ["baru", "edisi terbatas"] },
"photo": { "en-US": { "sys": { "type": "Refer", "id": "3trmXRM3RqbgSnifyg7PUl8DzDgDzP", "targetType": "Media" } } },
"photos": { "en-US": [ { "sys": { "type": "Refer", "id": "3trmXRM3RqbgSnifyg7PUl8DzDgDzP", "targetType": "Media" } } ] }
}Properti sistem (sys)
Setiap Content membawa properti sistem bersama di dalam objek sys. space, contentType, createdBy, dan updatedBy berbentuk Refer ({ "sys": { "id", "type": "Refer", "targetType" } }).
| Properti | Tipe | Deskripsi |
|---|---|---|
id | string | Pengidentifikasi unik resource. |
type | string | Jenis resource. Untuk Content selalu "Content". |
space | Refer<Space> | Space tempat Content ini berada. |
contentType | Refer<ContentType> | Content Type yang diikuti Content ini. |
publish | object | Penunjuk status publikasi. Lihat kunci di bawah. |
archive | object | Informasi pengarsipan. Hanya ada saat sedang diarsipkan, selain itu kuncinya tidak ada. Lihat kunci di bawah. |
createdBy | Refer<User> | Pengguna yang membuat. |
createdAt | string (date-time) | Waktu pembuatan. |
updatedBy | Refer<User> | Pengguna yang terakhir mengubah. |
updatedAt | string (date-time) | Waktu perubahan terakhir. |
version | integer (≥1) | Versi resource. Naik 1 pada setiap perubahan seperti buat, ubah, publikasi, batal publikasi, dan arsip. |
status | string (enum) | Status publikasi. Salah satu dari 4 nilai di bawah. |
status adalah salah satu dari 4 nilai berikut.
status | Arti |
|---|---|
Draft | Sedang disusun dan belum dipublikasikan. |
Changed | Pernah dipublikasikan, tetapi setelah itu diubah sehingga ada perubahan yang belum dipublikasikan. |
Published | Sudah dipublikasikan dan tidak ada perubahan yang belum dipublikasikan. |
Archived | Sedang diarsipkan. |
Objek publish adalah penunjuk yang menandakan status publikasi. Saat sedang dipublikasikan, ia memiliki semua kunci berikut.
| Kunci | Tipe | Deskripsi |
|---|---|---|
version | integer | sys.version pada saat dipublikasikan. |
at | string (date-time) | Waktu publikasi terakhir. |
firstAt | string (date-time) | Waktu publikasi pertama. Tetap tersimpan meskipun publikasi dibatalkan. |
counter | integer | Jumlah kumulatif publikasi. |
by | Refer<User> | Pengguna yang terakhir mempublikasikan. |
Saat publikasi dibatalkan, version, at, dan by hilang dari publish dan hanya firstAt serta counter yang tersisa. Jika belum pernah dipublikasikan sama sekali, publish berisi { "counter": 0 }.
Objek archive hanya ada saat sedang diarsipkan. Saat diarsipkan, ia memiliki version (sys.version pada saat pengarsipan), at (waktu pengarsipan), dan by (pengguna yang mengarsipkan); jika tidak berstatus arsip, kunci archive itu sendiri tidak ada.
sys.version dan semua nilai waktu pada contoh di bawah adalah nilai pada saat pemanggilan sebenarnya, dan berbeda pada setiap pemanggilan.
Publikasi, versi, dan konkurensi
Siklus hidup Content adalah sebagai berikut.
- Saat dibuat,
statusadalahDraft.Contenttidak otomatis dipublikasikan saat dibuat. Inilah yang membedakannya dari Content Type. Content Type otomatis dipublikasikan bersamaan dengan pembuatannya, tetapi Content memerlukan pemanggilan publikasi terpisah agar masuk ke jalur pengiriman. - Saat dipublikasikan,
statusmenjadiPublished. - Jika diubah setelah dipublikasikan,
statusmenjadiChanged. Artinya ada perubahan yang belum dipublikasikan. - Saat publikasi dibatalkan,
statuskembali menjadiDraft. - Untuk mengarsipkan, Anda harus membatalkan publikasi terlebih dahulu. Content yang berstatus publikasi tidak dapat langsung diarsipkan.
sys.version naik 1 pada setiap perubahan.
Permintaan ubah, ubah sebagian, publikasi, batal publikasi, arsip, dan batal arsip harus menyertakan sys.version saat ini pada header x-weegloo-version. Jika nilai ini hilang atau tidak cocok dengan versi saat ini, hal itu dianggap sebagai konflik perubahan bersamaan dan permintaan ditolak. Permintaan buat dan hapus tidak memakai header ini. Transisi status seperti publikasi, batal publikasi, arsip, dan batal arsip tidak memiliki badan permintaan tersendiri.
Batas nilai
Selain validations yang dipasang pada Content Type, nilai field juga dikenai batas atas platform yang ditetapkan oleh tipe. Batas atas per tipe ada pada tabel Jenis field pada Content Type.
Batas atas ini diperiksa saat nilai ditulis ke Content, lalu diperiksa sekali lagi saat publikasi. Meskipun Anda menuliskan batas atas yang lebih besar melalui size pada validations, batas atas platform yang lebih dahulu berlaku, sehingga walaupun size.max pada field ShortText disetel 200, nilai ditolak mulai dari 65 karakter.
Waktu pemeriksaan validations berbeda-beda menurut itemnya. unique, mediaMimetypeGroup, mediaImageDimensions, mediaFileSize, dan referContentType hanya diperiksa pada publikasi. Item lainnya beserta batas atas tipe dan platform diperiksa baik pada penulisan maupun publikasi. Karena itu, nilai yang lolos penulisan dapat ditolak pada publikasi.
Location dan Refer tidak menerima kunci selain yang telah didefinisikan. Jika Anda memasukkan kunci singkat seperti lat atau kunci asing di bawah sys, nilai tersebut ditolak.
Error
Berikut adalah kode yang muncul dari validasi nilai field. Kode yang muncul dari publikasi, versi, dan transisi status belum dirangkum pada tabel ini. Untuk kode yang berlaku umum pada semua resource, lihat Error umum.
| Kode | Kondisi |
|---|---|
WGL400006 | Salah satu dari nilai field, kunci field, atau Locale pada badan permintaan melanggar aturan. Kode ini mencakup kasus nilai melewati batas tipe atau batas platform, kasus mengirim kunci field yang tidak didefinisikan pada Content Type, kasus nilai field required yang hilang, dan kasus memakai kunci Locale yang tidak ada pada Space. Item yang melanggar dimuat pada details.errors di respons beserta jalur field-nya. Pembuatan, penyuntingan, penyuntingan parsial, dan publikasi semuanya menjalani pemeriksaan ini, dan cakupan pemeriksaan pada publikasi lebih luas. |
API
URL dasar untuk semua endpoint di bawah adalah https://cma.weegloo.com/v1, dan diperlukan token Bearer yang mengautentikasi ke CMA pada header Authorization. Ubah, ubah sebagian, publikasi, batal publikasi, arsip, dan batal arsip harus mengirimkan header X-Weegloo-Version (sys.version resource saat ini) untuk kontrol konkurensi optimistis.
Saat memfilter atau mengurutkan daftar /contents (GET /spaces/{spaceId}/contents) dengan fields.*, Content Type juga harus ditentukan dengan sys.contentType.sys.id={contentTypeId}. Bentuk contentType={contentTypeId} tidak dapat menggantikannya. Path /content-types/{contentTypeId}/contents sudah mencantumkan Content Type pada path, sehingga tidak perlu ditentukan secara terpisah.
Dokumen terkait
- Content Type: Kerangka dari Content ini (definisi field, apiName).
- CDA Content: Mengirimkan Content yang dipublikasikan ke pengunjung (baca).
- Tag: Label klasifikasi yang dilampirkan pada metadata.tags.
- Multibahasa (konsep): Locale default, pengisian wajib, fallback.
