mirror of
https://github.com/navidrome/navidrome.git
synced 2026-08-31 07:30:32 +00:00
add docs, test for rejected user
This commit is contained in:
parent
6b72ce3c0d
commit
cd2643f83e
@ -2,26 +2,46 @@ package host
|
|||||||
|
|
||||||
import "context"
|
import "context"
|
||||||
|
|
||||||
|
// ScrobbleList is a list of scrobbles, plus an optional timestamp
|
||||||
|
// that can be used as a cursor for the next fetch
|
||||||
type ScrobbleList struct {
|
type ScrobbleList struct {
|
||||||
Scrobbles []ScrobbleRef `json:"scrobbles"`
|
// The scrobbles in a given range
|
||||||
NextTimestamp *int64 `json:"nextTimestamp,omitempty"`
|
Scrobbles []ScrobbleRef `json:"scrobbles"`
|
||||||
|
// If additional items are available, the timestamp of the next scrobble to fetch
|
||||||
|
NextTimestamp *int64 `json:"nextTimestamp,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ScrobbleRef represents one instance of a scrobble (instance id, file id, submission time)
|
||||||
type ScrobbleRef struct {
|
type ScrobbleRef struct {
|
||||||
ID int64 `json:"id"`
|
// The ID of the scrobble. Useful if duplicate scrobbles happen for the same time
|
||||||
MediaFileID string `json:"mediaFileId"`
|
ID int64 `json:"id"`
|
||||||
SubmissionTime int64 `json:"submissionTime"`
|
// The ID of the MediaFile submitted at this time
|
||||||
|
MediaFileID string `json:"mediaFileId"`
|
||||||
|
// The UNIX timestamp this scrobble was submitted
|
||||||
|
SubmissionTime int64 `json:"submissionTime"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ScrobbleOptions carries optional parameters for retrieving user scrobbles
|
||||||
type ScrobbleOptions struct {
|
type ScrobbleOptions struct {
|
||||||
|
// The starting unix timestamp to query for scrobbles (inclusive).
|
||||||
|
// If not specified, start from the first scrobble
|
||||||
FromTimestamp *int64 `json:"fromTimestamp,omitempty"`
|
FromTimestamp *int64 `json:"fromTimestamp,omitempty"`
|
||||||
ToTimestamp *int64 `json:"toTimestamp,omitempty"`
|
// The ending unix timestamp to query for scrobbles (inclusive).
|
||||||
MaxItems int `json:"maxItems"`
|
// If not specified, go up to the last scrobble
|
||||||
|
ToTimestamp *int64 `json:"toTimestamp,omitempty"`
|
||||||
|
// The maximum number of items to retrieve. This is capped at 5000, the
|
||||||
|
// default if not specified
|
||||||
|
MaxItems int `json:"maxItems"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// ScrobbleCountOptions carries optional parameters for counting user scrobbles
|
||||||
type ScrobbleCountOptions struct {
|
type ScrobbleCountOptions struct {
|
||||||
|
// The starting unix timestamp to query for scrobbles (inclusive).
|
||||||
|
// If not specified, start from the first scrobble
|
||||||
FromTimestamp *int64 `json:"fromTimestamp,omitempty"`
|
FromTimestamp *int64 `json:"fromTimestamp,omitempty"`
|
||||||
ToTimestamp *int64 `json:"toTimestamp,omitempty"`
|
// The ending unix timestamp to query for scrobbles (inclusive).
|
||||||
|
// If not specified, go up to the last scrobble
|
||||||
|
ToTimestamp *int64 `json:"toTimestamp,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleRetrieverService allows a plugin to retrieve scrobbles for one or more authorized users.
|
// ScrobbleRetrieverService allows a plugin to retrieve scrobbles for one or more authorized users.
|
||||||
@ -30,17 +50,43 @@ type ScrobbleCountOptions struct {
|
|||||||
//
|
//
|
||||||
//nd:hostservice name=ScrobbleRetriever permission=scrobbleRetriever
|
//nd:hostservice name=ScrobbleRetriever permission=scrobbleRetriever
|
||||||
type ScrobbleRetrieverService interface {
|
type ScrobbleRetrieverService interface {
|
||||||
// GetFirstTimestamp returns the unix timestamp of the oldest scrobble for the user
|
// GetFirstTimestamp returns the unix timestamp of the oldest scrobble for the user.
|
||||||
|
// If the user has no scrobbles, returns nil
|
||||||
//nd:hostfunc
|
//nd:hostfunc
|
||||||
GetFirstTimestamp(ctx context.Context, username string) (*int64, error)
|
GetFirstTimestamp(ctx context.Context, username string) (*int64, error)
|
||||||
|
|
||||||
// GetLastTimestamp returns the unix timestamp of the most recent scrobble for the user
|
// GetLastTimestamp returns the unix timestamp of the most recent scrobble for the user
|
||||||
|
// If the user has no scrobbles, return nil
|
||||||
//nd:hostfunc
|
//nd:hostfunc
|
||||||
GetLastTimestamp(ctx context.Context, username string) (*int64, error)
|
GetLastTimestamp(ctx context.Context, username string) (*int64, error)
|
||||||
|
|
||||||
|
// GetScrobbles returns scrobbles for a user.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// - username: the user to query for scrobbles
|
||||||
|
// - options.FromTimestamp: If specified, the first UNIX timestamp to start fetching scrobbles (inclusive). Otherwise, start from the first scrobble
|
||||||
|
// - options.ToTimestamp: If specified, the last UNIX timestamp to fetch (inclusive). Otherwise, end at the last scrobble
|
||||||
|
// - options.MaxItems: The maximum number of items to retrieve. The maximum value (and default) if not specified is 5000
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// - Scrobbles: A list of scrobbles within the constraints given (if any). The order
|
||||||
|
// of the items depends on the options: if ToTimestamp is specified AND
|
||||||
|
// FromTImestamp is not specified, the order is in descending submission time.
|
||||||
|
// Otherwise, the scrobbles are returned in ascending submission time.
|
||||||
|
// - NextTimestamp: If there are additional items to retrieve in the range, the timestamp
|
||||||
|
// of the next scrobble that would be retrieved in the order (asc or desc)
|
||||||
//nd:hostfunc
|
//nd:hostfunc
|
||||||
GetScrobbles(ctx context.Context, username string, options ScrobbleOptions) (*ScrobbleList, error)
|
GetScrobbles(ctx context.Context, username string, options ScrobbleOptions) (*ScrobbleList, error)
|
||||||
|
|
||||||
|
// GetScrobbleCount returns the number of scrobbles for a user in a given range
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// - username: the user to query for scrobbles
|
||||||
|
// - options.FromTimestamp: If specified, the first UNIX timestamp to start fetching scrobbles (inclusive). Otherwise, start from the first scrobble
|
||||||
|
// - options.ToTimestamp: If specified, the last UNIX timestamp to fetch (inclusive). Otherwise, end at the last scrobble
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// - the number of scrobbles in the given range, or 0
|
||||||
//nd:hostfunc
|
//nd:hostfunc
|
||||||
GetScrobbleCount(ctx context.Context, username string, options ScrobbleCountOptions) (int64, error)
|
GetScrobbleCount(ctx context.Context, username string, options ScrobbleCountOptions) (int64, error)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -130,16 +130,58 @@ var _ = Describe("Scrobbble Retriever Host Function", Ordered, func() {
|
|||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
Describe("no items", func() {
|
var plugin *plugin
|
||||||
var plugin *plugin
|
|
||||||
|
|
||||||
BeforeEach(func() {
|
BeforeEach(func() {
|
||||||
manager.mu.RLock()
|
manager.mu.RLock()
|
||||||
plugin = manager.plugins["test-scrobble-retriever"]
|
plugin = manager.plugins["test-scrobble-retriever"]
|
||||||
manager.mu.RUnlock()
|
manager.mu.RUnlock()
|
||||||
Expect(plugin).ToNot(BeNil())
|
Expect(plugin).ToNot(BeNil())
|
||||||
|
})
|
||||||
|
|
||||||
|
Describe("not authorized", func() {
|
||||||
|
It("rejects first timestamp", func() {
|
||||||
|
instance, err := plugin.instance(GinkgoT().Context())
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
defer instance.Close(GinkgoT().Context())
|
||||||
|
|
||||||
|
exit, _, err := instance.Call("call_get_first_timestamp", []byte("baduser"))
|
||||||
|
Expect(err).To(HaveOccurred())
|
||||||
|
Expect(exit).To(Equal(uint32(1)))
|
||||||
})
|
})
|
||||||
|
|
||||||
|
It("rejects last timestamp", func() {
|
||||||
|
instance, err := plugin.instance(GinkgoT().Context())
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
defer instance.Close(GinkgoT().Context())
|
||||||
|
|
||||||
|
exit, _, err := instance.Call("call_get_last_timestamp", []byte("baduser"))
|
||||||
|
Expect(err).To(HaveOccurred())
|
||||||
|
Expect(exit).To(Equal(uint32(1)))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("rejects scrobbles", func() {
|
||||||
|
instance, err := plugin.instance(GinkgoT().Context())
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
defer instance.Close(GinkgoT().Context())
|
||||||
|
|
||||||
|
exit, _, err := instance.Call("call_get_scrobbles", []byte(`{"username":"baduser"}`))
|
||||||
|
Expect(err).To(HaveOccurred())
|
||||||
|
Expect(exit).To(Equal(uint32(1)))
|
||||||
|
})
|
||||||
|
|
||||||
|
It("rejects scrobbles", func() {
|
||||||
|
instance, err := plugin.instance(GinkgoT().Context())
|
||||||
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
defer instance.Close(GinkgoT().Context())
|
||||||
|
|
||||||
|
exit, _, err := instance.Call("call_get_scrobbles_count", []byte(`{"username":"baduser"}`))
|
||||||
|
Expect(err).To(HaveOccurred())
|
||||||
|
Expect(exit).To(Equal(uint32(1)))
|
||||||
|
})
|
||||||
|
})
|
||||||
|
|
||||||
|
Describe("no items", func() {
|
||||||
It("calls get first timestamp", func() {
|
It("calls get first timestamp", func() {
|
||||||
instance, err := plugin.instance(GinkgoT().Context())
|
instance, err := plugin.instance(GinkgoT().Context())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
@ -189,8 +231,6 @@ var _ = Describe("Scrobbble Retriever Host Function", Ordered, func() {
|
|||||||
})
|
})
|
||||||
|
|
||||||
Describe("with items", func() {
|
Describe("with items", func() {
|
||||||
var plugin *plugin
|
|
||||||
|
|
||||||
p := func(val int64) *int64 {
|
p := func(val int64) *int64 {
|
||||||
return &val
|
return &val
|
||||||
}
|
}
|
||||||
@ -210,13 +250,6 @@ var _ = Describe("Scrobbble Retriever Host Function", Ordered, func() {
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
BeforeEach(func() {
|
|
||||||
manager.mu.RLock()
|
|
||||||
plugin = manager.plugins["test-scrobble-retriever"]
|
|
||||||
manager.mu.RUnlock()
|
|
||||||
Expect(plugin).ToNot(BeNil())
|
|
||||||
})
|
|
||||||
|
|
||||||
It("calls get first timestamp", func() {
|
It("calls get first timestamp", func() {
|
||||||
instance, err := plugin.instance(GinkgoT().Context())
|
instance, err := plugin.instance(GinkgoT().Context())
|
||||||
Expect(err).ToNot(HaveOccurred())
|
Expect(err).ToNot(HaveOccurred())
|
||||||
|
|||||||
@ -15,18 +15,22 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// ScrobbleCountOptions represents the ScrobbleCountOptions data structure.
|
// ScrobbleCountOptions represents the ScrobbleCountOptions data structure.
|
||||||
|
// ScrobbleCountOptions carries optional parameters for counting user scrobbles
|
||||||
type ScrobbleCountOptions struct {
|
type ScrobbleCountOptions struct {
|
||||||
FromTimestamp *int64 `json:"fromTimestamp"`
|
FromTimestamp *int64 `json:"fromTimestamp"`
|
||||||
ToTimestamp *int64 `json:"toTimestamp"`
|
ToTimestamp *int64 `json:"toTimestamp"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleList represents the ScrobbleList data structure.
|
// ScrobbleList represents the ScrobbleList data structure.
|
||||||
|
// ScrobbleList is a list of scrobbles, plus an optional timestamp
|
||||||
|
// that can be used as a cursor for the next fetch
|
||||||
type ScrobbleList struct {
|
type ScrobbleList struct {
|
||||||
Scrobbles []ScrobbleRef `json:"scrobbles"`
|
Scrobbles []ScrobbleRef `json:"scrobbles"`
|
||||||
NextTimestamp *int64 `json:"nextTimestamp"`
|
NextTimestamp *int64 `json:"nextTimestamp"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleOptions represents the ScrobbleOptions data structure.
|
// ScrobbleOptions represents the ScrobbleOptions data structure.
|
||||||
|
// ScrobbleOptions carries optional parameters for retrieving user scrobbles
|
||||||
type ScrobbleOptions struct {
|
type ScrobbleOptions struct {
|
||||||
FromTimestamp *int64 `json:"fromTimestamp"`
|
FromTimestamp *int64 `json:"fromTimestamp"`
|
||||||
ToTimestamp *int64 `json:"toTimestamp"`
|
ToTimestamp *int64 `json:"toTimestamp"`
|
||||||
@ -34,6 +38,7 @@ type ScrobbleOptions struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleRef represents the ScrobbleRef data structure.
|
// ScrobbleRef represents the ScrobbleRef data structure.
|
||||||
|
// ScrobbleRef represents one instance of a scrobble (instance id, file id, submission time)
|
||||||
type ScrobbleRef struct {
|
type ScrobbleRef struct {
|
||||||
ID int64 `json:"id"`
|
ID int64 `json:"id"`
|
||||||
MediaFileID string `json:"mediaFileId"`
|
MediaFileID string `json:"mediaFileId"`
|
||||||
@ -99,7 +104,8 @@ type scrobbleRetrieverGetScrobbleCountResponse struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleRetrieverGetFirstTimestamp calls the scrobbleretriever_getfirsttimestamp host function.
|
// ScrobbleRetrieverGetFirstTimestamp calls the scrobbleretriever_getfirsttimestamp host function.
|
||||||
// GetFirstTimestamp returns the unix timestamp of the oldest scrobble for the user
|
// GetFirstTimestamp returns the unix timestamp of the oldest scrobble for the user.
|
||||||
|
// If the user has no scrobbles, returns nil
|
||||||
func ScrobbleRetrieverGetFirstTimestamp(username string) (*int64, error) {
|
func ScrobbleRetrieverGetFirstTimestamp(username string) (*int64, error) {
|
||||||
// Marshal request to JSON
|
// Marshal request to JSON
|
||||||
req := scrobbleRetrieverGetFirstTimestampRequest{
|
req := scrobbleRetrieverGetFirstTimestampRequest{
|
||||||
@ -135,6 +141,7 @@ func ScrobbleRetrieverGetFirstTimestamp(username string) (*int64, error) {
|
|||||||
|
|
||||||
// ScrobbleRetrieverGetLastTimestamp calls the scrobbleretriever_getlasttimestamp host function.
|
// ScrobbleRetrieverGetLastTimestamp calls the scrobbleretriever_getlasttimestamp host function.
|
||||||
// GetLastTimestamp returns the unix timestamp of the most recent scrobble for the user
|
// GetLastTimestamp returns the unix timestamp of the most recent scrobble for the user
|
||||||
|
// If the user has no scrobbles, return nil
|
||||||
func ScrobbleRetrieverGetLastTimestamp(username string) (*int64, error) {
|
func ScrobbleRetrieverGetLastTimestamp(username string) (*int64, error) {
|
||||||
// Marshal request to JSON
|
// Marshal request to JSON
|
||||||
req := scrobbleRetrieverGetLastTimestampRequest{
|
req := scrobbleRetrieverGetLastTimestampRequest{
|
||||||
@ -169,6 +176,21 @@ func ScrobbleRetrieverGetLastTimestamp(username string) (*int64, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleRetrieverGetScrobbles calls the scrobbleretriever_getscrobbles host function.
|
// ScrobbleRetrieverGetScrobbles calls the scrobbleretriever_getscrobbles host function.
|
||||||
|
// GetScrobbles returns scrobbles for a user.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// - username: the user to query for scrobbles
|
||||||
|
// - options.FromTimestamp: If specified, the first UNIX timestamp to start fetching scrobbles (inclusive). Otherwise, start from the first scrobble
|
||||||
|
// - options.ToTimestamp: If specified, the last UNIX timestamp to fetch (inclusive). Otherwise, end at the last scrobble
|
||||||
|
// - options.MaxItems: The maximum number of items to retrieve. The maximum value (and default) if not specified is 5000
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// - Scrobbles: A list of scrobbles within the constraints given (if any). The order
|
||||||
|
// of the items depends on the options: if ToTimestamp is specified AND
|
||||||
|
// FromTImestamp is not specified, the order is in descending submission time.
|
||||||
|
// Otherwise, the scrobbles are returned in ascending submission time.
|
||||||
|
// - NextTimestamp: If there are additional items to retrieve in the range, the timestamp
|
||||||
|
// of the next scrobble that would be retrieved in the order (asc or desc)
|
||||||
func ScrobbleRetrieverGetScrobbles(username string, options ScrobbleOptions) (*ScrobbleList, error) {
|
func ScrobbleRetrieverGetScrobbles(username string, options ScrobbleOptions) (*ScrobbleList, error) {
|
||||||
// Marshal request to JSON
|
// Marshal request to JSON
|
||||||
req := scrobbleRetrieverGetScrobblesRequest{
|
req := scrobbleRetrieverGetScrobblesRequest{
|
||||||
@ -204,6 +226,15 @@ func ScrobbleRetrieverGetScrobbles(username string, options ScrobbleOptions) (*S
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleRetrieverGetScrobbleCount calls the scrobbleretriever_getscrobblecount host function.
|
// ScrobbleRetrieverGetScrobbleCount calls the scrobbleretriever_getscrobblecount host function.
|
||||||
|
// GetScrobbleCount returns the number of scrobbles for a user in a given range
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// - username: the user to query for scrobbles
|
||||||
|
// - options.FromTimestamp: If specified, the first UNIX timestamp to start fetching scrobbles (inclusive). Otherwise, start from the first scrobble
|
||||||
|
// - options.ToTimestamp: If specified, the last UNIX timestamp to fetch (inclusive). Otherwise, end at the last scrobble
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// - the number of scrobbles in the given range, or 0
|
||||||
func ScrobbleRetrieverGetScrobbleCount(username string, options ScrobbleCountOptions) (int64, error) {
|
func ScrobbleRetrieverGetScrobbleCount(username string, options ScrobbleCountOptions) (int64, error) {
|
||||||
// Marshal request to JSON
|
// Marshal request to JSON
|
||||||
req := scrobbleRetrieverGetScrobbleCountRequest{
|
req := scrobbleRetrieverGetScrobbleCountRequest{
|
||||||
|
|||||||
@ -13,18 +13,22 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// ScrobbleCountOptions represents the ScrobbleCountOptions data structure.
|
// ScrobbleCountOptions represents the ScrobbleCountOptions data structure.
|
||||||
|
// ScrobbleCountOptions carries optional parameters for counting user scrobbles
|
||||||
type ScrobbleCountOptions struct {
|
type ScrobbleCountOptions struct {
|
||||||
FromTimestamp *int64 `json:"fromTimestamp"`
|
FromTimestamp *int64 `json:"fromTimestamp"`
|
||||||
ToTimestamp *int64 `json:"toTimestamp"`
|
ToTimestamp *int64 `json:"toTimestamp"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleList represents the ScrobbleList data structure.
|
// ScrobbleList represents the ScrobbleList data structure.
|
||||||
|
// ScrobbleList is a list of scrobbles, plus an optional timestamp
|
||||||
|
// that can be used as a cursor for the next fetch
|
||||||
type ScrobbleList struct {
|
type ScrobbleList struct {
|
||||||
Scrobbles []ScrobbleRef `json:"scrobbles"`
|
Scrobbles []ScrobbleRef `json:"scrobbles"`
|
||||||
NextTimestamp *int64 `json:"nextTimestamp"`
|
NextTimestamp *int64 `json:"nextTimestamp"`
|
||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleOptions represents the ScrobbleOptions data structure.
|
// ScrobbleOptions represents the ScrobbleOptions data structure.
|
||||||
|
// ScrobbleOptions carries optional parameters for retrieving user scrobbles
|
||||||
type ScrobbleOptions struct {
|
type ScrobbleOptions struct {
|
||||||
FromTimestamp *int64 `json:"fromTimestamp"`
|
FromTimestamp *int64 `json:"fromTimestamp"`
|
||||||
ToTimestamp *int64 `json:"toTimestamp"`
|
ToTimestamp *int64 `json:"toTimestamp"`
|
||||||
@ -32,6 +36,7 @@ type ScrobbleOptions struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleRef represents the ScrobbleRef data structure.
|
// ScrobbleRef represents the ScrobbleRef data structure.
|
||||||
|
// ScrobbleRef represents one instance of a scrobble (instance id, file id, submission time)
|
||||||
type ScrobbleRef struct {
|
type ScrobbleRef struct {
|
||||||
ID int64 `json:"id"`
|
ID int64 `json:"id"`
|
||||||
MediaFileID string `json:"mediaFileId"`
|
MediaFileID string `json:"mediaFileId"`
|
||||||
@ -54,7 +59,8 @@ func (m *mockScrobbleRetrieverService) GetFirstTimestamp(username string) (*int6
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleRetrieverGetFirstTimestamp delegates to the mock instance.
|
// ScrobbleRetrieverGetFirstTimestamp delegates to the mock instance.
|
||||||
// GetFirstTimestamp returns the unix timestamp of the oldest scrobble for the user
|
// GetFirstTimestamp returns the unix timestamp of the oldest scrobble for the user.
|
||||||
|
// If the user has no scrobbles, returns nil
|
||||||
func ScrobbleRetrieverGetFirstTimestamp(username string) (*int64, error) {
|
func ScrobbleRetrieverGetFirstTimestamp(username string) (*int64, error) {
|
||||||
return ScrobbleRetrieverMock.GetFirstTimestamp(username)
|
return ScrobbleRetrieverMock.GetFirstTimestamp(username)
|
||||||
}
|
}
|
||||||
@ -67,6 +73,7 @@ func (m *mockScrobbleRetrieverService) GetLastTimestamp(username string) (*int64
|
|||||||
|
|
||||||
// ScrobbleRetrieverGetLastTimestamp delegates to the mock instance.
|
// ScrobbleRetrieverGetLastTimestamp delegates to the mock instance.
|
||||||
// GetLastTimestamp returns the unix timestamp of the most recent scrobble for the user
|
// GetLastTimestamp returns the unix timestamp of the most recent scrobble for the user
|
||||||
|
// If the user has no scrobbles, return nil
|
||||||
func ScrobbleRetrieverGetLastTimestamp(username string) (*int64, error) {
|
func ScrobbleRetrieverGetLastTimestamp(username string) (*int64, error) {
|
||||||
return ScrobbleRetrieverMock.GetLastTimestamp(username)
|
return ScrobbleRetrieverMock.GetLastTimestamp(username)
|
||||||
}
|
}
|
||||||
@ -78,6 +85,21 @@ func (m *mockScrobbleRetrieverService) GetScrobbles(username string, options Scr
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleRetrieverGetScrobbles delegates to the mock instance.
|
// ScrobbleRetrieverGetScrobbles delegates to the mock instance.
|
||||||
|
// GetScrobbles returns scrobbles for a user.
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// - username: the user to query for scrobbles
|
||||||
|
// - options.FromTimestamp: If specified, the first UNIX timestamp to start fetching scrobbles (inclusive). Otherwise, start from the first scrobble
|
||||||
|
// - options.ToTimestamp: If specified, the last UNIX timestamp to fetch (inclusive). Otherwise, end at the last scrobble
|
||||||
|
// - options.MaxItems: The maximum number of items to retrieve. The maximum value (and default) if not specified is 5000
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// - Scrobbles: A list of scrobbles within the constraints given (if any). The order
|
||||||
|
// of the items depends on the options: if ToTimestamp is specified AND
|
||||||
|
// FromTImestamp is not specified, the order is in descending submission time.
|
||||||
|
// Otherwise, the scrobbles are returned in ascending submission time.
|
||||||
|
// - NextTimestamp: If there are additional items to retrieve in the range, the timestamp
|
||||||
|
// of the next scrobble that would be retrieved in the order (asc or desc)
|
||||||
func ScrobbleRetrieverGetScrobbles(username string, options ScrobbleOptions) (*ScrobbleList, error) {
|
func ScrobbleRetrieverGetScrobbles(username string, options ScrobbleOptions) (*ScrobbleList, error) {
|
||||||
return ScrobbleRetrieverMock.GetScrobbles(username, options)
|
return ScrobbleRetrieverMock.GetScrobbles(username, options)
|
||||||
}
|
}
|
||||||
@ -89,6 +111,15 @@ func (m *mockScrobbleRetrieverService) GetScrobbleCount(username string, options
|
|||||||
}
|
}
|
||||||
|
|
||||||
// ScrobbleRetrieverGetScrobbleCount delegates to the mock instance.
|
// ScrobbleRetrieverGetScrobbleCount delegates to the mock instance.
|
||||||
|
// GetScrobbleCount returns the number of scrobbles for a user in a given range
|
||||||
|
//
|
||||||
|
// Parameters:
|
||||||
|
// - username: the user to query for scrobbles
|
||||||
|
// - options.FromTimestamp: If specified, the first UNIX timestamp to start fetching scrobbles (inclusive). Otherwise, start from the first scrobble
|
||||||
|
// - options.ToTimestamp: If specified, the last UNIX timestamp to fetch (inclusive). Otherwise, end at the last scrobble
|
||||||
|
//
|
||||||
|
// Returns:
|
||||||
|
// - the number of scrobbles in the given range, or 0
|
||||||
func ScrobbleRetrieverGetScrobbleCount(username string, options ScrobbleCountOptions) (int64, error) {
|
func ScrobbleRetrieverGetScrobbleCount(username string, options ScrobbleCountOptions) (int64, error) {
|
||||||
return ScrobbleRetrieverMock.GetScrobbleCount(username, options)
|
return ScrobbleRetrieverMock.GetScrobbleCount(username, options)
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,6 +6,7 @@
|
|||||||
use extism_pdk::*;
|
use extism_pdk::*;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
/// ScrobbleCountOptions carries optional parameters for counting user scrobbles
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct ScrobbleCountOptions {
|
pub struct ScrobbleCountOptions {
|
||||||
@ -15,6 +16,8 @@ pub struct ScrobbleCountOptions {
|
|||||||
pub to_timestamp: Option<i64>,
|
pub to_timestamp: Option<i64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ScrobbleList is a list of scrobbles, plus an optional timestamp
|
||||||
|
/// that can be used as a cursor for the next fetch
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct ScrobbleList {
|
pub struct ScrobbleList {
|
||||||
@ -23,6 +26,7 @@ pub struct ScrobbleList {
|
|||||||
pub next_timestamp: Option<i64>,
|
pub next_timestamp: Option<i64>,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ScrobbleOptions carries optional parameters for retrieving user scrobbles
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct ScrobbleOptions {
|
pub struct ScrobbleOptions {
|
||||||
@ -33,6 +37,7 @@ pub struct ScrobbleOptions {
|
|||||||
pub max_items: i32,
|
pub max_items: i32,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// ScrobbleRef represents one instance of a scrobble (instance id, file id, submission time)
|
||||||
#[derive(Debug, Clone, Serialize, Deserialize)]
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
||||||
#[serde(rename_all = "camelCase")]
|
#[serde(rename_all = "camelCase")]
|
||||||
pub struct ScrobbleRef {
|
pub struct ScrobbleRef {
|
||||||
@ -111,7 +116,8 @@ extern "ExtismHost" {
|
|||||||
fn scrobbleretriever_getscrobblecount(input: Json<ScrobbleRetrieverGetScrobbleCountRequest>) -> Json<ScrobbleRetrieverGetScrobbleCountResponse>;
|
fn scrobbleretriever_getscrobblecount(input: Json<ScrobbleRetrieverGetScrobbleCountRequest>) -> Json<ScrobbleRetrieverGetScrobbleCountResponse>;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// GetFirstTimestamp returns the unix timestamp of the oldest scrobble for the user
|
/// GetFirstTimestamp returns the unix timestamp of the oldest scrobble for the user.
|
||||||
|
/// If the user has no scrobbles, returns nil
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
/// * `username` - String parameter.
|
/// * `username` - String parameter.
|
||||||
@ -136,6 +142,7 @@ pub fn get_first_timestamp(username: &str) -> Result<Option<i64>, Error> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// GetLastTimestamp returns the unix timestamp of the most recent scrobble for the user
|
/// GetLastTimestamp returns the unix timestamp of the most recent scrobble for the user
|
||||||
|
/// If the user has no scrobbles, return nil
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
/// * `username` - String parameter.
|
/// * `username` - String parameter.
|
||||||
@ -159,7 +166,21 @@ pub fn get_last_timestamp(username: &str) -> Result<Option<i64>, Error> {
|
|||||||
Ok(response.0.result)
|
Ok(response.0.result)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Calls the scrobbleretriever_getscrobbles host function.
|
/// GetScrobbles returns scrobbles for a user.
|
||||||
|
///
|
||||||
|
/// Parameters:
|
||||||
|
/// - username: the user to query for scrobbles
|
||||||
|
/// - options.FromTimestamp: If specified, the first UNIX timestamp to start fetching scrobbles (inclusive). Otherwise, start from the first scrobble
|
||||||
|
/// - options.ToTimestamp: If specified, the last UNIX timestamp to fetch (inclusive). Otherwise, end at the last scrobble
|
||||||
|
/// - options.MaxItems: The maximum number of items to retrieve. The maximum value (and default) if not specified is 5000
|
||||||
|
///
|
||||||
|
/// Returns:
|
||||||
|
/// - Scrobbles: A list of scrobbles within the constraints given (if any). The order
|
||||||
|
/// of the items depends on the options: if ToTimestamp is specified AND
|
||||||
|
/// FromTImestamp is not specified, the order is in descending submission time.
|
||||||
|
/// Otherwise, the scrobbles are returned in ascending submission time.
|
||||||
|
/// - NextTimestamp: If there are additional items to retrieve in the range, the timestamp
|
||||||
|
/// of the next scrobble that would be retrieved in the order (asc or desc)
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
/// * `username` - String parameter.
|
/// * `username` - String parameter.
|
||||||
@ -185,7 +206,15 @@ pub fn get_scrobbles(username: &str, options: ScrobbleOptions) -> Result<Option<
|
|||||||
Ok(response.0.result)
|
Ok(response.0.result)
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Calls the scrobbleretriever_getscrobblecount host function.
|
/// GetScrobbleCount returns the number of scrobbles for a user in a given range
|
||||||
|
///
|
||||||
|
/// Parameters:
|
||||||
|
/// - username: the user to query for scrobbles
|
||||||
|
/// - options.FromTimestamp: If specified, the first UNIX timestamp to start fetching scrobbles (inclusive). Otherwise, start from the first scrobble
|
||||||
|
/// - options.ToTimestamp: If specified, the last UNIX timestamp to fetch (inclusive). Otherwise, end at the last scrobble
|
||||||
|
///
|
||||||
|
/// Returns:
|
||||||
|
/// - the number of scrobbles in the given range, or 0
|
||||||
///
|
///
|
||||||
/// # Arguments
|
/// # Arguments
|
||||||
/// * `username` - String parameter.
|
/// * `username` - String parameter.
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user