package staff import ( "crypto/rand" "crypto/rsa" "crypto/x509" "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" ) // 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, publickey 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")) } // Decode the RSA private key priv, err := x509.ParsePKCS1PrivateKey(block.Bytes) if err != nil { log.Printf("bad private key: %s", err) return nil, fmt.Errorf(("INTERNAL_SERVER_ERROR")) } passEncrypted, err := rsa.EncryptPKCS1v15(rand.Reader, &priv.PublicKey, []byte(publickey)) if err != nil { log.Printf("decrypt: %s\n", err) return nil, fmt.Errorf(("DECRYPTION_FAILED")) } if passEncrypted != nil { // log.Printf("hasil variable passEncrypted: %s\n", passEncrypted) } if priv != nil { // log.Printf("hasil variable priv: %s\n", priv) } // data yang akan di tampilkan q := `SELECT M_StaffID, M_StaffNIP, M_StaffName, M_StaffEmail, M_StaffNoHp, M_StaffIsActive, M_StaffIsLogin, M_StaffToken, M_StaffIDGoogleSignIn, M_StaffCreated, M_StaffLastUpdated FROM m_staff WHERE 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.IsActive, &ret.IsLogin, &ret.Token, &ret.IDGoogleSignIn, &ret.CreatedAt, &ret.LastUpdatedAt, ) // check data if err != nil { log.Printf("Error employee_id 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 }