-
Notifications
You must be signed in to change notification settings - Fork 0
Guide Backend
VelinScript wurde entwickelt, um die Erstellung moderner, skalierbarer Backend-Services so einfach wie mΓΆglich zu machen, ohne dabei Kompromisse bei der Performance einzugehen. Durch die tiefe Integration von Web-Server, Datenbankzugriff und Validierung in die Sprache selbst kΓΆnnen Sie mit extrem wenig Boilerplate-Code produktive Anwendungen schreiben.
Dieses Handbuch fΓΌhrt Sie durch alle Aspekte der Backend-Entwicklung: von der Erstellung Ihrer ersten REST-API ΓΌber komplexe Datenbankmodellierung bis hin zu Performance-Optimierung und Deployment.
- REST APIs erstellen
- Validierung
- Datenbanken und ORM
- Performance und Monitoring
- Fehlerbehandlung im API-Kontext
- Multi-Target Backend (Neu in 3.1)
- Automatische System-Generierung (Neu in 3.1)
Das http-Modul von VelinScript ist das HerzstΓΌck Ihrer Webanwendung. Es nutzt ein Decorator-basiertes System, das stark von Frameworks wie NestJS oder Spring Boot inspiriert ist, aber dank der Kompilierung zu Rust extrem performant ist.
Ein Controller ist eine Struct, die zusammengehΓΆrige Endpunkte gruppiert. Der @Controller-Decorator definiert den Basispfad.
use http
use services
@Controller("/api/v1/products")
struct ProductController {
// Dieser Endpunkt ist unter GET /api/v1/products erreichbar
@GET("/")
fn listAll(): List<Product> {
return db.findAll(Product);
}
// Verschachtelte Pfade: GET /api/v1/products/featured
@GET("/featured")
fn listFeatured(): List<Product> {
return db.findMany(Product, { "isFeatured": true });
}
}
Um auf Daten des HTTP-Requests zuzugreifen, nutzen Sie Parameter-Decorators. VelinScript ΓΌbernimmt das Parsen und die Typkonvertierung automatisch.
Liest den JSON-Body des Requests und mappt ihn auf ein Struct.
@POST("/")
fn createProduct(@Body payload: CreateProductDto): Product {
// payload ist hier bereits ein typisiertes Objekt!
// Wenn das JSON ungΓΌltig ist, wird automatisch 400 Bad Request zurΓΌckgegeben.
return productService.create(payload);
}
Extrahiert variable Teile aus der URL.
// Route: /api/v1/products/:id
@GET("/:id")
fn getProduct(@Path("id") productId: string): Product {
let product = db.find(Product, productId);
if (!product) {
throw HttpError.NotFound("Produkt nicht gefunden");
}
return product;
}
Liest Parameter aus dem Query-String (z.B. ?limit=10&sort=desc).
@GET("/")
fn search(
@Query("q") searchTerm: string,
@Query("limit") limit: number = 20, // Default-Wert
@Query("offset") offset: number = 0
): List<Product> {
return db.search(Product, searchTerm, limit, offset);
}
Liest HTTP-Header, z.B. fΓΌr Authentifizierung oder Metadaten.
@GET("/secure-data")
fn getSecureData(@Header("X-API-Key") apiKey: string): string {
// ...
}
StandardmΓ€Γig sendet VelinScript Status 200 OK (oder 201 Created bei POST) und serialisiert den RΓΌckgabewert als JSON. Sie kΓΆnnen dies aber anpassen.
use http
@POST("/")
@Status(201) // Expliziter Statuscode
fn create(@Body p: Product): Product {
return db.save(p);
}
// Manuelle Response-Steuerung
@GET("/download")
fn downloadPdf(): HttpResponse {
let pdfData = generatePdf();
return HttpResponse.builder()
.status(200)
.header("Content-Type", "application/pdf")
.header("Content-Disposition", "attachment; filename=invoice.pdf")
.body(pdfData);
}
In VelinScript ist Validierung keine "Afterthought", sondern tief integriert. Anstatt Validierungslogik in Ihren Controllern zu schreiben, definieren Sie Regeln direkt an Ihren Datenmodellen.
Nutzen Sie den @Validate-Decorator an Struct-Feldern.
struct UserRegistration {
@Validate(min: 3, max: 20, message: "Benutzername muss zwischen 3 und 20 Zeichen lang sein")
username: string,
@Validate(email: true, message: "UngΓΌltige E-Mail-Adresse")
email: string,
@Validate(min: 18)
age: number,
@Validate(pattern: "^[A-Z0-9]+$") // Regex fΓΌr alphanumerische Codes
referralCode: string?, // Optionales Feld
@Validate(custom: "passwordComplexity") // Custom Validator
password: string
}
Wenn dieses Struct als @Body in einem Controller verwendet wird, fΓΌhrt VelinScript die Validierung automatisch durch, bevor Ihre Funktion aufgerufen wird.
VerfΓΌgbare Regeln:
-
min,max: FΓΌr Zahlen (Wert) oder Strings (LΓ€nge). -
email: PrΓΌft auf gΓΌltiges E-Mail-Format. -
url: PrΓΌft auf gΓΌltige URL. -
uuid: PrΓΌft auf UUID-Format. -
pattern: PrΓΌft gegen einen regulΓ€ren Ausdruck. -
notEmpty: Darf nicht leer sein (fΓΌr Listen/Strings).
Sie kΓΆnnen eigene Validierungslogik registrieren.
use validation
// Validator registrieren
validation.register("passwordComplexity", |value| {
if (value.length < 8) return false;
if (!value.match(/[A-Z]/)) return false; // Braucht GroΓbuchstaben
if (!value.match(/[0-9]/)) return false; // Braucht Zahl
return true;
});
Das db-Modul (basierend auf SeaORM) ermΓΆglicht typisierten Datenbankzugriff. Es unterstΓΌtzt PostgreSQL, MySQL und SQLite.
Modelle sind normale Structs mit @Entity-Annotationen.
@Entity(table: "users")
struct User {
@Id
@Generated // Auto-Increment oder UUID
id: string,
@Column(unique: true)
email: string,
name: string,
@Column(name: "created_at")
createdAt: string,
isActive: boolean
}
Das db-Objekt bietet intuitive Methoden fΓΌr Standard-Operationen.
Erstellen (Create):
let u = User {
id: utils.uuid(),
email: "test@example.com",
name: "Test",
createdAt: datetime.now(),
isActive: true
};
db.save(u); // Insert oder Update
Lesen (Read):
// Nach ID
let user = db.find(User, "uuid-123");
// Mit Bedingungen
let activeUsers = db.findMany(User, {
"isActive": true
});
// Komplexe Queries (Fluent API)
let recentUsers = db.query(User)
.filter("createdAt", ">", "2023-01-01")
.orderBy("name", "ASC")
.limit(10)
.all();
Aktualisieren (Update):
user.name = "Neuer Name";
db.save(user); // Erkennt existierende ID und macht Update
LΓΆschen (Delete):
db.delete(User, "uuid-123");
Transaktionen sind essentiell fΓΌr Datenkonsistenz.
try {
db.transaction(|tx| {
// Alle Operationen auf 'tx' statt 'db' ausfΓΌhren
let order = tx.save(newOrder);
// Inventar verringern
let product = tx.find(Product, order.productId);
product.stock -= order.quantity;
tx.save(product);
// Zahlung verarbeiten
paymentService.charge(order.total);
});
} catch (e) {
log.error("Transaktion fehlgeschlagen, Rollback durchgefΓΌhrt: " + e.message);
}
VelinScript hilft Ihnen, FlaschenhΓ€lse zu identifizieren und zu beheben.
Messen Sie granular, wie lange bestimmte Abschnitte Ihres Codes dauern.
Neu in 3.0: Der
ParallelizationAnalyzererkennt automatisch unabhΓ€ngige Operationen in Ihrem Code und parallelisiert diese fΓΌr maximale Performance (via Threads, Async oder GPU). Sie mΓΌssen dafΓΌr oft nichts tun, aber Sie kΓΆnnen mit@OptimizeHinweise geben.
use metrics
let monitor = PerformanceMonitor.new();
fn processOrder(order: Order) {
monitor.start("validate_stock");
inventory.check(order);
monitor.stop("validate_stock");
monitor.start("payment");
payment.process(order);
monitor.stop("payment");
log.info(monitor.report()); // Gibt JSON-Bericht zurΓΌck
}
Verwenden Sie den @Cache-Decorator, um teure Berechnungen oder Datenbankabfragen zu cachen.
@Controller("/api/stats")
struct StatsController {
// Cache-Ergebnis fΓΌr 5 Minuten
// Cache-Key wird automatisch aus Parametern generiert
@GET("/daily")
@Cache(ttl: "5m")
fn getDailyStats(): Stats {
// Teure DB Aggregation...
return db.query(Stats).aggregate(...);
}
}
FΓΌr manuelles Caching nutzen Sie das utils-Modul:
let result = utils.cache("my_cache_key", "10m", || {
return fetchRemoteData();
});
Der MetricsCollector integriert sich nahtlos mit Prometheus.
let metrics = MetricsCollector.new();
// In Middleware oder Interceptor
metrics.increment("http_requests_total", {
"method": req.method,
"status": res.status
});
// Histogramm fΓΌr Latenz
let timer = metrics.startTimer("http_request_duration_seconds");
// ... request verarbeiten ...
timer.observe();
VelinScript mappt Exceptions automatisch auf sinnvolle HTTP-Statuscodes.
-
throw HttpError.NotFound("User nicht gefunden")-> 404 -
throw HttpError.Forbidden("Kein Zugriff")-> 403 -
throw Error("Oops")-> 500
Sie kΓΆnnen globale Exception-Filter definieren, um Fehler einheitlich zu formatieren.
// Globaler Error Handler (Pseudocode)
app.onError(|error, req, res| {
log.error(error);
res.status(500).json({
"error": true,
"message": "Ein interner Fehler ist aufgetreten",
"requestId": req.id
});
});
Neu in VelinScript 3.1: Sie sind nicht mehr nur auf Rust als Zielplattform beschrΓ€nkt. Der Compiler kann Ihren Backend-Code nun fΓΌr verschiedene Γkosysteme generieren.
Nutzen Sie das --target Flag beim Kompilieren:
- Rust (Default): Maximale Performance, Zero-Overhead.
- Node.js / TypeScript: Generiert Express oder NestJS Code. Ideal fΓΌr bestehende JS-Teams.
- Python: Generiert FastAPI oder Flask Code. Perfekt fΓΌr KI/ML-Integration.
- PHP: Generiert Laravel oder Symfony Code.
- Java: Generiert Spring Boot Code.
- C#: Generiert ASP.NET Core Code.
VelinScript nutzt intelligente Decorators, um Framework-spezifischen Code zu erzeugen:
@Controller("/users")
@Spring // Erzwingt Spring Boot Annotationen
@NestJS // Erzwingt NestJS Annotationen
struct UserController { ... }
Wenn kein Framework spezifiziert ist, wΓ€hlt VelinScript den besten Standard fΓΌr das gewΓ€hlte Target (z.B. FastAPI fΓΌr Python).
Neu in VelinScript 3.1: Schreiben Sie keinen Boilerplate-Code mehr. Der SystemGenerator analysiert Ihre High-Level-Anforderungen und baut das komplette Backend fΓΌr Sie.
- Definieren Sie nur die Datentypen und grobe API-Struktur.
- Nutzen Sie
@Generate(api=true)an Ihren Haupt-Structs. - Der Compiler generiert:
- Routing: Alle Endpunkte fΓΌr CRUD-Operationen.
- Handler: Implementierung der Logik mit Datenbankzugriff.
- Auth: Login/Register Endpunkte mit JWT.
- Deployment: Dockerfile und Kubernetes Manifests.
@Generate(api=true)
@Entity(table: "smarthome_devices")
struct Device {
@Id id: string,
name: string,
type: DeviceType
}
Das Ergebnis ist ein voll funktionsfΓ€higer REST-Server mit Datenbankanbindung, Authentifizierung und Dokumentation.
Siehe auch: System-Generierung Dokumentation
Ende des Backend-Guides. FΓΌr Informationen zur Absicherung Ihrer API lesen Sie den Sicherheits-Guide.
- Compiler Architecture
- Pass-Verlauf
- Type Inference
- Code Ordering
- IR Representation
- Borrow Checker
- Code Generation
- Multi-Target Compilation
- Module Resolution
- Framework Integration
- Parallelization
- AI Compiler Passes
- Prompt Optimizer
- System Generation
- Basics
- APIs
- Security
- Database
- Validation
- Authentication
- ML/LLM
- Intelligence Features
- Type Inference
- ML Training
- Pattern Matching
- Closures
- Collections
- HTTP Client
- String Interpolation
- Debugger
- Vektor-Datenbanken
- CLI Reference
- API Keys Setup
- Advanced
- Backend
- Security Best Practices
- AI/ML
- Auto Imports
- Plugin Development