step 5 : add comp longi & lati, check distance gql, trans clock in gql

This commit is contained in:
sindhu
2024-01-22 15:11:44 +07:00
parent c62764165d
commit ba1f43ae70
12 changed files with 548 additions and 697 deletions

View File

@@ -3,14 +3,14 @@ module com.sismedika.com.absensi
go 1.21.5 go 1.21.5
require ( require (
github.com/99designs/gqlgen v0.17.42 github.com/99designs/gqlgen v0.17.44-0.20240120140729-5524a399d35c
github.com/dgrijalva/jwt-go v3.2.0+incompatible github.com/dgrijalva/jwt-go v3.2.0+incompatible
github.com/fsnotify/fsnotify v1.7.0 github.com/fsnotify/fsnotify v1.7.0
github.com/go-chi/chi v1.5.5 github.com/go-chi/chi v1.5.5
github.com/go-sql-driver/mysql v1.7.1 github.com/go-sql-driver/mysql v1.7.1
github.com/rs/cors v1.10.1 github.com/rs/cors v1.10.1
github.com/spf13/viper v1.18.2 github.com/spf13/viper v1.18.2
github.com/vektah/gqlparser/v2 v2.5.10 github.com/vektah/gqlparser/v2 v2.5.11
golang.org/x/crypto v0.18.0 golang.org/x/crypto v0.18.0
) )

View File

@@ -1,5 +1,5 @@
github.com/99designs/gqlgen v0.17.42 h1:BVWDOb2VVHQC5k3m6oa0XhDnxltLLrU4so7x/u39Zu4= github.com/99designs/gqlgen v0.17.44-0.20240120140729-5524a399d35c h1:7Bb7oV6i+qqaewxJycio3G6gObQts35FuYPai7Lk3ik=
github.com/99designs/gqlgen v0.17.42/go.mod h1:GQ6SyMhwFbgHR0a8r2Wn8fYgEwPxxmndLFPhU63+cJE= github.com/99designs/gqlgen v0.17.44-0.20240120140729-5524a399d35c/go.mod h1:lO0Zjy8MkZgBdv4T1U91x09r0e0WFOdhVUutlQs1Rsc=
github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM= github.com/PuerkitoBio/goquery v1.8.1 h1:uQxhNlArOIdbrH1tr0UXwdVFgDcZDrZVdcpygAcwmWM=
github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ= github.com/PuerkitoBio/goquery v1.8.1/go.mod h1:Q8ICL1kNUJ2sXGoAhPGUdYDJvgQgHzJsnnd3H7Ho5jQ=
github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8= github.com/agnivade/levenshtein v1.1.1 h1:QY8M92nrzkmr798gCo3kmMyqXFzdQVpxLlGPRBij0P8=
@@ -87,8 +87,8 @@ github.com/subosito/gotenv v1.6.0 h1:9NlTDc1FTs4qu0DDq7AEtTPNw6SVm7uBMsUCUjABIf8
github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU= github.com/subosito/gotenv v1.6.0/go.mod h1:Dk4QP5c2W3ibzajGcXpNraDfq2IrhjMIvMSWPKKo0FU=
github.com/urfave/cli/v2 v2.25.5 h1:d0NIAyhh5shGscroL7ek/Ya9QYQE0KNabJgiUinIQkc= github.com/urfave/cli/v2 v2.25.5 h1:d0NIAyhh5shGscroL7ek/Ya9QYQE0KNabJgiUinIQkc=
github.com/urfave/cli/v2 v2.25.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc= github.com/urfave/cli/v2 v2.25.5/go.mod h1:GHupkWPMM0M/sj1a2b4wUrWBPzazNrIjouW6fmdJLxc=
github.com/vektah/gqlparser/v2 v2.5.10 h1:6zSM4azXC9u4Nxy5YmdmGu4uKamfwsdKTwp5zsEealU= github.com/vektah/gqlparser/v2 v2.5.11 h1:JJxLtXIoN7+3x6MBdtIP59TP1RANnY7pXOaDnADQSf8=
github.com/vektah/gqlparser/v2 v2.5.10/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc= github.com/vektah/gqlparser/v2 v2.5.11/go.mod h1:1rCcfwB2ekJofmluGWXMSEnPMZgbxzwj6FaZ/4OT8Cc=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU=
github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=

File diff suppressed because it is too large Load Diff

View File

@@ -1,28 +0,0 @@
# GraphQL schema example
#
# https://gqlgen.com/getting-started/
type Todo {
id: ID!
text: String!
done: Boolean!
user: User!
}
type User {
id: ID!
name: String!
}
type Query {
todos: [Todo!]!
}
input NewTodo {
text: String!
userId: String!
}
type Mutation {
createTodo(input: NewTodo!): Todo!
}

View File

