Skip to main content

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.