first commit
This commit is contained in:
143
services/auth/oauth.store.go
Normal file
143
services/auth/oauth.store.go
Normal file
@@ -0,0 +1,143 @@
|
||||
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
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user