@@ -1,20 +1,22 @@
# model staff # model staff
type Staff { type Staff {
staff_id: ID! staff_id: ID!
nip: String! nip: String!
name: String! name: String!
email: String! email: String!
phone_number: String phone_number: String
company_id: ID! company_id: ID!
company_name: String company_name: String
is_active: String company_latitude:String
is_login: String company_longitude:String
token: String is_active: String
expired: String is_login: String
id_google_sign_in: String! token: String
display_name_google_sign_in: String expired: String
created_at: String id_google_sign_in: String!
last_updated_at: String display_name_google_sign_in: String
created_at: String
last_updated_at: String
} }
# model token response ketika login # model token response ketika login

View File

@@ -0,0 +1,17 @@
# response error atau success dan set message
type TransAbsensiResponse {
status: String
message: String
}
# query
extend type Query {
# untuk cek distance dengan fungsi distance_v2 di database
queryCheckDistance(M_StaffID:String!, M_CompanyID:String!, M_CompanyLatitude:String!, M_CompanyLongitude:String!, CurrentLatitude:String!, CurrentLongitude:String!) : TransAbsensiResponse!
}
# mutation
extend type Mutation {
# untuk clock in absensi (absensi masuk)
mutationClockInAttendance(T_TransactionM_AbsensiTypeID:String!, T_TransactionM_StaffID:String!, T_TransactionM_CompanyID:String!, T_TransactionCurrentLatitude:String!, T_TransactionCurrentLongitude:String!, T_TransactionDistance:String!, T_TransactionSelfiePhoto:String, T_TransactionNote:String):TransAbsensiResponse!
}

View File

@@ -5,11 +5,6 @@ package model
type Mutation struct { type Mutation struct {
} }
type NewTodo struct {
Text string `json:"text"`
UserID string `json:"userId"`
}
type Query struct { type Query struct {
} }
@@ -21,6 +16,8 @@ type Staff struct {
PhoneNumber *string `json:"phone_number,omitempty"` PhoneNumber *string `json:"phone_number,omitempty"`
CompanyID string `json:"company_id"` CompanyID string `json:"company_id"`
CompanyName *string `json:"company_name,omitempty"` CompanyName *string `json:"company_name,omitempty"`
CompanyLatitude *string `json:"company_latitude,omitempty"`
CompanyLongitude *string `json:"company_longitude,omitempty"`
IsActive *string `json:"is_active,omitempty"` IsActive *string `json:"is_active,omitempty"`
IsLogin *string `json:"is_login,omitempty"` IsLogin *string `json:"is_login,omitempty"`
Token *string `json:"token,omitempty"` Token *string `json:"token,omitempty"`
@@ -31,19 +28,12 @@ type Staff struct {
LastUpdatedAt *string `json:"last_updated_at,omitempty"` LastUpdatedAt *string `json:"last_updated_at,omitempty"`
} }
type Todo struct {
ID string `json:"id"`
Text string `json:"text"`
Done bool `json:"done"`
User *User `json:"user"`
}
type TokenResponse struct { type TokenResponse struct {
Token *string `json:"token,omitempty"` Token *string `json:"token,omitempty"`
Message *string `json:"message,omitempty"` Message *string `json:"message,omitempty"`
} }
type User struct { type TransAbsensiResponse struct {
ID string `json:"id"` Status *string `json:"status,omitempty"`
Name string `json:"name"` Message *string `json:"message,omitempty"`
} }

View File

@@ -1,32 +1 @@
package resolver package resolver
// This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end.
// Code generated by github.com/99designs/gqlgen version v0.17.42
import (
"context"
"fmt"
"com.sismedika.com.absensi/graph/generated"
"com.sismedika.com.absensi/graph/model"
)
// CreateTodo is the resolver for the createTodo field.
func (r *mutationResolver) CreateTodo(ctx context.Context, input model.NewTodo) (*model.Todo, error) {
panic(fmt.Errorf("not implemented: CreateTodo - createTodo"))
}
// Todos is the resolver for the todos field.
func (r *queryResolver) Todos(ctx context.Context) ([]*model.Todo, error) {
panic(fmt.Errorf("not implemented: Todos - todos"))
}
// Mutation returns generated.MutationResolver implementation.
func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} }
// Query returns generated.QueryResolver implementation.
func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} }
type mutationResolver struct{ *Resolver }
type queryResolver struct{ *Resolver }

View File

