2016-11-21 15:01:14 +00:00
package api
import (
"net/http"
"github.com/dannyvankooten/ana/models"
"github.com/dannyvankooten/ana/core"
"encoding/json"
2016-11-22 16:03:29 +00:00
"strconv"
2016-11-21 15:01:14 +00:00
)
2016-11-21 16:08:24 +00:00
// URL: /api/visits
2016-11-22 21:33:50 +00:00
var GetVisitsHandler = http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
2016-11-21 15:01:14 +00:00
stmt , err := core . DB . Prepare ( ` SELECT
id ,
COALESCE ( browser_name , ' ' ) AS browser_name ,
COALESCE ( browser_language , ' ' ) AS browser_language ,
COALESCE ( device_os , ' ' ) AS device_os ,
ip_address ,
path ,
COALESCE ( screen_resolution , ' ' ) AS screen_resolution ,
timestamp
2016-11-22 16:03:29 +00:00
FROM visits
ORDER BY timestamp DESC
LIMIT ? ` )
2016-11-21 15:01:14 +00:00
2016-11-21 16:08:24 +00:00
checkError ( err )
defer stmt . Close ( )
2016-11-21 15:01:14 +00:00
2016-11-22 16:03:29 +00:00
limit , _ := strconv . Atoi ( r . URL . Query ( ) . Get ( "limit" ) )
if limit == 0 {
limit = 10
}
rows , err := stmt . Query ( & limit )
2016-11-21 16:08:24 +00:00
checkError ( err )
2016-11-21 15:01:14 +00:00
results := make ( [ ] models . Visit , 0 )
defer rows . Close ( )
for rows . Next ( ) {
var v models . Visit
2016-11-21 16:08:24 +00:00
err = rows . Scan ( & v . ID , & v . BrowserName , & v . BrowserLanguage , & v . DeviceOS , & v . IpAddress , & v . Path , & v . ScreenResolution , & v . Timestamp ) ;
checkError ( err )
2016-11-21 15:01:14 +00:00
results = append ( results , v )
2016-11-21 16:08:24 +00:00
}
err = rows . Err ( ) ;
checkError ( err )
w . Header ( ) . Set ( "Content-Type" , "application/json" )
json . NewEncoder ( w ) . Encode ( results )
2016-11-22 21:33:50 +00:00
} )
2016-11-21 15:01:14 +00:00
2016-11-21 16:08:24 +00:00
// URL: /api/visits/count/realtime
2016-11-22 21:33:50 +00:00
var GetVisitsRealtimeCount = http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
2016-11-24 12:10:40 +00:00
row := core . DB . QueryRow ( ` SELECT COUNT(DISTINCT(ip_address)) FROM visits WHERE timestamp >= DATE_SUB(CURRENT_TIMESTAMP, INTERVAL 3 HOUR_MINUTE) AND timestamp <= CURRENT_TIMESTAMP ` )
2016-11-21 16:08:24 +00:00
var result int
row . Scan ( & result )
w . Header ( ) . Set ( "Content-Type" , "application/json" )
json . NewEncoder ( w ) . Encode ( result )
2016-11-22 21:33:50 +00:00
} )
2016-11-22 16:03:29 +00:00
// URL: /api/visits/count/day
2016-11-22 21:33:50 +00:00
var GetVisitsDayCountHandler = http . HandlerFunc ( func ( w http . ResponseWriter , r * http . Request ) {
2016-11-22 16:03:29 +00:00
stmt , err := core . DB . Prepare ( ` SELECT
2016-11-23 19:30:09 +00:00
COUNT ( DISTINCT ( ip_address ) ) AS count , DATE_FORMAT ( timestamp , ' % Y - % m - % d ' ) AS date_group
2016-11-22 16:03:29 +00:00
FROM visits
2016-11-23 20:29:54 +00:00
WHERE timestamp >= DATE_SUB ( CURRENT_TIMESTAMP , INTERVAL ? DAY )
2016-11-22 16:03:29 +00:00
GROUP BY date_group ` )
checkError ( err )
defer stmt . Close ( )
2016-11-23 21:26:47 +00:00
period , err := strconv . Atoi ( r . URL . Query ( ) . Get ( "period" ) )
if err != nil || period == 0 {
period = 1
2016-11-23 20:29:54 +00:00
}
rows , err := stmt . Query ( period )
2016-11-22 16:03:29 +00:00
checkError ( err )
results := make ( [ ] Datapoint , 0 )
defer rows . Close ( )
for rows . Next ( ) {
v := Datapoint { }
err = rows . Scan ( & v . Count , & v . Label ) ;
checkError ( err )
results = append ( results , v )
}
2016-11-23 21:26:47 +00:00
results = fillDatapoints ( period , results )
2016-11-22 16:03:29 +00:00
err = rows . Err ( ) ;
checkError ( err )
w . Header ( ) . Set ( "Content-Type" , "application/json" )
json . NewEncoder ( w ) . Encode ( results )
2016-11-22 21:33:50 +00:00
} )