Files
ris-backend-go/services/auth/oauth.store.go
2024-12-09 09:51:19 +07:00

144 lines
2.9 KiB
Go

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
}
}