Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Rayfin SDK menggunakan model pemrograman berbasis dekorator di mana Anda cukup satu kali menentukan skema data di TypeScript dan secara otomatis mendapatkan API siap produksi, klien yang aman secara tipe, serta infrastruktur.
Konsep Utama
Rayfin SDK menggabungkan tiga elemen inti:
- Skema berbasis dekorator: Gunakan dekorator TypeScript untuk menentukan model data, izin, dan hubungan.
- Pembuatan API otomatis: Kelas yang didekorasi menjadi titik akhir GraphQL tanpa menulis kode pengontrol.
- Klien yang aman terhadap tipe: Klien TypeScript yang dihasilkan menyediakan validasi pada waktu kompilasi untuk kueri dan mutasi.
Cara kerjanya
Saat Anda membuat aplikasi Fabric, kode Anda mengalir melalui tahap ini:
| # | Stage | Apa yang terjadi |
|---|---|---|
| 1 | Pengembang | Anda menulis aplikasi di editor pilihan Anda. |
| 2 | TypeScript | Anda menulis kelas entitas di TypeScript. |
| 3 | Decorators | Anda membuat anotasi kelas dan kolom dengan @entity, @uuid, @text, @role, dan dekorator lainnya. |
| 4 | Schema | CLI mengkompilasi kelas yang didekorasi ke dalam skema database, kebijakan izin, dan konfigurasi API. |
| 5 | Antarmuka Pemrograman Aplikasi (API) | Skema diterbitkan sebagai titik akhir GraphQL. |
| 6 | Client |
RayfinClient yang dihasilkan menyediakan klien data dan autentikasi yang aman secara tipe melalui endpoint tersebut. |
| 7 | Application | Aplikasi frontend Anda menggunakan klien untuk membaca dan menulis data. |
1. Definisikan model data dengan dekorator
Anda menentukan struktur data anda menggunakan kelas TypeScript dan dekorator dari @microsoft/rayfin-core:
scaffold default blankapp mengarah ke ruang kerja Universal App. Aktifkan Data dengan npm run pack:add -- data-modeling, definisikan entitas di packages/data/src/, daftarkan kelas runtime di packages/data/src/index.ts, dan pertahankan kontrak yang berhadapan langsung dengan klien di packages/shared/src/index.ts. Template flat dapat menggunakan rayfin/data/ dan rayfin/data/schema.ts sebagai gantinya. Path layanan dalam rayfin/rayfin.yml menentukan tata letak mana yang dibangun oleh CLI.
import { entity, uuid, text, int } from '@microsoft/rayfin-core';
@entity()
export class Product {
@uuid() id!: string;
@text({ max: 200 }) name!: string;
@text({ optional: true, max: 2000 }) description?: string;
@int() price!: number;
}
2. Pembuatan skema
Rayfin CLI (npx rayfin) menganalisis kelas yang Anda dekorasi dan menghasilkan:
- Skema database - Tabel, kolom, batasan, dan indeks
- Konfigurasi API - Definisi titik akhir GraphQL
- Kebijakan izin - Keamanan tingkat baris dan kontrol akses tingkat bidang
3. Penggunaan klien yang aman secara tipe
API GraphQL tersedia untuk melakukan operasi CRUD pada database Anda. Rayfin SDK menyediakan operasi klien data di luar kotak untuk membaca atau menulis atau menghapus data.
import { RayfinClient } from '@microsoft/rayfin-client';
import type { UniversalAppSchema } from '@rayfin-app/shared';
const client = new RayfinClient<UniversalAppSchema>({
baseUrl: import.meta.env.VITE_RAYFIN_API_URL,
publishableKey: import.meta.env.VITE_RAYFIN_PUBLISHABLE_KEY,
});
// Register Product in the data package and shared schema first.
const products = await client.data.Product
.select(['id', 'name', 'price'])
.execute();
// Compile-time error if field doesn't exist
const invalid = await client.data.Product
.select(['nonexistentField']) // ❌ TypeScript error
.execute();
Referensi dekorator
Rayfin SDK menyediakan dekorator untuk pola pemodelan data umum:
Dekorator Entitas
| Dekorator | Kegunaan | Example |
|---|---|---|
@entity() |
Menandai kelas sebagai entitas database | @entity() class Product |
Dekorator properti
| Dekorator | Jenis database | Jenis TypeScript |
|---|---|---|
@uuid() |
UNIQUEIDENTIFIER | string |
@text({ max: n }) |
NVARCHAR(n) | string |
@int() |
INT | number |
@decimal() |
DECIMAL | number |
@bool() |
BIT | boolean |
@date() |
DATETIME2 | Date |
Dekorator izin
| Dekorator | Kegunaan |
|---|---|
@role() |
Menentukan izin berbasis peran |
Lihat Menentukan izin data untuk detail otorisasi.
Functions
Buat satu UserDataFunctions instance, dan daftarkan setiap fungsi dengan memanggil udf.func(name, handler, connections?).
Ikuti aturan berikut saat Anda mendefinisikan sebuah fungsi:
- Tempatkan parameter
RayfinContextdi mana saja dalam signature handler. Runtime mengidentifikasinya berdasarkan tipe, menyuntikkannya, dan mengecualikannya dari input fungsi yang dihasilkan. - Deklarasikan audiens resource eksternal di
RayfinContext<Schema, Audiences>dan gunakan token resource milik identitas aplikasi melaluictx.Tokens. Teruskan[]sebagai argumen ketiga saat mendeklarasikan audiens tersebut denganudf.func(). Lihat Hubungkan Fungsi ke sumber daya eksternal.
Contoh berikut mendaftarkan fungsi biasa dan fungsi yang menggunakan konteks pemanggilan:
import {
UserDataFunctions,
type RayfinContext,
} from '@microsoft/fabric-user-data-functions';
import type { UniversalAppSchema } from '@rayfin-app/shared';
const udf = new UserDataFunctions();
udf.func('greet', async (name: string): Promise<string> => {
return `Hello, ${name}!`;
});
udf.func(
'whoAmI',
async (ctx: RayfinContext<UniversalAppSchema>): Promise<string> => {
return ctx.accessToken ? 'authenticated' : 'anonymous';
},
);
RayfinContext menyediakan layanan runtime fungsi:
| Anggota | Kegunaan |
|---|---|
ctx.accessToken |
Menyediakan Rayfin JSON Web Token (JWT) milik pengguna yang masuk. Pecahkan sub klaim untuk mendapatkan ID pengguna yang stabil. |
ctx.Tokens.<Audience> |
Mendapatkan token sumber daya yang disediakan platform untuk audiens yang dideklarasikan dalam anotasi RayfinContext. Fungsi yang Terdeploy menggunakan identitas aplikasi dan izinnya. Untuk detail, lihat Hubungkan Fungsi ke sumber daya eksternal. |
ctx.getSecret('NAME') |
Mendapatkan rahasia untuk invokasi saat ini. Mengembalikan undefined jika rahasia tidak ditetapkan. |
ctx.getDataClient() |
Mendapatkan API data yang diketik untuk entitas Anda. Klien mendukung operasi buat, findMany, perbarui, hapus, dan upsert. |
ctx.baseUrl |
Menyediakan endpoint Rayfin untuk item saat ini. |
ctx.publishableKey |
Menyediakan kunci yang dapat dipublikasikan untuk item saat ini. |
Untuk petunjuk tentang penyiapan, debugging secara lokal, dan penyebaran, lihat Menggunakan Fungsi di Fabric Apps.
Alur kerja pengembangan
Siklus pengembangan yang khas mengikuti pola ini:
- Menentukan atau memodifikasi model data - Menambahkan atau memperbarui kelas TypeScript dengan dekorator
-
Test secara lokal dengan backend jarak jauh - Jalankan
npm run devuntuk menguji perubahan kode frontend Anda terhadap backend Aplikasi Anda di Fabric. -
Deploy ke Fabric - Jalankan
npx rayfin upuntuk melakukan deployment ke layanan Fabric yang dikelola dan menerapkan perubahan skema Anda.
Perubahan pada model TypeScript Anda secara otomatis disebarluaskan melalui seluruh tumpukan — dari skema database ke titik akhir API ke jenis klien.
Authorization
Izin didefinisikan bersama model data Anda menggunakan dekorator @role:
@entity()
@role('authenticated', ['create', 'read', 'update', 'delete'], {
policy: (claims, item) => claims.sub.eq(item.userId)
})
export class UserDocument {
@uuid() id!: string;
@text({ max: 255 }) userId!: string;
@text({ max: 4000 }) content!: string;
}
Pendekatan ini memastikan:
- Aturan keamanan berada di samping data yang mereka lindungi
- Ekspresi kebijakan yang aman terhadap tipe mendeteksi kesalahan saat kompilasi
- Pemfaktoran ulang kolom entitas secara otomatis memperbarui pemeriksaan hak akses