87 lines
2.0 KiB
Go
87 lines
2.0 KiB
Go
package mongo
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
"time"
|
|
|
|
"go.mongodb.org/mongo-driver/bson"
|
|
"go.mongodb.org/mongo-driver/bson/primitive"
|
|
mongodriver "go.mongodb.org/mongo-driver/mongo"
|
|
"go.mongodb.org/mongo-driver/mongo/options"
|
|
|
|
"scheduler-backend/internal/store/model"
|
|
)
|
|
|
|
const schedulerGlobalConfigKey = "scheduler"
|
|
const defaultSchedulerGlobalConfigJSON = `{
|
|
"maxConcurrentJobs": 5,
|
|
"defaultTimeoutSeconds": 300
|
|
}`
|
|
|
|
type GlobalConfigStore struct {
|
|
collection *mongodriver.Collection
|
|
}
|
|
|
|
func NewGlobalConfigStore(db *mongodriver.Database) *GlobalConfigStore {
|
|
return &GlobalConfigStore{
|
|
collection: db.Collection("global_config"),
|
|
}
|
|
}
|
|
|
|
func (s *GlobalConfigStore) Get(ctx context.Context, key string) (*model.GlobalConfig, error) {
|
|
findCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
|
defer cancel()
|
|
|
|
var item model.GlobalConfig
|
|
err := s.collection.FindOne(findCtx, bson.M{"key": key}).Decode(&item)
|
|
if err == nil {
|
|
return &item, nil
|
|
}
|
|
if !errors.Is(err, mongodriver.ErrNoDocuments) {
|
|
return nil, err
|
|
}
|
|
|
|
item = model.GlobalConfig{
|
|
ID: primitive.NewObjectID(),
|
|
Key: key,
|
|
Config: defaultConfigForKey(key),
|
|
UpdatedBy: "system",
|
|
UpdatedAt: time.Now(),
|
|
}
|
|
if _, err := s.collection.InsertOne(findCtx, item); err != nil {
|
|
return nil, err
|
|
}
|
|
return &item, nil
|
|
}
|
|
|
|
func (s *GlobalConfigStore) Upsert(ctx context.Context, item *model.GlobalConfig) error {
|
|
updateCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
|
defer cancel()
|
|
|
|
item.UpdatedAt = time.Now()
|
|
if item.UpdatedBy == "" {
|
|
item.UpdatedBy = "system"
|
|
}
|
|
if item.Key == "" {
|
|
item.Key = schedulerGlobalConfigKey
|
|
}
|
|
|
|
_, err := s.collection.UpdateOne(updateCtx, bson.M{"key": item.Key}, bson.M{
|
|
"$set": bson.M{
|
|
"key": item.Key,
|
|
"config": item.Config,
|
|
"updatedBy": item.UpdatedBy,
|
|
"updatedAt": item.UpdatedAt,
|
|
},
|
|
}, options.Update().SetUpsert(true))
|
|
return err
|
|
}
|
|
|
|
func defaultConfigForKey(key string) string {
|
|
if key == schedulerGlobalConfigKey {
|
|
return defaultSchedulerGlobalConfigJSON
|
|
}
|
|
return "{}"
|
|
}
|