diff --git a/entrypoint.go b/entrypoint.go index 5524cc2..b74b1f3 100644 --- a/entrypoint.go +++ b/entrypoint.go @@ -196,23 +196,43 @@ type Claims struct { Session SessionClaims `json:"session"` } -func GetExtend(obj utils.DBObject, extends map[string][]tools.DataType) map[string]interface{} { +func GetExtends(objs []utils.ShallowDBObject, extends map[string][]tools.DataType) []map[string]interface{} { + cache := map[tools.DataType]map[string]interface{}{} + m := []map[string]interface{}{} + for _, obj := range objs { + m = append(m, GetExtend(obj, extends, cache)) + } + return m +} + +func GetExtend(obj utils.DBObject, extends map[string][]tools.DataType, cache map[tools.DataType]map[string]interface{}) map[string]interface{} { base := obj.Serialize(obj) for k, v := range extends { if base[k+"_id"] == nil || base[k+"_id"] == "" { continue } for _, vv := range v { + if cache[vv] != nil && cache[vv][k] != nil { + base[k] = cache[vv][k] + continue + } if d, _, err := models.Model(vv.EnumIndex()).GetAccessor(&tools.APIRequest{ Admin: true, }).LoadOne(fmt.Sprintf("%v", base[k+"_id"])); d != nil && err == nil { base[k] = d.Serialize(d) + if cache[vv] == nil { + cache[vv] = map[string]interface{}{} + } + if cache[vv][k] == nil { + cache[vv][k] = base[k] + } break } } } return base } + func ExtractTokenInfo(request http.Request) (string, string, []string) { reqToken := request.Header.Get("Authorization") splitToken := strings.Split(reqToken, "Bearer ")