Добавлена поддержка восстановления информации об аккаунте, если по какой-то причине её не удалось найти в хранилище

This commit is contained in:
ErickSkrauch
2017-04-10 14:53:26 +03:00
parent 3d73cc9402
commit 8693673a71
5 changed files with 238 additions and 9 deletions

View File

@@ -1,6 +1,7 @@
package worker
import (
"fmt"
"elyby/minecraft-skinsystem/lib/data"
"elyby/minecraft-skinsystem/lib/services"
)
@@ -18,13 +19,23 @@ func handleChangeUsername(model usernameChanged) (bool) {
return true
}
record, err := data.FindSkinByUsername(model.OldUsername)
record, err := data.FindSkinById(model.AccountId)
if (err != nil) {
services.Logger.IncCounter("worker.change_username.username_not_found", 1)
// TODO: я не уверен, что это валидное поведение
// Суть в том, что здесь может возникнуть ошибка в том случае, если записи в базе нету
// а значит его нужно, как минимум, зарегистрировать
return true
services.Logger.IncCounter("worker.change_username.id_not_found", 1)
fmt.Println("Cannot find user id. Trying to search.")
response, err := getById(model.AccountId)
if err != nil {
services.Logger.IncCounter("worker.change_username.id_not_restored", 1)
fmt.Printf("Cannot restore user info. %T\n", err)
// TODO: логгировать в какой-нибудь Sentry, если там не 404
return true
}
services.Logger.IncCounter("worker.change_username.id_restored", 1)
fmt.Println("User info successfully restored.")
record = data.SkinItem{
UserId: response.Id,
}
}
record.Username = model.NewUsername
@@ -35,11 +46,23 @@ func handleChangeUsername(model usernameChanged) (bool) {
return true
}
func handleSkinChanged(model skinChanged) (bool) {
func handleSkinChanged(model skinChanged) bool {
record, err := data.FindSkinById(model.AccountId)
if (err != nil) {
if err != nil {
services.Logger.IncCounter("worker.skin_changed.id_not_found", 1)
return true
fmt.Println("Cannot find user id. Trying to search.")
response, err := getById(model.AccountId)
if err != nil {
services.Logger.IncCounter("worker.skin_changed.id_not_restored", 1)
fmt.Printf("Cannot restore user info. %T\n", err)
// TODO: логгировать в какой-нибудь Sentry, если там не 404
return true
}
services.Logger.IncCounter("worker.skin_changed.id_restored", 1)
fmt.Println("User info successfully restored.")
record.UserId = response.Id
record.Username = response.Username
}
record.Uuid = model.Uuid

62
lib/worker/supports.go Normal file
View File

@@ -0,0 +1,62 @@
package worker
import (
"strconv"
"elyby/minecraft-skinsystem/lib/external/accounts"
)
var token *accounts.Token
const repeatsLimit = 3
var repeatsCount = 0
func getById(id int) (accounts.AccountInfoResponse, error) {
return _getByField("id", strconv.Itoa(id))
}
func _getByField(field string, value string) (accounts.AccountInfoResponse, error) {
defer resetRepeatsCount()
apiToken, err := getToken()
if err != nil {
return accounts.AccountInfoResponse{}, err
}
result, err := apiToken.AccountInfo(field, value)
if err != nil {
_, ok := err.(*accounts.UnauthorizedResponse)
if !ok || repeatsCount >= repeatsLimit {
return accounts.AccountInfoResponse{}, err
}
repeatsCount++
token = nil
return _getByField(field, value)
}
return result, nil
}
func getToken() (*accounts.Token, error) {
if token == nil {
tempToken, err := accounts.GetToken(accounts.TokenRequest{
Id: "skinsystem",
Secret: "qugFIaCjec3LMA",
Scopes: []string{
"internal_account_info",
},
})
if err != nil {
return &accounts.Token{}, err
}
token = &tempToken
}
return token, nil
}
func resetRepeatsCount() {
repeatsCount = 0
}