Dynamic Configuration
Embed *values.DynamicValues
in the project common.Values
.
Similarly, if you want to customize more configurations, you can first define a common.Extra
embedded *values.DynamicValues
, and then embed common.Values
into it.
Copy type Values struct {
Mode string `env:"MODE" envDefault:"debug"`
Hostname string `env:"HOSTNAME"`
Address string `env:"ADDRESS" envDefault:":3000"`
...
*Extra
}
type Extra struct {
IpAddress string `yaml:"ip_address"`
IpSecretId string `yaml:"ip_secret_id"`
IpSecretKey string `yaml:"ip_secret_key" secret:"*"`
...
*values.DynamicValues `yaml:"dynamic_values"`
}
The tag secret
means desensitization, and only shows whether state is set in the /values
return.
Add loading in bootstrap.go
Copy func LoadStaticValues(path string) (v *common.Values, err error) {
v = new(common.Values)
if err = env.Parse(v); err != nil {
return
}
var b []byte
if b, err = os.ReadFile(path); err != nil {
return
}
if err = yaml.Unmarshal(b, &v.Extra); err != nil {
return
}
return
}
Also define configuration loading
Copy func UseValues(v *common.Values, kv nats.KeyValue, cipher *cipher.Cipher) *values.Service {
return values.New(
values.SetKeyValue(kv),
values.SetCipher(cipher),
values.SetType(reflect.TypeOf(common.Extra{})),
)
}
Add it in wire.go
Copy func NewAPI(values *common.Values) (*api.API, error) {
wire.Build(
...
UseValues,
...
api.Provides,
)
return &api.API{}, nil
}
Then dependency in api.go and establish routing
Copy var Provides = wire.NewSet(
...
wire.Struct(new(values.Controller), "*"),
...
)
type API struct {
...
Values *values.Controller
...
}
func (x *API) Routes(h *server.Hertz) (err error) {
...
_values := h.Group("values", m...)
{
_values.GET("", x.Values.Get)
_values.PATCH("", x.Values.Set)
_values.DELETE(":key", x.Values.Remove)
}
...
}
Final execution generates wire_gen.go
Sessions
First define configuration loading in bootstrap.go
Copy func UseSessions(v *common.Values, rdb *redis.Client) *sessions.Service {
return sessions.New(
sessions.SetRedis(rdb),
sessions.SetDynamicValues(v.DynamicValues),
)
}
Add it in wire.go
Copy func NewAPI(values *common.Values) (*api.API, error) {
wire.Build(
...
UseSessions,
...
api.Provides,
)
return &api.API{}, nil
}
Dependency in api.go and establish routing
Copy var Provides = wire.NewSet(
...
wire.Struct(new(sessions.Controller), "*"),
...
)
type API struct {
...
Sessions *sessions.Controller
...
}
func (x *API) Routes(h *server.Hertz) (err error) {
...
_sessions := h.Group("sessions", m...)
{
_sessions.GET("", x.Sessions.Lists)
_sessions.DELETE(":uid", x.Sessions.Remove)
_sessions.POST("clear", x.Sessions.Clear)
}
...
}
Final execution generates wire_gen.go
Mongo REST
First define configuration loading in bootstrap.go
Copy func UseRest(
v *common.Values,
mgo *mongo.Client,
db *mongo.Database,
rdb *redis.Client,
js nats.JetStreamContext,
keyvalue nats.KeyValue,
xcipher *cipher.Cipher,
) *rest.Service {
return rest.New(
rest.SetMongoClient(mgo),
rest.SetDatabase(db),
rest.SetRedis(rdb),
rest.SetJetStream(js),
rest.SetKeyValue(keyvalue),
rest.SetDynamicValues(v.DynamicValues),
rest.SetCipher(xcipher),
)
}
Add it in wire.go
Copy func NewAPI(values *common.Values) (*api.API, error) {
wire.Build(
...
UseRest,
...
api.Provides,
)
return &api.API{}, nil
}
Dependency in api.go and establish routing
Copy var Provides = wire.NewSet(
...
wire.Struct(new(rest.Controller), "*"),
...
)
type API struct {
...
Rest *rest.Controller
...
}
func (x *API) Routes(h *server.Hertz) (err error) {
...
_db := h.Group("db", csrfToken, auth)
{
_db.GET(":collection/:id", x.Rest.FindById)
_db.POST(":collection/create", audit, x.Rest.Create)
_db.POST(":collection/bulk_create", audit, x.Rest.BulkCreate)
_db.POST(":collection/size", x.Rest.Size)
_db.POST(":collection/find", x.Rest.Find)
_db.POST(":collection/find_one", x.Rest.FindOne)
_db.POST(":collection/update", audit, x.Rest.Update)
_db.POST(":collection/bulk_delete", audit, x.Rest.BulkDelete)
_db.POST(":collection/sort", audit, x.Rest.Sort)
_db.PATCH(":collection/:id", audit, x.Rest.UpdateById)
_db.PUT(":collection/:id", audit, x.Rest.Replace)
_db.DELETE(":collection/:id", audit, x.Rest.Delete)
_db.POST("transaction", audit, x.Rest.Transaction)
_db.POST("commit", audit, x.Rest.Commit)
}
...
}
Final execution generates wire_gen.go