Main
A runnable Geblang example.
- Path
gebweb/examples/feature_tour/main.gb- Category
- Feature Tour
Feature-tour entry point. Wires the async / data / integrations
surface (jobs, scheduler, events, mailer, storage, query DSL,
cursor pagination, API-key auth, @RequiresPermission) into one
app, then either serves HTTP or runs the background worker loop
depending on the GEBWEB_RUN environment variable.
Run the HTTP server:
cd examples/feature_tour
geblang main.gb
Run the worker (background jobs + scheduled cleanup):
cd examples/feature_tour
gebweb worker
Source
import gebweb;
import db;
import sys;
import feature_tour.app as app;
import feature_tour.handlers as handlers;
let conn = db.connect("sqlite", ":memory:");
let gw = gebweb.app([]);
/* Auth: a tiny static API-key resolver. In a real app this would
* hit a user table; the demo seeds two keys for owner / admin. */
gebweb.useApiKeyAuth(gw, app.CurrentUser, func(string key): ?app.CurrentUser {
if (key == "ada-key") {
return app.CurrentUser("u-1", "ada", "user", ["tasks.delete"]);
}
if (key == "carla-key") {
return app.CurrentUser("u-2", "carla", "admin", ["tasks.delete", "tasks.audit"]);
}
return null;
});
/* Framework surface */
gebweb.useViews(gw, "templates");
gebweb.useJobs(gw, conn);
gebweb.useScheduler(gw);
gebweb.useEvents(gw);
gebweb.useStorage(gw, gebweb.memoryStorage());
gebweb.useMailer(gw, gebweb.logMailer());
let repo = app.TaskRepo(conn);
/* Controllers & handler instances */
let tasksCtrl = app.TaskController(repo, gw);
let attCtrl = app.AttachmentController(repo, gw);
let dashCtrl = app.DashboardController(repo, gw);
gw = gebweb.app([tasksCtrl, attCtrl, dashCtrl]);
/* Re-wire the app's runtime services after the new app instance
* (calling gebweb.app() above produces a new GebwebApp; carry
* over the configuration that the controllers will need). */
gebweb.useApiKeyAuth(gw, app.CurrentUser, func(string key): ?app.CurrentUser {
if (key == "ada-key") { return app.CurrentUser("u-1", "ada", "user", ["tasks.delete"]); }
if (key == "carla-key") { return app.CurrentUser("u-2", "carla", "admin", ["tasks.delete", "tasks.audit"]); }
return null;
});
gebweb.useViews(gw, "templates");
gebweb.useJobs(gw, conn);
gebweb.useScheduler(gw);
gebweb.useEvents(gw);
gebweb.useStorage(gw, gebweb.memoryStorage());
gebweb.useMailer(gw, gebweb.logMailer());
gebweb.registerEventSubscribers(gw, [handlers.TaskNotifier()]);
gebweb.registerJobHandlers(gw, [handlers.TaskNotificationJob()]);
gebweb.registerScheduledTasks(gw, [handlers.TaskCleanup(repo)]);
if (sys.getenv("GEBWEB_RUN") == "worker") {
gebweb.runWorker(gw);
} else {
gebweb.serve(gw, "0.0.0.0:8080");
}