# kahve-rest

> - [Description](#description) - [Installation](#installation) - [Usage](#usage)

Latest version **0.0.2** (published 2020-09-11) · MIT license · 0 weekly downloads

## Install

```sh
npm install kahve-rest
pnpm add kahve-rest
yarn add kahve-rest
bun add kahve-rest
```

## Health

**Score 20/100 (F)** — status: abandoned.

Positive: has types; no vulnerabilities.

Warnings: low downloads; no esm support; pre 1.0.

Negative: abandoned; low maintenance score.

## Facts

| | |
|---|---|
| Version | 0.0.2 |
| Published | 2020-09-11 |
| First published | 2020-08-25 |
| Weekly downloads | 0 |
| License | MIT |
| TypeScript types | bundled |
| Module format | CommonJS |
| Dependencies | 5 |
| Unpacked size | 355.9 KB |
| Known vulnerabilities | 0 |
| Install scripts | no |
| Author | Yigit Yuce |
| Maintainers | yigityuce |

## Links

- npm: https://www.npmjs.com/package/kahve-rest
- npm.io page: https://npm.io/package/kahve-rest

## Dependencies (5)

- [cors](https://npm.io/package/cors.md) ^2.8.5
- [helmet](https://npm.io/package/helmet.md) ^4.1.0
- [express](https://npm.io/package/express.md) ^4.17.1
- [kahve-core](https://npm.io/package/kahve-core.md) 0.0.2
- [http-status-codes](https://npm.io/package/http-status-codes.md) ^1.4.0

## Recent versions

- 0.0.2 (latest) — 2020-09-11
- 0.0.0-1 — 2020-08-25

## README

- [Description](#description)
- [Installation](#installation)
- [Usage](#usage)

# Description

Annotation based, Java Spring like, REST library


# Installation

kahve-rest runs on Node.js and is available as an NPM package. You can install kahve-rest
in your project's directory as usual:

```bash
$ npm install kahve-core kahve-rest
```

You should set the "```emitDecoratorMetadata```" and "```experimentalDecorators```" config to true in your **tsconfig.json** file.

```json
{ 
   "compilerOptions": { 
     ..., 
     "emitDecoratorMetadata": true,
     "experimentalDecorators": true,
   } 
}
```

# Usage

See the example below and you can find a postman collection within **"*/example*"** directory to test the code below.

```ts
import { logger, LogLevel } from 'kahve-core';
import {
  RestController,
  RestGet,
  RestPost,
  RequestBody,
  RestPut,
  PathVariable,
  RestError,
  RestDelete,
  RestServer,
  RestServerConfig,
  RestServerController,
  RestServerPreStart,
  RestServerPostStart,
  HttpStatus,
  QueryParam,
  RequestHeader
} from 'kahve-rest';

// SET LOG LEVEL
logger.setLevel(LogLevel.DEBUG);

// CONTROLLER DEFINITION
@RestController('base/path')
class TestController {
  private list: string[] = [];

  @RestGet('get-item')
  public getItem(@QueryParam('index') index: number): string {
    const i = Number.parseInt(`${index}`);
    if (!this.isValidIndex(i)) throw new RestError('Out of bound.', HttpStatus.BAD_REQUEST);
    return this.list[i];
  }

  @RestGet('get-list')
  public getAll(): string[] {
    return this.list;
  }

  @RestGet('get-list-with-timeout')
  public getAllTimeout(): Promise<string[]> {
    return new Promise(resolve => setTimeout(() => resolve(this.list), 2000));
  }

  @RestPost('add-item')
  public createItem(@RequestBody() item: string, @RequestHeader('Authorization', true) auth: string): string {
    this.list.push(item);
    logger.info('Auth Token is:', auth);
    logger.info('New item added:', item);
    return item;
  }

  @RestPut('update-item/:index')
  public updateItem(@RequestBody() item: string, @PathVariable('index') ind: number): string {
    const i = Number.parseInt(`${ind}`);
    if (!this.isValidIndex(i)) throw new RestError('Out of bound.', HttpStatus.BAD_REQUEST);

    this.list[i] = item;
    logger.info('Item updated:', item);
    return this.list[i];
  }

  @RestDelete('delete-item/:index')
  public deleteUser(@PathVariable('index') index: number): boolean {
    const i = Number.parseInt(`${index}`);
    if (!this.isValidIndex(i)) throw new RestError('Out of bound.', HttpStatus.BAD_REQUEST);

    const deletedItem = this.list.splice(i, 1);
    logger.info('Item deleted:', deletedItem);
    return true;
  }

  private isValidIndex(index: number): boolean {
    return index < this.list.length;
  }
}

@RestServer()
class PublicServer {
  @RestServerConfig('PORT')
  private port: number = 9000;

  @RestServerController()
  private testController: TestController = new TestController();

  @RestServerPreStart()
  private preStart(): Promise<void> {
    logger.info('Do some preparing steps in here and also you can do async operations.');
    return new Promise(resolve => setTimeout(() => resolve(null), 1500));
  }

  @RestServerPostStart()
  private postStart(): void {
    logger.info(`Server is started. Port: ${this.port} Log level: ${logger.getLevel()}`);
  }
}

@RestServer()
class SecureServer {
  @RestServerConfig('PORT')
  private port: number = 9001;

  @RestServerConfig('KEY')
  private keyFile: string = './key.pem';

  @RestServerConfig('CERT')
  private certFile: string = './cert.pem';

  @RestServerConfig('SECURE')
  private isSecure: boolean = true;

  @RestServerController()
  private testController: TestController = new TestController();

  @RestServerPreStart()
  private preStart(): Promise<void> {
    logger.info('Do some preparing steps in here and also you can do async operations.');
    return new Promise(resolve => setTimeout(() => resolve(null), 1500));
  }

  @RestServerPostStart()
  private postStart(): void {
    logger.info(`Secure server is started. Port: ${this.port} Log level: ${logger.getLevel()}`);
  }
}

const publicServer = new PublicServer();
const secureServer = new SecureServer();
```

---
_Source: https://npm.io/package/kahve-rest · Machine-readable twin of the npm.io package page. Health data is recomputed on every publish._
