routes

package
v0.0.21 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 27, 2026 License: MIT Imports: 7 Imported by: 0

Documentation

Index

Constants

View Source
const BindingD1 = api.BindingD1
View Source
const PathHealth = api.PathHealth
View Source
const PathHealthDB = api.PathHealthDB
View Source
const PathRolesAssign = api.PathRolesAssign
View Source
const PathToken = api.PathToken
View Source
const PathUsersResolve = api.PathUsersResolve

Variables

This section is empty.

Functions

func AssignRole added in v0.0.21

func AssignRole(db *orm.DB, rbacSvc *rbac.Service) router.HandlerFunc

AssignRole concede roleCode al usuario en el proyecto del llamante. Idempotente: si ya lo tiene, no es un error. Si el rol no existe en ese proyecto, se crea.

func Health

func Health() router.HandlerFunc

Health responde si este Worker esta vivo y sirviendo. A proposito NO toca la base: quien consulta esta ruta pregunta por el Worker, y meter una consulta a D1 aqui costaba ~160 ms de viaje a la region de la base ademas de convertir un hipo de red en una falsa alarma de caida. La alcanzabilidad de la base tiene su propia ruta, PathHealthDB.

func HealthDB added in v0.0.20

func HealthDB(db *orm.DB) router.HandlerFunc

HealthDB comprueba que la base responde. Es deliberadamente una ruta aparte: cuesta un viaje completo a la region donde vive D1, asi que se consulta cuando se quiere esa respuesta, no en cada latido de un monitor.

func Register

func Register(r router.Router, db *orm.DB, authMod *authority.Module, rbacSvc *rbac.Service, secret []byte)

Register monta todas las rutas de iam en el router.

modules is the single, exhaustive list of everything this server mounts through router.APIModule. It is intentionally the ONLY place iam calls MountAPI: a module with routes to serve belongs in this slice, never invoked ad hoc elsewhere, so adding a module here is the only way its routes reach a caller — and leaving it out is the only way they don't. That is what closes the hole this plan exists for: authMod's OAuth routes (/oauth/google, /oauth/callback/google) and /logout were built and enabled (config/auth.go, config/auth_local.go) but never mounted, so every login attempt 404'd, silently, since Stage 4 — MountAPI existed and was correct, nothing ever called it.

Ninguna ruta lleva CORS: el llamador es siempre el SERVIDOR de un proyecto consumidor (server-to-server), nunca el navegador del usuario directamente — el client_secret no puede vivir en un bundle WASM/JS (ver ARCHITECTURE.md §6.4/§7). Sin llamador cross-origin, no hay cabeceras CORS que emitir.

func ResolveUser added in v0.0.9

func ResolveUser(db *orm.DB, authMod *authority.Module) router.HandlerFunc

ResolveUser busca un usuario por email dentro de la identidad global de iam (no hay tabla de usuarios por proyecto: la identidad es una sola, ver ARCHITECTURE.md §1) y lo crea si no existe. Devuelve su Sub — el mismo id que llevará el Sub de su token cuando inicie sesión, así que un consumidor puede asignarle recursos (ej. dueño de un sitio) ANTES de que esa persona haga login por primera vez.

func Token

func Token(db *orm.DB, authMod *authority.Module, rbacSvc *rbac.Service, secret []byte) router.HandlerFunc

Token emite un token de autorización project-scoped para el usuario de la sesión activa, si project_id/client_secret validan contra el proyecto registrado.

Types

type AssignRoleRequest added in v0.0.21

type AssignRoleRequest struct {
	ProjectID    string
	ClientSecret string
	UserID       string
	RoleCode     string
}

AssignRoleRequest es el cuerpo de POST /api/roles/assign. Acotado al project_id del que llama: un consumidor jamás concede un rol en otro proyecto.

func (*AssignRoleRequest) DecodeFields added in v0.0.21

func (r *AssignRoleRequest) DecodeFields(fr model.FieldReader)

