package auth import ( "context" "database/sql" "fmt" "github.com/jmoiron/sqlx" "github.com/markbates/goth" "sismedika.com/sas/westone/types" "sismedika.com/sas/westone/utils" ) type Store struct { db *sqlx.DB } func NewStore(db *sqlx.DB) *Store { return &Store{db: db} } func (s *Store) AddGoolgeAccount(user types.UserGoogle) error { tx, err := s.db.BeginTxx(context.Background(), nil) if err != nil { return err } defer func() { if err != nil { tx.Rollback() } }() query := `INSERT INTO m_usergoogle ( M_UserGoogleM_UserID, M_UserGoogleEmail, M_UserGoogleIdentifier, M_UserGoogleCode, M_UserGoogleToken ) VALUES (:M_UserGoogleM_UserID, :M_UserGoogleEmail, :M_UserGoogleIdentifier, :M_UserGoogleCode, :M_UserGoogleToken)` _, err = tx.NamedExec(query, user) if err != nil { return err } if err = tx.Commit(); err != nil { return err } return nil } func (s *Store) CheckGoogleAccountLinked(user types.UserGoogle) (int, error) { var userID int qry := `SELECT M_UserGoogleM_UserID FROM m_usergoogle WHERE M_UserGoogleEmail = ? AND M_UserGoogleIdentifier = ?` if err := s.db.Get(&userID, qry, user.M_UserGoogleEmail, user.M_UserGoogleIdentifier); err != nil { if err == sql.ErrNoRows { return 0, nil } return 0, err } if userID < 1 { return 0, nil } return userID, nil } func (s *Store) GenerateAuthCode(email string, jenis string, userid int) error { payload := types.AuthCode{ AuthCodeMUserID: userid, AuthCodeUser: email, AuthCodeType: jenis, AuthCodeCode: utils.RandomTraceID(6), } tx, err := s.db.BeginTxx(context.Background(), nil) if err != nil { return err } defer func() { if err != nil { tx.Rollback() } }() sql := `INSERT INTO x_auth_code ( AuthCodeMUserID, AuthCodeUser, AuthCodeType, AuthCodeCode ) VALUES (:AuthCodeMUserID, :AuthCodeUser, :AuthCodeType, :AuthCodeCode)` _, err = tx.NamedExec(sql, payload) if err != nil { return err } if err = tx.Commit(); err != nil { return err } return nil } func (s *Store) CompareAuthCode(authcode string, user goth.User, typez string) (int, error) { var code types.AuthCode qry := `SELECT AuthCodeID, AuthCodeMUserID, AuthCodeUser, AuthCodeType, AuthCodeCode, AuthCodeIsUsed FROM x_auth_code WHERE AuthCodeUser = ? AND AuthCodeType = ? AND AuthCodeIsUsed = 'N' AND AuthCodeIsActive = 'Y'` if err := s.db.Get(&code, qry, user.Email, typez); err != nil { return 0, fmt.Errorf("auth code not found, %v", err) } if authcode != code.AuthCodeCode { return 0, fmt.Errorf("auth code do not match") } else { inst := ` UPDATE x_auth_code SET AuthCodeIsUsed = 'Y' WHERE AuthCodeUser = ? AND AuthCodeType = ? AND AuthCodeCode = ? ` if _, err := s.db.Exec(inst, user.Email, typez, authcode); err != nil { return 0, err } return code.AuthCodeMUserID, nil } }