-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathattendance_api.go
149 lines (129 loc) · 3.99 KB
/
attendance_api.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
package main
import (
"attendance/config"
"database/sql"
_ "github.com/go-sql-driver/mysql"
"github.com/gin-contrib/cors"
"github.com/gin-gonic/gin"
"github.com/sirupsen/logrus"
"net/http"
"os"
)
const (
dbDriver = "mysql"
)
var (
configFile = os.Getenv("CONFIG_FILE")
)
// AttendanceInfo struct will be the data structure for employee's attendance
type AttendanceInfo struct {
ID int `json:"id"`
Date string `json:"date"`
Status string `json:"status"`
}
func main() {
conf, err := config.ParseFile(configFile)
logrus.SetFormatter(&logrus.JSONFormatter{})
if err != nil {
logrus.Errorf("Unable to parse configuration file for attendance: %v", err)
}
logrus.Infof("Running employee-attendance in webserver mode")
logrus.Infof("employee-attendance api is listening on port: %v", conf.Attendance.APIPort)
logrus.Infof("Endpoint is available now - http://0.0.0.0:%v/create", conf.Attendance.APIPort)
router := gin.Default()
config := cors.DefaultConfig()
config.AllowOrigins = []string{"*"}
router.Use(cors.New(config))
router.POST("/attendance/create", pushAttendanceData)
router.GET("/attendance/search", fetchAttendanceData)
router.GET("attendance/healthz", healthCheckMySQL)
router.Run(":" + conf.Attendance.APIPort)
}
func initDBConnection() (*sql.DB, error) {
conf, err := config.ParseFile(configFile)
if err != nil {
logrus.Errorf("Unable to parse configuration file for attendance: %v", err)
}
db, err := sql.Open(dbDriver, conf.MySQL.Username+":"+conf.MySQL.Password+"@tcp("+conf.MySQL.Host+")/"+conf.MySQL.DBName)
if err != nil {
return db, err
}
return db, nil
}
func pushAttendanceData(c *gin.Context) {
conf, err := config.ParseFile(configFile)
if err != nil {
logrus.Errorf("Unable to parse configuration file for attendance: %v", err)
}
db, err := initDBConnection()
if err != nil {
logrus.Errorf("Error while creating sql connection for pushing attendance data: %v", err)
}
_, err = db.Exec("USE " + conf.MySQL.DBName)
if err != nil {
logrus.Errorf("Not able to use database: %v", err)
}
_, err = db.Exec("CREATE TABLE IF NOT EXISTS Employee ( id int(6) NOT NULL, status varchar(50) NOT NULL, date varchar(50), PRIMARY KEY (id) )")
if err != nil {
logrus.Errorf("Error while creating Table: %v", err)
}
defer db.Close()
var request AttendanceInfo
if err := c.BindJSON(&request); err != nil {
errorResponse(c, http.StatusBadRequest, "Malformed request body")
logrus.Errorf("Error parsing the request body in JSON: %v", err)
return
}
insForm, err := db.Prepare("INSERT INTO Employee(id, status, date) VALUES(?,?,?)")
if err != nil {
logrus.Errorf("Cannot create db insertion command: %v", err)
}
insForm.Exec(request.ID, request.Status, request.Date)
defer db.Close()
logrus.Infof("Successfully pushed employee's attendance information")
}
func fetchAttendanceData(c *gin.Context) {
db, err := initDBConnection()
if err != nil {
logrus.Errorf("Error while creating sql connection for fetching attendance data: %v", err)
}
selDB, err := db.Query("SELECT * FROM Employee ORDER BY id DESC")
var attendanceInfo []AttendanceInfo
for selDB.Next() {
var id int
var status, date string
err = selDB.Scan(&id, &status, &date)
if err != nil {
logrus.Errorf("Error while scanning data: %v", err)
}
attendanceInfo = append(attendanceInfo, AttendanceInfo{
ID: id,
Status: status,
Date: date,
})
}
c.JSON(http.StatusOK, attendanceInfo)
}
func healthCheckMySQL(c *gin.Context) {
db, err := initDBConnection()
if err != nil {
logrus.Errorf("Error while creating sql connection for fetching attendance data: %v", err)
}
defer db.Close()
err = db.Ping()
if err != nil {
logrus.Errorf("Unable to communicate with MySQL database: %v", err)
errorResponse(c, http.StatusBadRequest, "MySQL connection is not up")
return
}
c.JSON(http.StatusOK, gin.H{
"status": "up",
"database": "MySQL",
"message": "MySQL is running",
})
}
func errorResponse(c *gin.Context, code int, err string) {
c.JSON(code, gin.H{
"error": err,
})
}