package arkid import ( "applet/app/utils/cache" "applet/app/utils/logx" "encoding/json" "errors" "fmt" ) type SDK struct { response []byte fmap map[string]func(RequestBody) fname string err error } //Init is init sdk func (s *SDK) Init() { s.fmap = make(map[string]func(RequestBody)) } //SelectFunction is choose func func (s *SDK) SelectFunction(fname string) *SDK { s.fname = fname return s } //WithArgs is request args func (s *SDK) WithArgs(r RequestBody) *SDK { f := s.fmap[s.fname] f(r) return s } //Result is result to p func (s *SDK) Result(p interface{}) error { if s.err != nil { return s.err } if string(s.response) == "" { return nil } if err := json.Unmarshal(s.response, p); err != nil { return logx.Error(string(s.response), err) } return nil } // Register is register func func (s *SDK) Register(name string, f func(RequestBody)) { s.fmap[name] = f } //getAdmin arkid 用户的信息 ,主要是token func (s *SDK) arkidLogin(r RequestBody) { postData := map[string]interface{}{ "username": r.Username, "password": r.Password, } s.response, s.err = arkidLogin(postData) } func (s *SDK) arkidRegister(r RequestBody) { postData := map[string]interface{}{} b, err := json.Marshal(r) if err != nil { s.err = err } if err := json.Unmarshal(b, &postData); err != nil { s.err = err } s.response, s.err = arkidRegister(postData) } func (s *SDK) arkidAppAccessWhiteList(r RequestBody) { postData := map[string]interface{}{} b, err := json.Marshal(r) if err != nil { s.err = err } if err := json.Unmarshal(b, &postData); err != nil { s.err = err } s.response, s.err = arkidAppAccessWhiteList(postData, r.PermName) } func (s *SDK) arkidUserInfo(r RequestBody) { s.response, s.err = arkidUserInfo(r.Token) } func (s *SDK) arkidUserDelete(r RequestBody) { s.response, s.err = arkidUserDelete(r.Username) } func (s *SDK) arkidUserUpdate(r RequestBody) { postData := map[string]interface{}{} b, err := json.Marshal(r.User) if err != nil { s.err = err } if err := json.Unmarshal(b, &postData); err != nil { s.err = err } s.response, s.err = arkidUserUpdate(r.Username, postData) } func (s *SDK) arkidLogout(r RequestBody) { s.response, s.err = arkidLogout(r.Token) } // NewArkID is con func NewArkID() *SDK { sdk := new(SDK) sdk.Init() sdk.Register("arkid_login", sdk.arkidLogin) sdk.Register("arkid_register", sdk.arkidRegister) sdk.Register("arkid_app_access_white_list", sdk.arkidAppAccessWhiteList) sdk.Register("arkid_delete_user", sdk.arkidUserDelete) sdk.Register("arkid_user_info", sdk.arkidUserInfo) sdk.Register("arkid_user_update", sdk.arkidUserUpdate) sdk.Register("arkid_logout", sdk.arkidLogout) return sdk } // GetArkIDUser is get arkid token if redis is existed unless send request to arkid func GetArkIDUser(username string, MD5passowrd string) (*ArkIDUser, error) { key := fmt.Sprintf("arkid_user_%s", username) arkidUser := new(ArkIDUser) c, err := cache.GetBytes(key) if c != nil && err == nil { if err := json.Unmarshal(c, arkidUser); err != nil { return arkidUser, err } if arkidUser.Token == "" { return arkidUser, errors.New("Get Arkid User error, Token missing") } return arkidUser, err } arkidSdk := NewArkID() err = arkidSdk.SelectFunction("arkid_login").WithArgs(RequestBody{ Username: username, Password: MD5passowrd, }).Result(arkidUser) if arkidUser.Token == "" { return arkidUser, errors.New("Get Arkid User error, Token missing") } // 缓存30天 // cache.SetEx(key, utils.Serialize(arkidUser), 2592000) return arkidUser, err } // RegisterRollback is 注册时的错误回滚 func RegisterRollback(username string) error { sdk := NewArkID() err := sdk.SelectFunction("arkid_delete_user").WithArgs(RequestBody{ Username: username, }).Result(nil) if err != nil { return err } return nil }