# ADR-0001: DTI server нь standalone REST API байдлаар ажиллах

## Status

Accepted

## Context

`@napp/dti-server` нь `@napp/dti-core` дээр тодорхойлсон shared contract-ийг ашиглан server талын REST API endpoint-уудыг ажиллуулах үүрэгтэй.

DTI ecosystem дотор `@napp/dti-client` нь contract-aware client хэрэглээг хялбар болгоно. Гэхдээ server-ийн ажиллагаа зөвхөн `@napp/dti-client`-ээс хамаарах ёсгүй.

Business болон integration орчинд endpoint-уудыг энгийн REST API client-аар дуудах шаардлага гарна. Жишээ нь:

- `curl`
- Postman
- browser `fetch`
- өөр service-ийн HTTP client
- DTI ашигладаггүй legacy client

Иймээс `@napp/dti-server` нь `@napp/dti-client`-тэй хамт ашиглагдаагүй үед ч REST API standard-аар хэвийн ажиллах шаардлагатай.

## Decision

`@napp/dti-server` нь `@napp/dti-client`-ээс runtime хамааралгүй байна.

Server endpoint нь shared contract-оос route, method, content type, query/body/result validation-ийг авна. Гэхдээ request нь заавал DTI client-ээс ирсэн байх шаардлагагүй.

Action бүр public REST route-ээ explicit `path`-аар тодорхойлно. `action.name`-ийг route fallback болгохгүй байх шийдвэрийг `ADR-0009-require-explicit-action-path.md` дээр тодорхойлсон.

Action method omitted үед client/server хоёул `GET` гэж resolve хийх болон GET body хориглох дүрмийг `ADR-0010-default-get-and-forbid-get-body.md` дээр тодорхойлсон.

Query parameters нь flat scalar shape ашиглах бөгөөд array/nested query дэмжихгүй байх шийдвэрийг `ADR-0011-flat-scalar-query-parameters.md` дээр тодорхойлсон.

Энгийн REST API request дараах нөхцөлд хэвийн ажиллана:

- request path болон HTTP method contract-той таарч байгаа
- query/body payload contract schema-д нийцэж байгаа
- endpoint дээр configured auth болон signing policy-г хангаж байгаа
- server handler contract-д нийцсэн result буцааж байгаа

Unsigned endpoint нь DTI-specific header эсвэл DTI signing protocol шаардахгүй. Router дээр auth эсвэл signing enabled бол raw HTTP client тухайн configured security protocol-ийг хэрэгжүүлнэ. Энэ тохиолдолд ч `@napp/dti-client` runtime dependency заавал шаардахгүй; protocol-ийг баримтжуулсан дурын HTTP client ашиглаж болно.

Response format нь DTI client болон энгийн REST API client аль алинд ойлгомжтой байна:

```json
{
  "success": true,
  "data": {}
}
```

Алдааны үед:

```json
{
  "success": false,
  "code": "DTI_BODY_VALIDATE_ERROR",
  "message": "Invalid action body"
}
```

Response envelope болон REST status code-ийн нарийвчилсан шийдвэрийг `ADR-0002-dti-server-response-envelope-and-rest-status.md` дээр тодорхойлсон.

Non-JSON response type-ийн хүрээг `ADR-0003-dti-response-types.md` дээр тодорхойлсон.

## Consequences

- `@napp/dti-server` нь standalone REST API server adapter байдлаар ашиглагдана.
- `@napp/dti-client` нь optional хэрэглээ бөгөөд server-ийн заавал шаардлагатай dependency биш байна.
- External integration, DevOps health check, manual API test хийхэд DTI client шаардахгүй.
- Signed endpoint ашиглах non-DTI client нь DTI signing protocol болон action-ийн signing contract-ийг хэрэгжүүлэх шаардлагатай.
- Server талын validation shared contract дээр төвлөрөх тул DTI client ашиглаагүй request дээр ч ижил дүрэм үйлчилнэ.
- Response envelope тогтвортой байх шаардлагатай. Client болон non-DTI consumer аль аль нь энэ format-д найдна.

## Alternatives Considered

### Зөвхөн DTI client-ээр дамжуулж server ашиглах

Server implementation энгийн болох боловч REST API interoperability муудна. Postman, curl, legacy client, external service ашиглахад нэмэлт adapter шаардлагатай болно.

### DTI client-д зориулсан тусдаа endpoint гаргах

REST endpoint болон DTI endpoint хоёр салж contract drift үүсэх эрсдэлтэй. Нэг action contract дээр client болон server behavior төвлөрөх зорилготой нийцэхгүй.

### Raw Express handler-ийг contract validation-гүй ажиллуулах

Express integration энгийн боловч shared contract-ийн үндсэн үнэ цэнэ буурна. Client/server schema зөрөх, runtime payload алдаа хожуу илрэх эрсдэлтэй.
