Preskoči na sadržaj

TypeScript i Node.js

Poslovno pravilo pišem jednom, u kodu, i ono tada važi svuda.

Isto pravilo na troja vrata

Neko unese popust od 40 procenata. Šta se zatim dešava ne zavisi od toga gde broj uđe.

Formular u portalu

Unos
Popust 40 % u formularu
Pravilo
quote.discount: 40 > 15, odbijeno
Prikaz
„Preko 15 % treba odobrenje“
Ishod
Ništa nije sačuvano

Interfejs

Unos
POST /quotes sa popustom 40 %
Pravilo
quote.discount: 40 > 15, odbijeno
Log
warn quote.discount 40
Ishod
Odgovor 422, ništa nije sačuvano

Uvoz tabele

Unos
Red 114: popust 40 %
Pravilo
quote.discount: 40 > 15, odbijeno
Log
warn quote.discount 40, red 114
Ishod
Red preskočen, 249 od 250 uvezeno

Primer vrednosti. Koja granica važi kod vas, odlučujete vi. Ja je zapišem jednom.

Pravilo iza toga

Evo je, objašnjena red po red. Granica stoji jednom u kodu, a sva troja vrata je čitaju odatle.

rules/quote.tsTypeScript, Primer, skraćeno
import { z } from 'zod';// Procenti. Iznad toga odlučuje čovek.export const MAX_DISCOUNT = 15;export const QuoteLine = z.object({  item: z.string().min(1),  quantity: z.number().int().min(1),  discount: z.number().max(MAX_DISCOUNT),});

Pravilo stoji samo jednom.

Granica od 15 procenata stoji u redu 4 i nigde više. Ako se promeni, menjam taj jedan red, a formular, interfejs i uvoz ga prate.

Redovi 1 do 10

// Formular, interfejs i uvoz:const result = QuoteLine.safeParse(input);if (!result.success) {  return reject(result.error);}

Pogrešan unos staje na vratima.

Svako mesto koje prima podatke poziva istu proveru. Pogrešan broj ne stiže do baze, pa ga posle niko ne mora tražiti u izveštaju.

Redovi 11 do 15

function reject(error: z.ZodError) {  log.warn('quote.discount', error.issues);  return {    status: 422,    message: 'Preko 15 % treba odobrenje',  };}

Greška ide u log.

Provera upisuje događaj u log sa pravilom i vrednošću. Korisnik dobija rečenicu koju razume, a ne tehničku stranicu greške.

Redovi 16 do 22

test('iznad granice pada', () => {  const line = { item: 'A', quantity: 1 };  const bad = { ...line, discount: 16 };  expect(QuoteLine.safeParse(bad).success)    .toBe(false);});

Test učvršćuje granicu.

Test proverava vrednost odmah iznad granice, a ne formulare ispred nje. Ko kasnije pomeri granicu, naiđe na ovaj test i mora svesno da potvrdi izmenu.

Redovi 23 do 28

Za šta ga koristim

  • Posebna poslovna logika iza portala
  • Logika obračuna i ponuda za prodajne procese
  • Putevi uvoza i izvoza postojećih podataka
  • Modeli uloga i dozvola za više klijenata
  • MVP-ovi koje kasnije preuzima interni tim

Gde već radi

  • 2026

    KI-Exposé-Generator

    Ponude za oko 3 minuta

    Next.js, TypeScript, AI, PostgreSQL, PDF

  • 2025

    Snipeflip

    do 2.500 operacija dnevno

    Next.js, Node.js, PostgreSQL, Docker, Cloud

  • 2025

    RecRobot

    sa 3 na 12 automatizovanih koraka

    TypeScript, AI, Automation, APIs, Cloud

Svi projekti

Sadržano je u ovim ponudama

  • 04

    Full-stack razvoj

    Jedna funkcija, jedan sistem, jedna odgovornost.

    2–12 nedelja, Fiksna cena posle tehničke provere

  • 05

    Portal i softver po meri

    Pretvori uslugu u digitalno iskustvo.

    6–12+ nedelja, Izrada i rad, posle discovery faze

Koje pravilo kod vas ide u različitim pravcima?

Opišite mi slučaj u tri rečenice. Odgovaram sam, a razgovor traje 15 minuta.

Pre toga: tri rečenice, dva radna dana do odgovora, razgovor od 15 minuta. Kako počinje