Kyrux
Voltar

Referência Rápida

Context — todos os métodos

// Path params
ctx.Param("nome")              // string
ctx.ParamInt("id")             // (int, bool)

// Query string
ctx.Query("q")                 // string
ctx.QueryDefault("order","asc")// string com fallback
ctx.QueryInt("page", 1)        // int com fallback
ctx.QueryAll("tag")            // []string

// Respostas
ctx.JSON(status, v)
ctx.HTML(status, html)
ctx.Redirect(url, status)
ctx.Error(code)

// Dados internos
ctx.Set("chave", valor)
ctx.Get("chave")               // (any, bool)

// Acesso direto
ctx.Request                    // *http.Request
ctx.Writer                     // http.ResponseWriter
ctx.Params                     // map[string]string

ORM — todos os métodos

// Leitura
orm.FromDB[T](db).All()                          // ([]T, error)
orm.FromDB[T](db).Each(func(t *T) error {...})   // streaming, memória O(1)
orm.FromDB[T](db).First()                        // (*T, error) — sql.ErrNoRows se vazio
orm.FromDB[T](db).Last()                         // (*T, error) — ordenação invertida
orm.FromDB[T](db).Exists()                       // (bool, error)
orm.FromDB[T](db).Count()                        // (int64, error)
orm.FromDB[T](db).Sum("col")                     // (float64, error) — também Avg/Min/Max

// Filtros tipados (retornam *Query[T]) — preferidos: coluna validada
.WhereEq("col", val)          // col = ?      (também OrWhereEq)
.WhereNe("col", val)          // col <> ?
.WhereGt/.WhereGte/.WhereLt/.WhereLte("col", val)  // col >, >=, <, <= ?
.WhereLike("col", "%termo%")  // col LIKE ?   (também OrWhereLike)
.WhereNull("col") / .WhereNotNull("col")

// Filtros em SQL livre — nunca concatene valores na string, só em args
.Where("col = ?", val)        // idêntico a WhereSQL
.OrWhere("col = ?", val)      // idêntico a OrWhereSQL
.WhereIn("id", ids)           // expande slice em placeholders (máx. 5000 valores)
.Join("users", "users.id = posts.user_id")     // filtro por relação
.LeftJoin("users", "users.id = posts.user_id")
.OrderBy("col DESC", "id")    // múltiplas colunas — ou orm.Desc("col")/orm.Asc("col")
.Select("id", "titulo")       // restringe colunas do SELECT (padrão: *)
.Distinct()
.Limit(n)
.Offset(n)

// Relações (carregamento sem N+1)
orm.Prefetch[Comentario](db, "post_id", ids, func(c *Comentario) int64 { return c.PostID })
// → (map[int64][]Comentario, error)

// Paginação
orm.FromDB[T](db).Where(...).OrderBy("id DESC").Paginate(page, 20)     // pageSize máx. 1000
orm.FromDB[T](db).OrderBy("id DESC").PaginateNoCount(page, 20)         // sem COUNT(*)
// → (Page[T], error)
// Page[T]: Items, Total, Page, PageSize, TotalPages, HasNext, HasPrev

orm.FromDB[T](db).PaginateAfter("id", cursor, false, 20) // keyset — custo não cresce com a página
// → (KeysetPage[T], error) — KeysetPage[T]: Items, NextCursor, HasNext

// Escrita
orm.Create(db, &model)                         // error — preenche PK
orm.CreateAll(db, []*T{...})                   // bulk: um INSERT multi-VALUES
orm.FromDB[T](db).Where(...).Update(map[string]any{...}) // error
orm.FromDB[T](db).Where(...).Delete()            // error
orm.FromDB[T](db).Where(...).GetOrCreate(&defaults)      // (*T, created, error) — recupera de corrida via UNIQUE
orm.FromDB[T](db).Where(...).UpdateOrCreate(values, &defaults) // (created, error) — idem

// Transações (atômico — commit/rollback automático)
fw.DB.Use().Transaction(func(tx *database.Tx) error {
    orm.CreateTx(tx, &model)
    return orm.FromTx[T](tx).Where(...).Update(...)
})

// Multi-tenant
db := fw.DB.Use().WithSchema("tenant_abc")
orm.FromDB[T](db).All()  // → SELECT * FROM tenant_abc.tabela

ORM — tags do model

Tag Efeito
kyrux:"pk" Chave primária — ignorado no INSERT, preenchido após criação
kyrux:"column:nome" Override do nome da coluna SQL
kyrux:"size:N" VARCHAR(N) no makemigrations
kyrux:"unique" CREATE UNIQUE INDEX no makemigrations (apenas migration)
kyrux:"default:valor" Valor SQL literal no INSERT se campo for zero Go
kyrux:"hash" Hash Argon2id+pepper automático na escrita; nunca revertido
kyrux:"encrypt" AES-256-GCM: cifra na escrita, decifra na leitura
kyrux:"login" Exclusivo do auth.User — define o campo de login; imutável após migrate
kyrux:"autonow" CURRENT_TIMESTAMP automático em todo Update; preenche no Create se zerado
kyrux:"fk:tabela" REFERENCES tabela(id) + índice na migration

