package service import ( "electricity_bill_calc/cache" "electricity_bill_calc/global" "electricity_bill_calc/model" "xorm.io/builder" ) type _RegionService struct{} var RegionService _RegionService func (_RegionService) FetchSubRegions(parent string) ([]model.Region, error) { 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) if err != nil { return make([]model.Region, 0), err } cache.CacheSearch(regions, "region", "region", "parent", parent) return regions, err } func (r _RegionService) FetchAllParentRegions(code string) ([]model.Region, error) { regions := make([]model.Region, 0) region, err := r.fetchRegion(code) if err != nil { return regions, err } regions = append(regions, *region) for region.Level > 1 { region, err = r.fetchRegion(region.Parent) if err != nil { return make([]model.Region, 0), nil } regions = append(regions, *region) } return regions, nil } func (_RegionService) fetchRegion(code string) (*model.Region, error) { 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, "region", "region", code) } return _postProcessSingle(region, has, err) }