diff --git a/routes/api/diagnostics.go b/routes/api/diagnostics.go index 7ba37a7..e63be87 100644 --- a/routes/api/diagnostics.go +++ b/routes/api/diagnostics.go @@ -2,12 +2,13 @@ package api import ( "encoding/json" + "net/http" + "github.com/gorilla/mux" conf "github.com/muety/wakapi/config" "github.com/muety/wakapi/middlewares" "github.com/muety/wakapi/services" "github.com/muety/wakapi/utils" - "net/http" "github.com/muety/wakapi/models" ) @@ -41,7 +42,7 @@ func (h *DiagnosticsApiHandler) RegisterRoutes(router *mux.Router) { // @Param diagnostics body models.Diagnostics true "A single diagnostics object sent by WakaTime CLI" // @Security ApiKeyAuth // @Success 201 -// @Router /api/plugins/errors [post] +// @Router /plugins/errors [post] func (h *DiagnosticsApiHandler) Post(w http.ResponseWriter, r *http.Request) { var diagnostics models.Diagnostics diff --git a/routes/api/health.go b/routes/api/health.go index 58d061e..cc28724 100644 --- a/routes/api/health.go +++ b/routes/api/health.go @@ -2,9 +2,10 @@ package api import ( "fmt" + "net/http" + "github.com/gorilla/mux" "gorm.io/gorm" - "net/http" ) type HealthApiHandler struct { @@ -25,7 +26,7 @@ func (h *HealthApiHandler) RegisterRoutes(router *mux.Router) { // @Tags misc // @Produce plain // @Success 200 {string} string -// @Router /api/health [get] +// @Router /health [get] func (h *HealthApiHandler) Get(w http.ResponseWriter, r *http.Request) { var dbStatus int if sqlDb, err := h.db.DB(); err == nil { diff --git a/routes/api/heartbeat.go b/routes/api/heartbeat.go index f0e387b..71aa0c8 100644 --- a/routes/api/heartbeat.go +++ b/routes/api/heartbeat.go @@ -3,6 +3,9 @@ package api import ( "bytes" "encoding/json" + "io/ioutil" + "net/http" + "github.com/gorilla/mux" conf "github.com/muety/wakapi/config" "github.com/muety/wakapi/middlewares" @@ -10,8 +13,6 @@ import ( routeutils "github.com/muety/wakapi/routes/utils" "github.com/muety/wakapi/services" "github.com/muety/wakapi/utils" - "io/ioutil" - "net/http" "github.com/muety/wakapi/models" ) @@ -60,7 +61,7 @@ func (h *HeartbeatApiHandler) RegisterRoutes(router *mux.Router) { // @Param heartbeat body models.Heartbeat true "A single heartbeat" // @Security ApiKeyAuth // @Success 201 -// @Router /api/heartbeat [post] +// @Router /heartbeat [post] func (h *HeartbeatApiHandler) Post(w http.ResponseWriter, r *http.Request) { user, err := routeutils.CheckEffectiveUser(w, r, h.userSrvc, "current") if err != nil { @@ -182,7 +183,7 @@ func constructSuccessResponse(n int) *heartbeatResponseVm { // @Param heartbeat body models.Heartbeat true "A single heartbeat" // @Security ApiKeyAuth // @Success 201 -// @Router /api/v1/users/{user}/heartbeats [post] +// @Router /v1/users/{user}/heartbeats [post] func (h *HeartbeatApiHandler) postAlias1() {} // @Summary Push a new heartbeat @@ -192,7 +193,7 @@ func (h *HeartbeatApiHandler) postAlias1() {} // @Param heartbeat body models.Heartbeat true "A single heartbeat" // @Security ApiKeyAuth // @Success 201 -// @Router /api/compat/wakatime/v1/users/{user}/heartbeats [post] +// @Router /compat/wakatime/v1/users/{user}/heartbeats [post] func (h *HeartbeatApiHandler) postAlias2() {} // @Summary Push a new heartbeat @@ -202,7 +203,7 @@ func (h *HeartbeatApiHandler) postAlias2() {} // @Param heartbeat body models.Heartbeat true "A single heartbeat" // @Security ApiKeyAuth // @Success 201 -// @Router /api/users/{user}/heartbeats [post] +// @Router /users/{user}/heartbeats [post] func (h *HeartbeatApiHandler) postAlias3() {} // @Summary Push new heartbeats @@ -212,7 +213,7 @@ func (h *HeartbeatApiHandler) postAlias3() {} // @Param heartbeat body []models.Heartbeat true "Multiple heartbeats" // @Security ApiKeyAuth // @Success 201 -// @Router /api/heartbeats [post] +// @Router /heartbeats [post] func (h *HeartbeatApiHandler) postAlias4() {} // @Summary Push new heartbeats @@ -222,7 +223,7 @@ func (h *HeartbeatApiHandler) postAlias4() {} // @Param heartbeat body []models.Heartbeat true "Multiple heartbeats" // @Security ApiKeyAuth // @Success 201 -// @Router /api/v1/users/{user}/heartbeats.bulk [post] +// @Router /v1/users/{user}/heartbeats.bulk [post] func (h *HeartbeatApiHandler) postAlias5() {} // @Summary Push new heartbeats @@ -232,7 +233,7 @@ func (h *HeartbeatApiHandler) postAlias5() {} // @Param heartbeat body []models.Heartbeat true "Multiple heartbeats" // @Security ApiKeyAuth // @Success 201 -// @Router /api/compat/wakatime/v1/users/{user}/heartbeats.bulk [post] +// @Router /compat/wakatime/v1/users/{user}/heartbeats.bulk [post] func (h *HeartbeatApiHandler) postAlias6() {} // @Summary Push new heartbeats @@ -242,5 +243,5 @@ func (h *HeartbeatApiHandler) postAlias6() {} // @Param heartbeat body []models.Heartbeat true "Multiple heartbeats" // @Security ApiKeyAuth // @Success 201 -// @Router /api/users/{user}/heartbeats.bulk [post] +// @Router /users/{user}/heartbeats.bulk [post] func (h *HeartbeatApiHandler) postAlias7() {} diff --git a/routes/api/summary.go b/routes/api/summary.go index 5494c96..47d2131 100644 --- a/routes/api/summary.go +++ b/routes/api/summary.go @@ -1,13 +1,14 @@ package api import ( + "net/http" + "github.com/gorilla/mux" conf "github.com/muety/wakapi/config" "github.com/muety/wakapi/middlewares" su "github.com/muety/wakapi/routes/utils" "github.com/muety/wakapi/services" "github.com/muety/wakapi/utils" - "net/http" ) type SummaryApiHandler struct { @@ -42,7 +43,7 @@ func (h *SummaryApiHandler) RegisterRoutes(router *mux.Router) { // @Param recompute query bool false "Whether to recompute the summary from raw heartbeat or use cache" // @Security ApiKeyAuth // @Success 200 {object} models.Summary -// @Router /api/summary [get] +// @Router /summary [get] func (h *SummaryApiHandler) Get(w http.ResponseWriter, r *http.Request) { summary, err, status := su.LoadUserSummary(h.summarySrvc, r) if err != nil { diff --git a/routes/compat/shields/v1/badge.go b/routes/compat/shields/v1/badge.go index 5f8a127..91db649 100644 --- a/routes/compat/shields/v1/badge.go +++ b/routes/compat/shields/v1/badge.go @@ -2,6 +2,10 @@ package v1 import ( "fmt" + "net/http" + "regexp" + "time" + "github.com/gorilla/mux" conf "github.com/muety/wakapi/config" "github.com/muety/wakapi/models" @@ -9,9 +13,6 @@ import ( "github.com/muety/wakapi/services" "github.com/muety/wakapi/utils" "github.com/patrickmn/go-cache" - "net/http" - "regexp" - "time" ) const ( @@ -50,7 +51,7 @@ func (h *BadgeHandler) RegisterRoutes(router *mux.Router) { // @Param interval path string true "Interval to aggregate data for" Enums(today, yesterday, week, month, year, 7_days, last_7_days, 30_days, last_30_days, 12_months, last_12_months, any) // @Param filter path string true "Filter to apply (e.g. 'project:wakapi' or 'language:Go')" // @Success 200 {object} v1.BadgeData -// @Router /api/compat/shields/v1/{user}/{interval}/{filter} [get] +// @Router /compat/shields/v1/{user}/{interval}/{filter} [get] func (h *BadgeHandler) Get(w http.ResponseWriter, r *http.Request) { intervalReg := regexp.MustCompile(intervalPattern) entityFilterReg := regexp.MustCompile(entityFilterPattern) diff --git a/routes/compat/wakatime/v1/all_time.go b/routes/compat/wakatime/v1/all_time.go index 618e3a9..81b0614 100644 --- a/routes/compat/wakatime/v1/all_time.go +++ b/routes/compat/wakatime/v1/all_time.go @@ -1,6 +1,10 @@ package v1 import ( + "net/http" + "net/url" + "time" + "github.com/gorilla/mux" conf "github.com/muety/wakapi/config" "github.com/muety/wakapi/middlewares" @@ -9,9 +13,6 @@ import ( routeutils "github.com/muety/wakapi/routes/utils" "github.com/muety/wakapi/services" "github.com/muety/wakapi/utils" - "net/http" - "net/url" - "time" ) type AllTimeHandler struct { @@ -44,7 +45,7 @@ func (h *AllTimeHandler) RegisterRoutes(router *mux.Router) { // @Param user path string true "User ID to fetch data for (or 'current')" // @Security ApiKeyAuth // @Success 200 {object} v1.AllTimeViewModel -// @Router /api/compat/wakatime/v1/users/{user}/all_time_since_today [get] +// @Router /compat/wakatime/v1/users/{user}/all_time_since_today [get] func (h *AllTimeHandler) Get(w http.ResponseWriter, r *http.Request) { values, _ := url.ParseQuery(r.URL.RawQuery) diff --git a/routes/compat/wakatime/v1/projects.go b/routes/compat/wakatime/v1/projects.go index 5ecc86f..5e2ebb6 100644 --- a/routes/compat/wakatime/v1/projects.go +++ b/routes/compat/wakatime/v1/projects.go @@ -1,6 +1,9 @@ package v1 import ( + "net/http" + "strings" + "github.com/gorilla/mux" conf "github.com/muety/wakapi/config" "github.com/muety/wakapi/middlewares" @@ -9,8 +12,6 @@ import ( routeutils "github.com/muety/wakapi/routes/utils" "github.com/muety/wakapi/services" "github.com/muety/wakapi/utils" - "net/http" - "strings" ) type ProjectsHandler struct { @@ -44,7 +45,7 @@ func (h *ProjectsHandler) RegisterRoutes(router *mux.Router) { // @Param q query string true "Query to filter projects by" // @Security ApiKeyAuth // @Success 200 {object} v1.ProjectsViewModel -// @Router /api/compat/wakatime/v1/users/{user}/projects [get] +// @Router /compat/wakatime/v1/users/{user}/projects [get] func (h *ProjectsHandler) Get(w http.ResponseWriter, r *http.Request) { user, err := routeutils.CheckEffectiveUser(w, r, h.userSrvc, "current") if err != nil { diff --git a/routes/compat/wakatime/v1/stats.go b/routes/compat/wakatime/v1/stats.go index da1675c..72292c5 100644 --- a/routes/compat/wakatime/v1/stats.go +++ b/routes/compat/wakatime/v1/stats.go @@ -1,6 +1,9 @@ package v1 import ( + "net/http" + "time" + "github.com/gorilla/mux" conf "github.com/muety/wakapi/config" "github.com/muety/wakapi/middlewares" @@ -8,8 +11,6 @@ import ( v1 "github.com/muety/wakapi/models/compat/wakatime/v1" "github.com/muety/wakapi/services" "github.com/muety/wakapi/utils" - "net/http" - "time" ) type StatsHandler struct { @@ -50,7 +51,7 @@ func (h *StatsHandler) RegisterRoutes(router *mux.Router) { // @Param range path string false "Range interval identifier" Enums(today, yesterday, week, month, year, 7_days, last_7_days, 30_days, last_30_days, 12_months, last_12_months, any) // @Security ApiKeyAuth // @Success 200 {object} v1.StatsViewModel -// @Router /api/compat/wakatime/v1/users/{user}/stats/{range} [get] +// @Router /compat/wakatime/v1/users/{user}/stats/{range} [get] func (h *StatsHandler) Get(w http.ResponseWriter, r *http.Request) { var vars = mux.Vars(r) var authorizedUser, requestedUser *models.User diff --git a/routes/compat/wakatime/v1/statusbar.go b/routes/compat/wakatime/v1/statusbar.go index 8208f23..3facac1 100644 --- a/routes/compat/wakatime/v1/statusbar.go +++ b/routes/compat/wakatime/v1/statusbar.go @@ -52,7 +52,7 @@ func (h *StatusBarHandler) RegisterRoutes(router *mux.Router) { // @Param user path string true "User ID to fetch data for (or 'current')" // @Security ApiKeyAuth // @Success 200 {object} StatusBarViewModel -// @Router /api/users/{user}/statusbar/today [get] +// @Router /users/{user}/statusbar/today [get] func (h *StatusBarHandler) Get(w http.ResponseWriter, r *http.Request) { user, err := routeutils.CheckEffectiveUser(w, r, h.userSrvc, "current") if err != nil { diff --git a/routes/compat/wakatime/v1/summaries.go b/routes/compat/wakatime/v1/summaries.go index c839e48..c0d26b0 100644 --- a/routes/compat/wakatime/v1/summaries.go +++ b/routes/compat/wakatime/v1/summaries.go @@ -2,6 +2,10 @@ package v1 import ( "errors" + "net/http" + "strings" + "time" + "github.com/gorilla/mux" conf "github.com/muety/wakapi/config" "github.com/muety/wakapi/middlewares" @@ -10,9 +14,6 @@ import ( routeutils "github.com/muety/wakapi/routes/utils" "github.com/muety/wakapi/services" "github.com/muety/wakapi/utils" - "net/http" - "strings" - "time" ) type SummariesHandler struct { @@ -53,7 +54,7 @@ func (h *SummariesHandler) RegisterRoutes(router *mux.Router) { // @Param end query string false "End date (e.g. '2021-02-08')" // @Security ApiKeyAuth // @Success 200 {object} v1.SummariesViewModel -// @Router /api/compat/wakatime/v1/users/{user}/summaries [get] +// @Router /compat/wakatime/v1/users/{user}/summaries [get] func (h *SummariesHandler) Get(w http.ResponseWriter, r *http.Request) { _, err := routeutils.CheckEffectiveUser(w, r, h.userSrvc, "current") if err != nil { diff --git a/routes/compat/wakatime/v1/users.go b/routes/compat/wakatime/v1/users.go index a461302..72601bc 100644 --- a/routes/compat/wakatime/v1/users.go +++ b/routes/compat/wakatime/v1/users.go @@ -1,6 +1,8 @@ package v1 import ( + "net/http" + "github.com/gorilla/mux" conf "github.com/muety/wakapi/config" "github.com/muety/wakapi/middlewares" @@ -8,7 +10,6 @@ import ( routeutils "github.com/muety/wakapi/routes/utils" "github.com/muety/wakapi/services" "github.com/muety/wakapi/utils" - "net/http" ) type UsersHandler struct { @@ -41,7 +42,7 @@ func (h *UsersHandler) RegisterRoutes(router *mux.Router) { // @Param user path string true "User ID to fetch (or 'current')" // @Security ApiKeyAuth // @Success 200 {object} v1.UserViewModel -// @Router /api/compat/wakatime/v1/users/{user} [get] +// @Router /compat/wakatime/v1/users/{user} [get] func (h *UsersHandler) Get(w http.ResponseWriter, r *http.Request) { wakapiUser, err := routeutils.CheckEffectiveUser(w, r, h.userSrvc, "current") if err != nil { diff --git a/static/docs/docs.go b/static/docs/docs.go index 5b96fbc..2d33ec3 100644 --- a/static/docs/docs.go +++ b/static/docs/docs.go @@ -1,14 +1,13 @@ -// GENERATED BY THE COMMAND ABOVE; DO NOT EDIT +// Package docs GENERATED BY THE COMMAND ABOVE; DO NOT EDIT // This file was generated by swaggo/swag - package docs import ( "bytes" "encoding/json" "strings" + "text/template" - "github.com/alecthomas/template" "github.com/swaggo/swag" ) @@ -16,7 +15,7 @@ var doc = `{ "schemes": {{ marshal .Schemes }}, "swagger": "2.0", "info": { - "description": "{{.Description}}", + "description": "{{escape .Description}}", "title": "{{.Title}}", "contact": { "name": "Ferdinand Mütsch", @@ -32,7 +31,7 @@ var doc = `{ "host": "{{.Host}}", "basePath": "{{.BasePath}}", "paths": { - "/api/compat/shields/v1/{user}/{interval}/{filter}": { + "/compat/shields/v1/{user}/{interval}/{filter}": { "get": { "description": "Retrieve total time for a given entity (e.g. a project) within a given range (e.g. one week) in a format compatible with [Shields.io](https://shields.io/endpoint). Requires public data access to be allowed.", "produces": [ @@ -90,7 +89,7 @@ var doc = `{ } } }, - "/api/compat/wakatime/v1/users/{user}": { + "/compat/wakatime/v1/users/{user}": { "get": { "security": [ { @@ -125,7 +124,7 @@ var doc = `{ } } }, - "/api/compat/wakatime/v1/users/{user}/all_time_since_today": { + "/compat/wakatime/v1/users/{user}/all_time_since_today": { "get": { "security": [ { @@ -160,7 +159,7 @@ var doc = `{ } } }, - "/api/compat/wakatime/v1/users/{user}/heartbeats": { + "/compat/wakatime/v1/users/{user}/heartbeats": { "post": { "security": [ { @@ -193,7 +192,7 @@ var doc = `{ } } }, - "/api/compat/wakatime/v1/users/{user}/heartbeats.bulk": { + "/compat/wakatime/v1/users/{user}/heartbeats.bulk": { "post": { "security": [ { @@ -229,7 +228,7 @@ var doc = `{ } } }, - "/api/compat/wakatime/v1/users/{user}/projects": { + "/compat/wakatime/v1/users/{user}/projects": { "get": { "security": [ { @@ -271,7 +270,7 @@ var doc = `{ } } }, - "/api/compat/wakatime/v1/users/{user}/stats/{range}": { + "/compat/wakatime/v1/users/{user}/stats/{range}": { "get": { "security": [ { @@ -326,7 +325,7 @@ var doc = `{ } } }, - "/api/compat/wakatime/v1/users/{user}/summaries": { + "/compat/wakatime/v1/users/{user}/summaries": { "get": { "security": [ { @@ -393,7 +392,7 @@ var doc = `{ } } }, - "/api/health": { + "/health": { "get": { "produces": [ "text/plain" @@ -413,7 +412,7 @@ var doc = `{ } } }, - "/api/heartbeat": { + "/heartbeat": { "post": { "security": [ { @@ -446,7 +445,7 @@ var doc = `{ } } }, - "/api/heartbeats": { + "/heartbeats": { "post": { "security": [ { @@ -482,7 +481,7 @@ var doc = `{ } } }, - "/api/plugins/errors": { + "/plugins/errors": { "post": { "security": [ { @@ -515,244 +514,6 @@ var doc = `{ } } }, - "/api/summary": { - "get": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "produces": [ - "application/json" - ], - "tags": [ - "summary" - ], - "summary": "Retrieve a summary", - "operationId": "get-summary", - "parameters": [ - { - "enum": [ - "today", - "yesterday", - "week", - "month", - "year", - "7_days", - "last_7_days", - "30_days", - "last_30_days", - "12_months", - "last_12_months", - "any" - ], - "type": "string", - "description": "Interval identifier", - "name": "interval", - "in": "query" - }, - { - "type": "string", - "description": "Start date (e.g. '2021-02-07')", - "name": "from", - "in": "query" - }, - { - "type": "string", - "description": "End date (e.g. '2021-02-08')", - "name": "to", - "in": "query" - }, - { - "type": "boolean", - "description": "Whether to recompute the summary from raw heartbeat or use cache", - "name": "recompute", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Summary" - } - } - } - } - }, - "/api/users/{user}/heartbeats": { - "post": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "consumes": [ - "application/json" - ], - "tags": [ - "heartbeat" - ], - "summary": "Push a new heartbeat", - "operationId": "post-heartbeat-4", - "parameters": [ - { - "description": "A single heartbeat", - "name": "heartbeat", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.Heartbeat" - } - } - ], - "responses": { - "201": { - "description": "" - } - } - } - }, - "/api/users/{user}/heartbeats.bulk": { - "post": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "consumes": [ - "application/json" - ], - "tags": [ - "heartbeat" - ], - "summary": "Push new heartbeats", - "operationId": "post-heartbeat-8", - "parameters": [ - { - "description": "Multiple heartbeats", - "name": "heartbeat", - "in": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Heartbeat" - } - } - } - ], - "responses": { - "201": { - "description": "" - } - } - } - }, - "/api/users/{user}/statusbar/today": { - "get": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "description": "Mimics https://wakatime.com/api/v1/users/current/statusbar/today. Have no official documentation", - "produces": [ - "application/json" - ], - "tags": [ - "wakatime" - ], - "summary": "Retrieve summary for statusbar", - "operationId": "statusbar", - "parameters": [ - { - "type": "string", - "description": "User ID to fetch data for (or 'current')", - "name": "user", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/v1.StatusBarViewModel" - } - } - } - } - }, - "/api/v1/users/{user}/heartbeats": { - "post": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "consumes": [ - "application/json" - ], - "tags": [ - "heartbeat" - ], - "summary": "Push a new heartbeat", - "operationId": "post-heartbeat-2", - "parameters": [ - { - "description": "A single heartbeat", - "name": "heartbeat", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.Heartbeat" - } - } - ], - "responses": { - "201": { - "description": "" - } - } - } - }, - "/api/v1/users/{user}/heartbeats.bulk": { - "post": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "consumes": [ - "application/json" - ], - "tags": [ - "heartbeat" - ], - "summary": "Push new heartbeats", - "operationId": "post-heartbeat-6", - "parameters": [ - { - "description": "Multiple heartbeats", - "name": "heartbeat", - "in": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Heartbeat" - } - } - } - ], - "responses": { - "201": { - "description": "" - } - } - } - }, "/relay": { "get": { "tags": [ @@ -904,6 +665,244 @@ var doc = `{ } } } + }, + "/summary": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "summary" + ], + "summary": "Retrieve a summary", + "operationId": "get-summary", + "parameters": [ + { + "enum": [ + "today", + "yesterday", + "week", + "month", + "year", + "7_days", + "last_7_days", + "30_days", + "last_30_days", + "12_months", + "last_12_months", + "any" + ], + "type": "string", + "description": "Interval identifier", + "name": "interval", + "in": "query" + }, + { + "type": "string", + "description": "Start date (e.g. '2021-02-07')", + "name": "from", + "in": "query" + }, + { + "type": "string", + "description": "End date (e.g. '2021-02-08')", + "name": "to", + "in": "query" + }, + { + "type": "boolean", + "description": "Whether to recompute the summary from raw heartbeat or use cache", + "name": "recompute", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Summary" + } + } + } + } + }, + "/users/{user}/heartbeats": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "tags": [ + "heartbeat" + ], + "summary": "Push a new heartbeat", + "operationId": "post-heartbeat-4", + "parameters": [ + { + "description": "A single heartbeat", + "name": "heartbeat", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.Heartbeat" + } + } + ], + "responses": { + "201": { + "description": "" + } + } + } + }, + "/users/{user}/heartbeats.bulk": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "tags": [ + "heartbeat" + ], + "summary": "Push new heartbeats", + "operationId": "post-heartbeat-8", + "parameters": [ + { + "description": "Multiple heartbeats", + "name": "heartbeat", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Heartbeat" + } + } + } + ], + "responses": { + "201": { + "description": "" + } + } + } + }, + "/users/{user}/statusbar/today": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Mimics https://wakatime.com/api/v1/users/current/statusbar/today. Have no official documentation", + "produces": [ + "application/json" + ], + "tags": [ + "wakatime" + ], + "summary": "Retrieve summary for statusbar", + "operationId": "statusbar", + "parameters": [ + { + "type": "string", + "description": "User ID to fetch data for (or 'current')", + "name": "user", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.StatusBarViewModel" + } + } + } + } + }, + "/v1/users/{user}/heartbeats": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "tags": [ + "heartbeat" + ], + "summary": "Push a new heartbeat", + "operationId": "post-heartbeat-2", + "parameters": [ + { + "description": "A single heartbeat", + "name": "heartbeat", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.Heartbeat" + } + } + ], + "responses": { + "201": { + "description": "" + } + } + } + }, + "/v1/users/{user}/heartbeats.bulk": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "tags": [ + "heartbeat" + ], + "summary": "Push new heartbeats", + "operationId": "post-heartbeat-6", + "parameters": [ + { + "description": "Multiple heartbeats", + "name": "heartbeat", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Heartbeat" + } + } + } + ], + "responses": { + "201": { + "description": "" + } + } + } } }, "definitions": { @@ -1449,6 +1448,13 @@ func (s *s) ReadDoc() string { a, _ := json.Marshal(v) return string(a) }, + "escape": func(v interface{}) string { + // escape tabs + str := strings.Replace(v.(string), "\t", "\\t", -1) + // replace " with \", and if that results in \\", replace that with \\\" + str = strings.Replace(str, "\"", "\\\"", -1) + return strings.Replace(str, "\\\\\"", "\\\\\\\"", -1) + }, }).Parse(doc) if err != nil { return doc @@ -1463,5 +1469,5 @@ func (s *s) ReadDoc() string { } func init() { - swag.Register(swag.Name, &s{}) + swag.Register("swagger", &s{}) } diff --git a/static/docs/swagger.json b/static/docs/swagger.json index 6571d81..a91d191 100644 --- a/static/docs/swagger.json +++ b/static/docs/swagger.json @@ -16,7 +16,7 @@ }, "basePath": "/api", "paths": { - "/api/compat/shields/v1/{user}/{interval}/{filter}": { + "/compat/shields/v1/{user}/{interval}/{filter}": { "get": { "description": "Retrieve total time for a given entity (e.g. a project) within a given range (e.g. one week) in a format compatible with [Shields.io](https://shields.io/endpoint). Requires public data access to be allowed.", "produces": [ @@ -74,7 +74,7 @@ } } }, - "/api/compat/wakatime/v1/users/{user}": { + "/compat/wakatime/v1/users/{user}": { "get": { "security": [ { @@ -109,7 +109,7 @@ } } }, - "/api/compat/wakatime/v1/users/{user}/all_time_since_today": { + "/compat/wakatime/v1/users/{user}/all_time_since_today": { "get": { "security": [ { @@ -144,7 +144,7 @@ } } }, - "/api/compat/wakatime/v1/users/{user}/heartbeats": { + "/compat/wakatime/v1/users/{user}/heartbeats": { "post": { "security": [ { @@ -177,7 +177,7 @@ } } }, - "/api/compat/wakatime/v1/users/{user}/heartbeats.bulk": { + "/compat/wakatime/v1/users/{user}/heartbeats.bulk": { "post": { "security": [ { @@ -213,7 +213,7 @@ } } }, - "/api/compat/wakatime/v1/users/{user}/projects": { + "/compat/wakatime/v1/users/{user}/projects": { "get": { "security": [ { @@ -255,7 +255,7 @@ } } }, - "/api/compat/wakatime/v1/users/{user}/stats/{range}": { + "/compat/wakatime/v1/users/{user}/stats/{range}": { "get": { "security": [ { @@ -310,7 +310,7 @@ } } }, - "/api/compat/wakatime/v1/users/{user}/summaries": { + "/compat/wakatime/v1/users/{user}/summaries": { "get": { "security": [ { @@ -377,7 +377,7 @@ } } }, - "/api/health": { + "/health": { "get": { "produces": [ "text/plain" @@ -397,7 +397,7 @@ } } }, - "/api/heartbeat": { + "/heartbeat": { "post": { "security": [ { @@ -430,7 +430,7 @@ } } }, - "/api/heartbeats": { + "/heartbeats": { "post": { "security": [ { @@ -466,7 +466,7 @@ } } }, - "/api/plugins/errors": { + "/plugins/errors": { "post": { "security": [ { @@ -499,244 +499,6 @@ } } }, - "/api/summary": { - "get": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "produces": [ - "application/json" - ], - "tags": [ - "summary" - ], - "summary": "Retrieve a summary", - "operationId": "get-summary", - "parameters": [ - { - "enum": [ - "today", - "yesterday", - "week", - "month", - "year", - "7_days", - "last_7_days", - "30_days", - "last_30_days", - "12_months", - "last_12_months", - "any" - ], - "type": "string", - "description": "Interval identifier", - "name": "interval", - "in": "query" - }, - { - "type": "string", - "description": "Start date (e.g. '2021-02-07')", - "name": "from", - "in": "query" - }, - { - "type": "string", - "description": "End date (e.g. '2021-02-08')", - "name": "to", - "in": "query" - }, - { - "type": "boolean", - "description": "Whether to recompute the summary from raw heartbeat or use cache", - "name": "recompute", - "in": "query" - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/models.Summary" - } - } - } - } - }, - "/api/users/{user}/heartbeats": { - "post": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "consumes": [ - "application/json" - ], - "tags": [ - "heartbeat" - ], - "summary": "Push a new heartbeat", - "operationId": "post-heartbeat-4", - "parameters": [ - { - "description": "A single heartbeat", - "name": "heartbeat", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.Heartbeat" - } - } - ], - "responses": { - "201": { - "description": "" - } - } - } - }, - "/api/users/{user}/heartbeats.bulk": { - "post": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "consumes": [ - "application/json" - ], - "tags": [ - "heartbeat" - ], - "summary": "Push new heartbeats", - "operationId": "post-heartbeat-8", - "parameters": [ - { - "description": "Multiple heartbeats", - "name": "heartbeat", - "in": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Heartbeat" - } - } - } - ], - "responses": { - "201": { - "description": "" - } - } - } - }, - "/api/users/{user}/statusbar/today": { - "get": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "description": "Mimics https://wakatime.com/api/v1/users/current/statusbar/today. Have no official documentation", - "produces": [ - "application/json" - ], - "tags": [ - "wakatime" - ], - "summary": "Retrieve summary for statusbar", - "operationId": "statusbar", - "parameters": [ - { - "type": "string", - "description": "User ID to fetch data for (or 'current')", - "name": "user", - "in": "path", - "required": true - } - ], - "responses": { - "200": { - "description": "OK", - "schema": { - "$ref": "#/definitions/v1.StatusBarViewModel" - } - } - } - } - }, - "/api/v1/users/{user}/heartbeats": { - "post": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "consumes": [ - "application/json" - ], - "tags": [ - "heartbeat" - ], - "summary": "Push a new heartbeat", - "operationId": "post-heartbeat-2", - "parameters": [ - { - "description": "A single heartbeat", - "name": "heartbeat", - "in": "body", - "required": true, - "schema": { - "$ref": "#/definitions/models.Heartbeat" - } - } - ], - "responses": { - "201": { - "description": "" - } - } - } - }, - "/api/v1/users/{user}/heartbeats.bulk": { - "post": { - "security": [ - { - "ApiKeyAuth": [] - } - ], - "consumes": [ - "application/json" - ], - "tags": [ - "heartbeat" - ], - "summary": "Push new heartbeats", - "operationId": "post-heartbeat-6", - "parameters": [ - { - "description": "Multiple heartbeats", - "name": "heartbeat", - "in": "body", - "required": true, - "schema": { - "type": "array", - "items": { - "$ref": "#/definitions/models.Heartbeat" - } - } - } - ], - "responses": { - "201": { - "description": "" - } - } - } - }, "/relay": { "get": { "tags": [ @@ -888,6 +650,244 @@ } } } + }, + "/summary": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "produces": [ + "application/json" + ], + "tags": [ + "summary" + ], + "summary": "Retrieve a summary", + "operationId": "get-summary", + "parameters": [ + { + "enum": [ + "today", + "yesterday", + "week", + "month", + "year", + "7_days", + "last_7_days", + "30_days", + "last_30_days", + "12_months", + "last_12_months", + "any" + ], + "type": "string", + "description": "Interval identifier", + "name": "interval", + "in": "query" + }, + { + "type": "string", + "description": "Start date (e.g. '2021-02-07')", + "name": "from", + "in": "query" + }, + { + "type": "string", + "description": "End date (e.g. '2021-02-08')", + "name": "to", + "in": "query" + }, + { + "type": "boolean", + "description": "Whether to recompute the summary from raw heartbeat or use cache", + "name": "recompute", + "in": "query" + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/models.Summary" + } + } + } + } + }, + "/users/{user}/heartbeats": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "tags": [ + "heartbeat" + ], + "summary": "Push a new heartbeat", + "operationId": "post-heartbeat-4", + "parameters": [ + { + "description": "A single heartbeat", + "name": "heartbeat", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.Heartbeat" + } + } + ], + "responses": { + "201": { + "description": "" + } + } + } + }, + "/users/{user}/heartbeats.bulk": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "tags": [ + "heartbeat" + ], + "summary": "Push new heartbeats", + "operationId": "post-heartbeat-8", + "parameters": [ + { + "description": "Multiple heartbeats", + "name": "heartbeat", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Heartbeat" + } + } + } + ], + "responses": { + "201": { + "description": "" + } + } + } + }, + "/users/{user}/statusbar/today": { + "get": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "description": "Mimics https://wakatime.com/api/v1/users/current/statusbar/today. Have no official documentation", + "produces": [ + "application/json" + ], + "tags": [ + "wakatime" + ], + "summary": "Retrieve summary for statusbar", + "operationId": "statusbar", + "parameters": [ + { + "type": "string", + "description": "User ID to fetch data for (or 'current')", + "name": "user", + "in": "path", + "required": true + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/v1.StatusBarViewModel" + } + } + } + } + }, + "/v1/users/{user}/heartbeats": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "tags": [ + "heartbeat" + ], + "summary": "Push a new heartbeat", + "operationId": "post-heartbeat-2", + "parameters": [ + { + "description": "A single heartbeat", + "name": "heartbeat", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/models.Heartbeat" + } + } + ], + "responses": { + "201": { + "description": "" + } + } + } + }, + "/v1/users/{user}/heartbeats.bulk": { + "post": { + "security": [ + { + "ApiKeyAuth": [] + } + ], + "consumes": [ + "application/json" + ], + "tags": [ + "heartbeat" + ], + "summary": "Push new heartbeats", + "operationId": "post-heartbeat-6", + "parameters": [ + { + "description": "Multiple heartbeats", + "name": "heartbeat", + "in": "body", + "required": true, + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/models.Heartbeat" + } + } + } + ], + "responses": { + "201": { + "description": "" + } + } + } } }, "definitions": { diff --git a/static/docs/swagger.yaml b/static/docs/swagger.yaml index 0fe6280..f47c0b6 100644 --- a/static/docs/swagger.yaml +++ b/static/docs/swagger.yaml @@ -351,7 +351,7 @@ info: title: Wakapi API version: "1.0" paths: - /api/compat/shields/v1/{user}/{interval}/{filter}: + /compat/shields/v1/{user}/{interval}/{filter}: get: description: Retrieve total time for a given entity (e.g. a project) within a given range (e.g. one week) in a format compatible with [Shields.io](https://shields.io/endpoint). @@ -396,7 +396,7 @@ paths: summary: Get badge data tags: - badges - /api/compat/wakatime/v1/users/{user}: + /compat/wakatime/v1/users/{user}: get: description: Mimics https://wakatime.com/developers#users operationId: get-wakatime-user @@ -418,7 +418,7 @@ paths: summary: Retrieve the given user tags: - wakatime - /api/compat/wakatime/v1/users/{user}/all_time_since_today: + /compat/wakatime/v1/users/{user}/all_time_since_today: get: description: Mimics https://wakatime.com/developers#all_time_since_today operationId: get-all-time @@ -440,7 +440,7 @@ paths: summary: Retrieve summary for all time tags: - wakatime - /api/compat/wakatime/v1/users/{user}/heartbeats: + /compat/wakatime/v1/users/{user}/heartbeats: post: consumes: - application/json @@ -460,7 +460,7 @@ paths: summary: Push a new heartbeat tags: - heartbeat - /api/compat/wakatime/v1/users/{user}/heartbeats.bulk: + /compat/wakatime/v1/users/{user}/heartbeats.bulk: post: consumes: - application/json @@ -482,7 +482,7 @@ paths: summary: Push new heartbeats tags: - heartbeat - /api/compat/wakatime/v1/users/{user}/projects: + /compat/wakatime/v1/users/{user}/projects: get: description: Mimics https://wakatime.com/developers#projects operationId: get-wakatime-projects @@ -509,7 +509,7 @@ paths: summary: Retrieve and fitler the user's projects tags: - wakatime - /api/compat/wakatime/v1/users/{user}/stats/{range}: + /compat/wakatime/v1/users/{user}/stats/{range}: get: description: Mimics https://wakatime.com/developers#stats operationId: get-wakatimes-tats @@ -548,7 +548,7 @@ paths: summary: Retrieve statistics for a given user tags: - wakatime - /api/compat/wakatime/v1/users/{user}/summaries: + /compat/wakatime/v1/users/{user}/summaries: get: description: Mimics https://wakatime.com/developers#summaries. operationId: get-wakatime-summaries @@ -595,7 +595,7 @@ paths: summary: Retrieve WakaTime-compatible summaries tags: - wakatime - /api/health: + /health: get: operationId: get-health produces: @@ -608,7 +608,7 @@ paths: summary: Check the application's health status tags: - misc - /api/heartbeat: + /heartbeat: post: consumes: - application/json @@ -628,7 +628,7 @@ paths: summary: Push a new heartbeat tags: - heartbeat - /api/heartbeats: + /heartbeats: post: consumes: - application/json @@ -650,7 +650,7 @@ paths: summary: Push new heartbeats tags: - heartbeat - /api/plugins/errors: + /plugins/errors: post: consumes: - application/json @@ -670,158 +670,6 @@ paths: summary: Push a new diagnostics object tags: - diagnostics - /api/summary: - get: - operationId: get-summary - parameters: - - description: Interval identifier - enum: - - today - - yesterday - - week - - month - - year - - 7_days - - last_7_days - - 30_days - - last_30_days - - 12_months - - last_12_months - - any - in: query - name: interval - type: string - - description: Start date (e.g. '2021-02-07') - in: query - name: from - type: string - - description: End date (e.g. '2021-02-08') - in: query - name: to - type: string - - description: Whether to recompute the summary from raw heartbeat or use cache - in: query - name: recompute - type: boolean - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/models.Summary' - security: - - ApiKeyAuth: [] - summary: Retrieve a summary - tags: - - summary - /api/users/{user}/heartbeats: - post: - consumes: - - application/json - operationId: post-heartbeat-4 - parameters: - - description: A single heartbeat - in: body - name: heartbeat - required: true - schema: - $ref: '#/definitions/models.Heartbeat' - responses: - "201": - description: "" - security: - - ApiKeyAuth: [] - summary: Push a new heartbeat - tags: - - heartbeat - /api/users/{user}/heartbeats.bulk: - post: - consumes: - - application/json - operationId: post-heartbeat-8 - parameters: - - description: Multiple heartbeats - in: body - name: heartbeat - required: true - schema: - items: - $ref: '#/definitions/models.Heartbeat' - type: array - responses: - "201": - description: "" - security: - - ApiKeyAuth: [] - summary: Push new heartbeats - tags: - - heartbeat - /api/users/{user}/statusbar/today: - get: - description: Mimics https://wakatime.com/api/v1/users/current/statusbar/today. - Have no official documentation - operationId: statusbar - parameters: - - description: User ID to fetch data for (or 'current') - in: path - name: user - required: true - type: string - produces: - - application/json - responses: - "200": - description: OK - schema: - $ref: '#/definitions/v1.StatusBarViewModel' - security: - - ApiKeyAuth: [] - summary: Retrieve summary for statusbar - tags: - - wakatime - /api/v1/users/{user}/heartbeats: - post: - consumes: - - application/json - operationId: post-heartbeat-2 - parameters: - - description: A single heartbeat - in: body - name: heartbeat - required: true - schema: - $ref: '#/definitions/models.Heartbeat' - responses: - "201": - description: "" - security: - - ApiKeyAuth: [] - summary: Push a new heartbeat - tags: - - heartbeat - /api/v1/users/{user}/heartbeats.bulk: - post: - consumes: - - application/json - operationId: post-heartbeat-6 - parameters: - - description: Multiple heartbeats - in: body - name: heartbeat - required: true - schema: - items: - $ref: '#/definitions/models.Heartbeat' - type: array - responses: - "201": - description: "" - security: - - ApiKeyAuth: [] - summary: Push new heartbeats - tags: - - heartbeat /relay: delete: operationId: relay-delete @@ -923,6 +771,158 @@ paths: summary: Proxy an PUT API request to another Wakapi instance tags: - relay + /summary: + get: + operationId: get-summary + parameters: + - description: Interval identifier + enum: + - today + - yesterday + - week + - month + - year + - 7_days + - last_7_days + - 30_days + - last_30_days + - 12_months + - last_12_months + - any + in: query + name: interval + type: string + - description: Start date (e.g. '2021-02-07') + in: query + name: from + type: string + - description: End date (e.g. '2021-02-08') + in: query + name: to + type: string + - description: Whether to recompute the summary from raw heartbeat or use cache + in: query + name: recompute + type: boolean + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/models.Summary' + security: + - ApiKeyAuth: [] + summary: Retrieve a summary + tags: + - summary + /users/{user}/heartbeats: + post: + consumes: + - application/json + operationId: post-heartbeat-4 + parameters: + - description: A single heartbeat + in: body + name: heartbeat + required: true + schema: + $ref: '#/definitions/models.Heartbeat' + responses: + "201": + description: "" + security: + - ApiKeyAuth: [] + summary: Push a new heartbeat + tags: + - heartbeat + /users/{user}/heartbeats.bulk: + post: + consumes: + - application/json + operationId: post-heartbeat-8 + parameters: + - description: Multiple heartbeats + in: body + name: heartbeat + required: true + schema: + items: + $ref: '#/definitions/models.Heartbeat' + type: array + responses: + "201": + description: "" + security: + - ApiKeyAuth: [] + summary: Push new heartbeats + tags: + - heartbeat + /users/{user}/statusbar/today: + get: + description: Mimics https://wakatime.com/api/v1/users/current/statusbar/today. + Have no official documentation + operationId: statusbar + parameters: + - description: User ID to fetch data for (or 'current') + in: path + name: user + required: true + type: string + produces: + - application/json + responses: + "200": + description: OK + schema: + $ref: '#/definitions/v1.StatusBarViewModel' + security: + - ApiKeyAuth: [] + summary: Retrieve summary for statusbar + tags: + - wakatime + /v1/users/{user}/heartbeats: + post: + consumes: + - application/json + operationId: post-heartbeat-2 + parameters: + - description: A single heartbeat + in: body + name: heartbeat + required: true + schema: + $ref: '#/definitions/models.Heartbeat' + responses: + "201": + description: "" + security: + - ApiKeyAuth: [] + summary: Push a new heartbeat + tags: + - heartbeat + /v1/users/{user}/heartbeats.bulk: + post: + consumes: + - application/json + operationId: post-heartbeat-6 + parameters: + - description: Multiple heartbeats + in: body + name: heartbeat + required: true + schema: + items: + $ref: '#/definitions/models.Heartbeat' + type: array + responses: + "201": + description: "" + security: + - ApiKeyAuth: [] + summary: Push new heartbeats + tags: + - heartbeat securityDefinitions: ApiKeyAuth: in: header