Auth — todos os métodos

// Model
user.SetPassword("senha")          // hash Argon2id + pepper
user.CheckPassword("senha")        // bool
user.FullName()                    // "Nome Sobrenome"

// Campo de login (determinado pela tag kyrux:"login" no model User)
auth.LoginFieldName()                              // string — "Username" ou "Email"

// SSR (sessão)
auth.Login(db, store, w, r, loginValue, password)  // (*session.Session, error)
auth.Logout(store, r, w)                           // remove sessão + expira cookie
auth.GetUser(db, store, r)                         // (*User, error)
auth.NextURL(r, fallback)                          // string — lê ?next=, valida open redirect

// JWT
fw.Auth.GenerateToken(userID, ttl)  // (string, error)
fw.Auth.ValidateToken(token)        // (*Claims, error)

// Erros SSR
auth.ErrUserNotFound
auth.ErrWrongPassword
auth.ErrInactiveUser
auth.ErrAuthDisabled  // retornado quando DB_ENABLED=false

Realtime — todos os métodos

fw.Realtime.Replace("target", html)   // innerHTML = html
fw.Realtime.Append("target", html)    // adiciona ao final
fw.Realtime.Prepend("target", html)   // adiciona ao início
fw.Realtime.Remove("target")          // remove o elemento
fw.Realtime.Broadcast("evento", data) // publica no EventBus

EventBus — todos os métodos

fw.Events.Subscribe("evento", handler)   // assinar
fw.Events.Publish("evento", payload)     // publicar
fw.Events.Unsubscribe("evento")          // cancelar

DB Manager — todos os métodos

fw.DB.Add("nome", "driver", "dsn")          // adicionar conexão
fw.DB.Use()                                 // conexão "default"
fw.DB.Use("nome")                           // conexão nomeada
fw.DB.Use().WithSchema("schema")            // cópia com schema (multi-tenant)
fw.DB.Use().Transaction(func(tx) error { ... })
fw.DB.Close()                               // encerrar todas

Render — funções globais e processors

// Funções customizadas para templates (disponíveis globalmente)
render.AddFunc("nome", funcao)
render.AddFunc("formatarData", func(t time.Time) string {
    return t.Format("02/01/2006")
})

// ContextProcessors — variáveis injetadas em todos os templates de todos os apps
render.AddDefaultProcessor(func(ctx *router.Context) map[string]any {
    return map[string]any{"ano": time.Now().Year()}
})

// Renderizar fragmento para string (usado com Realtime)
html, err := render.Partial("appName", "partials/lista.html", data)

Crypton — utilitários de segurança

// Setup (chamado pelo bootstrap automaticamente)
crypton.SetPepper(pepper)
crypton.SetEncryptionKey(key)

// Senhas (Argon2id — formato PHC)
crypton.HashPassword("senha")                  // (string, error) — $argon2id$...
crypton.CheckPassword("senha", hash)           // bool — comparação em tempo-constante

// Criptografia simétrica (AES-256-GCM)
crypton.Encrypt("dado sensível")               // (string, error) — $enc$<base64>
crypton.Decrypt("$enc$<base64>")              // (string, error)

// Assinatura HMAC-SHA256
crypton.Sign("payload", "secret")             // (string, error) — <b64>.<sig>
crypton.Verify("token", "secret")             // (string, error) — payload ou erro

// Aleatoriedade criptograficamente segura
crypton.RandomBytes(32)                        // ([]byte, error)

Errors — customização de páginas de erro

import kyerrors "kyrux/core/errors"

// Registrar handler customizado para código HTTP
kyerrors.Set(404, func(w http.ResponseWriter, r *http.Request) {
    w.Header().Set("Content-Type", "application/json")
    w.WriteHeader(404)
    json.NewEncoder(w).Encode(map[string]string{"error": "não encontrado"})
})

kyerrors.Set(500, func(w http.ResponseWriter, r *http.Request) {
    // renderizar template personalizado de erro 500
})

Handlers registrados têm prioridade sobre o comportamento padrão em qualquer ambiente.

Session — API de baixo nível

import "kyrux/core/security/session"

// Criar sessão manualmente
sess, err := fw.Sessions.New()
sess.Set("chave", valor)
session.SetCookie(ctx.Writer, sess.ID, ctx.Request.TLS != nil)

// Ler sessão do request
sess, ok := session.FromRequest(ctx.Request, fw.Sessions)
if !ok { /* sem sessão */ }

// Acessar valores (seguro para requisições paralelas)
val, ok := sess.Get("chave")

// Encerrar sessão
fw.Sessions.Delete(sess.ID)

Kyrux — execução no momento certo. Desenvolvido por Müller Nocciolli · Licença MIT com atribuição obrigatória.