mirror of
https://github.com/muety/wakapi.git
synced 2023-08-10 21:12:56 +03:00
feat: implement stats endpoint (resolve #114)
This commit is contained in:
@ -10,16 +10,16 @@ type HeartbeatsViewModel struct {
|
||||
// that is actually required for the import
|
||||
|
||||
type HeartbeatEntry struct {
|
||||
Id string
|
||||
Branch string
|
||||
Category string
|
||||
Entity string
|
||||
IsWrite bool `json:"is_write"`
|
||||
Language string
|
||||
Project string
|
||||
Time models.CustomTime
|
||||
Type string
|
||||
UserId string `json:"user_id"`
|
||||
MachineNameId string `json:"machine_name_id"`
|
||||
UserAgentId string `json:"user_agent_id"`
|
||||
Id string `json:"id"`
|
||||
Branch string `json:"branch"`
|
||||
Category string `json:"category"`
|
||||
Entity string `json:"entity"`
|
||||
IsWrite bool `json:"is_write"`
|
||||
Language string `json:"language"`
|
||||
Project string `json:"project"`
|
||||
Time models.CustomTime `json:"time"`
|
||||
Type string `json:"type"`
|
||||
UserId string `json:"user_id"`
|
||||
MachineNameId string `json:"machine_name_id"`
|
||||
UserAgentId string `json:"user_agent_id"`
|
||||
}
|
||||
|
78
models/compat/wakatime/v1/stats.go
Normal file
78
models/compat/wakatime/v1/stats.go
Normal file
@ -0,0 +1,78 @@
|
||||
package v1
|
||||
|
||||
import (
|
||||
"github.com/muety/wakapi/models"
|
||||
"time"
|
||||
)
|
||||
|
||||
// https://wakatime.com/api/v1/users/current/stats/last_7_days
|
||||
// https://pastr.de/p/f2fxg6ragj7z5e7fhsow9rb6
|
||||
|
||||
type StatsViewModel struct {
|
||||
Data *StatsData `json:"data"`
|
||||
}
|
||||
|
||||
type StatsData struct {
|
||||
Username string `json:"username"`
|
||||
UserId string `json:"user_id"`
|
||||
Start time.Time `json:"start"`
|
||||
End time.Time `json:"end"`
|
||||
TotalSeconds float64 `json:"total_seconds"`
|
||||
DailyAverage float64 `json:"daily_average"`
|
||||
DaysIncludingHolidays int `json:"days_including_holidays"`
|
||||
Editors []*SummariesEntry `json:"editors"`
|
||||
Languages []*SummariesEntry `json:"languages"`
|
||||
Machines []*SummariesEntry `json:"machines"`
|
||||
Projects []*SummariesEntry `json:"projects"`
|
||||
OperatingSystems []*SummariesEntry `json:"operating_systems"`
|
||||
}
|
||||
|
||||
func NewStatsFrom(summary *models.Summary, filters *models.Filters) *StatsViewModel {
|
||||
totalTime := summary.TotalTime()
|
||||
numDays := int(summary.ToTime.T().Sub(summary.FromTime.T()).Hours() / 24)
|
||||
|
||||
data := &StatsData{
|
||||
Username: summary.UserID,
|
||||
UserId: summary.UserID,
|
||||
Start: summary.FromTime.T(),
|
||||
End: summary.ToTime.T(),
|
||||
TotalSeconds: totalTime.Seconds(),
|
||||
DailyAverage: totalTime.Seconds() / float64(numDays),
|
||||
DaysIncludingHolidays: numDays,
|
||||
}
|
||||
|
||||
editors := make([]*SummariesEntry, len(summary.Editors))
|
||||
for i, e := range summary.Editors {
|
||||
editors[i] = convertEntry(e, summary.TotalTimeBy(models.SummaryEditor))
|
||||
}
|
||||
|
||||
languages := make([]*SummariesEntry, len(summary.Languages))
|
||||
for i, e := range summary.Languages {
|
||||
languages[i] = convertEntry(e, summary.TotalTimeBy(models.SummaryLanguage))
|
||||
}
|
||||
|
||||
machines := make([]*SummariesEntry, len(summary.Machines))
|
||||
for i, e := range summary.Machines {
|
||||
machines[i] = convertEntry(e, summary.TotalTimeBy(models.SummaryMachine))
|
||||
}
|
||||
|
||||
projects := make([]*SummariesEntry, len(summary.Projects))
|
||||
for i, e := range summary.Projects {
|
||||
projects[i] = convertEntry(e, summary.TotalTimeBy(models.SummaryProject))
|
||||
}
|
||||
|
||||
oss := make([]*SummariesEntry, len(summary.OperatingSystems))
|
||||
for i, e := range summary.OperatingSystems {
|
||||
oss[i] = convertEntry(e, summary.TotalTimeBy(models.SummaryOS))
|
||||
}
|
||||
|
||||
data.Editors = editors
|
||||
data.Languages = languages
|
||||
data.Machines = machines
|
||||
data.Projects = projects
|
||||
data.OperatingSystems = oss
|
||||
|
||||
return &StatsViewModel{
|
||||
Data: data,
|
||||
}
|
||||
}
|
@ -5,8 +5,8 @@ type UserAgentsViewModel struct {
|
||||
}
|
||||
|
||||
type UserAgentEntry struct {
|
||||
Id string
|
||||
Editor string
|
||||
Os string
|
||||
Value string
|
||||
Id string `json:"id"`
|
||||
Editor string `json:"editor"`
|
||||
Os string `json:"os"`
|
||||
Value string `json:"value"`
|
||||
}
|
||||
|
@ -16,13 +16,13 @@ const (
|
||||
|
||||
const (
|
||||
IntervalToday string = "today"
|
||||
IntervalYesterday string = "day"
|
||||
IntervalYesterday string = "yesterday"
|
||||
IntervalThisWeek string = "week"
|
||||
IntervalThisMonth string = "month"
|
||||
IntervalThisYear string = "year"
|
||||
IntervalPast7Days string = "7_days"
|
||||
IntervalPast30Days string = "30_days"
|
||||
IntervalPast12Months string = "12_months"
|
||||
IntervalPast7Days string = "last_7_days"
|
||||
IntervalPast30Days string = "last_30_days"
|
||||
IntervalPast12Months string = "last_12_months"
|
||||
IntervalAny string = "any"
|
||||
|
||||
// https://wakatime.com/developers/#summaries
|
||||
|
Reference in New Issue
Block a user