diff --git a/dal/db_query/queries.sql b/dal/db_query/queries.sql index d7d6a57..979c351 100644 --- a/dal/db_query/queries.sql +++ b/dal/db_query/queries.sql @@ -675,7 +675,7 @@ DELETE FROM tokens WHERE AccountID = $1; -- name: SoftDeleteAccount :exec UPDATE users SET Deleted = TRUE WHERE AccountID = $1; --- name: GetCurrentAccount :exec +-- name: GetCurrentAccount :one SELECT * FROM users WHERE AccountID = $1; -- name: CheckUsers :exec diff --git a/model/amoResp.go b/model/amoResp.go index bcf81b2..fe9253e 100644 --- a/model/amoResp.go +++ b/model/amoResp.go @@ -52,7 +52,7 @@ type UserListPipelinesResp struct { type UserListResp struct { /* - общее количество юзеров, которые у нас закешированы для этого пользователя*/ - Count int `json:"count"` + Count int64 `json:"count"` /* - список юзеров, которые были закешированы нашим сервисом*/ Items []User `json:"items"` } diff --git a/repository/amo/amo.go b/repository/amo/amo.go index 6282ff6..c80f8d7 100644 --- a/repository/amo/amo.go +++ b/repository/amo/amo.go @@ -4,8 +4,10 @@ import ( "context" "database/sql" "encoding/json" + "github.com/sqlc-dev/pqtype" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/dal/sqlcgen" "penahub.gitlab.yandexcloud.net/backend/quiz/common.git/model" + "time" ) type AmoRepository struct { @@ -43,7 +45,7 @@ func (r *AmoRepository) GettingUserWithPagination(ctx context.Context, req *mode if err != nil { return nil, err } - + var count int64 var users []model.User for _, row := range rows { user := model.User{ @@ -58,6 +60,7 @@ func (r *AmoRepository) GettingUserWithPagination(ctx context.Context, req *mode Amouserid: row.Amouserid, Country: row.Country, } + count = row.TotalCount var group []model.UserGroups if !row.Group.Valid { err := json.Unmarshal(row.Group.RawMessage, &group) @@ -70,24 +73,70 @@ func (r *AmoRepository) GettingUserWithPagination(ctx context.Context, req *mode users = append(users, user) } - resp := model.UserListResp{} + resp := model.UserListResp{ + Count: count, + Items: users, + } - return users, nil + return &resp, nil } func (r *AmoRepository) SoftDeleteAccount(ctx context.Context, accountID string) error { + err := r.queries.SoftDeleteAccount(ctx, accountID) + if err != nil { + return err + } return nil } func (r *AmoRepository) GetCurrentAccount(ctx context.Context, accountID string) (*model.User, error) { + row, err := r.queries.GetCurrentAccount(ctx, accountID) return nil, nil } func (r *AmoRepository) CreateAccount(ctx context.Context, accountID string, userInfo model.User) error { + group, err := json.Marshal(userInfo.Group) + if err != nil { + return err + } + + err = r.queries.CreateAmoAccount(ctx, sqlcgen.CreateAmoAccountParams{ + Accountid: accountID, + Amoid: userInfo.AmoID, + Name: userInfo.Name, + Email: userInfo.Email, + Role: userInfo.Role, + Group: pqtype.NullRawMessage{RawMessage: group, Valid: len(group) > 0}, + Createdat: sql.NullTime{Time: time.Now(), Valid: true}, + Subdomain: userInfo.Subdomain, + Amouserid: userInfo.Amouserid, + Country: userInfo.Country, + }) + + if err != nil { + return err + } + return nil } -func (r *AmoRepository) CheckUsers(ctx context.Context, amouserid int, user model.User) error { +func (r *AmoRepository) CheckUsers(ctx context.Context, amouserid int32, user model.User) error { + group, err := json.Marshal(user.Group) + if err != nil { + return err + } + + err = r.queries.CheckUsers(ctx, sqlcgen.CheckUsersParams{ + Amoid: amouserid, + Name: user.Name, + Email: user.Email, + Role: user.Role, + Group: pqtype.NullRawMessage{RawMessage: group, Valid: len(group) > 0}, + }) + + if err != nil { + return err + } return nil } @@ -95,24 +144,88 @@ func (r *AmoRepository) CheckUsers(ctx context.Context, amouserid int, user mode // методы webhook func (r *AmoRepository) WebhookCreate(ctx context.Context, tokens model.Token) error { + err := r.queries.CreateWebHook(ctx, sqlcgen.CreateWebHookParams{ + Accountid: tokens.AccountID, + Refreshtoken: tokens.RefreshToken, + Accesstoken: tokens.AccessToken, + Authcode: tokens.AuthCode, + Expiration: time.Unix(tokens.Expiration, 0), + Createdat: sql.NullTime{Time: time.Unix(tokens.CreatedAt, 0), Valid: true}, + }) + + if err != nil { + return err + } + return nil } func (r *AmoRepository) WebhookUpdate(ctx context.Context, tokens model.Token) error { + err := r.queries.WebhookUpdate(ctx, sqlcgen.WebhookUpdateParams{ + Accountid: tokens.AccountID, + Accesstoken: tokens.AccessToken, + Refreshtoken: tokens.RefreshToken, + Expiration: time.Unix(tokens.Expiration, 0), + Createdat: sql.NullTime{Time: time.Unix(tokens.CreatedAt, 0), Valid: true}, + }) + + if err != nil { + return err + } + return nil } // воркер запускается каждые 5 минут, поэтомму ищем токены котторые исекают менее чем через 10 минут отдаем их на обноление func (r *AmoRepository) CheckExpired(ctx context.Context) ([]model.Token, error) { - return nil, nil + rows, err := r.queries.CheckExpired(ctx) + if err != nil { + return nil, err + } + + var tokens []model.Token + + for _, row := range rows { + token := model.Token{ + AccountID: row.Accountid, + AccessToken: row.Accesstoken, + RefreshToken: row.Refreshtoken, + AuthCode: row.Authcode, + Expiration: row.Expiration.Unix(), + CreatedAt: row.Createdat.Time.Unix(), + } + + tokens = append(tokens, token) + } + + return tokens, nil } func (r *AmoRepository) GetAllTokens(ctx context.Context) ([]model.Token, error) { - return nil, nil + rows, err := r.queries.GetAllTokens(ctx) + if err != nil { + return nil, err + } + + var tokens []model.Token + + for _, row := range rows { + token := model.Token{ + AccountID: row.Accountid, + AccessToken: row.Accesstoken, + RefreshToken: row.Refreshtoken, + AuthCode: row.Authcode, + Expiration: row.Expiration.Unix(), + CreatedAt: row.Createdat.Time.Unix(), + } + + tokens = append(tokens, token) + } + + return tokens, nil } func (r *AmoRepository) WebhookDelete(ctx context.Context) error { - //TODO:IMPLEMENT ME return nil