@@ -22,13 +22,14 @@ func NewCounterHandlerContext(db *sqlx.DB, ctx context.Context, authorization bo
22
22
}
23
23
24
24
func (route * CounterRoute ) CounterHTTPHandler (writer http.ResponseWriter , request * http.Request ) {
25
- log .Debug ().Msg ("POST request received. Incrementing counter." )
25
+ page := request .PathValue ("page" )
26
+
26
27
writer .Header ().Set ("Content-Type" , "application/json" )
27
28
writer .Header ().Set ("Access-Control-Allow-Origin" , "*" )
28
29
writer .Header ().Set ("Access-Control-Allow-Headers" , "*" )
29
30
var payload []byte
30
31
31
- if route .authorization && request .Method != "OPTIONS" {
32
+ if route .Authorization && request .Method != "OPTIONS" {
32
33
validation := internal .ValidateToken (request .Header .Get ("Authorization" ))
33
34
if ! validation {
34
35
log .Info ().Msg ("Invalid token." )
@@ -39,15 +40,16 @@ func (route *CounterRoute) CounterHTTPHandler(writer http.ResponseWriter, reques
39
40
40
41
switch request .Method {
41
42
case "POST" :
42
- value , err := route .postHandler (request )
43
+ log .Debug ().Msg ("POST request received. Incrementing counter." )
44
+ value , err := route .postHandler (request , page )
43
45
if err != nil {
44
46
log .Debug ().Msg ("Error incrementing counter." )
45
47
http .Error (writer , "Error incrementing counter." , http .StatusInternalServerError )
46
48
}
47
49
writer .WriteHeader (http .StatusCreated )
48
50
payload = value
49
51
case "GET" :
50
- value , err := route .getHandler (request )
52
+ value , err := route .getHandler (page )
51
53
if err != nil {
52
54
log .Debug ().Msg ("Error getting counter value." )
53
55
http .Error (writer , "Error getting counter value." , http .StatusInternalServerError )
@@ -70,27 +72,27 @@ func (route *CounterRoute) CounterHTTPHandler(writer http.ResponseWriter, reques
70
72
}
71
73
72
74
// postHandler increments the counter in the database.
73
- func (route * CounterRoute ) postHandler (r * http.Request ) ([]byte , error ) {
75
+ func (route * CounterRoute ) postHandler (r * http.Request , page string ) ([]byte , error ) {
74
76
currentTime := time .Now ().UTC ()
75
77
ua := useragent .Parse (r .UserAgent ())
76
78
browser := ua .Name
77
79
os := ua .OS
78
- transaction , err := route .DB .BeginTx (route .ctx , nil )
80
+ transaction , err := route .DB .BeginTx (route .Ctx , nil )
79
81
if err != nil {
80
82
log .Error ().Err (err ).Msg ("Error beginning transaction." )
81
83
return []byte {}, err
82
84
}
83
- sqlQuery := `INSERT INTO counter(date,browser,os) VALUES ($1, $2, $3)`
84
- _ , err = transaction .ExecContext (route .ctx , sqlQuery , currentTime , browser , os )
85
+ sqlQuery := `INSERT INTO counter(page, date, browser, os) VALUES ($1, $2, $3, $4 )`
86
+ _ , err = transaction .ExecContext (route .Ctx , sqlQuery , page , currentTime , browser , os )
85
87
if err != nil {
86
88
log .Error ().Err (err ).Msg ("Error inserting counter value." )
87
89
log .Debug ().Msgf ("SQL query: %s" , sqlQuery )
88
90
return []byte {}, err
89
91
}
90
92
log .Info ().Msg ("Counter incremented in database." )
91
- getNewCountQuery := `SELECT COUNT(*) AS total FROM counter`
93
+ getNewCountQuery := `SELECT COUNT(*) AS total FROM counter WHERE page = $1 `
92
94
var databaseTotal sql.NullInt64
93
- result := transaction .QueryRowContext (route .ctx , getNewCountQuery )
95
+ result := transaction .QueryRowContext (route .Ctx , getNewCountQuery , page )
94
96
err = result .Scan (& databaseTotal )
95
97
if err != nil {
96
98
log .Error ().Err (err ).Msg ("Error scanning counter value." )
@@ -100,7 +102,7 @@ func (route *CounterRoute) postHandler(r *http.Request) ([]byte, error) {
100
102
log .Error ().Err (err ).Msg ("Counter value is null." )
101
103
return []byte {}, err
102
104
}
103
- counterSummary := counterSummary {Total : databaseTotal .Int64 }
105
+ counterSummary := CounterSummary {Total : databaseTotal .Int64 }
104
106
err = transaction .Commit ()
105
107
if err != nil {
106
108
log .Error ().Err (err ).Msg ("Error committing transaction." )
@@ -120,13 +122,22 @@ func (route *CounterRoute) postHandler(r *http.Request) ([]byte, error) {
120
122
}
121
123
122
124
// getHandler returns the current counter value from the database as a JSON object.
123
- func (route * CounterRoute ) getHandler (r * http.Request ) ([]byte , error ) {
125
+ func (route * CounterRoute ) getHandler (page string ) ([]byte , error ) {
126
+ if page != "" {
127
+ return route .getHandlerForPage (page )
128
+ }
129
+
130
+ return route .getHandlerAllPages ()
131
+ }
132
+
133
+ // getHandlerAllPages returns the current counter value for all pages from the database as a JSON object.
134
+ func (route * CounterRoute ) getHandlerAllPages () ([]byte , error ) {
124
135
sqlQuery := `SELECT COUNT(*) AS total FROM counter`
125
- var counterSummary counterSummary
126
- err := route .DB .GetContext (route .ctx , & counterSummary , sqlQuery )
136
+ var counterSummary CounterSummary
137
+ err := route .DB .GetContext (route .Ctx , & counterSummary , sqlQuery )
127
138
if err != nil {
128
139
log .Error ().Err (err ).Msg ("Error getting counter value." )
129
- log .Debug ().Msgf ("SQL query: %s" , sqlQuery )
140
+ log .Info ().Msgf ("SQL query: %s" , sqlQuery )
130
141
return []byte {}, err
131
142
}
132
143
log .Info ().Msg ("Counter value retrieved from database." )
@@ -137,3 +148,22 @@ func (route *CounterRoute) getHandler(r *http.Request) ([]byte, error) {
137
148
}
138
149
return payload , nil
139
150
}
151
+
152
+ // getHandlerForPage returns the current counter value for a single page from the database as a JSON object.
153
+ func (route * CounterRoute ) getHandlerForPage (page string ) ([]byte , error ) {
154
+ sqlQuery := `SELECT COUNT(*) AS total FROM counter WHERE page = $1`
155
+ var counterSummary CounterSummary
156
+ err := route .DB .GetContext (route .Ctx , & counterSummary , sqlQuery , page )
157
+ if err != nil {
158
+ log .Error ().Err (err ).Msg ("Error getting counter value." )
159
+ log .Info ().Msgf ("SQL query: %s" , sqlQuery )
160
+ return []byte {}, err
161
+ }
162
+ log .Info ().Msgf ("Counter value retrieved from database for page %s" , page )
163
+ payload , err := json .MarshalIndent (counterSummary , "" , " " )
164
+ if err != nil {
165
+ log .Error ().Err (err ).Msg ("Error marshalling counterSummary struct into JSON." )
166
+ return []byte {}, err
167
+ }
168
+ return payload , nil
169
+ }
0 commit comments