types

package
v0.10.14 Latest Latest
Warning

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

Go to latest
Published: May 18, 2026 License: Apache-2.0 Imports: 12 Imported by: 0

Documentation

Index

Examples

Constants

This section is empty.

Variables

View Source
var ErrEntryNotFound = errors.New("cache entry not found")

ErrEntryNotFound is returned when a cache entry is not found.

Functions

This section is empty.

Types

type Cache

type Cache[T any] interface {
	// Get retrieves a value from the cache by key.
	// Returns ErrEntryNotFound if the key does not exist.
	Get(key string) (T, error)

	// Peek retrieves a value from the cache by key without affecting its position or access time.
	// Returns ErrEntryNotFound if the key does not exist.
	Peek(key string) (T, error)

	// Set stores a value in the cache with the specified TTL.
	// A zero TTL means the entry will not expire.
	Set(key string, value T, ttl time.Duration) error

	// Delete removes a key from the cache.
	// Returns ErrEntryNotFound if the key does not exist.
	Delete(key string) error

	// Exists checks if a key exists in the cache.
	// Returns true if the key exists, false otherwise.
	Exists(key string) bool

	// Len returns the number of entries currently stored in the cache.
	Len() int

	// Clear removes all entries from the cache.
	Clear()

	// WithContext replaces the cache internal context that used to propagate span context.
	WithContext(ctx context.Context) Cache[T]
}

Cache provides a unified caching abstraction with consistent error handling. Supports TTL, context-aware operations, and distributed tracing.

Type Parameters:

  • T: Serializable data type

Error Handling:

  • Get/Peek return ErrEntryNotFound when key doesn't exist
  • All operations return errors for proper error handling

type Coder added in v0.10.14

type Coder interface {
	Code() int
	Status() int
	Msg() string
}

Coder is implemented by API response code types (e.g. response.Code) so service errors can attach a stable client-facing numeric code and default message.

type ControllerConfig

type ControllerConfig[M Model] struct {
	DB        any // only support *gorm.DB
	TableName string
	ParamName string
}

type ControllerContext

type ControllerContext struct {
	Username string // currrent login user.
	UserID   string // currrent login user id
	Route    string
	Params   map[string]string
	Query    url.Values

	RequestID string
	TraceID   string
	PSpanID   string
	SpanID    string
	Seq       int
}

func NewControllerContext

func NewControllerContext(c *gin.Context) *ControllerContext

NewControllerContext creates a ControllerContext from gin.Context

type Database

type Database[M Model] interface {
	// Create inserts one or multiple records into the database.
	Create(objs ...M) error
	// Delete removes one or multiple records from the database.
	Delete(objs ...M) error
	// Update modifies one or multiple records in the database.
	Update(objs ...M) error
	// UpdateByID updates a single field of a record by its ID.
	UpdateByID(id string, key string, value any) error
	// List retrieves multiple records matching the query conditions.
	List(dest *[]M) error
	// Get retrieves a single record by its ID.
	Get(dest M, id string) error
	// First retrieves the first record ordered by primary key.
	First(dest M) error
	// Last retrieves the last record ordered by primary key.
	Last(dest M) error
	// Take retrieves the first record in no specified order.
	Take(dest M) error
	// Count returns the total number of records matching the query conditions.
	Count(*int64) error
	// Cleanup permanently deletes all soft-deleted records.
	Cleanup() error
	// Health checks the database connectivity and basic operations.
	Health() error
	// Transaction executes a function within a transaction (single-model, recommended).
	Transaction(fn func(txDB Database[M]) error) error
	// TransactionFunc executes a function within a transaction (multi-model, requires WithTx).
	TransactionFunc(fn func(tx any) error) error

	DatabaseOption[M]
}

Database provides comprehensive database operations for any model type. Supports CRUD operations, flexible querying, transactions, and advanced features.

Type Parameters:

  • M: Model type that implements Model interface

Features:

  • CRUD operations with automatic timestamp management
  • Flexible querying with various finder methods
  • Transaction support for single and multi-model operations
  • Health monitoring and cleanup capabilities
  • Optional caching support for improved performance

The interface embeds DatabaseOption[M] to provide chainable query building.

Implementations share an underlying GORM session. You must call database.Database[M](ctx) again for each separate operation chain. Keeping the returned value in a variable and running another independent operation on it (e.g. List then Get/Update) is incorrect usage; see database.Database.

