Omówienie modelu programowania

Rayfin SDK wykorzystuje model programowania oparty na dekoratorach, w którym jeden raz definiujesz schemat danych w TypeScript, a następnie automatycznie otrzymujesz gotowe do wdrożenia produkcyjnego interfejsy API, klienty z bezpiecznym typowaniem oraz infrastrukturę.

Kluczowe pojęcia

Zestaw Rayfin SDK łączy trzy podstawowe elementy:

  • Schemat oparty na dekoratorze: użyj dekoratorów języka TypeScript do definiowania modeli danych, uprawnień i relacji.
  • Automatyczne generowanie interfejsu API: Klasy ozdobione stają się punktami końcowymi GraphQL bez pisania kodu kontrolera.
  • Klienci z bezpiecznym typowaniem: Wygenerowani klienci TypeScript zapewniają walidację zapytań i mutacji na etapie kompilacji.

Jak to działa

Podczas tworzenia aplikacji Fabric kod przechodzi przez następujące etapy:

# Etapie Co się stanie
1 Deweloper Możesz utworzyć aplikację w wybranym edytorze.
2 TypeScript Klasy jednostek są pisane w języku TypeScript.
3 Decorators Opatrujesz klasy i pola adnotacjami za pomocą dekoratorów @entity, @uuid, @text, @role i innych.
4 Schema CLI kompiluje dekorowane klasy do postaci schematu bazy danych, zasad uprawnień i konfiguracji interfejsu API.
5 APIs Schemat jest udostępniany jako punkty końcowe GraphQL.
6 Client Wygenerowany RayfinClient udostępnia bezpiecznego typowo klienta danych i uwierzytelniania dla tych punktów końcowych.
7 Application Aplikacja frontendowa korzysta z klienta do odczytu i zapisu danych.

1. Definiowanie modeli danych za pomocą dekoratorów

Struktura danych jest definiowana przy użyciu klas TypeScript i dekoratorów z klasy @microsoft/rayfin-core:

import { entity, uuid, text, int } from '@microsoft/rayfin-core';

@entity()
export class Product {
  @uuid() id!: string;
  @text() name!: string;
  @text({ optional: true }) description?: string;
  @int() price!: number;
}

2. Generowanie schematu

Interfejs wiersza polecenia Rayfin (npx rayfin) analizuje klasy ozdobione i generuje:

  • Schemat bazy danych — tabele, kolumny, ograniczenia i indeksy
  • Konfiguracja interfejsu API — definicje punktów końcowych graphQL
  • Zasady uprawnień — zabezpieczenia na poziomie wiersza i kontrola dostępu na poziomie pola

4. Korzystanie z klienta bezpieczne pod względem typów

Interfejsy API GraphQL są dostępne do wykonywania operacji CRUD na Twojej bazie danych. Rayfin SDK domyślnie udostępnia operację klienta danych do odczytu, zapisu i usuwania danych.

import { RayfinClient } from '@microsoft/rayfin-client';

const client = new RayfinClient();

// TypeScript knows about Product fields
const products = await client.data.products.query()
  .select(['id', 'name', 'price'])
  .execute();

// Compile-time error if field doesn't exist
const invalid = await client.data.products.query()
  .select(['nonexistentField'])  // ❌ TypeScript error
  .execute();

Dokumentacja referencyjna dekoratora

Zestaw Rayfin SDK udostępnia dekoratory dla typowych wzorców modelowania danych:

Dekoratory jednostek

Dekorator Purpose Example
@entity() Oznaczanie klasy jako jednostki bazy danych @entity() class Product

Dekoratory właściwości

Dekorator Typ bazy danych typ TypeScript
@uuid() UNIQUEIDENTIFIER string
@text() NVARCHAR string
@int() INT number
@decimal() DZIESIĘTNA number
@bool() BIT boolean
@date() DATETIME2 Date

Dekoratory uprawnień

Dekorator Purpose
@role() Definiowanie uprawnień opartych na rolach

Aby uzyskać szczegółowe informacje o autoryzacji, zobacz Definiowanie uprawnień danych .

Przepływ pracy deweloperskiej

Typowy cykl programowania jest zgodny z tym wzorcem:

  1. Definiowanie lub modyfikowanie modeli danych — dodawanie lub aktualizowanie klas TypeScript za pomocą dekoratorów
  2. Przetestuj lokalnie przy użyciu zdalnego backendu — uruchom npm run dev, aby przetestować zmiany w kodzie frontendu z backendem aplikacji w Fabric.
  3. Wdróż do usługi Fabric - Uruchom npx rayfin up, aby wdrożyć do zarządzanej usługi Fabric i zastosować zmiany w schemacie.

Zmiany modeli TypeScript są automatycznie propagowane przez cały stos — ze schematu bazy danych do punktów końcowych interfejsu API po typy klientów.

Authorization

Uprawnienia są definiowane wraz z modelami danych przy użyciu dekoratora @role :

@entity()
@role('authenticated', ['create', 'read', 'update', 'delete'], {
  policy: (claims, item) => claims.sub.eq(item.userId)
})
export class UserDocument {
  @uuid() id!: string;
  @text() userId!: string;
  @text() content!: string;
}

Takie podejście zapewnia:

  • Reguły zabezpieczeń znajdują się przy danych, które chronią
  • Wyrażenia zasad bezpieczne pod względem typów wykrywają błędy w czasie kompilacji
  • Refaktoryzacja pól jednostek automatycznie aktualizuje kontrole uprawnień