|
- package account
-
- import (
- "code.gitea.io/gitea/models"
- "code.gitea.io/gitea/modules/log"
- "code.gitea.io/gitea/modules/redis/redis_client"
- "code.gitea.io/gitea/modules/redis/redis_key"
- "code.gitea.io/gitea/modules/redis/redis_lock"
- "code.gitea.io/gitea/modules/setting"
- "code.gitea.io/gitea/modules/util"
- "encoding/json"
- "time"
- )
-
- func GetAccount(userId int64) (*models.PointAccount, error) {
- redisKey := redis_key.PointAccountInfo(userId)
- val, _ := redis_client.Get(redisKey)
- if val != "" {
- account := &models.PointAccount{}
- json.Unmarshal([]byte(val), account)
- return account, nil
- }
- account, err := models.GetAccountByUserId(userId)
- if err != nil {
- if models.IsErrRecordNotExist(err) {
- a, err := InitAccount(userId)
- if err != nil {
- log.Error("InitAccount error,err=%v", err)
- return nil, err
- }
- return a, nil
- }
- log.Error("GetAccountByUserId error,err=%v", err)
- return nil, err
- }
- jsonStr, _ := json.Marshal(account)
- redis_client.Setex(redisKey, string(jsonStr), 24*time.Hour)
- return account, nil
- }
-
- func InitAccount(userId int64) (*models.PointAccount, error) {
- lock := redis_lock.NewDistributeLock(redis_key.PointAccountInitLock(userId))
- isOk, err := lock.LockWithWait(3*time.Second, 3*time.Second)
- if err != nil {
- log.Error("PointAccountInitLock error,err=%v", err)
- return nil, err
- }
- if isOk {
- defer lock.UnLock()
- account, _ := models.GetAccountByUserId(userId)
- if account == nil {
- models.InsertAccount(&models.PointAccount{
- Balance: 0,
- TotalEarned: 0,
- TotalConsumed: 0,
- UserId: userId,
- Status: models.PointAccountNormal,
- Version: 0,
- AccountCode: util.UUID(),
- })
- return models.GetAccountByUserId(userId)
- }
- return account, nil
- }
- return nil, nil
-
- }
-
- //IsPointBalanceEnough check whether the user's point balance is bigger than task unit price
- func IsPointBalanceEnough(targetUserId int64, jobType string, clusterType int, resourceSpecId int, flavorCode string) bool {
- if !setting.CloudBrainPaySwitch {
- return true
- }
- t := models.Cloudbrain{
- Type: clusterType,
- JobType: jobType,
- ResourceSpecId: resourceSpecId,
- FlavorCode: flavorCode,
- }
- uniPrice := models.GetCloudbrainTaskUnitPrice(t)
- if uniPrice == 0 {
- return true
- }
- a, err := GetAccount(targetUserId)
- if err != nil {
- log.Error("IsPointBalanceEnough GetAccount error,err=%v", err)
- return false
- }
- return a.Balance >= uniPrice
-
- }
|