type DatabaseContext

type DatabaseContext struct {
	Username string // currrent login user.
	UserID   string // currrent login user id
	Route    string
	Params   map[string]string
	Query    url.Values

	RequestID string
	TraceID   string
	PSpanID   string
	SpanID    string
	Seq       int
	// contains filtered or unexported fields
}

func NewDatabaseContext

func NewDatabaseContext(c *gin.Context, ctxs ...context.Context) *DatabaseContext

NewDatabaseContext creates a DatabaseContext from gin.Context

You can pass the custom context.Context to propagate span tracing, otherwise use the c.Request.Context().

func (*DatabaseContext) Context

func (dc *DatabaseContext) Context() context.Context

Context converts *DatabaseContext to context.Context. It starts from the underlying ctx.context and conditionally injects extra metadata.

type DatabaseOption

type DatabaseOption[M Model] interface {
	// WithDB sets a custom database instance for operations.
	WithDB(any) Database[M]
	// WithTx sets transaction context for operations (used with TransactionFunc).
	WithTx(tx any) Database[M]
	// WithTable sets a custom table name for operations.
	WithTable(name string) Database[M]
	// WithDebug enables debug mode to show detailed SQL queries.
	WithDebug() Database[M]
	// WithQuery sets query conditions based on model fields or raw SQL.
	WithQuery(query M, config ...QueryConfig) Database[M]
	// WithCursor enables cursor-based pagination for efficient large dataset traversal.
	WithCursor(string, bool, ...string) Database[M]
	// WithTimeRange applies a time range filter to the query.
	WithTimeRange(columnName string, startTime time.Time, endTime time.Time) Database[M]
	// WithSelect specifies fields to select in queries.
	WithSelect(columns ...string) Database[M]
	// WithSelectRaw specifies raw SQL for field selection.
	WithSelectRaw(query any, args ...any) Database[M]
	// WithIndex specifies database index hints for query optimization (MySQL only).
	WithIndex(indexName string, hint ...consts.IndexHintMode) Database[M]
	// WithRollback configures a rollback function for manual transaction control.
	WithRollback(rollbackFunc func()) Database[M]
	// WithJoinRaw adds a raw JOIN clause to the query.
	WithJoinRaw(query string, args ...any) Database[M]
	// WithLock adds row-level locking to SELECT queries (must be used within a transaction).
	WithLock(mode ...consts.LockMode) Database[M]
	// WithBatchSize sets the batch size for bulk operations.
	WithBatchSize(size int) Database[M]
	// WithPagination applies pagination parameters (page, size) to the query.
	WithPagination(page, size int) Database[M]
	// WithLimit restricts the number of returned records.
	WithLimit(limit int) Database[M]
	// WithExclude excludes records matching specified conditions.
	WithExclude(map[string][]any) Database[M]
	// WithOrder adds ORDER BY clause to sort query results.
	WithOrder(order string) Database[M]
	// WithExpand enables eager loading of specified associations.
	WithExpand(expand []string, order ...string) Database[M]
	// WithPurge controls whether to permanently delete records (hard delete).
	WithPurge(...bool) Database[M]
	// WithCache enables query result caching.
	WithCache(...bool) Database[M]
	// WithOmit excludes specified fields from operations.
	WithOmit(...string) Database[M]
	// WithDryRun enables dry-run mode to preview SQL without executing.
	WithDryRun() Database[M]
	// WithoutHook disables model hooks for the operation.
	WithoutHook() Database[M]
}

DatabaseOption provides chainable query building methods for database operations. All methods return Database[M] to support method chaining.

type DistributedCache

type DistributedCache[T any] interface {
	Cache[T]

	// SetWithSync stores a value in both local and distributed cache with synchronization.
	SetWithSync(key string, value T, localTTL time.Duration, remoteTTL time.Duration) error

	// GetWithSync retrieves a value from local cache first, then from distributed cache if not found.
	GetWithSync(key string, localTTL time.Duration) (T, error)

	// DeleteWithSync removes a value from both local and distributed cache with synchronization.
	DeleteWithSync(key string) error
}

DistributedCache provides a two-level distributed caching system combining local memory cache with Redis backend for synchronized caching across multiple nodes.

