Help us shape the future of Go! Take the 2026 Go Developer Survey

utvapi

package
v1.3.3 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Apr 8, 2026 License: MIT Imports: 13 Imported by: 0

Documentation

Index

Constants

View Source
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

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

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

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 CoachtechDataParams 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"`
}

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 DataForUpdateParams struct {
	Source string `form:"source" validate:"required,oneof=polar oura suunto garmin"`
	Hours  int    `form:"hours" validate:"required,min=1,max=8760"`
}

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 DisconnectParams struct {
	UserID string `form:"user_id" validate:"required,uuid4"`
	Source string `form:"source" validate:"required,oneof=polar oura suunto garmin klab archinisis"`
}

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 GarminGetDataParams struct {
	UserID string `form:"user_id" validate:"required,uuid4"`
	Date   string `form:"date" validate:"required,datetime=2006-01-02"`
	Key    string `form:"key" validate:"omitempty,key"`
}

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 GarminGetTypesParams struct {
	UserID string `form:"user_id" validate:"required,uuid4"`
	Date   string `form:"date" validate:"required,datetime=2006-01-02"`
}

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 OuraDeleteDataInput struct {
	UserID string `json:"user_id" validate:"required,uuid4"`
	Date   string `json:"date" validate:"required,datetime=2006-01-02"`
}

type OuraGetDataParams

type OuraGetDataParams struct {
	UserID string `form:"user_id" validate:"required,uuid4"`
	Date   string `form:"date" validate:"required,datetime=2006-01-02"`
	Key    string `form:"key" validate:"omitempty,key"`
}

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 OuraGetTypesParams struct {
	UserID string `form:"user_id" validate:"required,uuid4"`
	Date   string `form:"date" validate:"required,datetime=2006-01-02"`
}

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 PolarDeleteDataInput struct {
	UserID string `json:"user_id" validate:"required,uuid4"`
	Date   string `json:"date" validate:"required,datetime=2006-01-02"`
}

type PolarGetDataParams

type PolarGetDataParams struct {
	UserID string `form:"user_id" validate:"required,uuid4"`
	Date   string `form:"date" validate:"required,datetime=2006-01-02"`
	Key    string `form:"key" validate:"omitempty,key"`
}

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 PolarGetTypesParams struct {
	UserID string `form:"user_id" validate:"required,uuid4"`
	Date   string `form:"date" validate:"required,datetime=2006-01-02"`
}

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 SuuntoDeleteDataInput struct {
	UserID string `json:"user_id" validate:"required,uuid4"`
	Date   string `json:"date" validate:"required,datetime=2006-01-02"`
}

type SuuntoGetDataParams

type SuuntoGetDataParams struct {
	UserID string `form:"user_id" validate:"required,uuid4"`
	Date   string `form:"date" validate:"required,datetime=2006-01-02"`
	Key    string `form:"key" validate:"omitempty,key"`
}

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 SuuntoGetTypesParams struct {
	UserID string `form:"user_id" validate:"required,uuid4"`
	Date   string `form:"date" validate:"required,datetime=2006-01-02"`
}

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 TokenInput struct {
	UserID string `form:"user_id" validate:"required,uuid4"`
	Source string `form:"source" validate:"required,oneof=garmin oura polar suunto"`
}

type TokensForUpdateParams

type TokensForUpdateParams struct {
	Source string `form:"source" validate:"required,oneof=polar oura suunto garmin"`
	Hours  int    `form:"hours" validate:"required,min=1,max=8760"` // up to 1 year
}

type UpsertSourceCacheBody

type UpsertSourceCacheBody struct {
	Source string   `json:"source" validate:"required"`
	Data   []string `json:"data"   validate:"required,min=1,dive,required"`
}

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"`
}

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL