Basic Project Example
This example shows the minimum shape of a Quik application that exposes routes and uses models. It mirrors the structure used in quik/moxy/be but stays intentionally small.
1. Project layout
src/
app/
AppModule.ts
http/
routes/
HealthRoute.ts
UsersRoute.ts
users/
models/
User.ts
services/
UsersService.ts
main.ts
2. Bootstrap module
import { BootstrapModule } from '@quik/bootstrap';
import { CoreModule } from '@quik/core';
import { DatabaseModule } from '@quik/database';
import { EntityModule } from '@quik/entity';
import { HttpModule } from '@quik/http';
import { Module as HttpExpressModule } from '@quik/http-express';
export class AppModule extends BootstrapModule {
public modules = [
CoreModule,
HttpModule,
HttpExpressModule,
DatabaseModule,
EntityModule
];
}
3. Model
import { Column, Model } from '@quik/database';
import { Flags } from '@quik/entity';
@Model()
export class User {
@Column.Integer({ unsigned: true })
@Flags.Required
public id: number;
@Column.String({ length: 120 })
@Flags.Required
public name: string;
}
4. Service
import { Injectable } from '@quik/core';
import { Repository } from '@quik/database';
import { User } from '../models/User';
@Injectable()
export class UsersService {
public constructor(private readonly users: Repository<User>) {}
public list(): Promise<User[]> {
return this.users.findAll();
}
}
5. Route
import { Controller, Get } from '@quik/http';
import { UsersService } from '../services/UsersService';
@Controller('/users')
export class UsersRoute {
public constructor(private readonly users: UsersService) {}
@Get()
public async list() {
return this.users.list();
}
}
6. Entry point
import { BootstrapApp } from '@quik/bootstrap';
import { AppModule } from './app/AppModule';
async function main() {
await BootstrapApp.start(AppModule);
}
main();
7. Run
pnpm start
You now have a simple Quik app that exposes /users and uses a model-based repository.