Type Parameters:

  • T: Serializable data type

Features:

  • Automatic cache synchronization across multiple application instances
  • Configurable TTL for both local and distributed cache layers
  • Event-driven cache invalidation using Kafka messaging
  • Thread-safe concurrent operations

type ESDocumenter

type ESDocumenter interface {
	// Document returns a map representing an Elasticsearch document.
	// The returned map should contain all fields to be indexed, where:
	//   - keys are field names (string type)
	//   - values are field values (any type)
	//
	// Implementation notes:
	//   1. The returned map should only contain JSON-serializable values.
	//   2. Field names should match those defined in the Elasticsearch mapping.
	//   3. Complex types (like nested objects or arrays) should be correctly
	//      represented in the returned map.
	//
	// Example:
	//   return map[string]any{
	//       "id":    "1234",
	//       "title": "Sample Document",
	//       "tags":  []string{"tag1", "tag2"},
	//   }
	Document() map[string]any

	// GetID returns a string that uniquely identifies the document.
	// This ID is typically used as the Elasticsearch document ID.
	//
	// Implementation notes:
	//   1. The ID should be unique within the index.
	//   2. If no custom ID is needed, consider returning an empty string
	//      to let Elasticsearch auto-generate an ID.
	//   3. The ID should be a string, even if it's originally a numeric value.
	//
	// Example:
	//   return "user_12345"
	GetID() string
}

ESDocumenter represents a document that can be indexed into Elasticsearch. Types implementing this interface should be able to convert themselves into a document format suitable for Elasticsearch indexing.

type Event added in v0.10.2

type Event = sse.Event

Event is an alias for sse.Event. This allows users to use types.Event instead of importing internal/sse directly.

type Initializer added in v0.9.2

type Initializer interface {
	Init() error
}

Initializer defines components that perform one-time application setup. Typical implementations include config loaders, logger setup, and resource init.

type Logger

type Logger interface {
	With(fields ...string) Logger

	WithObject(name string, obj zapcore.ObjectMarshaler) Logger
	WithArray(name string, arr zapcore.ArrayMarshaler) Logger

	WithControllerContext(*ControllerContext, consts.Phase) Logger
	WithServiceContext(*ServiceContext, consts.Phase) Logger
	WithDatabaseContext(*DatabaseContext, consts.Phase) Logger

	StandardLogger
	StructuredLogger
	ZapLogger
}

Logger combines standard, structured, and zap logging with context helpers. With* methods attach fields, objects/arrays, and request/service/db context.

type Model

type Model interface {
	GetTableName() string // GetTableName returns the table name.
	GetID() string
	SetID(id ...string) // SetID method will automatically set the id if id is empty.
	ClearID()           // ClearID always set the id to empty.
	GetCreatedBy() string
	GetUpdatedBy() string
	GetCreatedAt() time.Time
	GetUpdatedAt() time.Time
	SetCreatedBy(string)
	SetUpdatedBy(string)
	SetCreatedAt(time.Time)
	SetUpdatedAt(time.Time)
	Expands() []string // Expands returns the foreign keys should preload.
	Excludes() map[string][]any
	Purge() bool                                  // Purge indicates whether to permanently delete records (hard delete). Default is false (soft delete).
	MarshalLogObject(zapcore.ObjectEncoder) error // MarshalLogObject implement zap.ObjectMarshaler

	CreateBefore(*ModelContext) error
	CreateAfter(*ModelContext) error
	DeleteBefore(*ModelContext) error
	DeleteAfter(*ModelContext) error
	UpdateBefore(*ModelContext) error
	UpdateAfter(*ModelContext) error
	ListBefore(*ModelContext) error
	ListAfter(*ModelContext) error
	GetBefore(*ModelContext) error
	GetAfter(*ModelContext) error
}

Model defines the contract for all data models in the framework. Provides database operations, audit trail, lifecycle hooks, and logging support.

Type Requirements:

  • Must be a pointer to struct (e.g., *User)
  • Must have an "ID" field as primary key
  • Should embed model.Base for common functionality

type ModelContext

type ModelContext struct {
	// contains filtered or unexported fields
}

func NewModelContext

func NewModelContext(ctx context.Context, dbctx *DatabaseContext) *ModelContext

func (*ModelContext) Context

func (mc *ModelContext) Context() context.Context

