package repository import ( "electricity_bill_calc/cache" "electricity_bill_calc/config" "electricity_bill_calc/global" "electricity_bill_calc/model" "xorm.io/builder" ) type _UserRepository struct{} var UserRepo _UserRepository func (_UserRepository) FindUserByUsername(username string) (*model.User, error) { cachedUser, _ := cache.RetreiveData[model.User]("user", username) if cachedUser != nil { return cachedUser, nil } user := new(model.User) has, err := global.DBConn.Where(builder.Eq{"username": username}).Get(user) if has { cache.CacheData(user, "user", username) } return _postProcessSingle(user, has, err) } func (_UserRepository) RetreiveUserDetail(uid string) (*model.UserDetail, error) { cachedUser, _ := cache.RetreiveData[model.UserDetail]("user", uid) if cachedUser != nil { return cachedUser, nil } user := new(model.UserDetail) has, err := global.DBConn.ID(uid).Get(user) if has { cache.CacheData(user, "user_detail", uid) } return _postProcessSingle(user, has, err) } func (_UserRepository) FindUserByID(uid string) (*model.User, error) { cachedUser, _ := cache.RetreiveData[model.User]("user", uid) if cachedUser != nil { return cachedUser, nil } user := new(model.User) has, err := global.DBConn.ID(uid).Get(user) if has { cache.CacheData(user, "user", uid) } return _postProcessSingle(user, has, err) } func (_UserRepository) ListUserDetail(keyword string, userType int, userState *bool, page int) ([]model.JoinedUserDetail, int64, error) { var cond = builder.NewCond() if len(keyword) != 0 { keywordCond := builder.NewCond(). Or(builder.Like{"u.username", keyword}). Or(builder.Like{"d.name", keyword}) cond = cond.And(keywordCond) } if userType != -1 { cond = cond.And(builder.Eq{"u.type": userType}) } if userState != nil { cond = cond.And(builder.Eq{"u.enabled": *userState}) } startItem := (page - 1) * config.ServiceSettings.ItemsPageSize total, err := global.DBConn. Table("user_detail").Alias("d"). Join("INNER", []string{"user", "u"}, "d.id=u.id"). Where(cond). Count(&model.User{}) if err != nil { return nil, -1, err } users := make([]model.JoinedUserDetail, 0) err = global.DBConn. Table("user_detail").Alias("d"). Join("INNER", []string{"user", "u"}, "d.id=u.id"). Where(cond). Limit(config.ServiceSettings.ItemsPageSize, startItem). Find(&users) return users, total, err }