Getting Started
This guide will walk you through creating your first Lockness application, from setup to deployment.
🎯 Your First Controller
Let's create a simple API endpoint. Use the CLI to scaffold a controller:
# API endpoint (returns JSON)
deno task cli make:controller Hello
# Web page (renders JSX view)
deno task cli make:controller Hello --viewThe --view flag automatically creates a view in app/view/pages/hello.tsx and generates a controller that renders it.
This creates app/controller/hello_controller.ts. Edit it:
import { Context, Controller, Get } from '@lockness/core'
@Controller('/api/hello')
export class HelloController {
@Get('/')
index(c: Context) {
return c.json({
message: 'Hello from Lockness!',
timestamp: new Date().toISOString(),
})
}
@Get('/:name')
greet(c: Context) {
const name = c.req.param('name')
return c.json({ message: `Hello, ${name}!` })
}
}Test it: http://localhost:5173/api/hello
🗄️ Adding a Database Model
Create a model with repository, controller, and seeder in one command:
deno task cli make:model Post -aThe -a flag generates:
app/model/post.ts- Drizzle schema + Zod validationapp/repository/post_repository.ts- Data access layerapp/controller/post_controller.ts- REST API with validationapp/seeder/post_seeder.ts- Database seeder
📊 Run Migrations
Generate and apply database migrations:
deno task cli db:generate
deno task cli db:migrate🌱 Seed the Database
Populate your database with test data:
deno task cli db:seed🎨 Create a View
Generate a JSX page component:
deno task cli make:view posts/indexThis creates app/view/pages/posts/index.tsx. Use it in your controller:
import { IndexPage } from '@view/pages/posts/index.tsx'
import { Context, Controller, Get } from '@lockness/core'
@Controller('/posts')
export class PostController {
@Get('/')
index(c: Context) {
return c.html(<IndexPage />)
}
}🔒 Add Authentication
Scaffold a complete auth system:
deno task cli make:authConfigure in app/kernel.ts:
import { configureAuth, container } from '@lockness/core'
import { UserProvider } from '@provider/user_provider.ts'
configureAuth({
userProvider: container.get(UserProvider),
redirectTo: '/auth/login',
})Protect routes with @Auth() decorator:
@Auth()
@Controller('/dashboard')
export class DashboardController {
@Get('/')
async index(c: Context) {
const user = await auth(c).user()
return c.json({ user })
}
}What's Next?
- [Learn more about Routing & Controllers](/docs/routing)
- [Deep dive into Models & Database](/docs/models)
- [Add Request Validation](/docs/validation)