func (*ModelContext) DatabaseContext

func (mc *ModelContext) DatabaseContext() *DatabaseContext

type Module added in v0.10.0

type Module[M Model, REQ Request, RSP Response] interface {
	// Service returns the service instance that handles business logic for this module.
	Service() Service[M, REQ, RSP]

	// Route returns the base API path for this module's endpoints.
	Route() string

	// Pub determines whether the API endpoints are public or require authentication.
	Pub() bool

	// Param returns the URL parameter name used for resource identification.
	Param() string
}

Module defines a module system for creating modular API endpoints with automatic CRUD operations, routing, and service layer integration.

Type Parameters:

  • M: Model type that implements Model interface
  • REQ: Request type for API operations
  • RSP: Response type for API operations

Features:

  • Automatic route registration
  • Service layer integration
  • Configurable authentication

type QueryConfig added in v0.9.7

type QueryConfig struct {
	FuzzyMatch   bool   // Enable fuzzy matching (LIKE/REGEXP). Default: false
	AllowEmpty   bool   // Allow empty query conditions. Default: false
	UseOr        bool   // Use OR logic to combine query conditions. Default: false (uses AND)
	RawQuery     string // Raw SQL query string for custom WHERE conditions
	RawQueryArgs []any  // Arguments for the raw SQL query parameters
}

QueryConfig configures the behavior of WithQuery method.

Fields:

  • FuzzyMatch: Enable fuzzy matching (LIKE/REGEXP queries). Default: false (exact match with IN clause)

  • Single value: Uses LIKE pattern (WHERE name LIKE '%value%')

  • Multiple values (comma-separated): Uses REGEXP pattern (WHERE name REGEXP '.*value1.*|.*value2.*')

  • Empty strings in comma-separated values are automatically skipped

  • REGEXP special characters are automatically escaped

  • Note: REGEXP may not be available in all databases (e.g., SQLite requires extension)

  • AllowEmpty: Allow empty query conditions to match all records. Default: false (blocked for safety)

  • When false: Empty queries are blocked (adds WHERE 1 = 0)

  • When true: Empty queries match all records (full table scan)

  • Empty query cases: nil, empty struct, all fields are zero values, all field values are empty strings

  • Critical: Use with caution, especially for Delete operations

  • UseOr: Use OR logic to combine query conditions. Default: false (uses AND logic)

  • When false: Multiple fields use AND logic (WHERE name IN ('John') AND age IN (18))

  • When true: Multiple fields use OR logic (WHERE name IN ('John') OR age IN (18))

  • First condition always uses WHERE, subsequent conditions use OR

  • Works with both exact match and fuzzy match

  • RawQuery: Raw SQL query string for custom WHERE conditions. When provided, model fields are ignored

  • Works even when query is nil

  • Supports parameterized queries with RawQueryArgs

  • Example: "age > ? AND status = ?"

  • RawQueryArgs: Arguments for the raw SQL query, used with RawQuery for parameterized queries

  • Can be nil or empty slice if RawQuery has no placeholders

  • Example: []any{18, "active"}

CRITICAL SAFETY FEATURE: Empty query conditions (all fields are zero values) are blocked by default to prevent catastrophic data loss scenarios, especially when the result is used for Delete operations.

Empty Query Examples:

  • WithQuery(&User{}) → all fields are zero values
  • WithQuery(&User{Name: "", Email: ""}) → all field values are empty strings
  • WithQuery(&KV{Key: ""}) → happens when removed slice is empty

Usage Examples:

// Exact match (default)
WithQuery(&User{Name: "John"})
WithQuery(&User{Name: "John"}, QueryConfig{})

// Exact match with multiple values (comma-separated)
WithQuery(&User{Name: "John,Jack"})  // WHERE name IN ('John', 'Jack')
WithQuery(&User{ID: "id1,id2,id3"})  // WHERE id IN ('id1', 'id2', 'id3')

// Fuzzy match - single value (LIKE)
WithQuery(&User{Name: "John"}, QueryConfig{FuzzyMatch: true})  // WHERE name LIKE '%John%'

// Fuzzy match - multiple values (REGEXP)
WithQuery(&User{Name: "John,Jack"}, QueryConfig{FuzzyMatch: true})  // WHERE name REGEXP '.*John.*|.*Jack.*'

