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 }