144 lines
2.9 KiB
Go
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
|
|
}
|
|
}
|