// Allow empty query (ListFactory with pagination)
WithQuery(&User{}, QueryConfig{AllowEmpty: true})  // Returns all records

// Fuzzy match + Allow empty
WithQuery(&User{}, QueryConfig{FuzzyMatch: true, AllowEmpty: true})

// Use OR logic to combine conditions
WithQuery(&User{Name: "John", Email: "john@example.com"}, QueryConfig{UseOr: true})
// WHERE name IN ('John') OR email IN ('john@example.com')

// OR logic with fuzzy match
WithQuery(&User{Name: "John", Email: "example"}, QueryConfig{UseOr: true, FuzzyMatch: true})
// WHERE name LIKE '%John%' OR email LIKE '%example%'

	// Raw SQL query (can be combined with model fields using AND logic)
WithQuery(&User{}, QueryConfig{RawQuery: "age > ? AND status = ?", RawQueryArgs: []any{18, "active"}})
WithQuery(nil, QueryConfig{RawQuery: "created_at BETWEEN ? AND ?", RawQueryArgs: []any{startDate, endDate}})

// Raw SQL with complex conditions
WithQuery(&User{}, QueryConfig{RawQuery: "created_at BETWEEN ? AND ? OR priority IN (?)", RawQueryArgs: []any{startDate, endDate, priorities}})
// Raw SQL combined with model fields
WithQuery(&User{Name: "John"}, QueryConfig{RawQuery: "age > ?", RawQueryArgs: []any{18}})  // WHERE age > ? AND name IN ('John')

// Combined options
WithQuery(&User{Name: "John"}, QueryConfig{
    FuzzyMatch: true,
    UseOr:      true,
    AllowEmpty: false,
})

type RBAC

type RBAC interface {
	AddRole(name string) error
	RemoveRole(name string) error

	GrantPermission(role string, resource string, action string) error
	// RevokePermission removes policies for the given role with flexible behaviors:
	// - resource=="" && action=="" : remove all policies for the role
	// - resource=="" && action!="" : remove policies matching the role and action
	// - resource!="" && action=="" : remove policies matching the role and resource
	// - resource!="" && action!="" : remove the exact (role, resource, action, "allow") policy
	RevokePermission(role string, resource string, action string) error

	AssignRole(subject string, role string) error
	UnassignRole(subject string, role string) error
}

RBAC provides role-based access control operations. Supports roles, permissions, and subject assignments with flexible resource and action management.

RBAC Model:

  • Subject: Users or entities that need access
  • Role: Named collection of permissions
  • Resource: Protected objects or endpoints
  • Action: Operations on resources

type Request

type Request any

type Response

type Response any

type SSEBuilder added in v0.10.13

type SSEBuilder struct {
	// contains filtered or unexported fields
}

SSEBuilder provides a fluent interface for building and sending SSE events. It supports chaining methods to configure and send SSE events or streams.

func (*SSEBuilder) Done added in v0.10.13

func (b *SSEBuilder) Done() error

Done sends a [DONE] marker to indicate the end of an SSE stream. This is commonly used in AI chat completions and similar streaming APIs.

Note: This method should be called AFTER Stream() returns, if your protocol requires a [DONE] marker. Standard SSE streams do not require this marker and will naturally end when the connection closes.

Example:

ctx.SSE().Stream(func(w io.Writer) bool {
    // Send data...
    return true
})
// Send [DONE] marker to indicate stream completion
_ = ctx.SSE().Done()

Returns:

  • error: Any error that occurred during encoding

func (*SSEBuilder) Stream added in v0.10.13

func (b *SSEBuilder) Stream(fn func(io.Writer) bool)

Stream starts a Server-Sent Events stream. The provided function will be called repeatedly until it returns false. The stream will automatically stop if:

  • The function returns false
  • The request context is canceled (timeout, client disconnect, etc.)
  • An error occurs while writing to the client

Note: This method does NOT automatically send a [DONE] marker when the stream ends. If your protocol requires a [DONE] marker (e.g., AI chat completions), you must manually call Done() after Stream() returns.

Example:

ctx.SSE().Stream(func(w io.Writer) bool {
    _ = ctx.Encode(w, types.Event{Data: "chunk"})
    return true // Continue streaming
})
// Send [DONE] marker if required by your protocol
_ = ctx.SSE().Done()

