Documentation
¶
Index ¶
- Constants
- type AllByTypeInput
- type ArchinisisStatusParams
- type ArchinisisTokenHandler
- type ArchinisisTokenInput
- type CoachtechDataHandler
- type CoachtechDataParams
- type CoachtechInsertInput
- type CoachtechStatusParams
- type DataForUpdateParams
- type DeleteAllGarminParams
- type DeleteAllOuraParams
- type DeleteAllPolarParams
- type DeleteAllSuuntoParams
- type DisconnectParams
- type GarminDataHandler
- func (h *GarminDataHandler) DeleteAllData(w http.ResponseWriter, r *http.Request)
- func (h *GarminDataHandler) GetData(w http.ResponseWriter, r *http.Request)
- func (h *GarminDataHandler) GetDates(w http.ResponseWriter, r *http.Request)
- func (h *GarminDataHandler) GetTypes(w http.ResponseWriter, r *http.Request)
- func (h *GarminDataHandler) InsertData(w http.ResponseWriter, r *http.Request)
- type GarminGetDataParams
- type GarminGetDatesParams
- type GarminGetTypesParams
- type GarminPostDataInput
- type GarminStatusParams
- type GarminTokenByAccessTokenParams
- type GarminTokenHandler
- func (h *GarminTokenHandler) GetStatus(w http.ResponseWriter, r *http.Request)
- func (h *GarminTokenHandler) GetUserIDByToken(w http.ResponseWriter, r *http.Request)
- func (h *GarminTokenHandler) TokenExists(w http.ResponseWriter, r *http.Request)
- func (h *GarminTokenHandler) UpsertToken(w http.ResponseWriter, r *http.Request)
- type GarminTokenInput
- type GeneralDataHandler
- func (h *GeneralDataHandler) Disconnect(w http.ResponseWriter, r *http.Request)
- func (h *GeneralDataHandler) GetAllByType(w http.ResponseWriter, r *http.Request)
- func (h *GeneralDataHandler) GetDataForUpdate(w http.ResponseWriter, r *http.Request)
- func (h *GeneralDataHandler) GetLatestData(w http.ResponseWriter, r *http.Request)
- func (h *GeneralDataHandler) GetToken(w http.ResponseWriter, r *http.Request)
- func (h *GeneralDataHandler) GetTokensForUpdate(w http.ResponseWriter, r *http.Request)
- type GetStatusParams
- type GetTokenByOuraIDParams
- type GetTokenByPolarIDParams
- type GetTokenByUsernameParams
- type KlabStatusParams
- type KlabTokenHandler
- type KlabTokenInput
- type LatestDataInput
- type LatestDataResponse
- type OuraDataHandler
- func (h *OuraDataHandler) DeleteAllData(w http.ResponseWriter, r *http.Request)
- func (h *OuraDataHandler) GetData(w http.ResponseWriter, r *http.Request)
- func (h *OuraDataHandler) GetDates(w http.ResponseWriter, r *http.Request)
- func (h *OuraDataHandler) GetTypes(w http.ResponseWriter, r *http.Request)
- func (h *OuraDataHandler) InsertData(w http.ResponseWriter, r *http.Request)
- type OuraDeleteDataInput
- type OuraGetDataParams
- type OuraGetDatesParams
- type OuraGetTypesParams
- type OuraPostDataInput
- type OuraStatusParams
- type OuraTokenHandler
- type OuraTokenInput
- type PolarDataHandler
- func (h *PolarDataHandler) DeleteAllData(w http.ResponseWriter, r *http.Request)
- func (h *PolarDataHandler) GetData(w http.ResponseWriter, r *http.Request)
- func (h *PolarDataHandler) GetDates(w http.ResponseWriter, r *http.Request)
- func (h *PolarDataHandler) GetTypes(w http.ResponseWriter, r *http.Request)
- func (h *PolarDataHandler) InsertData(w http.ResponseWriter, r *http.Request)
- type PolarDeleteDataInput
- type PolarGetDataParams
- type PolarGetDatesParams
- type PolarGetTypesParams
- type PolarPostDataInput
- type PolarTokenHandler
- type PolarTokenInput
- type SourceCacheHandler
- type SourceParam
- type SportIDParam
- type SuuntoDataHandler
- func (h *SuuntoDataHandler) DeleteAllData(w http.ResponseWriter, r *http.Request)
- func (h *SuuntoDataHandler) GetData(w http.ResponseWriter, r *http.Request)
- func (h *SuuntoDataHandler) GetDates(w http.ResponseWriter, r *http.Request)
- func (h *SuuntoDataHandler) GetTypes(w http.ResponseWriter, r *http.Request)
- func (h *SuuntoDataHandler) InsertData(w http.ResponseWriter, r *http.Request)
- type SuuntoDeleteDataInput
- type SuuntoGetDataParams
- type SuuntoGetDatesParams
- type SuuntoGetTypesParams
- type SuuntoPostDataInput
- type SuuntoStatusParams
- type SuuntoTokenHandler
- type SuuntoTokenInput
- type TokenInput
- type TokensForUpdateParams
- type UpsertSourceCacheBody
- type UserDataHandler
- func (h *UserDataHandler) DeleteUserData(w http.ResponseWriter, r *http.Request)
- func (h *UserDataHandler) GetLinkedDevices(w http.ResponseWriter, r *http.Request)
- func (h *UserDataHandler) GetUserData(w http.ResponseWriter, r *http.Request)
- func (h *UserDataHandler) GetUserIDBySportID(w http.ResponseWriter, r *http.Request)
- func (h *UserDataHandler) UpsertUserData(w http.ResponseWriter, r *http.Request)
- type UserDataInput
- type UserDataResponse
- type UserDataUpsertInput
- type UserIDParam
Constants ¶
const (
UTVCacheTTL = 6 * time.Hour
)
Variables ¶
This section is empty.
Functions ¶
This section is empty.
Types ¶
type AllByTypeInput ¶
type AllByTypeInput struct {
UserID string `form:"user_id" validate:"required,uuid4"`
Type string `form:"type" validate:"required,key"`
AfterDate string `form:"after_date" validate:"omitempty,datetime=2006-01-02"`
BeforeDate string `form:"before_date" validate:"omitempty,datetime=2006-01-02"`
Limit int32 `form:"limit" validate:"omitempty,min=1,max=10"`
Offset int32 `form:"offset" validate:"omitempty,min=0"`
}
type ArchinisisStatusParams ¶
type ArchinisisStatusParams struct {
UserID string `form:"user_id" validate:"required,uuid4"`
}
type ArchinisisTokenHandler ¶
type ArchinisisTokenHandler struct {
// contains filtered or unexported fields
}
func NewArchinisisTokenHandler ¶
func NewArchinisisTokenHandler(store utv.ArchinisisToken, cache *cache.Storage) *ArchinisisTokenHandler
func (*ArchinisisTokenHandler) GetSportIDs ¶
func (h *ArchinisisTokenHandler) GetSportIDs(w http.ResponseWriter, r *http.Request)
GetSportIDs godoc
@Summary List Archinisis sport IDs
@Description Returns distinct sport_id values from Archinisis tokens
@Tags UTV - Archinisis
@Accept json
@Produce json
@Success 200 {object} swagger.SportIDsResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/archinisis/sport_ids [get]
func (*ArchinisisTokenHandler) GetStatus ¶
func (h *ArchinisisTokenHandler) GetStatus(w http.ResponseWriter, r *http.Request)
GetStatus godoc
@Summary Check Archinisis connection
@Description Returns whether a user has connected their Archinisis account
@Tags UTV - Archinisis
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Success 200 {object} swagger.ArchinisisStatusResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/archinisis/status [get]
func (*ArchinisisTokenHandler) UpsertToken ¶
func (h *ArchinisisTokenHandler) UpsertToken(w http.ResponseWriter, r *http.Request)
UpsertToken godoc
@Summary Upsert Archinisis token
@Description Upserts a Archinisis token for a user
@Tags UTV - Archinisis
@Accept json
@Produce json
@Param body body swagger.ArchinisisTokenInput true "Archinisis token input"
@Success 201 "Created"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/archinisis/token [post]
type ArchinisisTokenInput ¶
type ArchinisisTokenInput struct {
UserID string `json:"user_id" validate:"required,uuid4"`
Details json.RawMessage `json:"details" validate:"required"`
}
type CoachtechDataHandler ¶
type CoachtechDataHandler struct {
// contains filtered or unexported fields
}
func NewCoachtechDataHandler ¶
func NewCoachtechDataHandler(store utv.CoachtechData, cache *cache.Storage) *CoachtechDataHandler
func (*CoachtechDataHandler) GetData ¶
func (h *CoachtechDataHandler) GetData(w http.ResponseWriter, r *http.Request)
GetCoachtechData godoc
@Summary Get Coachtech data
@Description Returns Coachtech data for a user
@Tags UTV - Coachtech
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param after_date query string false "Filter data after this date (YYYY-MM-DD)"
@Param before_date query string false "Filter data before this date (YYYY-MM-DD)"
@Success 200
@Success 204 "No Content"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/coachtech/data [get]
func (*CoachtechDataHandler) GetStatus ¶
func (h *CoachtechDataHandler) GetStatus(w http.ResponseWriter, r *http.Request)
GetCoachtechStatus godoc
@Summary Check Coachtech data availability
@Description Returns whether Coachtech data exists for a given user
@Tags UTV - Coachtech
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Success 200 {object} swagger.CoachtechStatusResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/coachtech/status [get]
func (*CoachtechDataHandler) Insert ¶
func (h *CoachtechDataHandler) Insert(w http.ResponseWriter, r *http.Request)
InsertCoachtechData godoc
@Summary Insert Coachtech data
@Description Adds a Coachtech ID and corresponding data for a user
@Tags UTV - Coachtech
@Accept json
@Produce json
@Param body body swagger.CoachtechInsertInput true "Coachtech data input"
@Success 201 "Created"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/coachtech/insert [post]
type CoachtechDataParams ¶
type CoachtechInsertInput ¶
type CoachtechInsertInput struct {
UserID string `json:"user_id" validate:"required,uuid4"`
CoachtechID int32 `json:"coachtech_id" validate:"required"`
SummaryDate string `json:"summary_date" validate:"required,datetime=2006-01-02"`
TestID string `json:"test_id" validate:"required"`
Data json.RawMessage `json:"data" validate:"required"`
}
type CoachtechStatusParams ¶
type CoachtechStatusParams struct {
UserID string `form:"user_id" validate:"required,uuid4"`
}
type DataForUpdateParams ¶
type DeleteAllGarminParams ¶
type DeleteAllGarminParams struct {
UserID string `validate:"required,uuid4" json:"user_id"`
}
type DeleteAllOuraParams ¶
type DeleteAllOuraParams struct {
UserID string `validate:"required,uuid4" json:"user_id"`
}
type DeleteAllPolarParams ¶
type DeleteAllPolarParams struct {
UserID string `validate:"required,uuid4" json:"user_id"`
}
type DeleteAllSuuntoParams ¶
type DeleteAllSuuntoParams struct {
UserID string `validate:"required,uuid4" json:"user_id"`
}
type DisconnectParams ¶
type GarminDataHandler ¶
type GarminDataHandler struct {
// contains filtered or unexported fields
}
store and cache interfaces
func NewGarminDataHandler ¶
func NewGarminDataHandler(store utv.GarminData, cache *cache.Storage) *GarminDataHandler
NewGarminDataHandler initializes GarminData handler
func (*GarminDataHandler) DeleteAllData ¶
func (h *GarminDataHandler) DeleteAllData(w http.ResponseWriter, r *http.Request)
DeleteAllDataGarmin godoc
@Summary Delete all Garmin data for a user @Description Deletes all Garmin data entries for a specific user @Tags UTV - Garmin @Accept json @Produce json @Param user_id query string true "User ID (UUID)" @Success 200 "Deleted: Data successfully removed" @Success 204 "No Content: No matching data" @Failure 400 {object} swagger.ValidationErrorResponse @Failure 401 {object} swagger.UnauthorizedResponse @Failure 403 {object} swagger.ForbiddenResponse @Failure 500 {object} swagger.InternalServerErrorResponse @Failure 503 {object} swagger.ServiceUnavailableResponse @Security BearerAuth @Router /utv/garmin/data [delete]
func (*GarminDataHandler) GetData ¶
func (h *GarminDataHandler) GetData(w http.ResponseWriter, r *http.Request)
@Summary Get available data @Description Returns data for the specified user on the specified date (optionally filtered by key) @Tags UTV - Garmin @Accept json @Produce json @Param user_id query string true "User ID (UUID)" @Param date query string true "Date (YYYY-MM-DD)" @Param key query string false "Type" @Success 200 {object} swagger.GarminDataResponse "Data" @Success 204 "No Content: No data found" @Failure 400 {object} swagger.ValidationErrorResponse @Failure 401 {object} swagger.UnauthorizedResponse @Failure 403 {object} swagger.ForbiddenResponse @Failure 500 {object} swagger.InternalServerErrorResponse @Failure 503 {object} swagger.ServiceUnavailableResponse @Security BearerAuth @Router /utv/garmin/data [get]
func (*GarminDataHandler) GetDates ¶
func (h *GarminDataHandler) GetDates(w http.ResponseWriter, r *http.Request)
GetDatesGarmin godoc
@Summary Get available dates
@Description Returns available dates for the specified user (optionally filtered by date range)
@Tags UTV - Garmin
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param after_date query string false "Filter dates after this date (YYYY-MM-DD)"
@Param before_date query string false "Filter dates before this date (YYYY-MM-DD)"
@Success 200 {object} swagger.DatesResponse "List of available dates"
@Success 204 "No Content: No available dates found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 422 {object} swagger.InvalidDateRange
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/garmin/dates [get]
func (*GarminDataHandler) GetTypes ¶
func (h *GarminDataHandler) GetTypes(w http.ResponseWriter, r *http.Request)
@Summary Get available types @Description Returns available types for the specified user on the specified date @Tags UTV - Garmin @Accept json @Produce json @Param user_id query string true "User ID (UUID)" @Param date query string true "Date (YYYY-MM-DD)" @Success 200 {object} swagger.GarminTypesResponse "List of available types" @Success 204 "No Content: No available types found" @Failure 400 {object} swagger.ValidationErrorResponse @Failure 401 {object} swagger.UnauthorizedResponse @Failure 403 {object} swagger.ForbiddenResponse @Failure 500 {object} swagger.InternalServerErrorResponse @Failure 503 {object} swagger.ServiceUnavailableResponse @Security BearerAuth @Router /utv/garmin/types [get]
func (*GarminDataHandler) InsertData ¶
func (h *GarminDataHandler) InsertData(w http.ResponseWriter, r *http.Request)
PostDataGarmin godoc
@Summary Post Garmin data
@Description Posts Garmin data for the specified user on the specified date
@Tags UTV - Garmin
@Accept json
@Produce json
@Param body body swagger.GarminPostDataInput true "Garmin data input"
@Success 201 "Created: Data successfully stored (no content in response body)"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/garmin/data [post]
type GarminGetDataParams ¶
type GarminGetDatesParams ¶
type GarminGetDatesParams struct {
UserID string `form:"user_id" validate:"required,uuid4"`
AfterDate string `form:"after_date" validate:"omitempty,datetime=2006-01-02"`
BeforeDate string `form:"before_date" validate:"omitempty,datetime=2006-01-02"`
}
Validation structs
type GarminGetTypesParams ¶
type GarminPostDataInput ¶
type GarminPostDataInput struct {
UserID string `json:"user_id" validate:"required,uuid4"`
Date string `json:"date" validate:"required,datetime=2006-01-02"`
Data json.RawMessage `json:"data" validate:"required"`
}
type GarminStatusParams ¶
type GarminStatusParams struct {
UserID string `form:"user_id" validate:"required,uuid4"`
}
type GarminTokenByAccessTokenParams ¶
type GarminTokenByAccessTokenParams struct {
Token string `form:"token" validate:"required"`
}
type GarminTokenHandler ¶
type GarminTokenHandler struct {
// contains filtered or unexported fields
}
func NewGarminTokenHandler ¶
func NewGarminTokenHandler(store utv.GarminToken, cache *cache.Storage) *GarminTokenHandler
func (*GarminTokenHandler) GetStatus ¶
func (h *GarminTokenHandler) GetStatus(w http.ResponseWriter, r *http.Request)
GetStatus godoc
@Summary Check Garmin connection & data status
@Description Returns whether a user has connected their Garmin account and whether any Garmin data exists
@Tags UTV - Garmin
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Success 200 {object} swagger.GarminStatusResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/garmin/status [get]
func (*GarminTokenHandler) GetUserIDByToken ¶
func (h *GarminTokenHandler) GetUserIDByToken(w http.ResponseWriter, r *http.Request)
GetUserIDByToken godoc
@Summary Get user_id by Garmin access token
@Description Returns the user ID associated with a given Garmin access token
@Tags UTV - Garmin
@Accept json
@Produce json
@Param token query string true "Garmin access token"
@Success 200 {object} swagger.GarminUserIDResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/garmin/user-id-by-token [get]
func (*GarminTokenHandler) TokenExists ¶
func (h *GarminTokenHandler) TokenExists(w http.ResponseWriter, r *http.Request)
TokenExists godoc
@Summary Check if Garmin token exists
@Description Checks whether a given Garmin access token is stored in the system
@Tags UTV - Garmin
@Accept json
@Produce json
@Param token query string true "Garmin access token"
@Success 200 {object} swagger.GarminTokenExistsResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/garmin/token-exists [get]
func (*GarminTokenHandler) UpsertToken ¶
func (h *GarminTokenHandler) UpsertToken(w http.ResponseWriter, r *http.Request)
UpsertToken godoc
@Summary Save or update Garmin token
@Description Saves or updates the Garmin token for a user
@Tags UTV - Garmin
@Accept json
@Produce json
@Param body body swagger.GarminTokenInput true "Garmin token input"
@Success 201 "Created"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/garmin/token [post]
type GarminTokenInput ¶
type GarminTokenInput struct {
UserID string `json:"user_id" validate:"required,uuid4"`
Details json.RawMessage `json:"details" validate:"required"`
}
type GeneralDataHandler ¶
type GeneralDataHandler struct {
// contains filtered or unexported fields
}
store and cache interfaces
func NewGeneralDataHandler ¶
func NewGeneralDataHandler( oura utv.OuraData, polar utv.PolarData, suunto utv.SuuntoData, garmin utv.GarminData, ouraToken utv.OuraToken, polarToken utv.PolarToken, suuntoToken utv.SuuntoToken, garminToken utv.GarminToken, klabToken utv.KlabToken, archinisisToken utv.ArchinisisToken, cache *cache.Storage, ) *GeneralDataHandler
NewGeneralDataHandler initializes the handler
func (*GeneralDataHandler) Disconnect ¶
func (h *GeneralDataHandler) Disconnect(w http.ResponseWriter, r *http.Request)
Disconnect godoc
@Summary Disconnect a wearable device
@Description Disconnects a user's wearable device by deleting the associated token
@Tags UTV - General
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param source query string true "Source device to disconnect (one of: 'polar', 'oura', 'suunto', 'garmin', 'klab', 'archinisis')"
@Success 200 "Successfully disconnected"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/disconnect [delete]
func (*GeneralDataHandler) GetAllByType ¶
func (h *GeneralDataHandler) GetAllByType(w http.ResponseWriter, r *http.Request)
GetAllByType godoc
@Summary Get all data by type
@Description Returns all entries of a specific data type for a user, across all wearable devices, optionally filtered by date range, paginated by limit (default 3) and offset.
@Tags UTV - General
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param type query string true "Data type (e.g., 'sleep', 'activity')"
@Param after_date query string false "Filter data after this date (YYYY-MM-DD)"
@Param before_date query string false "Filter data before this date (YYYY-MM-DD)"
@Param limit query int false "Limit the number of results returned (default: 3, max: 10)"
@Param offset query int false "Offset for pagination (default: 0)"
@Success 200 {array} swagger.LatestDataResponse "List of data entries across devices"
@Success 204 "No Content: No data available"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 422 {object} swagger.InvalidDateRange
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/all [get]
func (*GeneralDataHandler) GetDataForUpdate ¶
func (h *GeneralDataHandler) GetDataForUpdate(w http.ResponseWriter, r *http.Request)
GetDataForUpdate godoc
@Summary Get data for update
@Description Returns token records where 'data_last_fetched' is older than the cutoff
@Tags UTV - General
@Accept json
@Produce json
@Param source query string true "Source (one of: 'polar', 'oura', 'suunto', 'garmin')"
@Param hours query int true "Number of hours to look back (1-8760)"
@Success 200 {array} swagger.PolarTokenInput "List of tokens needing data update"
@Success 204 "No Content: No data found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/data4update [get]
func (*GeneralDataHandler) GetLatestData ¶
func (h *GeneralDataHandler) GetLatestData(w http.ResponseWriter, r *http.Request)
GetLatestData godoc
@Summary Get latest data by type
@Description Returns latest entries of a specific type for a user, optionally filtered by device and limited in number (defaults to 1).
@Tags UTV - General
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param type query string true "Data type (e.g., 'sleep', 'activity')"
@Param device query string false "Device type (one of: 'garmin', 'oura', 'polar', 'suunto')"
@Param limit query int false "Limit the number of results (default: 1, max: 100)"
@Success 200 {array} swagger.LatestDataResponse "Latest Data"
@Success 204 "No Content: No data found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/latest [get]
func (*GeneralDataHandler) GetToken ¶
func (h *GeneralDataHandler) GetToken(w http.ResponseWriter, r *http.Request)
GetToken godoc
@Summary Get wearable access token
@Description Returns token JSON for the given source. Shapes:
@Description - oura/suunto: {"access_token"}
@Description - polar: {"access_token", "x_user_id"}
@Description - garmin: {"access_token", "access_token_secret"}
@Tags UTV - General
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param source query string true "Source (one of: 'garmin', 'oura', 'polar', 'suunto')"
@Success 200 {object} swagger.GarminTokenResponse
@Success 204 "No Content: Token not found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/token [get]
func (*GeneralDataHandler) GetTokensForUpdate ¶
func (h *GeneralDataHandler) GetTokensForUpdate(w http.ResponseWriter, r *http.Request)
GetTokensForUpdate godoc
@Summary Get tokens for update
@Description Retrieves tokens that need to be updated based on the source and time cutoff
@Tags UTV - General
@Accept json
@Produce json
@Param source query string true "Source device (one of: 'polar', 'oura', 'suunto', 'garmin')"
@Param hours query int true "Number of hours to look back (1-8760)"
@Success 200 {array} swagger.PolarTokenInput "List of tokens needing update"
@Success 204 "No Content: No tokens found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/tokens4update [get]
type GetStatusParams ¶
type GetStatusParams struct {
UserID string `form:"user_id" validate:"required,uuid4"`
}
type GetTokenByOuraIDParams ¶
type GetTokenByOuraIDParams struct {
OuraID string `form:"oura_id" validate:"required"`
}
type GetTokenByPolarIDParams ¶
type GetTokenByPolarIDParams struct {
PolarID string `form:"polar_id" validate:"required"`
}
type GetTokenByUsernameParams ¶
type GetTokenByUsernameParams struct {
Username string `form:"username" validate:"required"`
}
type KlabStatusParams ¶
type KlabStatusParams struct {
UserID string `form:"user_id" validate:"required,uuid4"`
}
type KlabTokenHandler ¶
type KlabTokenHandler struct {
// contains filtered or unexported fields
}
func NewKlabTokenHandler ¶
func NewKlabTokenHandler(store utv.KlabToken, cache *cache.Storage) *KlabTokenHandler
func (*KlabTokenHandler) GetSportIDs ¶
func (h *KlabTokenHandler) GetSportIDs(w http.ResponseWriter, r *http.Request)
GetSportIDs godoc
@Summary List Klab sport IDs
@Description Returns distinct sport_id values from Klab tokens
@Tags UTV - Klab
@Accept json
@Produce json
@Success 200 {object} swagger.SportIDsResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/klab/sport_ids [get]
func (*KlabTokenHandler) GetStatus ¶
func (h *KlabTokenHandler) GetStatus(w http.ResponseWriter, r *http.Request)
GetStatus godoc
@Summary Check Klab connection
@Description Returns whether a user has connected their Klab account
@Tags UTV - Klab
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Success 200 {object} swagger.KlabStatusResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/klab/status [get]
func (*KlabTokenHandler) UpsertToken ¶
func (h *KlabTokenHandler) UpsertToken(w http.ResponseWriter, r *http.Request)
UpsertToken godoc
@Summary Upsert Klab token
@Description Upserts a Klab token for a user
@Tags UTV - Klab
@Accept json
@Produce json
@Param body body swagger.KlabTokenInput true "Klab token input"
@Success 201 "Created"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/klab/token [post]
type KlabTokenInput ¶
type KlabTokenInput struct {
UserID string `json:"user_id" validate:"required,uuid4"`
Details json.RawMessage `json:"details" validate:"required"`
}
type LatestDataInput ¶
type LatestDataInput struct {
UserID string `form:"user_id" validate:"required,uuid4"`
Type string `form:"type" validate:"required,key"`
Device string `form:"device" validate:"omitempty,oneof=garmin oura polar suunto"`
Limit int32 `form:"limit" validate:"omitempty,min=1,max=100"`
}
Validation structs
type LatestDataResponse ¶
type LatestDataResponse struct {
Device string `json:"device"`
Date string `json:"date"`
Data json.RawMessage `json:"data"`
}
response structs
type OuraDataHandler ¶
type OuraDataHandler struct {
// contains filtered or unexported fields
}
store and cache interfaces
func NewOuraDataHandler ¶
func NewOuraDataHandler(store utv.OuraData, cache *cache.Storage) *OuraDataHandler
NewOuraDataHandler initializes OuraData handler
func (*OuraDataHandler) DeleteAllData ¶
func (h *OuraDataHandler) DeleteAllData(w http.ResponseWriter, r *http.Request)
DeleteAllDataOura godoc
@Summary Delete all Oura data for a user @Description Deletes all Oura data entries for a specific user @Tags UTV - Oura @Accept json @Produce json @Param user_id query string true "User ID (UUID)" @Success 200 "Deleted: Data successfully removed" @Success 204 "No Content: No matching data" @Failure 400 {object} swagger.ValidationErrorResponse @Failure 401 {object} swagger.UnauthorizedResponse @Failure 403 {object} swagger.ForbiddenResponse @Failure 500 {object} swagger.InternalServerErrorResponse @Failure 503 {object} swagger.ServiceUnavailableResponse @Security BearerAuth @Router /utv/oura/data [delete]
func (*OuraDataHandler) GetData ¶
func (h *OuraDataHandler) GetData(w http.ResponseWriter, r *http.Request)
@Summary Get available data @Description Returns data for the specified user on the specified date (optionally filtered by key) @Tags UTV - Oura @Accept json @Produce json @Param user_id query string true "User ID (UUID)" @Param date query string true "Date (YYYY-MM-DD)" @Param key query string false "Type" @Success 200 {object} swagger.OuraDataResponse "Data" @Success 204 "No Content: No data found" @Failure 400 {object} swagger.ValidationErrorResponse @Failure 401 {object} swagger.UnauthorizedResponse @Failure 403 {object} swagger.ForbiddenResponse @Failure 500 {object} swagger.InternalServerErrorResponse @Failure 503 {object} swagger.ServiceUnavailableResponse @Security BearerAuth @Router /utv/oura/data [get]
func (*OuraDataHandler) GetDates ¶
func (h *OuraDataHandler) GetDates(w http.ResponseWriter, r *http.Request)
GetDatesOura godoc
@Summary Get available dates
@Description Returns available dates for the specified user (optionally filtered by date range)
@Tags UTV - Oura
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param after_date query string false "Filter dates after this date (YYYY-MM-DD)"
@Param before_date query string false "Filter dates before this date (YYYY-MM-DD)"
@Success 200 {object} swagger.DatesResponse "List of available dates"
@Success 204 "No Content: No available dates found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 422 {object} swagger.InvalidDateRange
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/oura/dates [get]
func (*OuraDataHandler) GetTypes ¶
func (h *OuraDataHandler) GetTypes(w http.ResponseWriter, r *http.Request)
@Summary Get available types @Description Returns available types for the specified user on the specified date @Tags UTV - Oura @Accept json @Produce json @Param user_id query string true "User ID (UUID)" @Param date query string true "Date (YYYY-MM-DD)" @Success 200 {object} swagger.OuraTypesResponse "List of available types" @Success 204 "No Content: No available types found" @Failure 400 {object} swagger.ValidationErrorResponse @Failure 401 {object} swagger.UnauthorizedResponse @Failure 403 {object} swagger.ForbiddenResponse @Failure 500 {object} swagger.InternalServerErrorResponse @Failure 503 {object} swagger.ServiceUnavailableResponse @Security BearerAuth @Router /utv/oura/types [get]
func (*OuraDataHandler) InsertData ¶
func (h *OuraDataHandler) InsertData(w http.ResponseWriter, r *http.Request)
PostDataOura godoc
@Summary Post Oura data
@Description Posts Oura data for the specified user on the specified date
@Tags UTV - Oura
@Accept json
@Produce json
@Param body body swagger.OuraPostDataInput true "Oura data input"
@Success 201 "Created: Data successfully stored (no content in response body)"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/oura/data [post]
type OuraDeleteDataInput ¶
type OuraGetDataParams ¶
type OuraGetDatesParams ¶
type OuraGetDatesParams struct {
UserID string `form:"user_id" validate:"required,uuid4"`
AfterDate string `form:"after_date" validate:"omitempty,datetime=2006-01-02"`
BeforeDate string `form:"before_date" validate:"omitempty,datetime=2006-01-02"`
}
Validation structs
type OuraGetTypesParams ¶
type OuraPostDataInput ¶
type OuraPostDataInput struct {
UserID string `json:"user_id" validate:"required,uuid4"`
Date string `json:"date" validate:"required,datetime=2006-01-02"`
Data json.RawMessage `json:"data" validate:"required"`
}
type OuraStatusParams ¶
type OuraStatusParams struct {
UserID string `form:"user_id" validate:"required,uuid4"`
}
type OuraTokenHandler ¶
type OuraTokenHandler struct {
// contains filtered or unexported fields
}
func NewOuraTokenHandler ¶
func NewOuraTokenHandler(store utv.OuraToken, cache *cache.Storage) *OuraTokenHandler
func (*OuraTokenHandler) GetStatus ¶
func (h *OuraTokenHandler) GetStatus(w http.ResponseWriter, r *http.Request)
GetStatus godoc
@Summary Check Oura connection & data status
@Description Returns whether a user has connected their Oura account and whether any Oura data exists
@Tags UTV - Oura
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Success 200 {object} swagger.OuraStatusResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/oura/status [get]
func (*OuraTokenHandler) GetTokenByOuraID ¶
func (h *OuraTokenHandler) GetTokenByOuraID(w http.ResponseWriter, r *http.Request)
GetTokenByOuraID godoc
@Summary Get Oura token by Oura ID
@Description Retrieves the user ID and token data associated with a specific Oura ID
@Tags UTV - Oura
@Accept json
@Produce json
@Param oura_id query string true "Oura ID"
@Success 200 {object} swagger.OuraTokenByIDResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/oura/token-by-id [get]
func (*OuraTokenHandler) UpsertToken ¶
func (h *OuraTokenHandler) UpsertToken(w http.ResponseWriter, r *http.Request)
UpsertToken godoc
@Summary Save or update Oura token
@Description Saves or updates the Oura token for a user
@Tags UTV - Oura
@Accept json
@Produce json
@Param body body swagger.OuraTokenInput true "Oura token input"
@Success 201 "Created"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/oura/token [post]
type OuraTokenInput ¶
type OuraTokenInput struct {
UserID string `json:"user_id" validate:"required,uuid4"`
Details json.RawMessage `json:"details" validate:"required"`
}
type PolarDataHandler ¶
type PolarDataHandler struct {
// contains filtered or unexported fields
}
store and cache interfaces
func NewPolarDataHandler ¶
func NewPolarDataHandler(store utv.PolarData, cache *cache.Storage) *PolarDataHandler
NewPolarDataHandler initializes PolarData handler
func (*PolarDataHandler) DeleteAllData ¶
func (h *PolarDataHandler) DeleteAllData(w http.ResponseWriter, r *http.Request)
DeleteAllDataPolar godoc
@Summary Delete all Polar data for a user @Description Deletes all Polar data entries for a specific user @Tags UTV - Polar @Accept json @Produce json @Param user_id query string true "User ID (UUID)" @Success 200 "Deleted: Data successfully removed" @Success 204 "No Content: No matching data" @Failure 400 {object} swagger.ValidationErrorResponse @Failure 401 {object} swagger.UnauthorizedResponse @Failure 403 {object} swagger.ForbiddenResponse @Failure 500 {object} swagger.InternalServerErrorResponse @Failure 503 {object} swagger.ServiceUnavailableResponse @Security BearerAuth @Router /utv/polar/data [delete]
func (*PolarDataHandler) GetData ¶
func (h *PolarDataHandler) GetData(w http.ResponseWriter, r *http.Request)
GetDataPolar godoc
@Summary Get available data
@Description Returns data for the specified user on the specified date (optionally filtered by key)
@Tags UTV - Polar
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param date query string true "Date (YYYY-MM-DD)"
@Param key query string false "Type"
@Success 200 {object} swagger.PolarDataResponse "Data"
@Success 204 "No Content: No data found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/polar/data [get]
func (*PolarDataHandler) GetDates ¶
func (h *PolarDataHandler) GetDates(w http.ResponseWriter, r *http.Request)
GetDatesPolar godoc
@Summary Get available dates
@Description Returns available dates for the specified user (optionally filtered by date range)
@Tags UTV - Polar
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param after_date query string false "Filter dates after this date (YYYY-MM-DD)"
@Param before_date query string false "Filter dates before this date (YYYY-MM-DD)"
@Success 200 {object} swagger.DatesResponse "List of available dates"
@Success 204 "No Content: No available dates found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 422 {object} swagger.InvalidDateRange
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/polar/dates [get]
func (*PolarDataHandler) GetTypes ¶
func (h *PolarDataHandler) GetTypes(w http.ResponseWriter, r *http.Request)
GetTypesPolar godoc
@Summary Get available types
@Description Returns available types for the specified user on the specified date
@Tags UTV - Polar
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param date query string true "Date (YYYY-MM-DD)"
@Success 200 {object} swagger.PolarTypesResponse "List of available types"
@Success 204 "No Content: No available types found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/polar/types [get]
func (*PolarDataHandler) InsertData ¶
func (h *PolarDataHandler) InsertData(w http.ResponseWriter, r *http.Request)
PostDataPolar godoc
@Summary Post Polar data
@Description Posts Polar data for the specified user on the specified date
@Tags UTV - Polar
@Accept json
@Produce json
@Param body body swagger.PolarPostDataInput true "Polar data input"
@Success 201 "Created: Data successfully stored (no content in response body)"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/polar/data [post]
type PolarDeleteDataInput ¶
type PolarGetDataParams ¶
type PolarGetDatesParams ¶
type PolarGetDatesParams struct {
UserID string `form:"user_id" validate:"required,uuid4"`
AfterDate string `form:"after_date" validate:"omitempty,datetime=2006-01-02"`
BeforeDate string `form:"before_date" validate:"omitempty,datetime=2006-01-02"`
}
Validation structs
type PolarGetTypesParams ¶
type PolarPostDataInput ¶
type PolarPostDataInput struct {
UserID string `json:"user_id" validate:"required,uuid4"`
Date string `json:"date" validate:"required,datetime=2006-01-02"`
Data json.RawMessage `json:"data" validate:"required"`
}
type PolarTokenHandler ¶
type PolarTokenHandler struct {
// contains filtered or unexported fields
}
func NewPolarTokenHandler ¶
func NewPolarTokenHandler(store utv.PolarToken, cache *cache.Storage) *PolarTokenHandler
func (*PolarTokenHandler) GetStatus ¶
func (h *PolarTokenHandler) GetStatus(w http.ResponseWriter, r *http.Request)
GetStatus godoc
@Summary Check Polar connection & data status
@Description Returns whether a user has connected their Polar account and whether any Polar data exists
@Tags UTV - Polar
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Success 200 {object} swagger.PolarStatusResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/polar/status [get]
func (*PolarTokenHandler) GetTokenByPolarID ¶
func (h *PolarTokenHandler) GetTokenByPolarID(w http.ResponseWriter, r *http.Request)
GetTokenByPolarID godoc
@Summary Get user token by Polar ID
@Description Returns user_id and token data associated with a given Polar x_user_id
@Tags UTV - Polar
@Accept json
@Produce json
@Param polar_id query string true "Polar x_user_id"
@Success 200 {object} swagger.PolarTokenByIDResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/polar/token-by-id [get]
func (*PolarTokenHandler) UpsertToken ¶
func (h *PolarTokenHandler) UpsertToken(w http.ResponseWriter, r *http.Request)
UpsertToken godoc
@Summary Save or update Polar token
@Description Upserts the Polar token details for a specific user
@Tags UTV - Polar
@Accept json
@Produce json
@Param body body swagger.PolarTokenInput true "Polar token input"
@Success 201 "Created"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/polar/token [post]
type PolarTokenInput ¶
type PolarTokenInput struct {
UserID string `json:"user_id" validate:"required,uuid4"`
Details json.RawMessage `json:"details" validate:"required"`
}
type SourceCacheHandler ¶
type SourceCacheHandler struct {
// contains filtered or unexported fields
}
func NewSourceCacheHandler ¶
func NewSourceCacheHandler(store utv.SourceCache, cache *cache.Storage) *SourceCacheHandler
func (*SourceCacheHandler) GetAllDataTypes ¶
func (h *SourceCacheHandler) GetAllDataTypes(w http.ResponseWriter, r *http.Request)
GetAllDataTypes godoc
@Summary Get data types (source_cache)
@Description Returns data types. If source is provided, returns only that source's keys.
@Tags UTV - Source_Cache
@Accept json
@Produce json
@Param source query string false "Source name (e.g., oura, garmin, polar, suunto)"
@Success 200 {object} swagger.SourceCacheSingleResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 404 {object} swagger.NotFoundResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/source_cache/data-types [get]
func (*SourceCacheHandler) UpsertDataTypes ¶
func (h *SourceCacheHandler) UpsertDataTypes(w http.ResponseWriter, r *http.Request)
UpsertDataTypes godoc
@Summary Replace keys for a source (upsert)
@Description Replaces the entire key list for the given source. One source per request.
@Tags UTV - Source_Cache
@Accept json
@Produce json
@Param body body swagger.SourceCacheUpsertInput true "source + data array"
@Success 201 "Created"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Security BearerAuth
@Router /utv/source_cache/data-types [post]
type SourceParam ¶
type SourceParam struct {
Source string `form:"source"`
}
type SportIDParam ¶
type SportIDParam struct {
SportID string `form:"sport_id" validate:"required,numeric"`
}
type SuuntoDataHandler ¶
type SuuntoDataHandler struct {
// contains filtered or unexported fields
}
store and cache interfaces
func NewSuuntoDataHandler ¶
func NewSuuntoDataHandler(store utv.SuuntoData, cache *cache.Storage) *SuuntoDataHandler
NewSuuntoDataHandler initializes SuuntoData handler
func (*SuuntoDataHandler) DeleteAllData ¶
func (h *SuuntoDataHandler) DeleteAllData(w http.ResponseWriter, r *http.Request)
DeleteAllDataSuunto godoc
@Summary Delete all Suunto data for a user @Description Deletes all Suunto data entries for a specific user @Tags UTV - Suunto @Accept json @Produce json @Param user_id query string true "User ID (UUID)" @Success 200 "Deleted: Data successfully removed" @Success 204 "No Content: No matching data" @Failure 400 {object} swagger.ValidationErrorResponse @Failure 401 {object} swagger.UnauthorizedResponse @Failure 403 {object} swagger.ForbiddenResponse @Failure 500 {object} swagger.InternalServerErrorResponse @Failure 503 {object} swagger.ServiceUnavailableResponse @Security BearerAuth @Router /utv/suunto/data [delete]
func (*SuuntoDataHandler) GetData ¶
func (h *SuuntoDataHandler) GetData(w http.ResponseWriter, r *http.Request)
GetDataSuunto godoc
@Summary Get available data
@Description Returns data for the specified user on the specified date (optionally filtered by key)
@Tags UTV - Suunto
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param date query string true "Date (YYYY-MM-DD)"
@Param key query string false "Type"
@Success 200 {object} swagger.SuuntoDataResponse "Data"
@Success 204 "No Content: No data found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/suunto/data [get]
func (*SuuntoDataHandler) GetDates ¶
func (h *SuuntoDataHandler) GetDates(w http.ResponseWriter, r *http.Request)
GetDatesSuunto godoc
@Summary Get available dates
@Description Returns available dates for the specified user (optionally filtered by date range)
@Tags UTV - Suunto
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param after_date query string false "Filter dates after this date (YYYY-MM-DD)"
@Param before_date query string false "Filter dates before this date (YYYY-MM-DD)"
@Success 200 {object} swagger.DatesResponse "List of available dates"
@Success 204 "No Content: No available dates found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 422 {object} swagger.InvalidDateRange
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/suunto/dates [get]
func (*SuuntoDataHandler) GetTypes ¶
func (h *SuuntoDataHandler) GetTypes(w http.ResponseWriter, r *http.Request)
GetTypesSuunto godoc
@Summary Get available types
@Description Returns available types for the specified user on the specified date
@Tags UTV - Suunto
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param date query string true "Date (YYYY-MM-DD)"
@Success 200 {object} swagger.SuuntoTypesResponse "List of available types"
@Success 204 "No Content: No available types found"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/suunto/types [get]
func (*SuuntoDataHandler) InsertData ¶
func (h *SuuntoDataHandler) InsertData(w http.ResponseWriter, r *http.Request)
PostDataSuunto godoc
@Summary Post Suunto data
@Description Posts Suunto data for the specified user on the specified date
@Tags UTV - Suunto
@Accept json
@Produce json
@Param body body swagger.SuuntoPostDataInput true "suunto data input"
@Success 201 "Created: Data successfully stored (no content in response body)"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/suunto/data [post]
type SuuntoDeleteDataInput ¶
type SuuntoGetDataParams ¶
type SuuntoGetDatesParams ¶
type SuuntoGetDatesParams struct {
UserID string `form:"user_id" validate:"required,uuid4"`
AfterDate string `form:"after_date" validate:"omitempty,datetime=2006-01-02"`
BeforeDate string `form:"before_date" validate:"omitempty,datetime=2006-01-02"`
}
Validation structs
type SuuntoGetTypesParams ¶
type SuuntoPostDataInput ¶
type SuuntoPostDataInput struct {
UserID string `json:"user_id" validate:"required,uuid4"`
Date string `json:"date" validate:"required,datetime=2006-01-02"`
Data json.RawMessage `json:"data" validate:"required"`
}
type SuuntoStatusParams ¶
type SuuntoStatusParams struct {
UserID string `form:"user_id" validate:"required,uuid4"`
}
type SuuntoTokenHandler ¶
type SuuntoTokenHandler struct {
// contains filtered or unexported fields
}
func NewSuuntoTokenHandler ¶
func NewSuuntoTokenHandler(store utv.SuuntoToken, cache *cache.Storage) *SuuntoTokenHandler
func (*SuuntoTokenHandler) GetStatus ¶
func (h *SuuntoTokenHandler) GetStatus(w http.ResponseWriter, r *http.Request)
GetStatus godoc
@Summary Check Suunto connection & data status
@Description Returns whether a user has connected their Suunto account and whether any Suunto data exists
@Tags UTV - Suunto
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Success 200 {object} swagger.SuuntoStatusResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/suunto/status [get]
func (*SuuntoTokenHandler) GetTokenByUsername ¶
func (h *SuuntoTokenHandler) GetTokenByUsername(w http.ResponseWriter, r *http.Request)
GetTokenByUsername godoc
@Summary Get Suunto token by username
@Description Returns user_id and token data associated with a given Suunto username
@Tags UTV - Suunto
@Accept json
@Produce json
@Param username query string true "Suunto username"
@Success 200 {object} swagger.SuuntoTokenByUsernameResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/suunto/token-by-username [get]
func (*SuuntoTokenHandler) UpsertToken ¶
func (h *SuuntoTokenHandler) UpsertToken(w http.ResponseWriter, r *http.Request)
UpsertToken godoc
@Summary Save or update Suunto token
@Description Upserts the Suunto token details for a specific user
@Tags UTV - Suunto
@Accept json
@Produce json
@Param body body swagger.SuuntoTokenInput true "Suunto token input"
@Success 201 "Created"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/suunto/token [post]
type SuuntoTokenInput ¶
type SuuntoTokenInput struct {
UserID string `json:"user_id" validate:"required,uuid4"`
Details json.RawMessage `json:"details" validate:"required"`
}
type TokenInput ¶
type TokensForUpdateParams ¶
type UpsertSourceCacheBody ¶
type UserDataHandler ¶
type UserDataHandler struct {
// contains filtered or unexported fields
}
func NewUserDataHandler ¶
func NewUserDataHandler(store utv.UserData, cache *cache.Storage) *UserDataHandler
func (*UserDataHandler) DeleteUserData ¶
func (h *UserDataHandler) DeleteUserData(w http.ResponseWriter, r *http.Request)
DeleteUserData godoc
@Summary Delete a user
@Description Removes a user
@Tags UTV - User
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Success 200
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/user [delete]
func (*UserDataHandler) GetLinkedDevices ¶
func (h *UserDataHandler) GetLinkedDevices(w http.ResponseWriter, r *http.Request)
GetLinkedDevices godoc
@Summary Get linked devices for a user
@Description Returns the status of linked devices for a user and if they include data.
@Tags UTV - User
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Success 200 {object} swagger.DeviceStatusResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/user-linked-devices [get]
func (*UserDataHandler) GetUserData ¶
func (h *UserDataHandler) GetUserData(w http.ResponseWriter, r *http.Request)
GetUserData godoc
@Summary Get user
@Description Returns JSON user data for a given UTV user ID
@Tags UTV - User
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Success 200 {object} swagger.UserDataResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 404 {object} swagger.NotFoundResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/user [get]
func (*UserDataHandler) GetUserIDBySportID ¶
func (h *UserDataHandler) GetUserIDBySportID(w http.ResponseWriter, r *http.Request)
GetUserIDBySportID godoc
@Summary Get UTV user ID by sport ID
@Description Find user_id from sport_id
@Tags UTV - User
@Accept json
@Produce json
@Param sport_id query string true "Sport ID"
@Success 200 {object} swagger.UserIDResponse
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 404 {object} swagger.NotFoundResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/user-id-by-sport-id [get]
func (*UserDataHandler) UpsertUserData ¶
func (h *UserDataHandler) UpsertUserData(w http.ResponseWriter, r *http.Request)
UpsertUserData godoc
@Summary Save or update user
@Description Upserts the user data JSON blob for a specific user
@Tags UTV - User
@Accept json
@Produce json
@Param user_id query string true "User ID (UUID)"
@Param body body swagger.UserDataInput true "User data input"
@Success 201 "Created"
@Failure 400 {object} swagger.ValidationErrorResponse
@Failure 401 {object} swagger.UnauthorizedResponse
@Failure 403 {object} swagger.ForbiddenResponse
@Failure 500 {object} swagger.InternalServerErrorResponse
@Failure 503 {object} swagger.ServiceUnavailableResponse
@Security BearerAuth
@Router /utv/user [post]
type UserDataInput ¶
type UserDataInput struct {
Data json.RawMessage `json:"data" validate:"required"`
}
type UserDataResponse ¶
type UserDataResponse struct {
UserID string `json:"user_id"`
Data interface{} `json:"data"`
}
type UserDataUpsertInput ¶
type UserDataUpsertInput struct {
Data json.RawMessage `json:"data" validate:"required"`
}
type UserIDParam ¶
type UserIDParam struct {
UserID string `form:"user_id" validate:"required,uuid4"`
}