@@ -2,12 +2,13 @@ package resolver
// This file will be automatically regenerated based on the schema, any resolver implementations // This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end. // will be copied through when generating and any unknown code will be moved to the end.
// Code generated by github.com/99designs/gqlgen version v0.17.42 // Code generated by github.com/99designs/gqlgen version v0.17.43-dev
import ( import (
"context" "context"
"fmt" "fmt"
"com.sismedika.com.absensi/graph/generated"
"com.sismedika.com.absensi/graph/model" "com.sismedika.com.absensi/graph/model"
staffinternal "com.sismedika.com.absensi/internal/staff" staffinternal "com.sismedika.com.absensi/internal/staff"
) )
@@ -35,12 +36,11 @@ func (r *queryResolver) StaffListBySearch(ctx context.Context, search *string, p
panic(fmt.Errorf("not implemented: StaffListBySearch - staffListBySearch")) panic(fmt.Errorf("not implemented: StaffListBySearch - staffListBySearch"))
} }
// !!! WARNING !!! // Mutation returns generated.MutationResolver implementation.
// The code below was going to be deleted when updating resolvers. It has been copied here so you have func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} }
// one last chance to move it out of harms way if you want. There are two reasons this happens:
// - When renaming or deleting a resolver the old code will be put in here. You can safely delete // Query returns generated.QueryResolver implementation.
// it when you're done. func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} }
// - You have helper methods in this file. Move them out to keep these resolver files clean.
func (r *mutationResolver) GenerateToken(ctx context.Context, email string, idGoogleSignIn string, publickey string) (*model.TokenResponse, error) { type mutationResolver struct{ *Resolver }
panic(fmt.Errorf("not implemented: GenerateToken - generateToken")) type queryResolver struct{ *Resolver }
}

View File

@@ -0,0 +1,35 @@
package resolver
// This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end.
// Code generated by github.com/99designs/gqlgen version v0.17.43-dev
import (
"context"
"fmt"
"com.sismedika.com.absensi/graph/model"
)
// MutationClockInAttendance is the resolver for the mutationClockInAttendance field.
func (r *mutationResolver) MutationClockInAttendance(ctx context.Context, tTransactionMAbsensiTypeID string, tTransactionMStaffID string, tTransactionMCompanyID string, tTransactionCurrentLatitude string, tTransactionCurrentLongitude string, tTransactionDistance string, tTransactionSelfiePhoto *string, tTransactionNote *string) (*model.TransAbsensiResponse, error) {
panic(fmt.Errorf("not implemented: MutationClockInAttendance - mutationClockInAttendance"))
}
// QueryCheckDistance is the resolver for the queryCheckDistance field.
func (r *queryResolver) QueryCheckDistance(ctx context.Context, mStaffID string, mCompanyID string, mCompanyLatitude string, mCompanyLongitude string, currentLatitude string, currentLongitude string) (*model.TransAbsensiResponse, error) {
panic(fmt.Errorf("not implemented: QueryCheckDistance - queryCheckDistance"))
}
// !!! WARNING !!!
// The code below was going to be deleted when updating resolvers. It has been copied here so you have
// one last chance to move it out of harms way if you want. There are two reasons this happens:
// - When renaming or deleting a resolver the old code will be put in here. You can safely delete
// it when you're done.
// - You have helper methods in this file. Move them out to keep these resolver files clean.
func (r *mutationResolver) MClockInAttendance(ctx context.Context, tTransactionMAbsensiTypeID string, tTransactionMStaffID string, tTransactionMCompanyID string, tTransactionCurrentLatitude string, tTransactionCurrentLongitude string, tTransactionDistance string, tTransactionSelfiePhoto *string, tTransactionNote *string) (*model.TransAbsensiResponse, error) {
panic(fmt.Errorf("not implemented: MClockInAttendance - mClockInAttendance"))
}
func (r *queryResolver) QCheckDistance(ctx context.Context, mStaffID string, mCompanyID string, mCompanyLatitude string, mCompanyLongitude string, currentLatitude string, currentLongitude string) (*model.TransAbsensiResponse, error) {
panic(fmt.Errorf("not implemented: QCheckDistance - qCheckDistance"))
}

View File

@@ -92,6 +92,8 @@ func (staff *Staff) LoginAttendance(email string, id_google_sign_in string) (*mo
M_StaffNoHp, M_StaffNoHp,
M_CompanyID, M_CompanyID,
M_CompanyName, M_CompanyName,
M_CompanyLatitude,
M_CompanyLongitude,
M_StaffIsActive, M_StaffIsActive,
M_StaffIsLogin, M_StaffIsLogin,
M_StaffToken, M_StaffToken,
@@ -121,6 +123,8 @@ func (staff *Staff) LoginAttendance(email string, id_google_sign_in string) (*mo
&ret.PhoneNumber, &ret.PhoneNumber,
&ret.CompanyID, &ret.CompanyID,
&ret.CompanyName, &ret.CompanyName,
&ret.CompanyLatitude,
&ret.CompanyLongitude,
&ret.IsActive, &ret.IsActive,
&ret.IsLogin, &ret.IsLogin,
&ret.Token, &ret.Token,

View File

@@ -64,7 +64,7 @@ func Middleware() func(http.Handler) http.Handler {
} }
// ForContext finds the user from the context. REQUIRES Middleware to have run. // ForContext finds the user from the context. REQUIRES Middleware to have run.
func ForContext(ctx context.Context) *model.User { func ForContext(ctx context.Context) *model.Staff {
raw, _ := ctx.Value(userCtxKey).(*model.User) raw, _ := ctx.Value(userCtxKey).(*model.Staff)
return raw return raw
} }