func (*SSEBuilder) WithInterval added in v0.10.13

func (b *SSEBuilder) WithInterval(duration time.Duration) *SSEBuilder

WithInterval sets the time interval between events in a stream. This must be called before Stream() when using interval-based streaming.

Example:

ctx.SSE().WithInterval(1*time.Second).Stream(func(w io.Writer) bool {
    _ = ctx.Encode(w, types.Event{Data: "chunk"})
    return true
})

type Service

type Service[M Model, REQ Request, RSP Response] interface {
	Create(*ServiceContext, REQ) (RSP, error)
	Delete(*ServiceContext, REQ) (RSP, error)
	Update(*ServiceContext, REQ) (RSP, error)
	Patch(*ServiceContext, REQ) (RSP, error)
	List(*ServiceContext, REQ) (RSP, error)
	Get(*ServiceContext, REQ) (RSP, error)

	CreateMany(*ServiceContext, REQ) (RSP, error)
	DeleteMany(*ServiceContext, REQ) (RSP, error)
	UpdateMany(*ServiceContext, REQ) (RSP, error)
	PatchMany(*ServiceContext, REQ) (RSP, error)

	CreateBefore(*ServiceContext, M) error
	CreateAfter(*ServiceContext, M) error
	DeleteBefore(*ServiceContext, M) error
	DeleteAfter(*ServiceContext, M) error
	UpdateBefore(*ServiceContext, M) error
	UpdateAfter(*ServiceContext, M) error
	PatchBefore(*ServiceContext, M) error
	PatchAfter(*ServiceContext, M) error
	ListBefore(*ServiceContext, *[]M) error
	ListAfter(*ServiceContext, *[]M) error
	GetBefore(*ServiceContext, M) error
	GetAfter(*ServiceContext, M) error

	CreateManyBefore(*ServiceContext, ...M) error
	CreateManyAfter(*ServiceContext, ...M) error
	DeleteManyBefore(*ServiceContext, ...M) error
	DeleteManyAfter(*ServiceContext, ...M) error
	UpdateManyBefore(*ServiceContext, ...M) error
	UpdateManyAfter(*ServiceContext, ...M) error
	PatchManyBefore(*ServiceContext, ...M) error
	PatchManyAfter(*ServiceContext, ...M) error

	Import(*ServiceContext, io.Reader) ([]M, error)
	Export(*ServiceContext, ...M) ([]byte, error)

	Filter(*ServiceContext, M) M
	FilterRaw(*ServiceContext) string

	Logger
}

Service provides business logic operations for model types. Defines the service layer between controllers and database operations.

Type Parameters:

  • M: Model type that implements Model interface
  • REQ: Request type (typically DTOs or request structures)
  • RSP: Response type (typically DTOs or response structures)

Features:

  • CRUD and batch operations
  • Lifecycle hooks (Before/After methods)
  • Data import/export
  • Custom filtering logic

type ServiceContext

type ServiceContext struct {
	Method       string        // http method
	Request      *http.Request // http request
	URL          *url.URL      // request url
	Header       http.Header   // http request header
	WriterHeader http.Header   // http writer header
	ClientIP     string        // client ip
	UserAgent    string        // user agent

	Writer http.ResponseWriter

	// route parameters,
	//
	// eg: PUT /api/gists/:id/star
	// Params: map[string]string{"id": "xxxxx-mygistid-xxxxx"}
	//
	// eg: DELETE /api/user/:userid/shelf/:shelfid/book
	// Params: map[string]string{"userid": "xxxxx-myuserid-xxxxx", "shelfid": "xxxxx-myshelfid-xxxxx"}
	Params map[string]string
	Query  url.Values

	SessionID string // session id
	Username  string // currrent login user.
	UserID    string // currrent login user id
	Route     string

	RequestID string
	TraceID   string
	PSpanID   string
	SpanID    string
	Seq       int
	// contains filtered or unexported fields
}

func NewServiceContext

func NewServiceContext(c *gin.Context, ctxs ...context.Context) *ServiceContext

NewServiceContext creates ServiceContext from gin.Context. Including request details, headers and user information.

You can pass the custom context.Context to propagate span tracing, otherwise use the c.Request.Context().

func (*ServiceContext) Context

func (sc *ServiceContext) Context() context.Context

