utvapi

package
v1.3.0 Latest Latest
Warning

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

Go to latest
Published: Dec 17, 2025 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