func (*AssignRoleRequest) EncodeFields added in v0.0.21

func (r *AssignRoleRequest) EncodeFields(w model.FieldWriter)

func (*AssignRoleRequest) IsNil added in v0.0.21

func (r *AssignRoleRequest) IsNil() bool

type AssignRoleResponse added in v0.0.21

type AssignRoleResponse struct{}

func (*AssignRoleResponse) DecodeFields added in v0.0.21

func (r *AssignRoleResponse) DecodeFields(fr model.FieldReader)

func (*AssignRoleResponse) EncodeFields added in v0.0.21

func (r *AssignRoleResponse) EncodeFields(w model.FieldWriter)

func (*AssignRoleResponse) IsNil added in v0.0.21

func (r *AssignRoleResponse) IsNil() bool

type ResolveUserRequest added in v0.0.9

type ResolveUserRequest struct {
	ProjectID    string
	ClientSecret string
	Email        string
	Name         string
}

ResolveUserRequest es el cuerpo de POST /api/users/resolve. No hay sesión de por medio — a diferencia de /api/token, el email de destino no tiene por qué haber iniciado sesión nunca (un admin de un consumidor registra un cliente nuevo por su email). client_secret es la única prueba de identidad: sin él, cualquiera podría crear usuarios en cualquier proyecto.

func (*ResolveUserRequest) DecodeFields added in v0.0.9

func (r *ResolveUserRequest) DecodeFields(fr model.FieldReader)

func (*ResolveUserRequest) EncodeFields added in v0.0.9

func (r *ResolveUserRequest) EncodeFields(w model.FieldWriter)

func (*ResolveUserRequest) IsNil added in v0.0.9

func (r *ResolveUserRequest) IsNil() bool

type ResolveUserResponse added in v0.0.9

type ResolveUserResponse struct {
	Sub string
}

ResolveUserResponse es la respuesta de POST /api/users/resolve.

func (*ResolveUserResponse) DecodeFields added in v0.0.9

func (r *ResolveUserResponse) DecodeFields(fr model.FieldReader)

func (*ResolveUserResponse) EncodeFields added in v0.0.9

func (r *ResolveUserResponse) EncodeFields(w model.FieldWriter)

func (*ResolveUserResponse) IsNil added in v0.0.9

func (r *ResolveUserResponse) IsNil() bool

type TokenRequest

type TokenRequest struct {
	ProjectID    string
	ClientSecret string
}

TokenRequest es el cuerpo de POST /api/token. userID NUNCA viaja aquí — sale de ctx.UserID() (la sesión activa), nunca del body (ver ARCHITECTURE.md §6, "el userID sale de la sesión, nunca del cuerpo").

func (*TokenRequest) DecodeFields

func (t *TokenRequest) DecodeFields(r model.FieldReader)

func (*TokenRequest) EncodeFields

func (t *TokenRequest) EncodeFields(w model.FieldWriter)

func (*TokenRequest) IsNil

func (t *TokenRequest) IsNil() bool

type TokenResponse

type TokenResponse struct {
	Token  string
	Email  string
	Name   string
	Avatar string
}

TokenResponse es la respuesta de POST /api/token. Además del token de autorización, lleva el perfil básico del usuario de la sesión — Email/Name/Avatar, no Sub/Aud/Scope (eso vive en Token, ver ARCHITECTURE.md §6.2) — para que un consumidor que ya está haciendo esta llamada no necesite una segunda solo para mostrar "Hola, <nombre>": la respuesta ya requiere sesión activa + client_secret válido, así que no hay superficie nueva que exponer.

func (*TokenResponse) DecodeFields

func (t *TokenResponse) DecodeFields(r model.FieldReader)

func (*TokenResponse) EncodeFields

func (t *TokenResponse) EncodeFields(w model.FieldWriter)

func (*TokenResponse) IsNil

func (t *TokenResponse) IsNil() bool

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL