package builder import ( "context" "git.dragse.it/anthrove/e621-sdk-go/pkg/e621/endpoints" "git.dragse.it/anthrove/e621-sdk-go/pkg/e621/model" "strconv" ) // FavoritesBuilder represents a builder for constructing queries to retrieve user's favorite posts. type FavoritesBuilder interface { // SetUserID sets the user ID for the query. SetUserID(userID model.UserID) FavoritesBuilder // SetLimit sets the maximum number of favorite posts to retrieve. SetLimit(limitFavorites int) FavoritesBuilder // Page sets the page number for paginated results. Page(pageNumber int) FavoritesBuilder // Execute sends the constructed query and returns a slice of favorite posts and an error if any. Execute() ([]model.Post, error) } // NewGetFavoritesBuilder creates a new instance of FavoritesBuilder with the provided RequestContext. // // Parameters: // - requestContext: The context for the API request, including the host, user agent, username, and API key. // // Returns: // - FavoritesBuilder: An instance of the FavoritesBuilder interface. func NewGetFavoritesBuilder(requestContext model.RequestContext) FavoritesBuilder { return &getFavorites{ requestContext: requestContext, query: make(map[string]string), } } // getFavorites is an implementation of the FavoritesBuilder interface. type getFavorites struct { query map[string]string requestContext model.RequestContext } // SetUserID sets the user ID for the query. // // Parameters: // - userID: The ID of the user whose favorite posts are to be retrieved. // // Returns: // - FavoritesBuilder: The instance of the FavoritesBuilder for method chaining. func (g *getFavorites) SetUserID(userID model.UserID) FavoritesBuilder { g.query["user_id"] = strconv.Itoa(int(userID)) return g } // SetLimit sets the maximum number of favorite posts to retrieve. // // Parameters: // - limitFavorites: The maximum number of favorite posts to retrieve. // // Returns: // - FavoritesBuilder: The instance of the FavoritesBuilder for method chaining. func (g *getFavorites) SetLimit(limitFavorites int) FavoritesBuilder { g.query["limit"] = strconv.Itoa(limitFavorites) return g } // Page sets the page number for paginated results. // // Parameters: // - pageNumber: The page number for paginated results. // // Returns: // - FavoritesBuilder: The instance of the FavoritesBuilder for method chaining. func (g *getFavorites) Page(pageNumber int) FavoritesBuilder { g.query["page"] = strconv.Itoa(pageNumber) return g } // Execute sends the constructed query and returns a slice of favorite posts and an error if any. // // Returns: // - []model.Post: A slice of favorite posts. // - error: An error, if any, encountered during the API request or response handling. func (g *getFavorites) Execute() ([]model.Post, error) { if g.requestContext.RateLimiter != nil { err := g.requestContext.RateLimiter.Wait(context.Background()) if err != nil { return nil, err } } favorites, err := endpoints.GetFavorites(g.requestContext, g.query) if err != nil { return nil, err } return favorites, nil }