150 lines
3.5 KiB
Go
150 lines
3.5 KiB
Go
package staff
|
|
|
|
import (
|
|
"database/sql"
|
|
"encoding/pem"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"log"
|
|
|
|
"com.sismedika.com.absensi/graph/model"
|
|
"com.sismedika.com.absensi/pkg/config"
|
|
db "com.sismedika.com.absensi/pkg/database"
|
|
"com.sismedika.com.absensi/pkg/jwt"
|
|
)
|
|
|
|
// diambil dari graph/model/struct nya Staff
|
|
type Staff model.Staff
|
|
|
|
// staff *Staff = receiver yang memiliki tipe data Staff. liat di graphql
|
|
// email string, id_google_sign_in string = parameter inputan dari flutter nanti
|
|
// *model.Staff, error = output yang dihasilkan, jika tidak error return *model.Staff namun jika error maka sebelah kanan nya yaitu
|
|
// error
|
|
|
|
func (staff *Staff) LoginAttendance(email string, id_google_sign_in string) (*model.Staff, error) {
|
|
|
|
// inisialisasi
|
|
var err error
|
|
var ret model.Staff
|
|
|
|
// decode private.pem
|
|
pemData, err := ioutil.ReadFile(config.Data.Get("privatekey"))
|
|
if err != nil {
|
|
log.Printf("read key file: %s", err)
|
|
return nil, fmt.Errorf(("INTERNAL_SERVER_ERROR"))
|
|
}
|
|
|
|
block, _ := pem.Decode(pemData)
|
|
if block == nil {
|
|
log.Printf("bad key data: %s", "not PEM-encoded")
|
|
return nil, fmt.Errorf(("INTERNAL_SERVER_ERROR"))
|
|
}
|
|
|
|
if got, want := block.Type, "RSA PRIVATE KEY"; got != want {
|
|
log.Printf("unknown key type %q, want %q", got, want)
|
|
return nil, fmt.Errorf(("INTERNAL_SERVER_ERROR"))
|
|
}
|
|
|
|
// generate token
|
|
// token yg kiri merupakan output
|
|
// _ merupakan value yg tidak digunakan dalam hal ini expired bisa di cek di fungsi jwt.GenerateToken
|
|
// err merupakan kondisi ketika error return nya apa
|
|
|
|
token, _, err := jwt.GenerateToken(email, id_google_sign_in)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// jika sukses generate token maka update
|
|
// M_StaffToken & M_StaffIsLogin
|
|
|
|
qx := `UPDATE m_staff
|
|
SET
|
|
M_StaffToken = ?,
|
|
M_StaffIsLogin = 'Y'
|
|
WHERE
|
|
M_StaffIsActive = 'Y'
|
|
AND M_StaffEmail = ?
|
|
AND M_StaffIDGoogleSignIn = ?
|
|
`
|
|
// log sql untuk mengetahui query yg akan dieksekusi
|
|
db.LogSQL(qx)
|
|
|
|
// cek kondisi
|
|
// _ merupakan kondisi true namun value tidak digunakan sbg cek
|
|
// error kondisi false dan error digunakan
|
|
_, err = db.Handle.Exec(
|
|
qx,
|
|
token,
|
|
email,
|
|
id_google_sign_in)
|
|
|
|
if err != nil {
|
|
return &ret, fmt.Errorf("UPDATE_TOKEN_FAILED")
|
|
}
|
|
|
|
// data yang akan di tampilkan
|
|
q := `SELECT
|
|
M_StaffID,
|
|
M_StaffNIP,
|
|
M_StaffName,
|
|
M_StaffEmail,
|
|
M_StaffNoHp,
|
|
M_CompanyID,
|
|
M_CompanyName,
|
|
M_StaffIsActive,
|
|
M_StaffIsLogin,
|
|
M_StaffToken,
|
|
M_StaffIDGoogleSignIn,
|
|
M_StaffCreated,
|
|
M_StaffLastUpdated
|
|
FROM m_staff
|
|
join m_company
|
|
ON M_StaffM_CompanyID = M_CompanyID
|
|
AND M_CompanyIsActive = 'Y'
|
|
AND M_StaffIsActive = 'Y'
|
|
AND M_StaffIDGoogleSignIn = ?
|
|
AND M_StaffEmail = ?`
|
|
|
|
// row merupakan penerima yang akan dimasukkan langsung, menggunakan anotasi :=
|
|
// id_google_sign_in, email merupakan binding parameter dari tanda tanya "?" di sql
|
|
row := db.Handle.QueryRow(q, id_google_sign_in, email)
|
|
db.LogSQL(q)
|
|
|
|
// row.Scan untuk mendapatkan field dari sql diatas
|
|
// NOTE POSISI ROW SCAN HARUS SAMA PERSIS SEPERTI FIELD YANG AKAN DI RETURN
|
|
err = row.Scan(
|
|
&ret.StaffID,
|
|
&ret.Nip,
|
|
&ret.Name,
|
|
&ret.Email,
|
|
&ret.PhoneNumber,
|
|
&ret.CompanyID,
|
|
&ret.CompanyName,
|
|
&ret.IsActive,
|
|
&ret.IsLogin,
|
|
&ret.Token,
|
|
&ret.IDGoogleSignIn,
|
|
&ret.CreatedAt,
|
|
&ret.LastUpdatedAt,
|
|
)
|
|
|
|
// check data
|
|
|
|
if err != nil {
|
|
log.Printf("Error m_staff select: %v", err)
|
|
log.Printf("Executing query: %s\n", q)
|
|
return nil, err
|
|
}
|
|
|
|
if err != nil {
|
|
if err == sql.ErrNoRows {
|
|
return nil, fmt.Errorf("RECORD_STAFF_LOGIN_ATTENDANCE_NOT_FOUND")
|
|
}
|
|
return nil, err
|
|
}
|
|
|
|
// hasil return nya
|
|
return &ret, err
|
|
}
|