Skip to content
This repository has been archived by the owner on Mar 12, 2024. It is now read-only.
/ odi Public archive

πŸŒͺ🌌 Opinionated, Declarative, Idiomatic framework for building scalable, supportable and reliable enterprise applications.

License

Notifications You must be signed in to change notification settings

Odi-ts/odi

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

TypeScript framework for creating enterprise-grade (web) applications with simple and minimalistic API, that allows you to focus on business logic. Based on declarative and imperative programming, inspiried by ASP.NET / Spring.

Check Docs for more details.

Odi provides feature set for creation of easy supportable and scalable web applications.

Features Overview:

  • MVC
  • Full-typed DI / IoT
  • Authentication
  • WebSockets
  • TypeORM integration
  • GraphQL
  • AOP
  • SSR

For future updates check Roadmap
Got an idea, proposal or feature request? Feel free to Submit it!

Edit Odi

πŸš€ Getting Started

  1. Install npm package
    npm install odi --save

  2. Install reflect-metadata
    npm install reflect-metadata --save

  3. Import reflect-metadata (for example in index.ts):
    import "reflect-metadata";

  4. Enabled the following settings in tsconfig.json

    "emitDecoratorMetadata":  true, 
    "experimentalDecorators":  true

πŸŒͺ Overview

Controller

Controllers serve as a simple yet powerful routing mechanism in a minimalistic style.

@Controller('foo') 
export class FooController extends IController {      
        
    @RoutePatch('{id}')     
    bar(id: string, payload: FooDTO) {         
        ...some updates..          
        return Ok();     
    } 

    @Get index() {
        return 'Foo';
    }
} 

So, as you see, there no need to provide any additional param decorators for injection data from the HTTP request. It's just a small controller overview, there are a lot of other possibilities.You can read more in docs.

Dependency Injection

Odi has powerful dependency injection mechanism out of the box. (Let's imagine that we already have FooRepository)

//foo.service.ts
@Service()
export class FooService {
​
    @Autowired()
    repository: FooRepository;
​
    public getFoo(id: string) {
        return this.repository.findOne(id);
    }​
}


//foo.controller.ts
@Controller('foo')
export class OrderController extends IController {
​
    @Autowired()
    fooService: OrderService;
    
    @Get async '{id}' (id: string) {
        const foo = this.fooService.getFoo(id);
        
        if(!foo)
            return NotFound();

        return foo;
    }​
} 

As you can see, all dependencies will be automatically provided to all application components.

Currently, Odi support 3 ways of injection:

  • By constructor
  • By property
  • By method

Classes that are not Odi components can participate in DI. You can simply define behaviour with preset properties and constructor args.

class Pet {
    ...
}

​define(Pet)
    .set('default', {
        constructorArgs: [...],        
        props: {...},
        type: 'singleton'
    })
    .set('special', {
        constructorArgs: [...],        
        props: {...},
        type: 'scoped'
    });

DTO

It's a common scenario when web server should validate data before processing. DTO can optimize and automate this process.

@Data()
export class TodoDTO {
   
    @MaxLength(80)
    title: string;
    
    @IsOptional()
    @MaxLength(255)
    desctiption: string;
}

Then, DTO class should be added as an argument for the controller method

@Controller('todo')
export class TodoController extends IController {

    @Autowired()
    todoService: TodoService;   
     
    @Post async index(payload: TodoDTO) {
        ...
    }​
}

And it's all! Odi will automatically inject the validated request body in this argument. If there are some errors during validation, 400 status code will be sent with errors description.

Odi provides a wide set for DTO description, supporting nested DTOs, arrays, enums and etc.

To Sum up

It was a small overview of some features. If you interested in more, check the Docs.

Contributing

Pull requests are welcome. For major changes, please open an issue first to discuss what you would like to change.

Please make sure to update tests as appropriate.

License

MIT