mirror of
https://github.com/muety/wakapi.git
synced 2023-08-10 21:12:56 +03:00
feat: implement wakatime users endpoint (resolve #193)
This commit is contained in:
63
routes/compat/wakatime/v1/users.go
Normal file
63
routes/compat/wakatime/v1/users.go
Normal file
@ -0,0 +1,63 @@
|
||||
package v1
|
||||
|
||||
import (
|
||||
"github.com/gorilla/mux"
|
||||
conf "github.com/muety/wakapi/config"
|
||||
"github.com/muety/wakapi/middlewares"
|
||||
v1 "github.com/muety/wakapi/models/compat/wakatime/v1"
|
||||
"github.com/muety/wakapi/services"
|
||||
"github.com/muety/wakapi/utils"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
type UsersHandler struct {
|
||||
config *conf.Config
|
||||
userSrvc services.IUserService
|
||||
heartbeatSrvc services.IHeartbeatService
|
||||
}
|
||||
|
||||
func NewUsersHandler(userService services.IUserService, heartbeatService services.IHeartbeatService) *UsersHandler {
|
||||
return &UsersHandler{
|
||||
userSrvc: userService,
|
||||
heartbeatSrvc: heartbeatService,
|
||||
config: conf.Get(),
|
||||
}
|
||||
}
|
||||
|
||||
func (h *UsersHandler) RegisterRoutes(router *mux.Router) {
|
||||
r := router.PathPrefix("/compat/wakatime/v1/users/{user}").Subrouter()
|
||||
r.Use(
|
||||
middlewares.NewAuthenticateMiddleware(h.userSrvc).Handler,
|
||||
)
|
||||
r.Methods(http.MethodGet).HandlerFunc(h.Get)
|
||||
}
|
||||
|
||||
// @Summary Retrieve the given user
|
||||
// @Description Mimics https://wakatime.com/developers#users
|
||||
// @ID get-wakatime-user
|
||||
// @Tags wakatime
|
||||
// @Produce json
|
||||
// @Param user path string true "User ID to fetch (or 'current')"
|
||||
// @Security ApiKeyAuth
|
||||
// @Success 200 {object} v1.UserViewModel
|
||||
// @Router /compat/wakatime/v1/users/{user} [get]
|
||||
func (h *UsersHandler) Get(w http.ResponseWriter, r *http.Request) {
|
||||
vars := mux.Vars(r)
|
||||
|
||||
requestedUser := vars["user"]
|
||||
authorizedUser := middlewares.GetPrincipal(r)
|
||||
|
||||
if requestedUser != authorizedUser.ID && requestedUser != "current" {
|
||||
w.WriteHeader(http.StatusForbidden)
|
||||
return
|
||||
}
|
||||
|
||||
user := v1.NewFromUser(authorizedUser)
|
||||
if hb, err := h.heartbeatSrvc.GetLatestByUser(authorizedUser); err == nil {
|
||||
user = user.WithLatestHeartbeat(hb)
|
||||
} else {
|
||||
conf.Log().Request(r).Error("%v", err)
|
||||
}
|
||||
|
||||
utils.RespondJSON(w, r, http.StatusOK, v1.UserViewModel{Data: user})
|
||||
}
|
Reference in New Issue
Block a user