Context converts *ServiceContex to context.Context. It starts from the underlying ctx.context and conditionally injects extra metadata.

func (*ServiceContext) Cookie

func (sc *ServiceContext) Cookie(name string) (string, error)

func (*ServiceContext) Data

func (sc *ServiceContext) Data(code int, contentType string, data []byte)

func (*ServiceContext) DatabaseContext

func (sc *ServiceContext) DatabaseContext() *DatabaseContext

func (*ServiceContext) Encode added in v0.10.2

func (sc *ServiceContext) Encode(w io.Writer, event Event) error

Encode writes an SSE event to the given writer. This is a convenience method that wraps sse.Encode for use within SSE stream callbacks.

The event is formatted according to the SSE specification:

  • Fields are written in recommended order: id, event, retry, data
  • Each field is written as "field: value\n"
  • Multiple data fields are concatenated (for multi-line data)
  • Events are separated by a blank line (\n\n)

If Data is a complex type (map, struct, slice), it will be JSON-encoded. If Data is a primitive type, it will be converted to string. If Data is nil, no data field will be written.

Example:

ctx.SSE().WithInterval(1*time.Second).Stream(func(w io.Writer) bool {
    _ = ctx.Encode(w, types.Event{
        Event: "message",
        Data:  "Hello",
    })
    return true
})

Parameters:

  • w: Writer to write the event to (typically from SSE stream callback)
  • event: SSE event to encode

Returns:

  • error: Any error that occurred during encoding

func (*ServiceContext) FormFile added in v0.10.5

func (sc *ServiceContext) FormFile(name string) (*multipart.FileHeader, error)

func (*ServiceContext) GetPhase

func (sc *ServiceContext) GetPhase() consts.Phase

func (*ServiceContext) HTML

func (sc *ServiceContext) HTML(code int, name string, obj any)

func (*ServiceContext) PostForm added in v0.10.5

func (sc *ServiceContext) PostForm(key string) string

func (*ServiceContext) Redirect

func (sc *ServiceContext) Redirect(code int, location string)

func (*ServiceContext) RequiresAuth added in v0.9.6

func (sc *ServiceContext) RequiresAuth() bool

RequiresAuth returns whether the current API requires authentication

func (*ServiceContext) SSE added in v0.10.2

func (sc *ServiceContext) SSE() *SSEBuilder

SSE returns a new SSE builder for chaining SSE operations. This provides a fluent interface for sending SSE events and streams.

Example usage:

// Start a stream
ctx.SSE().Stream(func(w io.Writer) bool {
    _ = ctx.Encode(w, types.Event{Data: "chunk"})
    return true
})

// Stream with interval
ctx.SSE().WithInterval(1*time.Second).Stream(func(w io.Writer) bool {
    _ = ctx.Encode(w, types.Event{Data: "chunk"})
    return true
})

// Send [DONE] marker
_ = ctx.SSE().Done()
Example (CompleteFlow)

ExampleServiceContext_SSE_completeFlow demonstrates a complete SSE flow using the chainable API. This pattern is commonly used in AI chat completions and similar streaming APIs.

package main

import (
	"io"

	"github.com/forbearing/gst/types"
)

func main() {
	var sc *types.ServiceContext

	// Stream data chunks using the chainable API
	sc.SSE().Stream(func(w io.Writer) bool {
		// Send chat completion chunks
		_ = sc.Encode(w, types.Event{
			Data: map[string]any{
				"content": "Hello",
			},
		})
		// Continue streaming...
		return true
	})

	// Send [DONE] marker to indicate stream completion
	// This is required by protocols like OpenAI's chat completion API
	_ = sc.SSE().Done()
}
Example (Done)

ExampleServiceContext_SSE_done demonstrates using the chainable API to send a [DONE] marker.

package main

import (
	"github.com/forbearing/gst/types"
)

func main() {
	var sc *types.ServiceContext

	// Send [DONE] marker using the chainable API
	_ = sc.SSE().Done()
}
Example (Stream)

ExampleServiceContext_SSE_stream demonstrates using the chainable API for streaming.

package main

import (
	"io"
	"time"

	"github.com/forbearing/gst/types"
)

