Clone
1
Razvoj
Dasko edited this page 2026-06-21 02:16:00 +02:00

Razvoj

Okruženje

# 1. Kloniraj
git clone git@git.vm-net.in.rs:Dasko/GoNtech.git
cd GoNtech

# 2. Podesi ENV
export $(grep -v '^#' ntech.env | xargs)

# 3. Pokreni u dev modu (šabloni sa diska — hot-reload nije ugrađen)
go run ./cmd/ntech

Struktura koda po konvenciji

  • Handleri — grupisani po domenu u internal/handler/ (jedan fajl = jedan domen)
  • Modeliinternal/model/ — čiste strukture, nula poslovne logike
  • Middleware — stacked na chi ruter u main.go
  • Šabloni — komponentna struktura u web/templates/komponente/
  • Migracije — numerisane prefiksom (001_, 002_, ...), append-only, nikad ne renumber-ovati

Konvencije koda

  • Indentacija: tabovi (Go standard)
  • Formatiranje: gofmt -s -w . pre svakog commit-a
  • Imenovanje:
    • Izvezeni: PascalCase (MagacinHandler, ListaArtikala)
    • Neizvezeni: camelCase (renderStranicu, parsirajFormu)
    • Fajlovi: snake_case.go po domenu (magacin.go, servis.go)
  • Importi: stdlib → third-party → internal (blank-line razdvajanje)
  • Error handling: eksplicitna provera, wrap kroz fmt.Errorf("ntech: ...: %w", err)

Jezik

Šta Jezik
Korisnički interfejs srpski (ekavica, latinica)
Poruke o greškama srpski
Komentari u kodu srpski
Git commit poruke srpski
Dokumentacija srpski
Imena promenljivih/funkcija engleski
Nazivi SQL kolona/tabela engleski
Nazivi ENV promenljivih engleski

Testiranje

# Svi testovi
go test ./...

# Bez keša
go test ./... -v -count=1

# Specifični test
go test ./internal/handler/ -run TestPrijava -v

Test fajlovi su pored koda koji testiraju:

  • internal/handler/prijava_test.go
  • internal/handler/parseformu_test.go
  • internal/model/model_test.go
  • internal/db/sqlite/izvestaj_test.go

Build i provera

# Formatiranje
gofmt -s -w .

# Statička analiza
go vet ./...

# Build
CGO_ENABLED=0 go build ./cmd/ntech

Migracije

Migracije su u migrations/, numerisane trocifrenim prefiksom:

001_kategorije.sql
002_artikli.sql
...
061_backfill_kategorija_kod.sql

Pravila:

  • Append-only — nove migracije se dodaju, postojeće se nikad ne menjaju
  • Idempotentne — koriste CREATE TABLE IF NOT EXISTS, ALTER TABLE ... ADD COLUMN (SQLite)
  • Redosled — izvršavaju se po imenu fajla, rastuće
  • Transakcije — SQLite implicitno, migration tabela prati koje su izvršene

Grane i workflow

# Nova funkcionalnost
git switch -c feature/kratak-opis

# Posle izmene
gofmt -s -w .
go vet ./...
git commit -m "Kratak opis promene"
git push -u origin feature/kratak-opis

Commit poruke

Format: srpski, kratak opis (max 50 karaktera), opciono detaljnije u telu.

Primeri:

Magacin: modal za premeštanje + ujednačen slajder na svim brauzerima

Bezbednosni audit i refaktoring: HP popravke, RBAC, flash poruke, go:embed, CSP

Dodavanje novog modula

  1. Model — struktura u internal/model/novi_modul.go
  2. Repozitorijum — interfejs u internal/db/repository.go, implementacija u internal/db/sqlite/novi_modul.go
  3. Migracijamigrations/062_novi_modul.sql
  4. Handlerinternal/handler/novi_modul.go
  5. Rute — dodati u cmd/ntech/main.go
  6. Dozvole — dodati u internal/middleware/dozvole.go
  7. Šabloniweb/templates/stranice/novi_modul.html
  8. CSS — dodati u web/static/main.css (ako treba novi stil)

Zavisnosti (go.mod)

Direktna Verzija Uloga
go-chi/chi/v5 5.3.0 HTTP ruter + middleware
google/uuid 1.6.0 UUID generator (tokeni sesije)
joho/godotenv 1.5.1 .env fajl loader
pquerna/otp 1.5.0 TOTP 2FA
x/crypto 0.52.0 bcrypt
modernc.org/sqlite 1.51.0 SQLite bez CGO

Sve ostalo je Go standardna biblioteka: net/http, database/sql, html/template, crypto/rand, embed, io/fs, log/slog.