gopiwik/piwik/handler.go

121 lines
3.9 KiB
Go

package piwik
import (
"log"
"net/http"
"encoding/json"
"os"
)
type PiwikHandler struct {
fileServer http.Handler
siteStorage SiteStorageInterface
visitStorage VisitStorageInterface
}
func NewPiwikHandler(ss SiteStorageInterface, vs VisitStorageInterface) *PiwikHandler {
return &PiwikHandler{
fileServer: http.FileServer(http.Dir("assets")),
siteStorage: ss,
visitStorage: vs,
}
}
func (h *PiwikHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
switch r.Method {
case http.MethodGet:
switch r.URL.Path {
case "/piwik.php":
h.handlePiwik(w, r)
default:
h.fileServer.ServeHTTP(w, r)
}
default:
http.Error(w, http.StatusText(http.StatusMethodNotAllowed), http.StatusMethodNotAllowed)
}
}
func (h *PiwikHandler) handlePiwik(w http.ResponseWriter, r *http.Request) {
pr := ParseV3(r)
v := &Visit{
SiteID: pr.SiteID,
URL: pr.URL,
ActionName: pr.ActionName,
VisitorID: pr.VisitorID,
Referrer: pr.Referrer,
CustomVars: pr.CustomVars,
VisitsCount: pr.VisitsCount,
ViewTime: pr.ViewTime,
VisitorFirstVisitTime: pr.VisitorFirstVisitTime,
CampaignName: pr.CampaignName,
CampaignKeyword: pr.CampaignKeyword,
Resolution: pr.Resolution,
LocalHour: pr.LocalHour,
LocalMinute: pr.LocalMinute,
LocalSeconds: pr.LocalSeconds,
LocalTimeUTC: pr.LocalTimeUTC,
Plugins: pr.Plugins,
SupportsCookies: pr.SupportsCookies,
UserAgent: pr.UserAgent,
Language: pr.Language,
UserID: pr.UserID,
CustomUserID: pr.CustomUserID,
NewVisit: pr.NewVisit,
PageCustomVars: pr.PageCustomVars,
Link: pr.Link,
Download: pr.Download,
Search: pr.Search,
SearchCategory: pr.SearchCategory,
SearchCount: pr.SearchCount,
PageViewID: pr.PageViewID,
GoalID: pr.GoalID,
Revenue: pr.Revenue,
GenerationTime: pr.GenerationTime,
Characterset: pr.Characterset,
EventCategory: pr.EventCategory,
EventAction: pr.EventAction,
EventName: pr.EventName,
EventValue: pr.EventValue,
ContentName: pr.ContentName,
ContentPiece: pr.ContentPiece,
ContentTarget: pr.ContentTarget,
ContentInteraction: pr.ContentInteraction,
ECommerceID: pr.ECommerceID,
ECommerceItems: pr.ECommerceItems,
ECommerceSubTotal: pr.ECommerceSubTotal,
ECommerceTax: pr.ECommerceTax,
ECommerceShipping: pr.ECommerceShipping,
ECommerceDiscount: pr.ECommerceDiscount,
ECommerceTime: pr.ECommerceTime,
TokenAuth: pr.TokenAuth,
CustomIP: pr.CustomIP,
CustomDateTime: pr.CustomDateTime,
CustomCountry: pr.CustomCountry,
CustomRegion: pr.CustomRegion,
CustomCity: pr.CustomCity,
CustomLatitude: pr.CustomLatitude,
CustomLongitude: pr.CustomLongitude,
MediaID: pr.MediaID,
MediaTitle: pr.MediaTitle,
MediaResource: pr.MediaResource,
MediaType: pr.MediaType,
MediaPlayerName: pr.MediaPlayerName,
MediaSecondsPlayingTime: pr.MediaSecondsPlayingTime,
MediaLength: pr.MediaLength,
MediaProgress: pr.MediaProgress,
MediaTimeUntilPlay: pr.MediaTimeUntilPlay,
MediaWidth: pr.MediaWidth,
MediaHeight: pr.MediaHeight,
MediaFullscreen: pr.MediaFullscreen,
}
if e := h.visitStorage.Add(v); e != nil {
log.Println(e)
}
if pr.SendImage == "0" {
w.WriteHeader(204)
}
json.NewEncoder(os.Stdout).Encode(v)
}