/* * Licensed to the Apache Software Foundation (ASF) under one * or more contributor license agreements. See the NOTICE file * distributed with this work for additional information * regarding copyright ownership. The ASF licenses this file * to you under the Apache License, Version 2.0 (the * "License"); you may not use this file except in compliance * with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, * software distributed under the License is distributed on an * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY * KIND, either express or implied. See the License for the * specific language governing permissions and limitations * under the License. */ package config import ( "context" "encoding/json" "fmt" "github.com/apache/answer/internal/entity" ) // ConfigRepo config repository type ConfigRepo interface { GetConfigByID(ctx context.Context, id int) (c *entity.Config, err error) GetConfigByKey(ctx context.Context, key string) (c *entity.Config, err error) GetConfigByKeyFromDB(ctx context.Context, key string) (c *entity.Config, err error) UpdateConfig(ctx context.Context, key, value string) (err error) } // ConfigService user service type ConfigService struct { configRepo ConfigRepo } // NewConfigService new config service func NewConfigService(configRepo ConfigRepo) *ConfigService { return &ConfigService{ configRepo: configRepo, } } // GetIntValue get config int value func (cs *ConfigService) GetIntValue(ctx context.Context, key string) (val int, err error) { cf, err := cs.configRepo.GetConfigByKey(ctx, key) if err != nil { return 0, err } return cf.GetIntValue(), nil } // GetStringValue get config string value func (cs *ConfigService) GetStringValue(ctx context.Context, key string) (val string, err error) { cf, err := cs.configRepo.GetConfigByKey(ctx, key) if err != nil { return "", err } return cf.Value, nil } // GetStringValueFromDB gets config string value directly from DB, bypassing cache. func (cs *ConfigService) GetStringValueFromDB(ctx context.Context, key string) (val string, err error) { cf, err := cs.configRepo.GetConfigByKeyFromDB(ctx, key) if err != nil { return "", err } return cf.Value, nil } // GetArrayStringValue get config array string value func (cs *ConfigService) GetArrayStringValue(ctx context.Context, key string) (val []string, err error) { cf, err := cs.configRepo.GetConfigByKey(ctx, key) if err != nil { return nil, err } return cf.GetArrayStringValue(), nil } func (cs *ConfigService) GetJsonConfigByIDAndSetToObject(ctx context.Context, id int, obj any) (err error) { cf, err := cs.configRepo.GetConfigByID(ctx, id) if err != nil { return err } err = json.Unmarshal([]byte(cf.Value), obj) if err != nil { return fmt.Errorf("[%s] config value is not json format", cf.Key) } return nil } // GetConfigByID get config by id func (cs *ConfigService) GetConfigByID(ctx context.Context, id int) (c *entity.Config, err error) { return cs.configRepo.GetConfigByID(ctx, id) } func (cs *ConfigService) GetConfigByKey(ctx context.Context, key string) (c *entity.Config, err error) { return cs.configRepo.GetConfigByKey(ctx, key) } // GetIDByKey get config id by key func (cs *ConfigService) GetIDByKey(ctx context.Context, key string) (id int, err error) { cf, err := cs.configRepo.GetConfigByKey(ctx, key) if err != nil { return 0, err } return cf.ID, nil } func (cs *ConfigService) UpdateConfig(ctx context.Context, key, value string) (err error) { return cs.configRepo.UpdateConfig(ctx, key, value) }