step 12 : fix search first login internal

This commit is contained in:
sindhu
2024-01-25 07:32:06 +07:00
parent 369e1ff02a
commit cadeeb6740
6 changed files with 417 additions and 21 deletions

View File

@@ -46,8 +46,14 @@ type DirectiveRoot struct {
} }
type ComplexityRoot struct { type ComplexityRoot struct {
LogoutResponse struct {
Message func(childComplexity int) int
Status func(childComplexity int) int
}
Mutation struct { Mutation struct {
LoginAttendance func(childComplexity int, email string, idGoogleSignIn string) int LoginAttendance func(childComplexity int, email string, idGoogleSignIn string) int
LogoutAttendance func(childComplexity int, email string, idGoogleSignIn string) int
MutationClockInAttendance func(childComplexity int, tTransactionMStaffID string, tTransactionMCompanyID string, tTransactionCurrentLatitude string, tTransactionCurrentLongitude string, tTransactionCurrentDistance string, tTransactionSelfiePhoto *string, token string, isSelfie string) int MutationClockInAttendance func(childComplexity int, tTransactionMStaffID string, tTransactionMCompanyID string, tTransactionCurrentLatitude string, tTransactionCurrentLongitude string, tTransactionCurrentDistance string, tTransactionSelfiePhoto *string, token string, isSelfie string) int
MutationClockOutAttendance func(childComplexity int, tTransactionMStaffID string, tTransactionMCompanyID string, tTransactionCurrentLatitude string, tTransactionCurrentLongitude string, tTransactionCurrentDistance string, tTransactionSelfiePhoto *string, token string, isSelfie string) int MutationClockOutAttendance func(childComplexity int, tTransactionMStaffID string, tTransactionMCompanyID string, tTransactionCurrentLatitude string, tTransactionCurrentLongitude string, tTransactionCurrentDistance string, tTransactionSelfiePhoto *string, token string, isSelfie string) int
} }
@@ -109,6 +115,7 @@ type ComplexityRoot struct {
type MutationResolver interface { type MutationResolver interface {
LoginAttendance(ctx context.Context, email string, idGoogleSignIn string) (*model.Staff, error) LoginAttendance(ctx context.Context, email string, idGoogleSignIn string) (*model.Staff, error)
LogoutAttendance(ctx context.Context, email string, idGoogleSignIn string) (*model.LogoutResponse, error)
MutationClockInAttendance(ctx context.Context, tTransactionMStaffID string, tTransactionMCompanyID string, tTransactionCurrentLatitude string, tTransactionCurrentLongitude string, tTransactionCurrentDistance string, tTransactionSelfiePhoto *string, token string, isSelfie string) (*model.TransAbsensiResponse, error) MutationClockInAttendance(ctx context.Context, tTransactionMStaffID string, tTransactionMCompanyID string, tTransactionCurrentLatitude string, tTransactionCurrentLongitude string, tTransactionCurrentDistance string, tTransactionSelfiePhoto *string, token string, isSelfie string) (*model.TransAbsensiResponse, error)
MutationClockOutAttendance(ctx context.Context, tTransactionMStaffID string, tTransactionMCompanyID string, tTransactionCurrentLatitude string, tTransactionCurrentLongitude string, tTransactionCurrentDistance string, tTransactionSelfiePhoto *string, token string, isSelfie string) (*model.TransAbsensiResponse, error) MutationClockOutAttendance(ctx context.Context, tTransactionMStaffID string, tTransactionMCompanyID string, tTransactionCurrentLatitude string, tTransactionCurrentLongitude string, tTransactionCurrentDistance string, tTransactionSelfiePhoto *string, token string, isSelfie string) (*model.TransAbsensiResponse, error)
} }
@@ -139,6 +146,20 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
_ = ec _ = ec
switch typeName + "." + field { switch typeName + "." + field {
case "LogoutResponse.message":
if e.complexity.LogoutResponse.Message == nil {
break
}
return e.complexity.LogoutResponse.Message(childComplexity), true
case "LogoutResponse.status":
if e.complexity.LogoutResponse.Status == nil {
break
}
return e.complexity.LogoutResponse.Status(childComplexity), true
case "Mutation.loginAttendance": case "Mutation.loginAttendance":
if e.complexity.Mutation.LoginAttendance == nil { if e.complexity.Mutation.LoginAttendance == nil {
break break
@@ -151,6 +172,18 @@ func (e *executableSchema) Complexity(typeName, field string, childComplexity in
return e.complexity.Mutation.LoginAttendance(childComplexity, args["email"].(string), args["id_google_sign_in"].(string)), true return e.complexity.Mutation.LoginAttendance(childComplexity, args["email"].(string), args["id_google_sign_in"].(string)), true
case "Mutation.logoutAttendance":
if e.complexity.Mutation.LogoutAttendance == nil {
break
}
args, err := ec.field_Mutation_logoutAttendance_args(context.TODO(), rawArgs)
if err != nil {
return 0, false
}
return e.complexity.Mutation.LogoutAttendance(childComplexity, args["email"].(string), args["id_google_sign_in"].(string)), true
case "Mutation.mutationClockInAttendance": case "Mutation.mutationClockInAttendance":
if e.complexity.Mutation.MutationClockInAttendance == nil { if e.complexity.Mutation.MutationClockInAttendance == nil {
break break
@@ -582,6 +615,13 @@ type TokenResponse {
message: String message: String
} }
# logout response
type LogoutResponse {
status:String
message:String
}
# query search # query search
extend type Query { extend type Query {
searchStaffByEmail(email: String!): Staff! searchStaffByEmail(email: String!): Staff!
@@ -591,7 +631,11 @@ extend type Query {
# mutation untuk perubahan data # mutation untuk perubahan data
extend type Mutation { extend type Mutation {
# login
loginAttendance(email:String!, id_google_sign_in:String!) : Staff! loginAttendance(email:String!, id_google_sign_in:String!) : Staff!
# logout
logoutAttendance(email:String!, id_google_sign_in:String!) : LogoutResponse!
}`, BuiltIn: false}, }`, BuiltIn: false},
{Name: "../graphqls/transabsensi.graphqls", Input: `# response error atau success dan set message {Name: "../graphqls/transabsensi.graphqls", Input: `# response error atau success dan set message
type TransAbsensiResponse { type TransAbsensiResponse {
@@ -667,6 +711,30 @@ func (ec *executionContext) field_Mutation_loginAttendance_args(ctx context.Cont
return args, nil return args, nil
} }
func (ec *executionContext) field_Mutation_logoutAttendance_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
var err error
args := map[string]interface{}{}
var arg0 string
if tmp, ok := rawArgs["email"]; ok {
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("email"))
arg0, err = ec.unmarshalNString2string(ctx, tmp)
if err != nil {
return nil, err
}
}
args["email"] = arg0
var arg1 string
if tmp, ok := rawArgs["id_google_sign_in"]; ok {
ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("id_google_sign_in"))
arg1, err = ec.unmarshalNString2string(ctx, tmp)
if err != nil {
return nil, err
}
}
args["id_google_sign_in"] = arg1
return args, nil
}
func (ec *executionContext) field_Mutation_mutationClockInAttendance_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) { func (ec *executionContext) field_Mutation_mutationClockInAttendance_args(ctx context.Context, rawArgs map[string]interface{}) (map[string]interface{}, error) {
var err error var err error
args := map[string]interface{}{} args := map[string]interface{}{}
@@ -1014,6 +1082,88 @@ func (ec *executionContext) field___Type_fields_args(ctx context.Context, rawArg
// region **************************** field.gotpl ***************************** // region **************************** field.gotpl *****************************
func (ec *executionContext) _LogoutResponse_status(ctx context.Context, field graphql.CollectedField, obj *model.LogoutResponse) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_LogoutResponse_status(ctx, field)
if err != nil {
return graphql.Null
}
ctx = graphql.WithFieldContext(ctx, fc)
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return obj.Status, nil
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
return graphql.Null
}
res := resTmp.(*string)
fc.Result = res
return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
}
func (ec *executionContext) fieldContext_LogoutResponse_status(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
fc = &graphql.FieldContext{
Object: "LogoutResponse",
Field: field,
IsMethod: false,
IsResolver: false,
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
return nil, errors.New("field of type String does not have child fields")
},
}
return fc, nil
}
func (ec *executionContext) _LogoutResponse_message(ctx context.Context, field graphql.CollectedField, obj *model.LogoutResponse) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_LogoutResponse_message(ctx, field)
if err != nil {
return graphql.Null
}
ctx = graphql.WithFieldContext(ctx, fc)
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return obj.Message, nil
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
return graphql.Null
}
res := resTmp.(*string)
fc.Result = res
return ec.marshalOString2ᚖstring(ctx, field.Selections, res)
}
func (ec *executionContext) fieldContext_LogoutResponse_message(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
fc = &graphql.FieldContext{
Object: "LogoutResponse",
Field: field,
IsMethod: false,
IsResolver: false,
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
return nil, errors.New("field of type String does not have child fields")
},
}
return fc, nil
}
func (ec *executionContext) _Mutation_loginAttendance(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { func (ec *executionContext) _Mutation_loginAttendance(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_Mutation_loginAttendance(ctx, field) fc, err := ec.fieldContext_Mutation_loginAttendance(ctx, field)
if err != nil { if err != nil {
@@ -1101,6 +1251,67 @@ func (ec *executionContext) fieldContext_Mutation_loginAttendance(ctx context.Co
return fc, nil return fc, nil
} }
func (ec *executionContext) _Mutation_logoutAttendance(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_Mutation_logoutAttendance(ctx, field)
if err != nil {
return graphql.Null
}
ctx = graphql.WithFieldContext(ctx, fc)
defer func() {
if r := recover(); r != nil {
ec.Error(ctx, ec.Recover(ctx, r))
ret = graphql.Null
}
}()
resTmp, err := ec.ResolverMiddleware(ctx, func(rctx context.Context) (interface{}, error) {
ctx = rctx // use context from middleware stack in children
return ec.resolvers.Mutation().LogoutAttendance(rctx, fc.Args["email"].(string), fc.Args["id_google_sign_in"].(string))
})
if err != nil {
ec.Error(ctx, err)
return graphql.Null
}
if resTmp == nil {
if !graphql.HasFieldError(ctx, fc) {
ec.Errorf(ctx, "must not be null")
}
return graphql.Null
}
res := resTmp.(*model.LogoutResponse)
fc.Result = res
return ec.marshalNLogoutResponse2ᚖcomᚗsismedikaᚗcomᚗabsensiᚋgraphᚋmodelᚐLogoutResponse(ctx, field.Selections, res)
}
func (ec *executionContext) fieldContext_Mutation_logoutAttendance(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) {
fc = &graphql.FieldContext{
Object: "Mutation",
Field: field,
IsMethod: true,
IsResolver: true,
Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) {
switch field.Name {
case "status":
return ec.fieldContext_LogoutResponse_status(ctx, field)
case "message":
return ec.fieldContext_LogoutResponse_message(ctx, field)
}
return nil, fmt.Errorf("no field named %q was found under type LogoutResponse", field.Name)
},
}
defer func() {
if r := recover(); r != nil {
err = ec.Recover(ctx, r)
ec.Error(ctx, err)
}
}()
ctx = graphql.WithFieldContext(ctx, fc)
if fc.Args, err = ec.field_Mutation_logoutAttendance_args(ctx, field.ArgumentMap(ec.Variables)); err != nil {
ec.Error(ctx, err)
return fc, err
}
return fc, nil
}
func (ec *executionContext) _Mutation_mutationClockInAttendance(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { func (ec *executionContext) _Mutation_mutationClockInAttendance(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) {
fc, err := ec.fieldContext_Mutation_mutationClockInAttendance(ctx, field) fc, err := ec.fieldContext_Mutation_mutationClockInAttendance(ctx, field)
if err != nil { if err != nil {
@@ -4821,6 +5032,44 @@ func (ec *executionContext) fieldContext___Type_specifiedByURL(ctx context.Conte
// region **************************** object.gotpl **************************** // region **************************** object.gotpl ****************************
var logoutResponseImplementors = []string{"LogoutResponse"}
func (ec *executionContext) _LogoutResponse(ctx context.Context, sel ast.SelectionSet, obj *model.LogoutResponse) graphql.Marshaler {
fields := graphql.CollectFields(ec.OperationContext, sel, logoutResponseImplementors)
out := graphql.NewFieldSet(fields)
deferred := make(map[string]*graphql.FieldSet)
for i, field := range fields {
switch field.Name {
case "__typename":
out.Values[i] = graphql.MarshalString("LogoutResponse")
case "status":
out.Values[i] = ec._LogoutResponse_status(ctx, field, obj)
case "message":
out.Values[i] = ec._LogoutResponse_message(ctx, field, obj)
default:
panic("unknown field " + strconv.Quote(field.Name))
}
}
out.Dispatch(ctx)
if out.Invalids > 0 {
return graphql.Null
}
atomic.AddInt32(&ec.deferred, int32(len(deferred)))
for label, dfs := range deferred {
ec.processDeferredGroup(graphql.DeferredGroup{
Label: label,
Path: graphql.GetPath(ctx),
FieldSet: dfs,
Context: ctx,
})
}
return out
}
var mutationImplementors = []string{"Mutation"} var mutationImplementors = []string{"Mutation"}
func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler { func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) graphql.Marshaler {
@@ -4847,6 +5096,13 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet)
if out.Values[i] == graphql.Null { if out.Values[i] == graphql.Null {
out.Invalids++ out.Invalids++
} }
case "logoutAttendance":
out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
return ec._Mutation_logoutAttendance(ctx, field)
})
if out.Values[i] == graphql.Null {
out.Invalids++
}
case "mutationClockInAttendance": case "mutationClockInAttendance":
out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) {
return ec._Mutation_mutationClockInAttendance(ctx, field) return ec._Mutation_mutationClockInAttendance(ctx, field)
@@ -5650,6 +5906,20 @@ func (ec *executionContext) marshalNID2string(ctx context.Context, sel ast.Selec
return res return res
} }
func (ec *executionContext) marshalNLogoutResponse2comᚗsismedikaᚗcomᚗabsensiᚋgraphᚋmodelᚐLogoutResponse(ctx context.Context, sel ast.SelectionSet, v model.LogoutResponse) graphql.Marshaler {
return ec._LogoutResponse(ctx, sel, &v)
}
func (ec *executionContext) marshalNLogoutResponse2ᚖcomᚗsismedikaᚗcomᚗabsensiᚋgraphᚋmodelᚐLogoutResponse(ctx context.Context, sel ast.SelectionSet, v *model.LogoutResponse) graphql.Marshaler {
if v == nil {
if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) {
ec.Errorf(ctx, "the requested element is null which the schema does not allow")
}
return graphql.Null
}
return ec._LogoutResponse(ctx, sel, v)
}
func (ec *executionContext) marshalNStaff2comᚗsismedikaᚗcomᚗabsensiᚋgraphᚋmodelᚐStaff(ctx context.Context, sel ast.SelectionSet, v model.Staff) graphql.Marshaler { func (ec *executionContext) marshalNStaff2comᚗsismedikaᚗcomᚗabsensiᚋgraphᚋmodelᚐStaff(ctx context.Context, sel ast.SelectionSet, v model.Staff) graphql.Marshaler {
return ec._Staff(ctx, sel, &v) return ec._Staff(ctx, sel, &v)
} }

View File

@@ -23,6 +23,13 @@ type TokenResponse {
message: String message: String
} }
# logout response
type LogoutResponse {
status:String
message:String
}
# query search # query search
extend type Query { extend type Query {
searchStaffByEmail(email: String!): Staff! searchStaffByEmail(email: String!): Staff!
@@ -32,5 +39,9 @@ extend type Query {
# mutation untuk perubahan data # mutation untuk perubahan data
extend type Mutation { extend type Mutation {
# login
loginAttendance(email:String!, id_google_sign_in:String!) : Staff! loginAttendance(email:String!, id_google_sign_in:String!) : Staff!
# logout
logoutAttendance(email:String!, id_google_sign_in:String!) : LogoutResponse!
} }

View File

@@ -2,6 +2,11 @@
package model package model
type LogoutResponse struct {
Status *string `json:"status,omitempty"`
Message *string `json:"message,omitempty"`
}
type Mutation struct { type Mutation struct {
} }

View File

@@ -21,6 +21,13 @@ func (r *mutationResolver) LoginAttendance(ctx context.Context, email string, id
return staffinternal.LoginAttendance(email, idGoogleSignIn) return staffinternal.LoginAttendance(email, idGoogleSignIn)
} }
// LogoutAttendance is the resolver for the logoutAttendance field.
func (r *mutationResolver) LogoutAttendance(ctx context.Context, email string, idGoogleSignIn string) (*model.LogoutResponse, error) {
// panic(fmt.Errorf("not implemented: LogoutAttendance - logoutAttendance"))
var staffinternal staffinternal.Staff
return staffinternal.LogoutAttendance(email, idGoogleSignIn)
}
// SearchStaffByEmail is the resolver for the searchStaffByEmail field. // SearchStaffByEmail is the resolver for the searchStaffByEmail field.
func (r *queryResolver) SearchStaffByEmail(ctx context.Context, email string) (*model.Staff, error) { func (r *queryResolver) SearchStaffByEmail(ctx context.Context, email string) (*model.Staff, error) {
panic(fmt.Errorf("not implemented: SearchStaffByEmail - searchStaffByEmail")) panic(fmt.Errorf("not implemented: SearchStaffByEmail - searchStaffByEmail"))

View File

@@ -26,6 +26,7 @@ func (staff *Staff) LoginAttendance(email string, id_google_sign_in string) (*mo
// inisialisasi // inisialisasi
var err error var err error
var ret model.Staff var ret model.Staff
var var_staff_is_login string
// decode private.pem // decode private.pem
pemData, err := ioutil.ReadFile(config.Data.Get("privatekey")) pemData, err := ioutil.ReadFile(config.Data.Get("privatekey"))
@@ -55,32 +56,61 @@ func (staff *Staff) LoginAttendance(email string, id_google_sign_in string) (*mo
return nil, err return nil, err
} }
// jika sukses generate token maka update // check staff is login
// M_StaffToken & M_StaffIsLogin qCheck := `SELECT
M_StaffIsLogin
qx := `UPDATE m_staff FROM m_staff
SET
M_StaffToken = ?,
M_StaffIsLogin = 'Y'
WHERE WHERE
M_StaffIsActive = 'Y' M_StaffIsActive = 'Y'
AND M_StaffEmail = ? AND M_StaffEmail = ?
AND M_StaffIDGoogleSignIn = ?
` `
// log sql untuk mengetahui query yg akan dieksekusi
db.LogSQL(qx)
// cek kondisi rowCheck := db.Handle.QueryRow(
// _ merupakan kondisi true namun value tidak digunakan sbg cek qCheck,
// error kondisi false dan error digunakan
_, err = db.Handle.Exec(
qx,
token,
email, email,
id_google_sign_in) )
db.LogSQL(qCheck)
err = rowCheck.Scan(
&var_staff_is_login,
)
if err != nil { if err != nil {
return &ret, fmt.Errorf("UPDATE_TOKEN_FAILED") log.Printf("Error m_staff select isLogin: %v", err)
log.Printf("Executing query: %s\n", qCheck)
return nil, err
}
if var_staff_is_login == "N" {
// generate token jk isLogin N
// jika sukses generate token maka update
// M_StaffToken & M_StaffIsLogin
qx := `UPDATE m_staff
SET
M_StaffToken = ?,
M_StaffIDGoogleSignIn = ?,
M_StaffIsLogin = 'Y'
WHERE
M_StaffIsActive = 'Y'
AND M_StaffEmail = ?
`
// 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,
id_google_sign_in,
email)
if err != nil {
return &ret, fmt.Errorf("UPDATE_TOKEN_FAILED")
}
} }
// data yang akan di tampilkan // data yang akan di tampilkan
@@ -147,3 +177,76 @@ func (staff *Staff) LoginAttendance(email string, id_google_sign_in string) (*mo
// hasil return nya // hasil return nya
return &ret, err return &ret, err
} }
// logout
func (staff *Staff) LogoutAttendance(email string, id_google_sign_in string) (*model.LogoutResponse, error) {
// inisialisasi
var err error
var ret model.LogoutResponse
var varCheckToken string
ret.Status = new(string)
ret.Message = new(string)
*ret.Status = "OK"
*ret.Message = "Logout Berhasil"
q := `SELECT
M_StaffToken
FROM m_staff
join m_company
ON M_StaffM_CompanyID = M_CompanyID
AND M_CompanyIsActive = 'Y'
AND M_StaffIsActive = 'Y'
AND M_StaffIsLogin = '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(
&varCheckToken,
)
// check data
if err != nil {
log.Printf("Error m_staff select: %v", err)
log.Printf("Executing query: %s\n", q)
*ret.Status = "ERR"
*ret.Message = "Error : Check Data Failed"
return &ret, err
}
qx := `UPDATE m_staff
SET
M_StaffToken = NULL,
M_StaffIsLogin = 'N'
WHERE
M_StaffIsActive = 'Y'
AND M_StaffEmail = ?
`
// 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,
email)
if err != nil {
*ret.Status = "ERR"
*ret.Message = "Error : UPDATE TOKEN FAILED"
return &ret, fmt.Errorf("UPDATE_TOKEN_FAILED")
}
// hasil return nya
return &ret, err
}

Binary file not shown.