diff --git a/service/region.go b/service/region.go index 12d9b5f..76ba5b1 100644 --- a/service/region.go +++ b/service/region.go @@ -3,25 +3,38 @@ package service import ( "electricity_bill_calc/cache" "electricity_bill_calc/global" + "electricity_bill_calc/logger" "electricity_bill_calc/model" + "fmt" + "time" - "xorm.io/builder" + "github.com/samber/lo" + "go.uber.org/zap" ) -type _RegionService struct{} +type _RegionService struct { + l *zap.Logger +} -var RegionService _RegionService +var RegionService = _RegionService{ + l: logger.Named("Service", "Region"), +} func (_RegionService) FetchSubRegions(parent string) ([]model.Region, error) { + ctx, cancel := global.TimeoutContext(30 * time.Second) + defer cancel() if regions, _ := cache.RetreiveSearch[[]model.Region]("region", "parent", parent); regions != nil { return *regions, nil } regions := make([]model.Region, 0) - err := global.DBConn.Where(builder.Eq{"parent": parent}).Asc("code").Find(®ions) + err := global.DB.NewSelect().Model(®ions).Where("parent = ?", parent).Order("code asc").Scan(ctx) if err != nil { return make([]model.Region, 0), err } - cache.CacheSearch(regions, []string{"region"}, "region", "parent", parent) + relationNames := lo.Map(regions, func(r model.Region, index int) string { + return fmt.Sprintf("region:%s", r.Code) + }) + cache.CacheSearch(regions, relationNames, "region", "parent", parent) return regions, err } @@ -43,13 +56,16 @@ func (r _RegionService) FetchAllParentRegions(code string) ([]model.Region, erro } func (_RegionService) fetchRegion(code string) (*model.Region, error) { + ctx, cancel := global.TimeoutContext(30 * time.Second) + defer cancel() if cachedRegion, _ := cache.RetreiveSearch[model.Region]("region", code); cachedRegion != nil { return cachedRegion, nil } region := new(model.Region) - has, err := global.DBConn.ID(code).NoAutoCondition().Get(region) - if has { - cache.CacheSearch(region, []string{"region"}, "region", code) + err := global.DB.NewSelect().Model(®ion).WherePK(code).Scan(ctx) + if err != nil && region != nil { + relationName := fmt.Sprintf("region:%s", code) + cache.CacheSearch(region, []string{relationName}, "region", code) } - return _postProcessSingle(region, has, err) + return region, err }