func main() {
	var sc *types.ServiceContext

	// Stream events using the chainable API
	sc.SSE().Stream(func(w io.Writer) bool {
		_ = sc.Encode(w, types.Event{
			Event: "message",
			Data:  time.Now().String(),
		})
		return true
	})
}
Example (StreamWithInterval)

ExampleServiceContext_SSE_streamWithInterval demonstrates using the chainable API for interval-based streaming.

package main

import (
	"fmt"
	"io"
	"time"

	"github.com/forbearing/gst/types"
)

func main() {
	var sc *types.ServiceContext

	// Stream with interval using the chainable API
	counter := 0
	sc.SSE().WithInterval(1 * time.Second).Stream(func(w io.Writer) bool {
		counter++

		// Send event
		_ = sc.Encode(w, types.Event{
			ID:    fmt.Sprintf("event-%d", counter),
			Event: "message",
			Data: map[string]any{
				"number":  counter,
				"message": fmt.Sprintf("Event %d of 3", counter),
			},
		})

		// Return true to continue (will wait 1 second), false to stop
		// This will send 3 events: at 0s, 1s, 2s, then stop
		return counter < 3
	})

	// Send [DONE] marker if required by your protocol
	_ = sc.SSE().Done()
}

func (*ServiceContext) SSEvent added in v0.10.5

func (sc *ServiceContext) SSEvent(name string, message any)

func (*ServiceContext) SetCookie

func (sc *ServiceContext) SetCookie(name, value string, maxAge int, path, domain string, secure, httpOnly bool)

func (*ServiceContext) SetPhase

func (sc *ServiceContext) SetPhase(phase consts.Phase)

func (*ServiceContext) Stream added in v0.10.5

func (sc *ServiceContext) Stream(step func(io.Writer) bool)

func (*ServiceContext) WithPhase

func (sc *ServiceContext) WithPhase(phase consts.Phase) *ServiceContext

type ServiceError

type ServiceError struct {
	StatusCode int
	Message    string
	Err        error
	// Coder optionally maps the error to a client-facing API code (JSON "code" field).
	// When nil, the controller uses CodeFailure (-1).
	Coder Coder
}

ServiceError represents an error with a custom HTTP status code that can be returned from service layer methods

func NewServiceError

func NewServiceError(statusCode int, message string, coder ...Coder) *ServiceError

NewServiceError creates a new ServiceError with the given status code and message. Optional coders: if one or more Coder values are passed, only the first is kept and used by the controller to set the JSON "code" field (see handleServiceError).

func NewServiceErrorWithCause

func NewServiceErrorWithCause(statusCode int, message string, err error, coder ...Coder) *ServiceError

NewServiceErrorWithCause creates a new ServiceError with the given status code, message and underlying error. Optional coders: if one or more Coder values are passed, only the first is kept.

func (*ServiceError) Error

func (e *ServiceError) Error() string

Error implements the error interface

func (*ServiceError) Unwrap

func (e *ServiceError) Unwrap() error

Unwrap returns the underlying error for error unwrapping

type StandardLogger

type StandardLogger interface {
	Debug(args ...any)
	Info(args ...any)
	Warn(args ...any)
	Error(args ...any)
	Fatal(args ...any)

	Debugf(format string, args ...any)
	Infof(format string, args ...any)
	Warnf(format string, args ...any)
	Errorf(format string, args ...any)
	Fatalf(format string, args ...any)
}

StandardLogger provides leveled logging and formatted variants. Fatal/Fatalf should exit after logging.

type StructuredLogger

type StructuredLogger interface {
	Debugw(msg string, keysAndValues ...any)
	Infow(msg string, keysAndValues ...any)
	Warnw(msg string, keysAndValues ...any)
	Errorw(msg string, keysAndValues ...any)
	Fatalw(msg string, keysAndValues ...any)
}

StructuredLogger logs with key-value pairs (msg plus fields). Methods with suffix 'w' mean "with fields".

type ZapLogger

type ZapLogger interface {
	Debugz(msg string, fields ...zap.Field)
	Infoz(msg string, fields ...zap.Field)
	Warnz(msg string, fields ...zap.Field)
	Errorz(msg string, fields ...zap.Field)
	Fatalz(msg string, fields ...zap.Field)
}

ZapLogger logs with typed zap fields. Methods with suffix 'z' use zap.Field values.

Directories

Path Synopsis

Jump to

Keyboard shortcuts

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