Releases: gofr-dev/gofr
v1.28.2
v1.28.1
Release v1.28.1
🛠️ Fixes:
-
Improved Static File Metrics
- Metrics middleware now accurately identifies and tracks static file requests, including handling file paths with query parameters.
Example:
Metrics will now correctly log/static/example.js
or/static/example.js?v=42
. -
Subscription Handler Validation
- Improved error handling in
App.Subscribe()
. - Ensures that
topic
andhandler
parameters are validated to prevent runtime errors. - Logs detailed error messages for invalid subscriptions.
- Improved error handling in
v1.28.0
✨ Features:
Custom Response Headers Support:
Users can add custom HTTP response headers using the Response
struct. This feature helps add extra information, such as security policies or other metadata, to improve communication between clients and servers.
- Example usage:
return response.Response{ Data: "Hello World from new Server", Headers: map[string]string{"X-Custom-Header": "CustomValue", "X-Another-Header": "AnotherValue"}, }`
OpenTSDB Support:
Users can integrate OpenTSDB to store and retrieve time-series data.
-
Methods include:
PutDataPoints
: Send data to OpenTSDB.QueryDataPoints
: Retrieve data based on specified parameters.GetAggregators
: Get available aggregation functions.QueryAnnotation
,PostAnnotation
,PutAnnotation
,DeleteAnnotation
: Manage annotations in OpenTSDB.
-
To import GoFr's external OpenTSDB driver:
go get gofr.dev/pkg/gofr/datasource/opentsdb@latest
type OpenTSDB interface {
HealthChecker
PutDataPoints(ctx context.Context, data any, queryParam string, res any) error
QueryDataPoints(ctx context.Context, param any, res any) error
QueryLatestDataPoints(ctx context.Context, param any, res any) error
GetAggregators(ctx context.Context, res any) error QueryAnnotation(ctx context.Context, queryAnnoParam map[string]any, res any) error
PostAnnotation(ctx context.Context, annotation any, res any) error
PutAnnotation(ctx context.Context, annotation any, res any) error
DeleteAnnotation(ctx context.Context, annotation any, res any) error
}
- For more info, checkout the documentation: https://gofr.dev/docs/advanced-guide/injecting-databases-drivers#open-tsdb
Support for Binding Binary/Octet Stream:
Users can bind binary/octet-stream
content directly to []byte
slices using GoFr context.
-
Example usage:
var result []byte err := req.Bind(&result) if err != nil { log.Fatalf("Bind error: %v", err) }
🛠️ Fixes:
Milliseconds Logged as Microseconds:
- Previously, operation duration was calculated in milliseconds but was incorrectly logged as microseconds, which led to confusion. This has been fixed to ensure that logs display the accurate duration in microseconds.
Dgraph Datasource Panic Fix
- Fixed an issue where the Dgraph datasource would panic due to an uninitialized tracer when added as an external datasource. This bug has been addressed.
Solr Methods Fixes:
- Fixed errors occurring in the following Solr datasource methods:
Update
,Delete
,ListFields
,Retrieve
,AddField
,UpdateField
,DeleteField
. - Updated documentation and provided a working example, accordingly.
Deprecated UseMiddlewareWithContainer
Method:
- The method
UseMiddlewareWithContainer
has been deprecated and will be removed in future releases. Developers should use the*App.UseMiddleware
method instead, which does not depend on the container.
Static File Path Handling Fix:
- Fixed an issue in the
AddStaticFiles
method where file paths were not correctly resolved when they didn't start with./
or were not absolute paths. The fix ensures that the correct file path is registered for static file serving.
v1.27.1
Release v1.27.1
🛠️ Fixes
Fix Google Pubsub Panic
The callback function for the Google client Subscribe function was configured to fetch one message per Subscribe call. Still, at times the message was being sent to a closed channel causing unexpected behaviour. Fixed the issue of receiving messages on a channel that closes only on application shutdown.
v1.27.0
Release v1.27.0
✨ Features
-
UseMiddlewareWithContainer
for Custom Middleware with Container Access
Introduced theUseMiddlewareWithContainer
method, which allows custom middleware to access the application's container. This provides access to essential services such as logging, configuration, and database instances, enabling middleware to modify request processing dynamically.Example Usage:
import ( "fmt" "net/http" "gofr.dev/pkg/gofr" "gofr.dev/pkg/gofr/container" ) func main() { // Create a new GoFr application instance a := gofr.New() // Add custom middleware with container access a.UseMiddlewareWithContainer(customMiddleware) .... } // Define middleware with container access func customMiddleware(c *container.Container, handler http.Handler) http.Handler { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { c.Logger.Log("Hey! Welcome to GoFr") handler.ServeHTTP(w, r) }) } `
-
Migrations Support in MongoDB
GoFr now introduces support for data migrations in MongoDB, enabling seamless modifications to your database schema and data. This includes adding new fields, modifying data types of existing fields, setting or removing indexes, and applying constraints to collections. All changes are meticulously tracked in the GoFr Migrations Table, ensuring a reliable and auditable history of database updates.
🛠️ Fixes
-
Remote Log URL Setup
Resolved an issue where logs fetched from the remote log URL were missing correlation IDs. Logs now consistently include the correlation ID, ensuring better traceability. -
Entity DataType Documentation Update
Enhanced the documentation for theAdd-rest-handler
feature by specifying supported data types in the entity structure, improving usability and reducing confusion. -
SQL Logs Level Adjustment
Fixed the log level for successful SQL connections, which was mistakenly set to debug. It is now appropriately logged at the info level, aligning with logging best practices.
v1.26.0
Release v1.26.0
✨ Features
1. Support for NATS as External Pub-Sub
We have added support for NATS as an external pub/sub service in GoFr. Users can now easily set up NATS for message publishing and subscribing by configuring it via app.AddPubSub
. Here’s a quick example:
app.AddPubSub(nats.New(&nats.Config{
Server: "nats://localhost:4222",
CredsFile: "",
Stream: nats.StreamConfig{
Stream: "my-stream",
Subjects: []string{"order-logs", "products"},
},
MaxWait: 5 * time.Second,
MaxPullWait: 500,
Consumer: "my-consumer",
}, app.Logger()))
To inject NATS, import it using the following command:
go get gofr.dev/pkg/gofr/datasources/pubsub/nats
Refer to our documentation for detailed setup instructions.
2. New Environment Variable DB_CHARSET
Introduced a new environment variable DB_CHARSET
to make the MySQL character set configurable. By default, DB_CHARSET is set to utf8. However, setting it to utf8mb4 is recommended for full Unicode support, including emojis and special characters.
3. Enhanced CLI with TUI Elements (Spinners and Progress Bar)
This release enhances the GoFr command-line experience by introducing Text User Interface (TUI) elements, including spinners and a progress bar for visual feedback during command execution.
Check out an example in examples/sample-cmd
to see this in action.
4. New Examples for Remote File Server Interaction
We’ve added new examples in the examples/using-add-filestore
directory, demonstrating how to interact with remote file servers using GoFr. This addition provides a convenient reference for developers working with remote file management.
🛠️ Fixes
1. Fix: Invalid ClickHouse Documentation
Updated the ClickHouse package documentation to highlight only the relevant parts, improving readability and maintainability.
Release v1.25.0
Release v1.25.0
✨ Features
BadgerDB Tracing
- Added context support and tracing for BadgerDB datasource operations, enhancing observability and tracking within the BadgerDB storage layer.(Released pkg/gofr/datasource/kv-store/badger - v0.2.0)
Redis Authentication Support
-
Users can now connect to Redis instances requiring a username, password, or both. Configure these credentials in the
.env
file located in theconfigs
folder:-
REDIS_USER
: User credential for connecting to the Redis server. Multiple users with different permissions can be configured within a single Redis instance. For more details, refer to the official Redis documentation. -
REDIS_PASSWORD
: Password credential required only if authentication is enabled on the Redis instance.
-
Enhanced Authentication Retrieval in Context
-
The
GetAuthInfo
method on the context provides easy access to various authentication methods, allowing developers to retrieve:-
JWT Claims: Use
GetAuthInfo().GetClaims()
when OAuth is enabled, returning ajwt.MapClaims
response. -
Username: Use
GetAuthInfo().GetUsername()
for basic authentication, returning the username or an empty string if basic auth is not enabled. -
API Key: Use
GetAuthInfo().GetAPIKey()
for API key-based authentication, returning the API key or an empty string if API key auth is not enabled.
-
🛠️ Fixes
Static File Route Issue
-
Resolved a bug in the
AddStaticFiles
method where static files could not be accessed via specified routes. Now, running the following code:func main() { app := gofr.New() app.AddStaticFiles("/", "./static") app.Run() }
Files within the
./static
directory can be accessed properly, e.g.,http://localhost:9000/abc.jpeg
, without encountering a "route not registered" error.
Controlled Access to OpenAPI Files
- Prevented direct access to the
openapi.json
file via static routes. The file is now restricted to access through explicitly defined routes such as/.well-known/swagger
or/.well-known/openapi.json
for secure and controlled API documentation access.
Release v1.24.2
Release v1.24.2
🛠️ Fixes
-
Tracing in Solr data source
Fixed missing tracing for Solr data source. Now, spans for Solr data source will be visible on the trace graph with important attributes to better debug the user application. -
Cassandra logs misaligned
The logs while running the migrations for the Cassandra database were misaligned and did not contain the exact operation that was being performed. Now logs are aligned with the other logs and also contain which operation is being performed. -
EventHub messages not getting consumed
The Azure EventHub was not able to subscribe to the messages, fixed the flow to correctly consume the messages, and also added proper shutdown for the subscriber to close on application closure. -
Application Shutdown not working when subscribers are registered
Now gofr applications will shutdown gracefully without getting stuck because of the forever subscription for topics.
Full Changelog: v1.24.1...v1.24.2
v1.24.1
Release v1.24.1
🛠️ Fixes:
- Google Subscriptions not calling user handlers
Fixed a bug in the Google subscriber where messages were being consumed in the callback handler but was not calling theSubscribeFunc
registered by the user.
v1.24.0
Release v1.24.0
✨ Features:
-
Cassandra Tracing & Context Support:
We’ve added context support and tracing for Cassandra operations, improving flexibility and observability. The following methods are now available:Single Operations:
QueryWithCtx
: Executes queries with context, binding results to the specified destination.ExecWithCtx
: Executes non-query operations with context.ExecCASWithCtx
: Executes lightweight (CAS) transactions with context.NewBatchWithCtx
: Initializes a new batch operation with context.
Batch Operations:
BatchQueryWithCtx
: Adds queries to batch operations with context.ExecuteBatchWithCtx
: Executes batch operations with context.ExecuteBatchCASWithCtx
: Executes batch operations with context and returns the result.
Note: The following methods in Cassandra have been deprecated:
type Cassandra interface { Query(dest interface{}, stmt string, values ...any) error Exec(stmt string, values ...any) error ExecCAS(dest any, stmt string, values ...any) (bool, error) BatchQuery(stmt string, values ...any) error NewBatch(name string, batchType int) error CassandraBatch } type CassandraBatch interface { BatchQuery(name, stmt string, values ...any) ExecuteBatch(name string) error ExecuteBatchCAS(name string, dest ...any) (bool, error) }
-
JWT Claims Retrieval:
OAuth-enabled applications can now retrieve JWT claims directly within handlers. Here’s an example:func HelloHandler(c *gofr.Context) (interface{}, error) { // Retrieve the JWT claim from the context claimData := c.Context.Value(middleware.JWTClaim) // Assert that the claimData is of type jwt.MapClaims claims, ok := claimData.(jwt.MapClaims) if !ok { return nil, fmt.Errorf("invalid claim data type") } // Return the claims as a response return claims, nil }
🛠️ Fixes:
-
Redis Panic Handling:
Resolved an issue where callingRedis.Ping()
without an active connection caused the application to panic. This is now handled gracefully. -
Docker Example Enhancement:
Thehttp-server
example has been enhanced to include Prometheus and Grafana containers in its Docker setup, allowing users to fully explore GoFr's observability features.